diff --git a/CMakeLists.txt b/CMakeLists.txt index 783580c09..dd7e9b1c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,9 +58,18 @@ option(MNN_ENABLE_COVERAGE "Build with coverage enable" OFF) option(MNN_BUILD_PROTOBUFFER "Build with protobuffer in MNN" ON) option(MNN_BUILD_OPENCV "Build OpenCV api in MNN." OFF) option(MNN_BUILD_LLM "Build llm library based MNN." OFF) +option(MNN_BUILD_DIFFUSION "Build diffusion demo based MNN." OFF) option(MNN_INTERNAL "Build with MNN internal features, such as model authentication, metrics logging" OFF) option(MNN_JNI "Build MNN Jni for java to use" OFF) +IF (OHOS) + include($ENV{NODE_PATH}/@ali/tcpkg/tcpkg.cmake) + export_headers(DIR ${CMAKE_SOURCE_DIR}/include/MNN) + IF (MNN_BUILD_OPENCV) + export_headers(DIR ${CMAKE_SOURCE_DIR}/tools/cv/include/cv) + ENDIF() +ENDIF() + IF (NOT DEFINED MNN_USE_SPARSE_COMPUTE) set(MNN_USE_SPARSE_COMPUTE ON) ENDIF() @@ -263,12 +272,12 @@ endif() option(MNN_USE_CPP11 "Enable MNN use c++11" ON) if (NOT MSVC) if(MNN_CUDA AND MNN_SUPPORT_TRANSFORMER_FUSE) - set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") elseif(MNN_USE_CPP11) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") @@ -493,7 +502,7 @@ endif() IF(MNN_COREML) add_definitions(-DMNN_COREML_ENABLED=1) add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/coreml/) - + IF(MNN_SEP_BUILD) list(APPEND MNN_DEPS MNNCoreML) list(APPEND MNN_EXTRA_DEPENDS MNNCoreML) @@ -631,7 +640,7 @@ ENDIF() IF(MNN_BUILD_LLM) # add_definitions(-DMNN_BUILD_LLM) - include(${CMAKE_CURRENT_LIST_DIR}/llm/CMakeLists.txt) + include(${CMAKE_CURRENT_LIST_DIR}/transformers/llm/engine/CMakeLists.txt) ENDIF() # NPU @@ -755,6 +764,9 @@ list(REMOVE_ITEM MNN_TARGETS MNN) IF(MNN_BUILD_DEMO) include(${CMAKE_CURRENT_LIST_DIR}/demo/exec/CMakeLists.txt) ENDIF() +IF(MNN_BUILD_DIFFUSION AND MNN_BUILD_OPENCV AND MNN_IMGCODECS) +include(${CMAKE_CURRENT_LIST_DIR}/transformers/diffusion/CMakeLists.txt) +ENDIF() IF(MNN_BUILD_TOOLS) include(${CMAKE_CURRENT_LIST_DIR}/tools/cpp/CMakeLists.txt) ENDIF() diff --git a/benchmark/benchmark.cpp b/benchmark/benchmark.cpp index 30e4eea2e..f3ee0c55a 100644 --- a/benchmark/benchmark.cpp +++ b/benchmark/benchmark.cpp @@ -127,7 +127,7 @@ std::vector doBench(Model& model, int loop, int warmup = 10, int forward auto modelBuffer = revertor->getBuffer(); const auto bufferSize = revertor->getBufferSize(); - auto net = std::shared_ptr(MNN::Interpreter::createFromBuffer(modelBuffer, bufferSize)); + auto net = std::shared_ptr(MNN::Interpreter::createFromBuffer(modelBuffer, bufferSize), MNN::Interpreter::destroy); revertor.reset(); net->setSessionMode(MNN::Interpreter::Session_Release); MNN::ScheduleConfig config; diff --git a/docs/compile/cmake.md b/docs/compile/cmake.md index 46d04ad9a..092c9d1ec 100644 --- a/docs/compile/cmake.md +++ b/docs/compile/cmake.md @@ -80,6 +80,7 @@ MNN使用CMake构建项目,CMake中的宏定义列表如下: | MNN_OPENCV_BENCH | 构建MNN的OpenCV功能是否开启性能benchmark,默认为`OFF` | | MNN_VULKAN_IMAGE | 构建MNN的Vulkan后端时采用Image内存模式,以便支持FP16和部分移动端上GPU的加速,默认为`ON` | | MNN_LOW_MEMORY | 是否支持低内存模式,支持低内存模式使用权值量化模型并设置`low_memory`则会使用计算时反量化,默认为`OFF` | -| MNN_SUPPORT_RENDER | 是否支持图形渲染相关算子实现,默认为 `OFF` | +| MNN_SUPPORT_RENDER | 是否支持图形渲染相关算子实现,默认为 `OFF` | | MNN_SUPPORT_TRANSFORMER_FUSE | 是否支持Fuse Transformer相关OP实现,默认为 `OFF` | | MNN_BUILD_LLM | 是否构建基于MNN的llm库和demo,默认为`OFF` | +| MNN_BUILD_DIFFUSION | 是否构建基于MNN的diffusion demo,需要打开MNN_BUILD_OPENCV和MNN_IMGCODECS宏使用 默认为`OFF` | diff --git a/docs/compile/tools.md b/docs/compile/tools.md index d246d8e75..f119c397d 100644 --- a/docs/compile/tools.md +++ b/docs/compile/tools.md @@ -60,6 +60,7 @@ - `winogradExample.out` winograd示例 - `fuseTest` 测试 GPU 自定义算子的功能,目前仅支持 Vulkan Buffer 模式 - `GpuInterTest.out` 测试 GPU 内存输入的功能,目前仅支持 OpenCL Buffer 模式与 OpenGL texture 模式,编译时许打开 MNN_OPENCL 与 MNN_OPENGL + - `LoRA` 将LorA权重添加到模型权重中 ## Benchmark工具 - 相关编译选项 - `MNN_BUILD_BENCHMARK` 是否编译Benchmark工具 diff --git a/express/Executor.cpp b/express/Executor.cpp index c54520ccc..201562e96 100644 --- a/express/Executor.cpp +++ b/express/Executor.cpp @@ -27,6 +27,7 @@ namespace Express { void Executor::setGlobalExecutorConfig(MNNForwardType type, const BackendConfig& config, int numberThread) { std::lock_guard _l(mMutex); + if(type == MNN_FORWARD_AUTO) { ScheduleConfig sConfig; sConfig.type = type; @@ -41,10 +42,12 @@ void Executor::setGlobalExecutorConfig(MNNForwardType type, const BackendConfig& info.numThread = 4; } mAttr->firstType = std::make_pair(type, info.numThread); - - info.user = (BackendConfig*)&config; - std::shared_ptr bn(creator->onCreate(info)); - mRuntimes[mAttr->firstType] = bn; + auto firstIter = mRuntimes.find(mAttr->firstType); + if (firstIter == mRuntimes.end()) { + info.user = (BackendConfig*)&config; + std::shared_ptr bn(creator->onCreate(info)); + mRuntimes[mAttr->firstType] = bn; + } } else { auto creator = MNNGetExtraRuntimeCreator(type); if (nullptr == creator) { @@ -56,11 +59,14 @@ void Executor::setGlobalExecutorConfig(MNNForwardType type, const BackendConfig& Backend::Info info; info.type = type; mAttr->firstType = std::make_pair(type, numberThread); - info.mode = Backend::Info::DIRECT; - info.numThread = numberThread; - info.user = (BackendConfig*)&config; - std::shared_ptr bn(creator->onCreate(info)); - mRuntimes[mAttr->firstType] = bn; + auto firstIter = mRuntimes.find(mAttr->firstType); + if (firstIter == mRuntimes.end()) { + info.mode = Backend::Info::DIRECT; + info.numThread = numberThread; + info.user = (BackendConfig*)&config; + std::shared_ptr bn(creator->onCreate(info)); + mRuntimes[mAttr->firstType] = bn; + } } _refreshRuntime(); } @@ -155,6 +161,10 @@ std::shared_ptr Executor::newExecutor(MNNForwardType type, const BackendConfig& config, int numberThread) { auto creator = MNNGetExtraRuntimeCreator(type); + if(nullptr == creator) { + MNN_ERROR("Don't support %d\n", type); + return nullptr; + } Backend::Info info; info.type = type; info.numThread = numberThread; diff --git a/express/module/StaticModule.cpp b/express/module/StaticModule.cpp index 9bdc86e77..dd63c1718 100644 --- a/express/module/StaticModule.cpp +++ b/express/module/StaticModule.cpp @@ -98,6 +98,21 @@ static std::vector> preRearrangeWeights( // NOLIN } break; } + case MNN::OpType_Attention: { + exe.reset(backend->onCreate({}, {}, op)); + if (exe.get() == nullptr) { + exe.reset(backupBackend->onCreate({}, {}, op)); + } + if (nullptr == exe) { + break; + } + // The exe can't clone + if (!exe->onClone(nullptr, op, nullptr)) { + exe = nullptr; + break; + } + break; + } default: { break; } diff --git a/include/MNN/MNNDefine.h b/include/MNN/MNNDefine.h index ec0956421..45dc30bfb 100644 --- a/include/MNN/MNNDefine.h +++ b/include/MNN/MNNDefine.h @@ -68,7 +68,7 @@ MNN_ERROR("Check failed: %s ==> %s\n", #success, #log); \ #define STR_IMP(x) #x #define STR(x) STR_IMP(x) #define MNN_VERSION_MAJOR 2 -#define MNN_VERSION_MINOR 8 -#define MNN_VERSION_PATCH 4 +#define MNN_VERSION_MINOR 9 +#define MNN_VERSION_PATCH 0 #define MNN_VERSION STR(MNN_VERSION_MAJOR) "." STR(MNN_VERSION_MINOR) "." STR(MNN_VERSION_PATCH) #endif /* MNNDefine_h */ diff --git a/project/harmony/build_64.sh b/project/harmony/build_64.sh new file mode 100755 index 000000000..fefd02c60 --- /dev/null +++ b/project/harmony/build_64.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cmake ../../../ \ +-DCMAKE_TOOLCHAIN_FILE=$HARMONY_HOME/native/build/cmake/ohos.toolchain.cmake \ +-DCMAKE_BUILD_TYPE=Release \ +-DOHOS_ARCH="arm64-v8a" \ +-DOHOS_STL=c++_static \ +-DMNN_USE_LOGCAT=false \ +-DMNN_BUILD_BENCHMARK=ON \ +-DMNN_USE_SSE=OFF \ +-DMNN_SUPPORT_BF16=OFF \ +-DMNN_BUILD_TEST=ON \ +-DOHOS_PLATFORM_LEVEL=9 \ +-DMNN_BUILD_FOR_ANDROID_COMMAND=true \ +-DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $1 $2 $3 + +make -j4 diff --git a/project/harmony/updateTest.sh b/project/harmony/updateTest.sh new file mode 100755 index 000000000..5a0be5c6f --- /dev/null +++ b/project/harmony/updateTest.sh @@ -0,0 +1,16 @@ +#!/bin/bash +DIR=yanxing + +make -j16 +hdc file send ./libMNN.so /data/local/tmp/$DIR/libMNN.so +hdc file send ./libMNN_Express.so /data/local/tmp/$DIR/libMNN_Express.so +hdc file send ./MNNV2Basic.out /data/local/tmp/$DIR/MNNV2Basic.out +hdc file send ./ModuleBasic.out /data/local/tmp/$DIR/ModuleBasic.out +# hdc shell "cd /data/local/tmp/$DIR && rm -r output" +# hdc shell "cd /data/local/tmp/$DIR && mkdir output" +hdc file send ./unitTest.out /data/local/tmp/$DIR/unitTest.out +hdc file send ./testModel.out /data/local/tmp/$DIR/testModel.out +hdc file send ./testModelWithDescribe.out /data/local/tmp/$DIR/testModelWithDescribe.out +hdc file send ./backendTest.out /data/local/tmp/$DIR/backendTest.out +hdc file send ./timeProfile.out /data/local/tmp/$DIR/timeProfile.out +hdc file send ./run_test.out /data/local/tmp/$DIR/run_test.out diff --git a/project/ios/MNN.xcodeproj/project.pbxproj b/project/ios/MNN.xcodeproj/project.pbxproj index 21fc774f7..f31638c61 100644 --- a/project/ios/MNN.xcodeproj/project.pbxproj +++ b/project/ios/MNN.xcodeproj/project.pbxproj @@ -174,7 +174,6 @@ 489D7A7B2550FDC800AD896A /* MetalUnary.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A2A2550FDC800AD896A /* MetalUnary.hpp */; }; 489D7A7D2550FDC900AD896A /* MetalConvolution.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A2C2550FDC800AD896A /* MetalConvolution.mm */; }; 489D7A7E2550FDC900AD896A /* MNNMetalContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A2D2550FDC800AD896A /* MNNMetalContext.mm */; }; - 489D7A7F2550FDC900AD896A /* MetalReLU.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A2E2550FDC800AD896A /* MetalReLU.hpp */; }; 489D7A802550FDC900AD896A /* MetalEltwise.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A2F2550FDC800AD896A /* MetalEltwise.hpp */; }; 489D7A812550FDC900AD896A /* MetalPooling.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A302550FDC800AD896A /* MetalPooling.hpp */; }; 489D7A822550FDC900AD896A /* MetalPReLU.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A312550FDC800AD896A /* MetalPReLU.hpp */; }; @@ -184,7 +183,6 @@ 489D7A8A2550FDC900AD896A /* MetalConvolutionDepthwise.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A392550FDC800AD896A /* MetalConvolutionDepthwise.mm */; }; 489D7A8B2550FDC900AD896A /* MetalConvolutionWinograd.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A3A2550FDC800AD896A /* MetalConvolutionWinograd.hpp */; }; 489D7A8C2550FDC900AD896A /* MetalDeconvolution.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A3B2550FDC800AD896A /* MetalDeconvolution.mm */; }; - 489D7A8D2550FDC900AD896A /* MetalReLU.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A3C2550FDC800AD896A /* MetalReLU.mm */; }; 489D7A8E2550FDC900AD896A /* MetalPooling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A3D2550FDC800AD896A /* MetalPooling.mm */; }; 489D7A902550FDC900AD896A /* MetalConvolution.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 489D7A3F2550FDC800AD896A /* MetalConvolution.hpp */; }; 489D7A912550FDC900AD896A /* MetalScale.mm in Sources */ = {isa = PBXBuildFile; fileRef = 489D7A402550FDC800AD896A /* MetalScale.mm */; }; @@ -746,6 +744,7 @@ 9558333D29B0947300488807 /* MNNGelu.S in Sources */ = {isa = PBXBuildFile; fileRef = 9558333C29B0947300488807 /* MNNGelu.S */; }; 9558334729B09A2300488807 /* MNNGelu.S in Sources */ = {isa = PBXBuildFile; fileRef = 9558334629B09A2300488807 /* MNNGelu.S */; }; 9558334B29B09A7B00488807 /* MNNGeluFP16.S in Sources */ = {isa = PBXBuildFile; fileRef = 9558334A29B09A7B00488807 /* MNNGeluFP16.S */; settings = {COMPILER_FLAGS = "-march=armv8.2-a+fp16"; }; }; + 9560EAD62BDE426A00C8D0B6 /* GeometryLayernorm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9560EAD52BDE426A00C8D0B6 /* GeometryLayernorm.cpp */; }; 956F52E12AB2D692004B13D9 /* ImageProcessUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 956F52E02AB2D692004B13D9 /* ImageProcessUtils.cpp */; }; 956F52E32AB2D6A1004B13D9 /* ImageProcessUtils.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 956F52E22AB2D6A1004B13D9 /* ImageProcessUtils.hpp */; }; 958375352A496E5C007C0A3E /* MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3.S in Sources */ = {isa = PBXBuildFile; fileRef = 958375342A496E5C007C0A3E /* MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3.S */; }; @@ -1005,7 +1004,6 @@ 489D7A2A2550FDC800AD896A /* MetalUnary.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalUnary.hpp; sourceTree = ""; }; 489D7A2C2550FDC800AD896A /* MetalConvolution.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalConvolution.mm; sourceTree = ""; }; 489D7A2D2550FDC800AD896A /* MNNMetalContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MNNMetalContext.mm; sourceTree = ""; }; - 489D7A2E2550FDC800AD896A /* MetalReLU.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalReLU.hpp; sourceTree = ""; }; 489D7A2F2550FDC800AD896A /* MetalEltwise.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalEltwise.hpp; sourceTree = ""; }; 489D7A302550FDC800AD896A /* MetalPooling.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalPooling.hpp; sourceTree = ""; }; 489D7A312550FDC800AD896A /* MetalPReLU.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalPReLU.hpp; sourceTree = ""; }; @@ -1015,7 +1013,6 @@ 489D7A392550FDC800AD896A /* MetalConvolutionDepthwise.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalConvolutionDepthwise.mm; sourceTree = ""; }; 489D7A3A2550FDC800AD896A /* MetalConvolutionWinograd.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalConvolutionWinograd.hpp; sourceTree = ""; }; 489D7A3B2550FDC800AD896A /* MetalDeconvolution.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalDeconvolution.mm; sourceTree = ""; }; - 489D7A3C2550FDC800AD896A /* MetalReLU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalReLU.mm; sourceTree = ""; }; 489D7A3D2550FDC800AD896A /* MetalPooling.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalPooling.mm; sourceTree = ""; }; 489D7A3F2550FDC800AD896A /* MetalConvolution.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MetalConvolution.hpp; sourceTree = ""; }; 489D7A402550FDC800AD896A /* MetalScale.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MetalScale.mm; sourceTree = ""; }; @@ -1587,6 +1584,7 @@ 9558333C29B0947300488807 /* MNNGelu.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = MNNGelu.S; sourceTree = ""; }; 9558334629B09A2300488807 /* MNNGelu.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = MNNGelu.S; sourceTree = ""; }; 9558334A29B09A7B00488807 /* MNNGeluFP16.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = MNNGeluFP16.S; path = ../../../arm82/asm/arm64/MNNGeluFP16.S; sourceTree = ""; }; + 9560EAD52BDE426A00C8D0B6 /* GeometryLayernorm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GeometryLayernorm.cpp; sourceTree = ""; }; 956F52E02AB2D692004B13D9 /* ImageProcessUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageProcessUtils.cpp; sourceTree = ""; }; 956F52E22AB2D6A1004B13D9 /* ImageProcessUtils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ImageProcessUtils.hpp; sourceTree = ""; }; 958375342A496E5C007C0A3E /* MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; name = MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3.S; path = arm/arm64/MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3.S; sourceTree = ""; }; @@ -1842,6 +1840,7 @@ 4819FB2624C139690050BD09 /* GeometryLSTM.cpp */, 4819FB2424C139680050BD09 /* GeometryPoolGrad.cpp */, 4819FB2A24C139690050BD09 /* GeometryReduce.cpp */, + 9560EAD52BDE426A00C8D0B6 /* GeometryLayernorm.cpp */, 489404DD24A2FC2B001E456C /* GeometryReverseSequence.cpp */, 48FD0349246AA40300456AF5 /* GeometryConvert.cpp */, 48FD12BD2466A88D009E9102 /* GeometryConv2DBackPropFilter.cpp */, @@ -2150,7 +2149,6 @@ 489D7A2A2550FDC800AD896A /* MetalUnary.hpp */, 489D7A2C2550FDC800AD896A /* MetalConvolution.mm */, 489D7A2D2550FDC800AD896A /* MNNMetalContext.mm */, - 489D7A2E2550FDC800AD896A /* MetalReLU.hpp */, 489D7A2F2550FDC800AD896A /* MetalEltwise.hpp */, 489D7A302550FDC800AD896A /* MetalPooling.hpp */, 489D7A312550FDC800AD896A /* MetalPReLU.hpp */, @@ -2160,7 +2158,6 @@ 489D7A392550FDC800AD896A /* MetalConvolutionDepthwise.mm */, 489D7A3A2550FDC800AD896A /* MetalConvolutionWinograd.hpp */, 489D7A3B2550FDC800AD896A /* MetalDeconvolution.mm */, - 489D7A3C2550FDC800AD896A /* MetalReLU.mm */, 489D7A3D2550FDC800AD896A /* MetalPooling.mm */, 489D7A3F2550FDC800AD896A /* MetalConvolution.hpp */, 489D7A402550FDC800AD896A /* MetalScale.mm */, @@ -3070,7 +3067,6 @@ EBECA39924643D320062C7A3 /* Arm82Relu.hpp in Headers */, 4838EA7C2611BFE20027232C /* CPUGridSample.hpp in Headers */, 92FF03A523AA0B5A00AC97F6 /* DeconvolutionWithStride.hpp in Headers */, - 489D7A7F2550FDC900AD896A /* MetalReLU.hpp in Headers */, 92FF03D123AA0B5A00AC97F6 /* CPUTopKV2.hpp in Headers */, 92FF033F23AA0B5A00AC97F6 /* CPUArgMax.hpp in Headers */, 92FF034C23AA0B5A00AC97F6 /* CPUSetDiff1D.hpp in Headers */, @@ -3602,7 +3598,6 @@ 486E1A9924F5078D00C16006 /* CPURandomUniform.cpp in Sources */, 92FF02C823AA0B5A00AC97F6 /* MNNNV21ToBGRUnit.S in Sources */, 92FF045C23AA0B7100AC97F6 /* ShapeBroadcastTo.cpp in Sources */, - 489D7A8D2550FDC900AD896A /* MetalReLU.mm in Sources */, 48747D49245D9D24000B9709 /* RuntimeFactory.cpp in Sources */, 92FF02AE23AA0B5A00AC97F6 /* CPUProposal.cpp in Sources */, 92FF042723AA0B7100AC97F6 /* ShapeMatMul.cpp in Sources */, @@ -3627,6 +3622,7 @@ 92FF025923AA0B5A00AC97F6 /* CPUPoolInt8.cpp in Sources */, 92FF045B23AA0B7100AC97F6 /* ShapeShape.cpp in Sources */, CECF8C87299CAD9400D3875B /* sds.c in Sources */, + 9560EAD62BDE426A00C8D0B6 /* GeometryLayernorm.cpp in Sources */, 4D6D7FD72656896D00F80814 /* SparseConvolutionTiledExecutor.cpp in Sources */, CECF8C82299CAD9400D3875B /* log_api.cpp in Sources */, 92FF03A823AA0B5A00AC97F6 /* WinogradOptFunction.cpp in Sources */, @@ -4131,7 +4127,7 @@ CODE_SIGN_STYLE = Automatic; DEAD_CODE_STRIPPING = YES; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 6G7464HHUS; + DEVELOPMENT_TEAM = Q48UX93J22; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -4218,7 +4214,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 6G7464HHUS; + DEVELOPMENT_TEAM = Q48UX93J22; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; HEADER_SEARCH_PATHS = ( diff --git a/pymnn/CMakeLists.txt b/pymnn/CMakeLists.txt index 6dc42231d..0813adb64 100644 --- a/pymnn/CMakeLists.txt +++ b/pymnn/CMakeLists.txt @@ -17,6 +17,10 @@ option(PYMNN_INTERNAL_SERVING "Internal use only." OFF) option(PYMNN_OPENCV_API "MNN OpenCV API be exposed" ON) option(PYMNN_IMGCODECS "MNN IMGCODECS API be exposed" OFF) +if (OHOS) + include($ENV{NODE_PATH}/@ali/tcpkg/tcpkg.cmake) +endif() + if(PYMNN_INTERNAL_SERVING) file(GLOB_RECURSE SRC ${CMAKE_CURRENT_LIST_DIR}/src/MNN.cc ${CMAKE_CURRENT_LIST_DIR}/src/internal/monitor_service.cc @@ -185,12 +189,20 @@ if(WIN32 OR APPLE OR CMAKE_SYSTEM_NAME MATCHES "^Linux") else() target_include_directories(mnnpybridge PRIVATE ${MNN_DIR}/pymnn/src ${MNN_DIR}/pymnn/android/src/main/c/include) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${MNN_DIR}/pymnn/android/src/main/jniLibs/${ANDROID_ABI}) - target_link_libraries(mnnpybridge PRIVATE log MNN MNN_Express MNNOpenCV) - if(PYMNN_USE_ALINNPYTHON) - target_link_libraries(mnnpybridge PRIVATE AliNNPython) - endif() - if(PYMNN_NUMPY_USABLE) - target_link_libraries(mnnpybridge PRIVATE numpy_python) + if (OHOS) + target_link_libraries(mnnpybridge PRIVATE tcpkg::mnn) + if(PYMNN_USE_ALINNPYTHON) + target_link_libraries(mnnpybridge PRIVATE tcpkg::alinnpython) + endif() + export_headers(DIR ${CMAKE_SOURCE_DIR}/pip_package/MNN) + else() + target_link_libraries(mnnpybridge PRIVATE log MNN MNN_Express MNNOpenCV) + if(PYMNN_USE_ALINNPYTHON) + target_link_libraries(mnnpybridge PRIVATE AliNNPython) + endif() + if(PYMNN_NUMPY_USABLE) + target_link_libraries(mnnpybridge PRIVATE numpy_python) + endif() endif() endif() diff --git a/schema/current/MNN_generated.h b/schema/current/MNN_generated.h index 45b397ee8..14ae9e4e9 100644 --- a/schema/current/MNN_generated.h +++ b/schema/current/MNN_generated.h @@ -24,6 +24,9 @@ struct ExtraT; struct StringVec; struct StringVecT; +struct AttentionParam; +struct AttentionParamT; + struct FmhaV2Param; struct FmhaV2ParamT; @@ -69,6 +72,8 @@ inline const flatbuffers::TypeTable *ExtraTypeTable(); inline const flatbuffers::TypeTable *StringVecTypeTable(); +inline const flatbuffers::TypeTable *AttentionParamTypeTable(); + inline const flatbuffers::TypeTable *FmhaV2ParamTypeTable(); inline const flatbuffers::TypeTable *FmhcaParamTypeTable(); @@ -261,6 +266,7 @@ enum OpType { OpType_BatchNorm = 267, OpType_ConvTranspose3D = 268, OpType_ZeroGrad = 269, + OpType_Attention = 299, OpType_FmhaV2 = 300, OpType_Fmhca = 301, OpType_SeqLen2Spatial = 302, @@ -281,7 +287,7 @@ enum OpType { OpType_MAX = OpType_GridSample }; -inline const OpType (&EnumValuesOpType())[181] { +inline const OpType (&EnumValuesOpType())[182] { static const OpType values[] = { OpType_AbsVal, OpType_QuantizedAdd, @@ -448,6 +454,7 @@ inline const OpType (&EnumValuesOpType())[181] { OpType_BatchNorm, OpType_ConvTranspose3D, OpType_ZeroGrad, + OpType_Attention, OpType_FmhaV2, OpType_Fmhca, OpType_SeqLen2Spatial, @@ -769,7 +776,7 @@ inline const char * const *EnumNamesOpType() { "", "", "", - "", + "Attention", "FmhaV2", "Fmhca", "SeqLen2Spatial", @@ -1185,11 +1192,12 @@ enum OpParameter { OpParameter_GroupNorm = 95, OpParameter_FmhaV2Param = 96, OpParameter_FmhcaParam = 97, + OpParameter_AttentionParam = 98, OpParameter_MIN = OpParameter_NONE, - OpParameter_MAX = OpParameter_FmhcaParam + OpParameter_MAX = OpParameter_AttentionParam }; -inline const OpParameter (&EnumValuesOpParameter())[98] { +inline const OpParameter (&EnumValuesOpParameter())[99] { static const OpParameter values[] = { OpParameter_NONE, OpParameter_QuantizedAdd, @@ -1288,7 +1296,8 @@ inline const OpParameter (&EnumValuesOpParameter())[98] { OpParameter_CumSum, OpParameter_GroupNorm, OpParameter_FmhaV2Param, - OpParameter_FmhcaParam + OpParameter_FmhcaParam, + OpParameter_AttentionParam }; return values; } @@ -1393,13 +1402,14 @@ inline const char * const *EnumNamesOpParameter() { "GroupNorm", "FmhaV2Param", "FmhcaParam", + "AttentionParam", nullptr }; return names; } inline const char *EnumNameOpParameter(OpParameter e) { - if (e < OpParameter_NONE || e > OpParameter_FmhcaParam) return ""; + if (e < OpParameter_NONE || e > OpParameter_AttentionParam) return ""; const size_t index = static_cast(e); return EnumNamesOpParameter()[index]; } @@ -1796,6 +1806,10 @@ template<> struct OpParameterTraits { static const OpParameter enum_value = OpParameter_FmhcaParam; }; +template<> struct OpParameterTraits { + static const OpParameter enum_value = OpParameter_AttentionParam; +}; + struct OpParameterUnion { OpParameter type; void *value; @@ -2603,6 +2617,14 @@ struct OpParameterUnion { return type == OpParameter_FmhcaParam ? reinterpret_cast(value) : nullptr; } + AttentionParamT *AsAttentionParam() { + return type == OpParameter_AttentionParam ? + reinterpret_cast(value) : nullptr; + } + const AttentionParamT *AsAttentionParam() const { + return type == OpParameter_AttentionParam ? + reinterpret_cast(value) : nullptr; + } }; bool VerifyOpParameter(flatbuffers::Verifier &verifier, const void *obj, OpParameter type); @@ -2900,6 +2922,60 @@ inline flatbuffers::Offset CreateStringVec( flatbuffers::Offset CreateStringVec(flatbuffers::FlatBufferBuilder &_fbb, const StringVecT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +struct AttentionParamT : public flatbuffers::NativeTable { + typedef AttentionParam TableType; + bool kv_cache; + AttentionParamT() + : kv_cache(true) { + } +}; + +struct AttentionParam FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef AttentionParamT NativeTableType; + static const flatbuffers::TypeTable *MiniReflectTypeTable() { + return AttentionParamTypeTable(); + } + bool kv_cache() const { + return GetField(4, 1) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, 4) && + verifier.EndTable(); + } + AttentionParamT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(AttentionParamT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AttentionParamT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct AttentionParamBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_kv_cache(bool kv_cache) { + fbb_.AddElement(4, static_cast(kv_cache), 1); + } + explicit AttentionParamBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) { + start_ = fbb_.StartTable(); + } + AttentionParamBuilder &operator=(const AttentionParamBuilder &); + flatbuffers::Offset Finish() { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateAttentionParam( + flatbuffers::FlatBufferBuilder &_fbb, + bool kv_cache = true) { + AttentionParamBuilder builder_(_fbb); + builder_.add_kv_cache(kv_cache); + return builder_.Finish(); +} + +flatbuffers::Offset CreateAttentionParam(flatbuffers::FlatBufferBuilder &_fbb, const AttentionParamT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + struct FmhaV2ParamT : public flatbuffers::NativeTable { typedef FmhaV2Param TableType; int32_t heads; @@ -3784,6 +3860,9 @@ struct Op FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { const FmhcaParam *main_as_FmhcaParam() const { return main_type() == OpParameter_FmhcaParam ? static_cast(main()) : nullptr; } + const AttentionParam *main_as_AttentionParam() const { + return main_type() == OpParameter_AttentionParam ? static_cast(main()) : nullptr; + } const flatbuffers::String *name() const { return GetPointer(10); } @@ -4209,6 +4288,10 @@ template<> inline const FmhcaParam *Op::main_as() const { return main_as_FmhcaParam(); } +template<> inline const AttentionParam *Op::main_as() const { + return main_as_AttentionParam(); +} + struct OpBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; @@ -5006,6 +5089,32 @@ inline flatbuffers::Offset CreateStringVec(flatbuffers::FlatBufferBui _data); } +inline AttentionParamT *AttentionParam::UnPack(const flatbuffers::resolver_function_t *_resolver) const { + auto _o = new AttentionParamT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void AttentionParam::UnPackTo(AttentionParamT *_o, const flatbuffers::resolver_function_t *_resolver) const { + (void)_o; + (void)_resolver; + { auto _e = kv_cache(); _o->kv_cache = _e; }; +} + +inline flatbuffers::Offset AttentionParam::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AttentionParamT* _o, const flatbuffers::rehasher_function_t *_rehasher) { + return CreateAttentionParam(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateAttentionParam(flatbuffers::FlatBufferBuilder &_fbb, const AttentionParamT *_o, const flatbuffers::rehasher_function_t *_rehasher) { + (void)_rehasher; + (void)_o; + struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const AttentionParamT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; + auto _kv_cache = _o->kv_cache; + return MNN::CreateAttentionParam( + _fbb, + _kv_cache); +} + inline FmhaV2ParamT *FmhaV2Param::UnPack(const flatbuffers::resolver_function_t *_resolver) const { auto _o = new FmhaV2ParamT(); UnPackTo(_o, _resolver); @@ -5902,6 +6011,10 @@ inline bool VerifyOpParameter(flatbuffers::Verifier &verifier, const void *obj, auto ptr = reinterpret_cast(obj); return verifier.VerifyTable(ptr); } + case OpParameter_AttentionParam: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } default: return false; } } @@ -6308,6 +6421,10 @@ inline void *OpParameterUnion::UnPack(const void *obj, OpParameter type, const f auto ptr = reinterpret_cast(obj); return ptr->UnPack(resolver); } + case OpParameter_AttentionParam: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } default: return nullptr; } } @@ -6702,6 +6819,10 @@ inline flatbuffers::Offset OpParameterUnion::Pack(flatbuffers::FlatBufferB auto ptr = reinterpret_cast(value); return CreateFmhcaParam(_fbb, ptr, _rehasher).Union(); } + case OpParameter_AttentionParam: { + auto ptr = reinterpret_cast(value); + return CreateAttentionParam(_fbb, ptr, _rehasher).Union(); + } default: return 0; } } @@ -7096,6 +7217,10 @@ inline OpParameterUnion::OpParameterUnion(const OpParameterUnion &u) FLATBUFFERS value = new FmhcaParamT(*reinterpret_cast(u.value)); break; } + case OpParameter_AttentionParam: { + value = new AttentionParamT(*reinterpret_cast(u.value)); + break; + } default: break; } @@ -7588,6 +7713,11 @@ inline void OpParameterUnion::Reset() { delete ptr; break; } + case OpParameter_AttentionParam: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } default: break; } value = nullptr; @@ -7776,12 +7906,13 @@ inline const flatbuffers::TypeTable *OpTypeTypeTable() { { flatbuffers::ET_INT, 0, 0 }, { flatbuffers::ET_INT, 0, 0 }, { flatbuffers::ET_INT, 0, 0 }, + { flatbuffers::ET_INT, 0, 0 }, { flatbuffers::ET_INT, 0, 0 } }; static const flatbuffers::TypeFunction type_refs[] = { OpTypeTypeTable }; - static const int64_t values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 300, 301, 302, 303, 304, 512, 513, 514, 515, 516, 517, 518, 600, 601, 603, 604 }; + static const int64_t values[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 299, 300, 301, 302, 303, 304, 512, 513, 514, 515, 516, 517, 518, 600, 601, 603, 604 }; static const char * const names[] = { "AbsVal", "QuantizedAdd", @@ -7948,6 +8079,7 @@ inline const flatbuffers::TypeTable *OpTypeTypeTable() { "BatchNorm", "ConvTranspose3D", "ZeroGrad", + "Attention", "FmhaV2", "Fmhca", "SeqLen2Spatial", @@ -7966,7 +8098,7 @@ inline const flatbuffers::TypeTable *OpTypeTypeTable() { "GridSample" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_ENUM, 181, type_codes, type_refs, values, names + flatbuffers::ST_ENUM, 182, type_codes, type_refs, values, names }; return &tt; } @@ -8070,7 +8202,8 @@ inline const flatbuffers::TypeTable *OpParameterTypeTable() { { flatbuffers::ET_SEQUENCE, 0, 93 }, { flatbuffers::ET_SEQUENCE, 0, 94 }, { flatbuffers::ET_SEQUENCE, 0, 95 }, - { flatbuffers::ET_SEQUENCE, 0, 96 } + { flatbuffers::ET_SEQUENCE, 0, 96 }, + { flatbuffers::ET_SEQUENCE, 0, 97 } }; static const flatbuffers::TypeFunction type_refs[] = { QuantizedAddTypeTable, @@ -8169,7 +8302,8 @@ inline const flatbuffers::TypeTable *OpParameterTypeTable() { CumSumTypeTable, GroupNormTypeTable, FmhaV2ParamTypeTable, - FmhcaParamTypeTable + FmhcaParamTypeTable, + AttentionParamTypeTable }; static const char * const names[] = { "NONE", @@ -8269,10 +8403,11 @@ inline const flatbuffers::TypeTable *OpParameterTypeTable() { "CumSum", "GroupNorm", "FmhaV2Param", - "FmhcaParam" + "FmhcaParam", + "AttentionParam" }; static const flatbuffers::TypeTable tt = { - flatbuffers::ST_UNION, 98, type_codes, type_refs, nullptr, names + flatbuffers::ST_UNION, 99, type_codes, type_refs, nullptr, names }; return &tt; } @@ -8376,6 +8511,19 @@ inline const flatbuffers::TypeTable *StringVecTypeTable() { return &tt; } +inline const flatbuffers::TypeTable *AttentionParamTypeTable() { + static const flatbuffers::TypeCode type_codes[] = { + { flatbuffers::ET_BOOL, 0, -1 } + }; + static const char * const names[] = { + "kv_cache" + }; + static const flatbuffers::TypeTable tt = { + flatbuffers::ST_TABLE, 1, type_codes, nullptr, nullptr, names + }; + return &tt; +} + inline const flatbuffers::TypeTable *FmhaV2ParamTypeTable() { static const flatbuffers::TypeCode type_codes[] = { { flatbuffers::ET_INT, 0, -1 } diff --git a/schema/default/MNN.fbs b/schema/default/MNN.fbs index 54626df04..b5d8b5756 100644 --- a/schema/default/MNN.fbs +++ b/schema/default/MNN.fbs @@ -187,6 +187,7 @@ enum OpType : int { ZeroGrad, // User define op + Attention = 299, FmhaV2 = 300, Fmhca = 301, SeqLen2Spatial = 302, @@ -218,7 +219,7 @@ table Extra { engine: string; info: [byte]; attr:[Attribute]; - // The Extra Op can be vectorized for execution + // The Extra Op can be vectorized for execution vector: bool; } @@ -226,10 +227,14 @@ table StringVec { data: [string]; } +table AttentionParam { + kv_cache: bool = true; +} + table FmhaV2Param { heads: int; } - + table FmhcaParam { heads: int; } @@ -408,7 +413,8 @@ union OpParameter { CumSum, GroupNorm, FmhaV2Param, - FmhcaParam + FmhcaParam, + AttentionParam } table Op { diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S index a46d4bf12..9620c93eb 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_sdot.S @@ -53,7 +53,7 @@ asm_function MNNGemmHybridInt4FP16_sdot // int32_t useInt8; //}; -//void MNNGemmHybridInt4_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); +//void MNNGemmHybridInt4_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); // Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param @@ -79,8 +79,6 @@ lsl x13, x3, #5 // x13 = src_depth_quad * UNIT * UNIT_SRC / 2(int4) = src_depth_ ld1 {v6.16b, v7.16b}, [x14] // mask movi v14.16b, #15 -// offset -movi v15.16b, #8 TILE_4: cmp x6, #4 blt TILE_1 @@ -120,22 +118,14 @@ LoopSz_TILE_4: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 // dst : 2 x 4 x [4] : v16-23 - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v4.16b, v5.16b}, [x24], x15 // src // int4 to int8: v0, v1, v2, v3 - ushr v9.16b, v0.16b, #4 - ushr v12.16b, v1.16b, #4 - and v8.16b, v0.16b, v14.16b - and v13.16b, v1.16b, v14.16b - sub v9.16b, v9.16b, v15.16b - sub v8.16b, v8.16b, v15.16b - sub v12.16b, v12.16b, v15.16b - sub v13.16b, v13.16b, v15.16b - zip1 v0.16b, v9.16b, v8.16b - zip2 v1.16b, v9.16b, v8.16b - zip1 v2.16b, v12.16b, v13.16b - zip2 v3.16b, v12.16b, v13.16b - + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v14.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v14.16b + mov v10.d[0], v4.d[1] mov v10.d[1], v4.d[0] mov v11.d[1], v5.d[0] @@ -244,21 +234,13 @@ LoopSz_TILE_1: // src : 1 x [1 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 // dst : 1 x 4 x [2] : v16-v19 - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v4.8b}, [x24], x15 // src // int4 to int8: v0, v1, v2, v3 - ushr v16.16b, v0.16b, #4 - ushr v17.16b, v1.16b, #4 - and v18.16b, v0.16b, v14.16b - and v19.16b, v1.16b, v14.16b - sub v16.16b, v16.16b, v15.16b - sub v18.16b, v18.16b, v15.16b - sub v17.16b, v17.16b, v15.16b - sub v19.16b, v19.16b, v15.16b - zip1 v0.16b, v16.16b, v18.16b - zip2 v1.16b, v16.16b, v18.16b - zip1 v2.16b, v17.16b, v19.16b - zip2 v3.16b, v17.16b, v19.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v14.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v14.16b mov v29.d[0], v4.d[1] mov v29.d[1], v4.d[0] diff --git a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S index 07c65b1fd..62a3053ee 100644 --- a/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S +++ b/source/backend/arm82/asm/arm64/low_memory/MNNGemmHybridInt4FP16_smmla.S @@ -64,7 +64,7 @@ asm_function MNNGemmHybridInt4FP16_smmla // int32_t useInt8; //}; -//void MNNGemmHybridInt4_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); +//void MNNGemmHybridInt4_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); // Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param @@ -135,22 +135,14 @@ LoopDz_TILE_8: LoopSz_TILE_8: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 - // dst : 2 x 4 x [4] : v16-23 - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + // dst : 2 x 4 x [4] : v16-31 + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v4.16b, v5.16b, v6.16b, v7.16b}, [x24], x15 // src // int4 to int8: v0, v1, v2, v3 - ushr v8.16b, v0.16b, #4 - and v9.16b, v0.16b, v10.16b - sub v8.16b, v8.16b, v11.16b - sub v9.16b, v9.16b, v11.16b - ushr v12.16b, v1.16b, #4 - and v13.16b, v1.16b, v10.16b - sub v12.16b, v12.16b, v11.16b - sub v13.16b, v13.16b, v11.16b - zip1 v0.16b, v8.16b, v9.16b - zip2 v1.16b, v8.16b, v9.16b - zip1 v2.16b, v12.16b, v13.16b - zip2 v3.16b, v12.16b, v13.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v10.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v10.16b .inst 0x4e80a490 // smmla v16.4s, v4.16b, v0.16b // batch=0,1, oc=0,1 .inst 0x4e81a491 // smmla v17.4s, v4.16b, v1.16b // batch=0,1, oc=2,3 @@ -270,21 +262,13 @@ LoopSz_TILE_4: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 // dst : 2 x 4 x [4] : v16-23 - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v4.16b, v5.16b}, [x24], x15 // src // int4 to int8: v0, v1, v2, v3 - ushr v8.16b, v0.16b, #4 - and v9.16b, v0.16b, v10.16b - sub v8.16b, v8.16b, v11.16b - sub v9.16b, v9.16b, v11.16b - ushr v12.16b, v1.16b, #4 - and v13.16b, v1.16b, v10.16b - sub v12.16b, v12.16b, v11.16b - sub v13.16b, v13.16b, v11.16b - zip1 v0.16b, v8.16b, v9.16b - zip2 v1.16b, v8.16b, v9.16b - zip1 v2.16b, v12.16b, v13.16b - zip2 v3.16b, v12.16b, v13.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v10.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v10.16b .inst 0x4e80a490 // smmla v16.4s, v4.16b, v0.16b .inst 0x4e81a491 // smmla v17.4s, v4.16b, v1.16b @@ -313,7 +297,7 @@ LoopSzEnd_TILE_4: trn2 v5.2d, v8.2d, v8.2d // alpha: oc 2,3,2,3 trn1 v6.2d, v9.2d, v9.2d // alpha: oc 4,5,4,5 trn2 v7.2d, v9.2d, v9.2d // alpha: oc 6,7,6,7 - + MulScale_New v16, v17, v18, v19, v0, v4, v5, v6, v7 MulScale_New v20, v21, v22, v23, v1, v4, v5, v6, v7 Float32ToHalf v16, v17, v18, v19, v0, v1 // (batch,oc) v12:(0,0)(0,1)(1,0)(1,1)(0,2)(0,3)(1,3)(1,2) @@ -372,21 +356,13 @@ LoopSz_TILE_2: // src : 1 x [2 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 // dst : 1 x 4 x [4] : v16-19 - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v4.16b}, [x24], x15 // src - // int4 to int8: v0, v1, v2, v3 - ushr v8.16b, v0.16b, #4 - and v9.16b, v0.16b, v10.16b - sub v8.16b, v8.16b, v11.16b - sub v9.16b, v9.16b, v11.16b - ushr v12.16b, v1.16b, #4 - and v13.16b, v1.16b, v10.16b - sub v12.16b, v12.16b, v11.16b - sub v13.16b, v13.16b, v11.16b - zip1 v0.16b, v8.16b, v9.16b - zip2 v1.16b, v8.16b, v9.16b - zip1 v2.16b, v12.16b, v13.16b - zip2 v3.16b, v12.16b, v13.16b + // int4 to int8: v0, v1, v2, v3 + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v10.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v10.16b .inst 0x4e80a490 // smmla v16.4s, v4.16b, v0.16b .inst 0x4e81a491 // smmla v17.4s, v4.16b, v1.16b @@ -409,10 +385,10 @@ LoopSzEnd_TILE_2: trn2 v7.2d, v9.2d, v9.2d // alpha: oc 6,7,6,7 MulScale_New v16, v17, v18, v19, v0, v4, v5, v6, v7 Float32ToHalf v16, v17, v18, v19, v0, v1 // (batch,oc) v12:(0,0)(0,1)(1,0)(1,1)(0,2)(0,3)(1,3)(1,2) - + uzp1 v4.4s, v0.4s, v1.4s uzp2 v5.4s, v0.4s, v1.4s - + Tile2Dequant: ld1 {v16.8h}, [x20], #16 // zero ld1 {v17.8h}, [x21], #16 // bias @@ -463,22 +439,14 @@ LoopSz_TILE_1: // dst : 1 x 4 x [2] : v16-v19 prfm pldl1keep, [x25, #64] // 预取下一次权重数据 prfm pldl1keep, [x24, x15] // 预取下一次源数据 - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v4.8b}, [x24], x15 // src // int4 to int8: v0, v1, v2, v3 - ushr v8.16b, v0.16b, #4 - and v9.16b, v0.16b, v10.16b - sub v8.16b, v8.16b, v11.16b - sub v9.16b, v9.16b, v11.16b - ushr v12.16b, v1.16b, #4 - and v13.16b, v1.16b, v10.16b - sub v12.16b, v12.16b, v11.16b - sub v13.16b, v13.16b, v11.16b - zip1 v0.16b, v8.16b, v9.16b - zip2 v1.16b, v8.16b, v9.16b - zip1 v2.16b, v12.16b, v13.16b - zip2 v3.16b, v12.16b, v13.16b - + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v10.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v10.16b + .inst 0x4e84a410 // smmla v16.4s, v0.16b, v4.16b .inst 0x4e84a431 // smmla v17.4s, v1.16b, v4.16b .inst 0x4e84a452 // smmla v18.4s, v2.16b, v4.16b @@ -505,7 +473,7 @@ LoopSzEnd_TILE_1: fcvtn v17.4h, v20.4s fcvtn2 v17.8h, v21.4s Tile1Dequant: - + ld1 {v1.8h}, [x20], #16 // zero ld1 {v2.8h}, [x21], #16 // bias ld1 {v3.h}[0], [x22] // sums @@ -535,4 +503,4 @@ ldp d12, d13, [sp, #(16 * 1)] ldp d14, d15, [sp], #(16 * 9) ret -#endif \ No newline at end of file +#endif diff --git a/source/backend/cpu/CPUAttention.cpp b/source/backend/cpu/CPUAttention.cpp new file mode 100644 index 000000000..43b4206d9 --- /dev/null +++ b/source/backend/cpu/CPUAttention.cpp @@ -0,0 +1,462 @@ +// +// CPUAttention.cpp +// MNN +// +// Created by MNN on 2024/03/19. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE + +#include +#include "CPUAttention.hpp" +#include "CPUBackend.hpp" +#include "compute/CommonOptFunction.h" +#include "core/Macro.h" +#include "core/Concurrency.h" +#include "core/BufferAllocator.hpp" +#include "core/TensorUtils.hpp" +#include "core/OpCommonUtils.hpp" + +#if defined (__aarch64__) +#define FLOAT16_T __fp16 +#else +#define FLOAT16_T float +#endif + + +namespace MNN { + +template +static void prefill_pack(Tensor* query, Tensor* key, Tensor* value, char* query_ptr, char* key_ptr, char* value_ptr, + int mMaxLength, int mNumHead, int mHeadDim, int mValueH, + int eP, int hP, int query_e, int key_h, int seq_len, int h) { + auto query_src = query->host(); + auto key_src = key->host(); + auto value_src = value->host(); + auto query_dst = reinterpret_cast(query_ptr); + auto key_dst = reinterpret_cast(key_ptr); + auto value_dst = reinterpret_cast(value_ptr); + // transpose query: [seq_len, num_head, head_dim] -> numhead, [seq_len/eP, head_dim, eP] + for (int i = 0; i < query_e; i++) { + for (int j = 0; j < mHeadDim; j++) { + for (int k = 0; k < eP; k++) { + int s = i * eP + k; + if (s < seq_len) { + query_dst[i * mHeadDim * eP + j * eP + k] = query_src[s * mNumHead * mHeadDim + h * mHeadDim + j]; + } + } + } + } + // transpose key: [seq_len, num_head, head_dim] -> numhead, [seq_len/hP, head_dim, hP] + for (int i = 0; i < key_h; i++) { + for (int j = 0; j < mHeadDim; j++) { + for (int k = 0; k < hP; k++) { + int s = i * hP + k; + if (s < seq_len) { + key_dst[i * mHeadDim * hP + j * hP + k] = key_src[s * mNumHead * mHeadDim + h * mHeadDim + j]; + } + } + } + } + // transpose value: [seq_len, num_head, head_dim] -> numhead, [head_dim/hP, seq_len, hP] + for (int i = 0; i < mValueH; i++) { + for (int j = 0; j < seq_len; j++) { + for (int k = 0; k < hP; k++) { + int hd = i * hP + k; + if (hd < mHeadDim) { + value_dst[i * mMaxLength * hP + j * hP + k] = value_src[j * mNumHead * mHeadDim + h * mHeadDim + hd]; + } + } + } + } +} + +template +static void decode_pack(Tensor* query, Tensor* key, Tensor* value, char* query_ptr, char* key_ptr, char* value_ptr, + int mMaxLength, int mPastLength, int mHeadDim, int mValueH, int eP, int hP, int h) { + auto query_src = query->host(); + auto key_src = key->host(); + auto value_src = value->host(); + auto query_dst = reinterpret_cast(query_ptr); + auto key_dst = reinterpret_cast(key_ptr); + auto value_dst = reinterpret_cast(value_ptr); + for (int i = 0; i < mHeadDim; i++) { + query_dst[i * eP] = query_src[h * mHeadDim + i]; + } + // transpose key: [1, num_head, head_dim] -> numhead, [kv_seq_len/hP, head_dim, hP] + int outside_offset = UP_DIV(mPastLength, hP); + int inside_offset = mPastLength % hP; + for (int i = 0; i < mHeadDim; i++) { + key_dst[(outside_offset - (inside_offset != 0)) * mHeadDim * hP + i * hP + inside_offset] = key_src[h * mHeadDim + i]; + } + // transpose value: [1, num_head, head_dim] -> numhead, [head_dim/hP, kv_seq_len, hP] + for (int i = 0; i < mValueH; i++) { + for (int j = 0; j < hP; j++) { + value_dst[i * mMaxLength * hP + mPastLength * hP + j] = value_src[h * mHeadDim + i * hP + j]; + } + } +} + +template +static void prefill_unpack(char* pack_qkv, char* unpack_qkv, int mNumHead, int mHeadDim, int unit, int seq_len) { + auto src_ptr = reinterpret_cast(pack_qkv); + auto dst_ptr = reinterpret_cast(unpack_qkv); + for (int i = 0; i < seq_len; i++) { + for (int j = 0; j < mHeadDim; j++) { + int a = j / unit; + int b = j % unit; + dst_ptr[i * mNumHead * mHeadDim + j] = src_ptr[a * seq_len * unit + i * unit + b]; + } + } +} + +template +static void prefill_softmax(int* mask_ptr, float* mask_qk, float* softmax_qk, char* unpack_qk, char* pack_qk, + float mScale, int eP, int query_e, int seq_len, float min_val) { + T* qk_src = reinterpret_cast(unpack_qk); + T* qk_dst = reinterpret_cast(pack_qk); + for (int i = 0; i < seq_len * seq_len; i++) { + if (mask_ptr[i]) { + mask_qk[i] = qk_src[i] * mScale; + } else { + mask_qk[i] = min_val; + } + } + for (int i = 0; i < seq_len; i++) { + MNNSoftmax(softmax_qk + i * seq_len, mask_qk + i * seq_len, seq_len); + } + for (int i = 0; i < query_e; i++) { + for (int j = 0; j < seq_len; j++) { + for (int k = 0; k < eP; k++) { + int s = i * eP + k; + if (s < seq_len) { + qk_dst[i * seq_len * eP + j * eP + k] = softmax_qk[s * seq_len + j]; + } + } + } + } +} + +template +static void decode_softmax(float* mask_qk, float* softmax_qk, char* unpack_qk, char* pack_qk, + float mScale, int eP, int kv_seq_len) { + T* qk_src = reinterpret_cast(unpack_qk); + T* qk_dst = reinterpret_cast(pack_qk); + for (int i = 0; i < kv_seq_len; i++) { + mask_qk[i] = qk_src[i] * mScale; + } + // softmax + MNNSoftmax(softmax_qk, mask_qk, kv_seq_len); + // pack qk + for (int i = 0; i < kv_seq_len; i++) { + qk_dst[i * eP] = softmax_qk[i]; + } +} + +void CPUAttentionImpl::allocKVCache() { + if (!mKVCache || mPastLength < mMaxLength) { + return; + } + mMaxLength = mPastLength + mExpandChunk; + // past_key: [1, numhead, headdim, maxlen] -> numhead, [headdim, maxlen] -> pack_b -> numhead, [maxlen/hP, head_dim, hP] + mPastKey.reset(Tensor::createDevice({mNumHead, UP_DIV(mMaxLength, hP), mHeadDim, hP})); + // past_value: [1, numhead, maxlen, headdim] -> numhead, [maxlen, headdim] -> pack_b -> numhead, [head_dim/hP, max_len, hP] + mPastValue.reset(Tensor::createDevice({mNumHead, mValueH, mMaxLength, hP})); + backend()->onAcquireBuffer(mPastKey.get(), Backend::STATIC); + backend()->onAcquireBuffer(mPastValue.get(), Backend::STATIC); +} + +void CPUAttentionImpl::reallocKVCache() { + if (!mKVCache || mPastLength < mMaxLength) { + return; + } + mMaxLength = mPastLength + mExpandChunk; + // past_key: [1, numhead, headdim, maxlen] -> numhead, [headdim, maxlen] -> pack_b -> numhead, [maxlen/hP, head_dim, hP] + auto new_key = Tensor::createDevice({mNumHead, UP_DIV(mMaxLength, hP), mHeadDim, hP}); + // past_value: [1, numhead, maxlen, headdim] -> numhead, [maxlen, headdim] -> pack_b -> numhead, [head_dim/hP, max_len, hP] + auto new_value = Tensor::createDevice({mNumHead, mValueH, mMaxLength, hP}); + backend()->onAcquireBuffer(new_key, Backend::STATIC); + backend()->onAcquireBuffer(new_value, Backend::STATIC); + // copy + for (int h = 0; h < mNumHead; h++) { + ::memset(new_key->host() + h * UP_DIV(mMaxLength, hP) * mHeadDim * hP * bytes, 0, UP_DIV(mMaxLength, hP) * mHeadDim * hP * bytes); + ::memset(new_value->host() + h * mValueH * mMaxLength * hP * bytes, 0, mValueH * mMaxLength * hP * bytes); + ::memcpy(new_key->host() + h * UP_DIV(mMaxLength, hP) * mHeadDim * hP * bytes, + mPastKey->host() + h * UP_DIV(mPastLength, hP) * mHeadDim * hP * bytes, + UP_DIV(mPastLength, hP) * mHeadDim * hP * bytes); + for (int i = 0; i < mValueH; i++) { + ::memcpy(new_value->host() + (h * mValueH + i) * mMaxLength * hP * bytes, + mPastValue->host() + (h * mValueH + i) * mPastLength * hP * bytes, + mPastLength * hP * bytes); + } + } + mPastKey.reset(new_key); + mPastValue.reset(new_value); + mTempQK.reset(Tensor::createDevice({mThreadNum, eP + 2, mMaxLength})); + backend()->onAcquireBuffer(mTempQK.get(), Backend::STATIC); +} + +ErrorCode CPUAttentionImpl::onResize(Backend* _backend, const std::vector& inputs, const std::vector& outputs) { + mBackend = _backend; + auto core = static_cast(backend())->functions(); + int unit = core->pack; + bytes = core->bytes; + core->MNNGetMatMulPackMode(&eP, &lP, &hP); + + auto query = inputs[0]; + auto key = inputs[1]; + auto value = inputs[2]; + auto mask = inputs[3]; + auto shape = query->shape(); + int seq_len = shape[1]; + mThreadNum = ((CPUBackend *)backend())->threadNumber(); + mIsDecode = seq_len == 1; + if (mPastLength == 0 || seq_len > 1) { + mPastLength = seq_len; + } + mNumHead = shape[2]; + mHeadDim = shape[3]; + mScale = 1.0 / sqrt(mHeadDim); + mValueH = UP_DIV(mHeadDim, hP); + int query_e = UP_DIV(seq_len, eP); + int key_h = UP_DIV(seq_len, hP); + // mPastLength = 10; + // alloc kv cache + allocKVCache(); + + int tileCount = UP_DIV(mNumHead, mThreadNum); + + // temp_query + mPackQ.reset(Tensor::createDevice({mThreadNum, query_e, mHeadDim, eP})); + mPackQKV.reset(Tensor::createDevice({mThreadNum, UP_DIV(mHeadDim, unit), seq_len, unit})); + if (mIsDecode) { + mTempQK.reset(Tensor::createDevice({mThreadNum, eP + 2, mMaxLength})); + backend()->onAcquireBuffer(mTempQK.get(), Backend::DYNAMIC); + } else { + mTempQK.reset(Tensor::createDevice({mThreadNum, 4, seq_len, seq_len})); + backend()->onAcquireBuffer(mTempQK.get(), Backend::DYNAMIC); + } + backend()->onAcquireBuffer(mPackQ.get(), Backend::DYNAMIC); + backend()->onAcquireBuffer(mPackQKV.get(), Backend::DYNAMIC); + backend()->onReleaseBuffer(mPackQ.get(), Backend::DYNAMIC); + backend()->onReleaseBuffer(mTempQK.get(), Backend::DYNAMIC); + backend()->onReleaseBuffer(mPackQKV.get(), Backend::DYNAMIC); + return NO_ERROR; +} + +ErrorCode CPUAttentionImpl::onExecute(Backend* _backend, const std::vector& inputs, const std::vector& outputs) { + auto core = static_cast(backend())->functions(); + int unit = core->pack; + bytes = core->bytes; + core->MNNGetMatMulPackMode(&eP, &lP, &hP); + mBackend = _backend; + auto matmulUnit = core->MNNPackedMatMul; + auto matmulRemain = core->MNNPackedMatMulRemain; + + auto query = inputs[0]; + auto key = inputs[1]; + auto value = inputs[2]; + auto mask = inputs[3]; + auto shape = query->shape(); + int seq_len = shape[1]; + mThreadNum = ((CPUBackend *)backend())->threadNumber(); + mIsDecode = seq_len == 1; + if (mPastLength == 0 || seq_len > 1) { + mPastLength = seq_len; + } + mNumHead = shape[2]; + mHeadDim = shape[3]; + mScale = 1.0 / sqrt(mHeadDim); + mValueH = UP_DIV(mHeadDim, hP); + int query_e = UP_DIV(seq_len, eP); + int key_h = UP_DIV(seq_len, hP); + // mPastLength = 10; + + int tileCount = UP_DIV(mNumHead, mThreadNum); + + // try calloc kv cache + mPrefill = [=](int tId){ + auto pack_q = mPackQ->host() + tId * query_e * mHeadDim * eP * bytes; + auto pack_qk = mTempQK->host() + tId * 4 * seq_len * seq_len * bytes; + auto unpack_qk = pack_qk + seq_len * seq_len * 2 * bytes; + auto mask_qk = reinterpret_cast(pack_qk); + auto softmax_qk = reinterpret_cast(unpack_qk); + auto pack_qkv = mPackQKV->host() + tId * UP_DIV(mHeadDim, unit) * seq_len * unit * bytes; + + int head_index = tId * tileCount; + for (int h = head_index; h < head_index + tileCount && h < mNumHead; h++) { + // pack for matmul + auto key_dst = mPastKey->host() + h * UP_DIV(mMaxLength, hP) * mHeadDim * hP * bytes; + auto value_dst = mPastValue->host() + h * mValueH * mMaxLength * hP * bytes; + if (bytes == 2) { + prefill_pack(query, key, value, pack_q, key_dst, value_dst, mMaxLength, mNumHead, mHeadDim, mValueH, eP, hP, query_e, key_h, seq_len, h); + } else { + prefill_pack(query, key, value, pack_q, key_dst, value_dst, mMaxLength, mNumHead, mHeadDim, mValueH, eP, hP, query_e, key_h, seq_len, h); + } + // query @ key + int loop_e = seq_len / eP; + int remain = seq_len % eP; + for (int i = 0 ; i < loop_e; i++) { + size_t shapeParameters[6]; + size_t* parameters = shapeParameters; + parameters[0] = eP * bytes; + parameters[1] = mHeadDim; + parameters[2] = seq_len; + parameters[3] = seq_len * unit * bytes; + parameters[4] = 0; + parameters[5] = 0; + matmulUnit((float*)(pack_qk + (i * eP * unit) * bytes), (float*)(pack_q + (i * mHeadDim * eP) * bytes), (float*)key_dst, parameters, nullptr, nullptr, nullptr, nullptr); + } + { + size_t shapeParameters[6]; + size_t* parameters = shapeParameters; + parameters[0] = eP * bytes; + parameters[1] = mHeadDim; + parameters[2] = seq_len; + parameters[3] = seq_len * unit * bytes; + parameters[4] = 0; + parameters[5] = 0; + matmulRemain((float*)(pack_qk + (loop_e * eP * unit) * bytes), (float*)(pack_q + (loop_e * mHeadDim * eP) * bytes), (float*)key_dst, remain, parameters, nullptr, nullptr, nullptr, nullptr); + } + int area_offset[1] {seq_len}; + core->MNNUnpackCUnitTranspose((float*)unpack_qk, (float*)pack_qk, seq_len, seq_len, area_offset); + // div scale and mask + auto mask_ptr = mask->host(); + if (bytes == 2) { + prefill_softmax(mask_ptr, mask_qk, softmax_qk, unpack_qk, pack_qk, mScale, eP, query_e, seq_len, -65504.0); + } else { + prefill_softmax(mask_ptr, mask_qk, softmax_qk, unpack_qk, pack_qk, mScale, eP, query_e, seq_len, std::numeric_limits::lowest()); + } + // qk @ v + for (int i = 0 ; i < loop_e; i++) { + size_t shapeParameters[6]; + size_t* parameters = shapeParameters; + parameters[0] = eP * bytes; + parameters[1] = seq_len; + parameters[2] = mHeadDim; + parameters[3] = seq_len * unit * bytes; + parameters[4] = 0; + parameters[5] = (mMaxLength - seq_len) * hP * bytes; + matmulUnit((float*)(pack_qkv + (i * eP * unit) * bytes), (float*)(pack_qk + (i * seq_len * eP) * bytes), (float*)value_dst, parameters, nullptr, nullptr, nullptr, nullptr); + } + { + size_t shapeParameters[6]; + size_t* parameters = shapeParameters; + parameters[0] = eP * bytes; + parameters[1] = seq_len; + parameters[2] = mHeadDim; + parameters[3] = seq_len * unit * bytes; + parameters[4] = 0; + parameters[5] = (mMaxLength - seq_len) * hP * bytes; + matmulRemain((float*)(pack_qkv + (loop_e * eP * unit) * bytes), (float*)(pack_qk + (loop_e * seq_len * eP) * bytes), (float*)value_dst, remain, parameters, nullptr, nullptr, nullptr, nullptr); + } + // transpose: [head_dim/unit, seq_len, unit] -> [seq_len, num_head, head_dim] + auto dst_ptr = outputs[0]->host() + h * mHeadDim * bytes; + if (bytes == 2) { + prefill_unpack(pack_qkv, dst_ptr, mNumHead, mHeadDim, unit, seq_len); + } else { + prefill_unpack(pack_qkv, dst_ptr, mNumHead, mHeadDim, unit, seq_len); + } + } + }; + + mDecode = [=](int tId) { + int kv_seq_len = mPastLength + 1; + auto pack_q = mPackQ->host() + tId * mHeadDim * eP * bytes; + auto pack_qk = mTempQK->host() + tId * (eP + 2) * kv_seq_len * bytes; + auto unpack_qk = pack_qk + kv_seq_len * eP * bytes; + auto mask_qk = reinterpret_cast(pack_qk); + auto softmax_qk = reinterpret_cast(unpack_qk); + auto pack_qkv = mPackQKV->host() + tId * UP_DIV(mHeadDim, unit) * unit * bytes; + + int head_index = tId * tileCount; + for (int h = head_index; h < head_index + tileCount && h < mNumHead; h++) { + auto key_dst = mPastKey->host() + h * UP_DIV(mMaxLength, hP) * mHeadDim * hP * bytes; + auto value_dst = mPastValue->host() + h * mValueH * mMaxLength * hP * bytes; + // pack for matmul + if (bytes == 2) { + decode_pack(query, key, value, pack_q, key_dst, value_dst, mMaxLength, mPastLength, mHeadDim, mValueH, eP, hP, h); + } else { + decode_pack(query, key, value, pack_q, key_dst, value_dst, mMaxLength, mPastLength, mHeadDim, mValueH, eP, hP, h); + } + // query @ key: [1, head_dim] @ [head_dim, kv_seq_len] -> [1, kv_seq_len] + size_t shapeParameters[6]; + size_t* parameters = shapeParameters; + parameters[0] = eP * bytes; + parameters[1] = mHeadDim; + parameters[2] = kv_seq_len; + parameters[3] = seq_len * unit * bytes; + parameters[4] = 0; + parameters[5] = 0; + matmulRemain((float*)pack_qk, (float*)pack_q, (float*)key_dst, seq_len, parameters, nullptr, nullptr, nullptr, nullptr); + int area_offset[1] {seq_len}; + core->MNNUnpackCUnitTranspose((float*)unpack_qk, (float*)pack_qk, seq_len, kv_seq_len, area_offset); + if (bytes == 2) { + decode_softmax(mask_qk, softmax_qk, unpack_qk, pack_qk, mScale, eP, kv_seq_len); + } else { + decode_softmax(mask_qk, softmax_qk, unpack_qk, pack_qk, mScale, eP, kv_seq_len); + } + // qk @ v: [1, kv_seq_len] @ [kv_seq_len, head_dim] -> [1, head_dim] + { + size_t shapeParameters[6]; + size_t* parameters = shapeParameters; + parameters[0] = eP * bytes; + parameters[1] = kv_seq_len; + parameters[2] = mHeadDim; + parameters[3] = 1 * unit * bytes; + parameters[5] = (mMaxLength - kv_seq_len) * hP * bytes; + matmulRemain((float*)pack_qkv, (float*)pack_qk, (float*)value_dst, 1, parameters, nullptr, nullptr, nullptr, nullptr); + } + // transpose: [head_dim/unit, 1, unit] -> [1, num_head, head_dim] + auto dst_ptr = outputs[0]->host() + h * mHeadDim * bytes; + core->MNNUnpackCUnitTranspose((float*)dst_ptr, (float*)pack_qkv, 1, mHeadDim, area_offset); + } + }; + mFunction = mIsDecode ? mDecode : mPrefill; + reallocKVCache(); + // compute + MNN_CONCURRENCY_BEGIN(tId, mThreadNum) { + mFunction((int)tId); + } + MNN_CONCURRENCY_END(); + mPastLength += mIsDecode; + return NO_ERROR; +} + +CPUAttention::CPUAttention(Backend* backend, bool kv_cahce) : Execution(backend) { + mImpl.reset(new CPUAttentionImpl(backend, kv_cahce)); +} + +CPUAttention::CPUAttention(std::shared_ptr impl, Backend *backend) : Execution(backend), mImpl(impl) {} + +ErrorCode CPUAttention::onResize(const std::vector& inputs, const std::vector& outputs) { + return mImpl->onResize(backend(), inputs, outputs); +} + +ErrorCode CPUAttention::onExecute(const std::vector& inputs, const std::vector& outputs) { + return mImpl->onExecute(backend(), inputs, outputs); +} + +bool CPUAttention::onClone(Backend* bn, const Op* op, Execution** dst) { + if (nullptr == dst) { + return true; + } + *dst = new CPUAttention(mImpl, bn); + return true; +} + +class CPUAttentionCreator : public CPUBackend::Creator { +public: + virtual Execution* onCreate(const std::vector& inputs, const std::vector& outputs, + const MNN::Op* op, Backend* backend) const override { + auto param = op->main_as_AttentionParam(); + return new CPUAttention(backend, param->kv_cache()); + } +}; + +REGISTER_CPU_OP_CREATOR_TRANSFORMER(CPUAttentionCreator, OpType_Attention); + +} // namespace MNN + +#endif diff --git a/source/backend/cpu/CPUAttention.hpp b/source/backend/cpu/CPUAttention.hpp new file mode 100644 index 000000000..1cbc26aba --- /dev/null +++ b/source/backend/cpu/CPUAttention.hpp @@ -0,0 +1,58 @@ +// +// CPUAttention.hpp +// MNN +// +// Created by MNN on 2024/03/19. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE + +#ifndef CPUATTENTION_HPP +#define CPUATTENTION_HPP + +#include +#include "core/Execution.hpp" + +namespace MNN { + +class CPUAttentionImpl { +public: + CPUAttentionImpl(Backend *backend, bool kv_cache) : mBackend(backend), mKVCache(kv_cache) {} + ~CPUAttentionImpl() = default; + ErrorCode onResize(Backend *backend, const std::vector &inputs, const std::vector &outputs); + ErrorCode onExecute(Backend *backend, const std::vector &inputs, const std::vector &outputs); +private: + void allocKVCache(); + void reallocKVCache(); + Backend* backend() { return mBackend; } +private: + Backend* mBackend; + bool mKVCache; + float mScale; + const int mExpandChunk = 64; + int mThreadNum = 1; + bool mIsDecode = false; + int mPastLength = 0, mMaxLength = 0; + std::shared_ptr mPastKey, mPastValue, mTempQK; + std::shared_ptr mPackQ, mPackQKV; + int mNumHead = 0, mHeadDim = 0, mValueH = 0; + int eP, lP, hP, bytes; + std::function mFunction, mPrefill, mDecode; +}; + +class CPUAttention : public Execution { +public: + CPUAttention(Backend *backend, bool kv_cache); + CPUAttention(std::shared_ptr impl, Backend *backend); + virtual ~CPUAttention() = default; + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; +private: + std::shared_ptr mImpl; +}; +} // namespace MNN + +#endif // CPUATTENTION_HPP +#endif diff --git a/source/backend/cpu/CPUBackend.hpp b/source/backend/cpu/CPUBackend.hpp index ef481b354..7793b696c 100644 --- a/source/backend/cpu/CPUBackend.hpp +++ b/source/backend/cpu/CPUBackend.hpp @@ -93,7 +93,7 @@ class CPUBackend : public Backend { virtual void* onMapTensor(Tensor::MapType mtype, Tensor::DimensionType dtype, const Tensor* srcTensor) override; virtual bool onUnmapTensor(Tensor::MapType mtype, Tensor::DimensionType dtype, const Tensor* dstTensor, void* mapPtr) override; - + virtual void onResizeBegin() override; virtual ErrorCode onResizeEnd() override; @@ -194,6 +194,12 @@ class CastWrapExecution : public Execution { CPUBackend::addCreator(opType, &_temp); \ } +#define REGISTER_CPU_OP_CREATOR_TRANSFORMER(name, opType) \ + void ___##name##__##opType##__() { \ + static name _temp;\ + CPUBackend::addCreator(opType, &_temp); \ + } + } // namespace MNN #endif /* CPUBackend_hpp */ diff --git a/source/backend/cpu/CPULayerNorm.cpp b/source/backend/cpu/CPULayerNorm.cpp index 7446bea24..48225d960 100644 --- a/source/backend/cpu/CPULayerNorm.cpp +++ b/source/backend/cpu/CPULayerNorm.cpp @@ -105,6 +105,10 @@ ErrorCode CPULayerNorm::onResize(const std::vector &inputs, mInnerSize *= inputs.at(0)->length(i); } mInnerSize /= mResource->mGroup; + if (mResource->mIniGammaBeta) { + MNN_ASSERT(mResource->mGamma->size() == mInnerSize * sizeof(float)); + } + return NO_ERROR; } for (int i = 0; i < rank - mResource->mAxis; ++i) { @@ -113,6 +117,9 @@ ErrorCode CPULayerNorm::onResize(const std::vector &inputs, for (int i = rank - mResource->mAxis; i < rank; ++i) { mInnerSize *= inputs.at(0)->length(i); } + if (mResource->mIniGammaBeta) { + MNN_ASSERT(mResource->mGamma->size() == mInnerSize * sizeof(float)); + } if (CPUBackend::getDataType(inputs[0]) == DataType_DT_INT8 || inputs[0]->getType().bytes() == 1) { mInpZero.resize(1); mOutZero.resize(1); diff --git a/source/backend/cpu/CPUOPRegister.cpp b/source/backend/cpu/CPUOPRegister.cpp index b24bcb469..37f868732 100644 --- a/source/backend/cpu/CPUOPRegister.cpp +++ b/source/backend/cpu/CPUOPRegister.cpp @@ -75,6 +75,9 @@ extern void ___CPURasterAndInterpolateCreator__OpType_RasterAndInterpolate__(); extern void ___CPURasterDiffCreator__OpType_RasterDiff__(); extern void ___CPUTextureCreator__OpType_Texture__(); #endif +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE +extern void ___CPUAttentionCreator__OpType_Attention__(); +#endif void registerCPUOps() { ___CPUCropAndResizeCreator__OpType_CropAndResize__(); ___CPUArgMaxCreator__OpType_ArgMax__(); @@ -150,5 +153,8 @@ ___CPURasterAndInterpolateCreator__OpType_RasterAndInterpolate__(); ___CPURasterDiffCreator__OpType_RasterDiff__(); ___CPUTextureCreator__OpType_Texture__(); #endif +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE +___CPUAttentionCreator__OpType_Attention__(); +#endif } } diff --git a/source/backend/cpu/arm/CommonOptFunctionNeon.cpp b/source/backend/cpu/arm/CommonOptFunctionNeon.cpp index 6153281df..06180fcef 100644 --- a/source/backend/cpu/arm/CommonOptFunctionNeon.cpp +++ b/source/backend/cpu/arm/CommonOptFunctionNeon.cpp @@ -3,7 +3,7 @@ #ifdef MNN_USE_NEON #include #include "./FunctionSummary.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" extern "C" { void MNNTranspose32Bit4x4(int32_t* dstO, const int32_t* srcO, int32_t* dim); diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S index 2a3b61d48..83548cfd9 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32.S @@ -43,7 +43,7 @@ asm_function MNNGemmHybridInt4FP32 // int32_t useInt8; //}; -//void MNNGemmHybridInt4FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); +//void MNNGemmHybridInt4FP32(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); // Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param @@ -120,8 +120,6 @@ LoopSz_TILE_4: // int4->int8 ushr v8.16b, v0.16b, #4 and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b zip1 v0.16b, v8.16b, v9.16b Unit_TILE_4: @@ -244,8 +242,6 @@ LoopSz_TILE_1: // int4->int8 ushr v8.16b, v0.16b, #4 and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b zip1 v0.16b, v8.16b, v9.16b Unit_TILE_1: @@ -261,7 +257,7 @@ LoopSz_TILE_1: smlal v11.4s, v5.4h, v29.4h smlal v12.4s, v5.4h, v30.4h smlal v13.4s, v5.4h, v31.4h - + //.inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] subs x26, x26, #1 diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S index 05839505a..11bf247a5 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_sdot.S @@ -43,7 +43,7 @@ asm_function MNNGemmHybridInt4FP32_sdot // int32_t useInt8; //}; -//void MNNGemmHybridInt4FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); +//void MNNGemmHybridInt4FP32_sdot(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); // Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param @@ -99,11 +99,9 @@ LoopDz_TILE_12: movi v25.4s, #0 movi v26.4s, #0 movi v27.4s, #0 - + // mask movi v14.16b, #15 - // offset - movi v15.16b, #8 LoopSz_TILE_12: // src : 4(batch) x [1 x 4] : v4 // weight : 4(oc) x [1 x 4] : v0 @@ -113,8 +111,6 @@ LoopSz_TILE_12: // int4->int8 ushr v8.16b, v0.16b, #4 and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b zip1 v0.16b, v8.16b, v9.16b .inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] // batch0 .inst 0x4fa4e011 // sdot v17.4s, v0.16b, v4.4b[1] // batch1 @@ -203,11 +199,9 @@ LoopDz_TILE_8: movi v21.4s, #0 movi v22.4s, #0 movi v23.4s, #0 - + // mask movi v14.16b, #15 - // offset - movi v15.16b, #8 LoopSz_TILE_8: // src : 4(batch) x [1 x 4] : v4 // weight : 4(oc) x [1 x 4] : v0 @@ -217,8 +211,6 @@ LoopSz_TILE_8: // int4->int8 ushr v8.16b, v0.16b, #4 and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b zip1 v0.16b, v8.16b, v9.16b .inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] // batch0 .inst 0x4fa4e011 // sdot v17.4s, v0.16b, v4.4b[1] // batch1 @@ -294,8 +286,6 @@ LoopDz_TILE_4: dup v19.4s, wzr // mask movi v14.16b, #15 - // offset - movi v15.16b, #8 LoopSz_TILE_4: // src : 4(batch) x [1 x 4] : v4 // weight : 4(oc) x [1 x 4] : v0 @@ -305,8 +295,6 @@ LoopSz_TILE_4: // int4->int8 ushr v8.16b, v0.16b, #4 and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b zip1 v0.16b, v8.16b, v9.16b .inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] // batch0 .inst 0x4fa4e011 // sdot v17.4s, v0.16b, v4.4b[1] // batch1 @@ -368,8 +356,6 @@ LoopDz_TILE_1: dup v16.4s, wzr // mask movi v14.16b, #15 - // offset - movi v15.16b, #8 LoopSz_TILE_1: // src : 1(batch) x [1 x 4] : v4 // weight : 4(oc) x [1 x 4] : v0 @@ -379,10 +365,8 @@ LoopSz_TILE_1: // int4->int8 ushr v8.16b, v0.16b, #4 and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b zip1 v0.16b, v8.16b, v9.16b - + .inst 0x4f84e010 // sdot v16.4s, v0.16b, v4.4b[0] subs x26, x26, #1 diff --git a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S index 5d5831dcb..aa0b5a383 100644 --- a/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S +++ b/source/backend/cpu/arm/arm64/low_memory/MNNGemmHybridInt4FP32_smmla.S @@ -43,7 +43,7 @@ asm_function MNNGemmHybridInt4FP32_smmla // int32_t useInt8; //}; -//void MNNGemmHybridInt4FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); +//void MNNGemmHybridInt4FP32_smmla(float* C, const int8_t* A, const int8_t* B, size_t src_depth_quad, size_t dst_step, size_t dst_depth_quad, size_t realSize, float** param); // Auto: x0: C*, x1: A*, x2:B*, x3: src_depth_quad, x4: dst_step, x5: dst_depth_quad, x6: realSize, x7: param @@ -106,28 +106,18 @@ LoopDz_TILE_8: // mask movi v10.16b, #15 - // offset - movi v11.16b, #8 LoopSz_TILE_8: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 // dst : 2 x 4 x [4] : v16-23 //ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x25], #64 // weight - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight ld1 {v12.16b, v13.16b, v14.16b, v15.16b}, [x24], x15 // src // int4 to int8: v0, v1, v2, v3 - ushr v4.16b, v0.16b, #4 - and v5.16b, v0.16b, v10.16b - sub v4.16b, v4.16b, v11.16b - sub v5.16b, v5.16b, v11.16b - ushr v8.16b, v1.16b, #4 - and v9.16b, v1.16b, v10.16b - sub v8.16b, v8.16b, v11.16b - sub v9.16b, v9.16b, v11.16b - zip1 v0.16b, v4.16b, v5.16b - zip2 v1.16b, v4.16b, v5.16b - zip1 v2.16b, v8.16b, v9.16b - zip2 v3.16b, v8.16b, v9.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v10.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v10.16b .inst 0x4e80a590 // smmla v16.4s, v12.16b, v0.16b .inst 0x4e81a591 // smmla v17.4s, v12.16b, v1.16b @@ -247,27 +237,17 @@ LoopDz_TILE_4: dup v23.4s, wzr // mask movi v10.16b, #15 - // offset - movi v11.16b, #8 LoopSz_TILE_4: // src : 2 x [2 x 8] : v4-5 // weight : 4 x [2 x 8] : v0-3 // dst : 2 x 4 x [4] : v16-23 //ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x25], #64 // weight - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight // int4 to int8: v0, v1, v2, v3 - ushr v4.16b, v0.16b, #4 - and v5.16b, v0.16b, v10.16b - sub v4.16b, v4.16b, v11.16b - sub v5.16b, v5.16b, v11.16b - ushr v6.16b, v1.16b, #4 - and v7.16b, v1.16b, v10.16b - sub v6.16b, v6.16b, v11.16b - sub v7.16b, v7.16b, v11.16b - zip1 v0.16b, v4.16b, v5.16b - zip2 v1.16b, v4.16b, v5.16b - zip1 v2.16b, v6.16b, v7.16b - zip2 v3.16b, v6.16b, v7.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v10.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v10.16b ld1 {v4.16b, v5.16b}, [x24], x15 // src .inst 0x4e80a490 // smmla v16.4s, v4.16b, v0.16b .inst 0x4e81a491 // smmla v17.4s, v4.16b, v1.16b @@ -349,27 +329,17 @@ LoopDz_TILE_2: dup v19.4s, wzr // mask movi v14.16b, #15 - // offset - movi v15.16b, #8 LoopSz_TILE_2: // src : 1 x [2 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 // dst : 1 x 4 x [4] : v16-19 //ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x25], #64 // weight - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight // int4 to int8: v0, v1, v2, v3 - ushr v8.16b, v0.16b, #4 - and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b - ushr v10.16b, v1.16b, #4 - and v11.16b, v1.16b, v14.16b - sub v10.16b, v10.16b, v15.16b - sub v11.16b, v11.16b, v15.16b - zip1 v0.16b, v8.16b, v9.16b - zip2 v1.16b, v8.16b, v9.16b - zip1 v2.16b, v10.16b, v11.16b - zip2 v3.16b, v10.16b, v11.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v14.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v14.16b ld1 {v4.16b}, [x24], x15 // src .inst 0x4e80a490 // smmla v16.4s, v4.16b, v0.16b .inst 0x4e81a491 // smmla v17.4s, v4.16b, v1.16b @@ -438,28 +408,18 @@ LoopDz_TILE_1: dup v19.4s, wzr // mask movi v14.16b, #15 - // offset - movi v15.16b, #8 LoopSz_TILE_1: // src : 1 x [1 x 8] : v4 // weight : 4 x [2 x 8] : v0-3 // dst : 1 x 4 x [2] : v16-v19 //ld1 {v0.16b, v1.16b, v2.16b, v3.16b}, [x25], #64 // weight - ld1 {v0.16b, v1.16b}, [x25], #32 // weight + ld1 {v8.16b, v9.16b}, [x25], #32 // weight // int4 to int8: v0, v1, v2, v3 - ushr v8.16b, v0.16b, #4 - and v9.16b, v0.16b, v14.16b - sub v8.16b, v8.16b, v15.16b - sub v9.16b, v9.16b, v15.16b - ushr v10.16b, v1.16b, #4 - and v11.16b, v1.16b, v14.16b - sub v10.16b, v10.16b, v15.16b - sub v11.16b, v11.16b, v15.16b - zip1 v0.16b, v8.16b, v9.16b - zip2 v1.16b, v8.16b, v9.16b - zip1 v2.16b, v10.16b, v11.16b - zip2 v3.16b, v10.16b, v11.16b + ushr v0.16b, v8.16b, #4 + and v1.16b, v8.16b, v14.16b + ushr v2.16b, v9.16b, #4 + and v3.16b, v9.16b, v14.16b ld1 {v4.8b}, [x24], x15 // src .inst 0x4e84a410 // smmla v16.4s, v0.16b, v4.16b .inst 0x4e84a431 // smmla v17.4s, v1.16b, v4.16b diff --git a/source/backend/cpu/compute/CommonOptFunction.cpp b/source/backend/cpu/compute/CommonOptFunction.cpp index ef5b63130..acc2c3c5f 100644 --- a/source/backend/cpu/compute/CommonOptFunction.cpp +++ b/source/backend/cpu/compute/CommonOptFunction.cpp @@ -18,7 +18,7 @@ #include "math/Vec.hpp" #include #include "../CPURuntime.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" // TODO: Find better way to optimize it #include "../CPUBinary.hpp" #include "../CPUUnary.hpp" @@ -376,7 +376,7 @@ void MNN1BitCopyFast (uint8_t* dstO, const uint8_t* srcO, int size, int stride, #ifdef MNN_USE_SSE std::vector arr(16, val); auto val16 = _mm_loadu_ps((float*)arr.data()); - + for (; cnt >= 16; cnt-=16) { _mm_storeu_ps((float*)dstO, val16); dstO += 16; @@ -427,7 +427,7 @@ void MNNAccumulateSequenceNumber (float* dst, const float* src, int size) { if (size >= 8) { auto sum4_1 = _mm_set_ps1(0.f); auto sum4_2 = _mm_set_ps1(0.f); - + for (; i < size8; i += 8) { auto v4 = _mm_loadu_ps(src); auto u4 = _mm_loadu_ps(src + 4); @@ -435,7 +435,7 @@ void MNNAccumulateSequenceNumber (float* dst, const float* src, int size) { sum4_2 = _mm_add_ps(sum4_2, u4); src += 8; } - + sum4_1 = _mm_add_ps(sum4_1, sum4_2); _mm_storeu_ps(tmp, sum4_1); sum += (tmp[0] + tmp[1] + tmp[2] + tmp[3]); @@ -823,7 +823,7 @@ void MNNGemmHybridInt8FP32(float* C, const int8_t* A, const int8_t* B, size_t sr } } } - + // int32->float for (int cn = 0; cn < pack; ++cn) { float val = (float)tmp[cn] * scale[0]; @@ -873,7 +873,7 @@ void MNNGemmHybridInt4FP32(float* C, const int8_t* A, const int8_t* B, size_t sr } } } - + // int32->float for (int cn = 0; cn < pack; ++cn) { float val = (float)tmp[cn] * scale[0]; @@ -3333,7 +3333,7 @@ void MNNCoreFunctionInit() { gCoreFunction->MNNPoolingAvg = (decltype(gCoreFunction->MNNPoolingAvg))(poolingAvg); // Set min value as 1 << 24 gCoreFunction->MNNPoolingMax = (decltype(gCoreFunction->MNNPoolingMax))(poolingMax); - + gCoreFunction->MNNPoolingMaxWithRedice = (decltype(gCoreFunction->MNNPoolingMaxWithRedice))(poolingMaxWithRedice); // ImageProcess Functions gCoreFunction->MNNRGBAToBGRA = MNNRGBAToBGRA; @@ -3353,7 +3353,7 @@ void MNNCoreFunctionInit() { gCoreFunction->MNN4BitcopyFast = MNN4BitcopyFast; gCoreFunction->MNN2BitcopyFast = MNN2BitcopyFast; gCoreFunction->MNN1BitcopyFast = MNN1BitCopyFast; - + gCoreFunction->MNNAccumulateSequenceNumber = MNNAccumulateSequenceNumber; cpuinfo_arm_isa gCPUInfo; diff --git a/source/backend/cpu/compute/ConvolutionHybrid.cpp b/source/backend/cpu/compute/ConvolutionHybrid.cpp index 0c63ab728..b21ed220c 100644 --- a/source/backend/cpu/compute/ConvolutionHybrid.cpp +++ b/source/backend/cpu/compute/ConvolutionHybrid.cpp @@ -33,19 +33,7 @@ bool ConvolutionHybrid::initQuantizeResource(std::shared_ptrlU = lU; resource->hP = hP; resource->lP = lP; - // Reorder weight - auto dstWInt8 = resource->mWeight->host(); - auto srcWInt8 = int8Info->weight.get(); - // oc, ic -> oc/hP, ic/lP, hP, lP - for (int i = 0; i < hU; i++) { - for (int j = 0; j < lU; j++) { - for (int k = 0; k < hP; k++) { - for (int l = 0; l < lP; l++) { - dstWInt8[i * srcChannel * hP + j * hP * lP + k * lP + l] = srcWInt8[(i * hP + k) * srcChannel + (j * lP + l)]; - } - } - } - } + // Save scale bias resource->mDequantize.mScaleBias.reset(MNN::Tensor::createDevice({hU * hP * 2})); res = resource->backend->onAcquireBuffer(resource->mDequantize.mScaleBias.get(), Backend::STATIC); @@ -56,6 +44,12 @@ bool ConvolutionHybrid::initQuantizeResource(std::shared_ptr(reinterpret_cast(alphaPtr) + hU * hP * bytes); ::memset(alphaPtr, 0, 2 * hU * hP * bytes); int h = int8Info->alpha.size(); + if (int8Info->canUseInt4) { + // int4 to uint4, -8 offset merge to bias + for (int i = 0; i < h/2; ++i) { + int8Info->alpha.get()[2 * i] -= 8 * int8Info->alpha.get()[2 * i + 1]; + } + } if (bytes == 2) { auto core = static_cast(resource->backend)->functions(); if (int8Info->asymmetric) { @@ -86,21 +80,53 @@ bool ConvolutionHybrid::initQuantizeResource(std::shared_ptrmDequantize.bits = 4; - std::shared_ptr weightLow(Tensor::createDevice( - {weightLength})); - auto res = resource->backend->onAcquireBuffer(weightLow.get(), Backend::STATIC); - if (!res) { - return false; + + auto srcPtr = int8Info->weight.get(); + auto dstPtr = resource->mWeight->host(); + // oc, ic -> oc/hP, ic/lP, hP, lP + if (hP == 8 && lP == 8) { + for (int i = 0; i < hU; i++) { + for (int j = 0; j < lU; j++) { + for (int k = 0; k < 2; k++) { + for (int n = 0; n < 16; n++) { + int hp_idx = n / 8; + int lp_idx = n % 8; + int s0 = srcPtr[(i * hP + k * 4 + hp_idx) * srcChannel + (j * lP + lp_idx)]; + int s1 = srcPtr[(i * hP + k * 4 + hp_idx + 2) * srcChannel + (j * lP + lp_idx)]; + int d = (s0 + 8) * 16 + (s1 + 8); + dstPtr[(i * srcChannel * hP + j * hP * lP + k * 32) / 2 + n] = (uint8_t)d; + } + } + } + } + } else { + for (int i = 0; i < hU; i++) { + for (int j = 0; j < lU; j++) { + for (int k = 0; k < hP; k++) { + for (int l = 0; l < lP; l+=2) { + int s0 = srcPtr[(i * hP + k) * srcChannel + (j * lP + l)]; + int s1 = srcPtr[(i * hP + k) * srcChannel + (j * lP + l + 1)]; + int d = (s0 + 8) * 16 + (s1 + 8); + dstPtr[(i * srcChannel * hP + j * hP * lP + k * lP + l) / 2] = d; + } + } + } + } } - auto srcPtr = resource->mWeight->host(); - auto dstPtr = weightLow->host(); - for (int i=0; i < weightLength; ++i) { - int s0 = srcPtr[2 * i + 0]; - int s1 = srcPtr[2 * i + 1]; - int d = (s0 + 8) * 16 + (s1 + 8); - dstPtr[i] = d; + } else { + // Reorder weight for int8 + auto dstWInt8 = resource->mWeight->host(); + auto srcWInt8 = int8Info->weight.get(); + // oc, ic -> oc/hP, ic/lP, hP, lP + for (int i = 0; i < hU; i++) { + for (int j = 0; j < lU; j++) { + for (int k = 0; k < hP; k++) { + for (int l = 0; l < lP; l++) { + dstWInt8[i * srcChannel * hP + j * hP * lP + k * lP + l] = srcWInt8[(i * hP + k) * srcChannel + (j * lP + l)]; + } + } + } } - resource->mWeight = weightLow; } return true; } @@ -129,10 +155,10 @@ ConvolutionHybrid::ConvolutionHybrid(const Convolution2DCommon *common, Backend hPack = unit; lPack = unit; // [oc, ic] => [oc/unit, ic/src_unit, unit, src_unit] - if (unit == 4 && core->supportI8mm) { // Low Memory: use fp32 and smmla. - hPack = 8; - lPack = 8; - } + if (unit == 4 && core->supportI8mm) { // Low Memory: use fp32 and smmla. + hPack = 8; + lPack = 8; + } auto hU = UP_DIV(outputCount, hPack); auto lU = UP_DIV(inputCount, lPack); ConvolutionHybrid::initQuantizeResource(quantInfo, mResource, hU, hPack, lU, lPack, outputCount, (int)originWeightSize / (int)biasSize, common->kernelX() * common->kernelY(), core->bytes); @@ -237,8 +263,8 @@ ErrorCode ConvolutionHybrid::onResize(const std::vector &inputs, const int iTileCount = UP_DIV(iC4, threadNumber); if (unit == 4 && core->supportI8mm) { // Low Memory: use fp32 and smmla. ANeedToPack8 = true; - } - int8_t order[32] = {0, 1, 2, 3, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29, 30, 31, 8, 9, 10, 11, 4, 5, 6, 7, 24, 25, 26, 27, 20, 21, 22, 23}; + } + int8_t order[32] = {0, 1, 2, 3, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29, 30, 31, 8, 9, 10, 11, 4, 5, 6, 7, 24, 25, 26, 27, 20, 21, 22, 23}; allocDynamicQuantInfo(threadNumber, batch, ic, oc, bytes); mDynamicQuant = [=]() { auto maxPtr = mQuantInfo.quant_info.host(); diff --git a/source/backend/cpu/compute/ConvolutionPackFreeWinograd.cpp b/source/backend/cpu/compute/ConvolutionPackFreeWinograd.cpp index bb97db324..a4ccae1db 100644 --- a/source/backend/cpu/compute/ConvolutionPackFreeWinograd.cpp +++ b/source/backend/cpu/compute/ConvolutionPackFreeWinograd.cpp @@ -15,7 +15,7 @@ #include "core/TensorUtils.hpp" #include "math/WingoradGenerater.hpp" #include -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #ifdef MNN_USE_NEON #include #endif diff --git a/source/backend/cpu/compute/ConvolutionPackWinograd.cpp b/source/backend/cpu/compute/ConvolutionPackWinograd.cpp index ecf1c0510..83b17c77d 100644 --- a/source/backend/cpu/compute/ConvolutionPackWinograd.cpp +++ b/source/backend/cpu/compute/ConvolutionPackWinograd.cpp @@ -15,7 +15,7 @@ #include "core/TensorUtils.hpp" #include "math/WingoradGenerater.hpp" #include -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" constexpr int FULSE_THRESHHOLD_NUMERATOR = 10; constexpr int FULSE_THRESHHOLD_DENOMINATOR = 10; diff --git a/source/backend/cpu/compute/ConvolutionTiledExecutor.cpp b/source/backend/cpu/compute/ConvolutionTiledExecutor.cpp index c4b158306..ff3a0afa1 100644 --- a/source/backend/cpu/compute/ConvolutionTiledExecutor.cpp +++ b/source/backend/cpu/compute/ConvolutionTiledExecutor.cpp @@ -16,7 +16,7 @@ #include "core/TensorUtils.hpp" #include "math/Vec.hpp" #include "core/BufferAllocator.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" using Vec4 = MNN::Math::Vec; namespace MNN { diff --git a/source/backend/cpu/compute/ConvolutionWinogradImpl.cpp b/source/backend/cpu/compute/ConvolutionWinogradImpl.cpp index 250710e8e..0d597b07b 100644 --- a/source/backend/cpu/compute/ConvolutionWinogradImpl.cpp +++ b/source/backend/cpu/compute/ConvolutionWinogradImpl.cpp @@ -15,7 +15,7 @@ #include "core/TensorUtils.hpp" #include "math/WingoradGenerater.hpp" #include -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" //#define MNN_WINOGRAD_PRINT_REDUCE_RATE diff --git a/source/backend/cpu/compute/DenseConvolutionTiledExecutor.cpp b/source/backend/cpu/compute/DenseConvolutionTiledExecutor.cpp index 40da39e3d..10df5d863 100644 --- a/source/backend/cpu/compute/DenseConvolutionTiledExecutor.cpp +++ b/source/backend/cpu/compute/DenseConvolutionTiledExecutor.cpp @@ -16,7 +16,7 @@ #include "core/TensorUtils.hpp" #include "math/Vec.hpp" #include "core/BufferAllocator.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #define PARAMETERSIZE 6 using Vec4 = MNN::Math::Vec; diff --git a/source/backend/cpu/compute/Int8FunctionsOpt.cpp b/source/backend/cpu/compute/Int8FunctionsOpt.cpp index b8502ff40..e1f29a14e 100644 --- a/source/backend/cpu/compute/Int8FunctionsOpt.cpp +++ b/source/backend/cpu/compute/Int8FunctionsOpt.cpp @@ -10,7 +10,7 @@ #include // for memset #include "Int8FunctionsOpt.h" #include "core/Macro.h" -#include "common/CommonCompute.hpp" +#include "core/CommonCompute.hpp" #include "CommonOptFunction.h" #include "math/Vec.hpp" @@ -1537,7 +1537,7 @@ static void MNNLineDepthWiseInt8AddBiasScaleUnit(int8_t* dst, const int8_t* src, } for (int i = 0; i < pack; ++i) { - + float val = (dstInt32[i] + bias_z[i]) * scale_z[i]; int valOut = roundf(val) + offset; if (valOut > parameters->maxValue + offset) { @@ -1615,7 +1615,7 @@ void MNNMaxPoolInt8(int8_t* dst, int8_t* src, size_t outputWidth, size_t inputWi for (int y = 0; y < kernely; ++y) { for (int x = 0; x < kernelx; ++x) { const int8_t* inputPtr = srcPtr + pack* (x + inputWidth* y); - for (int idx = 0; idx < pack; ++idx) { + for (int idx = 0; idx < pack; ++idx) { results[idx] = std::max(results[idx], *(inputPtr + idx)); } } @@ -2125,7 +2125,7 @@ void MNNCoreInt8FunctionInit() { // pooling gCoreFunc->MNNAvgPoolInt8 = MNNAvgPoolInt8; gCoreFunc->MNNMaxPoolInt8 = MNNMaxPoolInt8; - + // Norm gCoreFunc->MNNNormInt8 = MNNNormInt8; @@ -2143,7 +2143,7 @@ void MNNCoreInt8FunctionInit() { gCoreFunc->MNNPackC4Int8ForMatMul_A = _ArmBasicMNNPackC4ForMatMul_A_L4<12, 4>; // ConvDepthwise gCoreFunc->ConvDepthwise3x3LineInt8_ARM82 = MNNLineDepthWiseInt8AddBiasScale_ARMV82_Unit3X3; - + } if (core->supportI8mm) { // MatMul diff --git a/source/backend/cpu/compute/SparseConvInt8TiledExecutor.cpp b/source/backend/cpu/compute/SparseConvInt8TiledExecutor.cpp index 48b006102..395fa3745 100644 --- a/source/backend/cpu/compute/SparseConvInt8TiledExecutor.cpp +++ b/source/backend/cpu/compute/SparseConvInt8TiledExecutor.cpp @@ -15,7 +15,7 @@ #include "CommonOptFunction.h" #include "core/Concurrency.h" #include "core/TensorUtils.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #include "MNN/AutoTime.hpp" #include #ifdef MNN_USE_SSE diff --git a/source/backend/cpu/compute/SparseConvolutionTiledExecutor.cpp b/source/backend/cpu/compute/SparseConvolutionTiledExecutor.cpp index c74ac33a5..ab39bfd9b 100644 --- a/source/backend/cpu/compute/SparseConvolutionTiledExecutor.cpp +++ b/source/backend/cpu/compute/SparseConvolutionTiledExecutor.cpp @@ -16,8 +16,8 @@ #include "core/TensorUtils.hpp" #include "math/Vec.hpp" #include "core/BufferAllocator.hpp" -#include "common/MemoryFormater.h" -#include "common/CommonCompute.hpp" +#include "core/MemoryFormater.h" +#include "core/CommonCompute.hpp" using Vec4 = MNN::Math::Vec; namespace MNN { diff --git a/source/backend/cpu/compute/WinogradOptFunction.cpp b/source/backend/cpu/compute/WinogradOptFunction.cpp index 1af07afa2..23b83eab2 100644 --- a/source/backend/cpu/compute/WinogradOptFunction.cpp +++ b/source/backend/cpu/compute/WinogradOptFunction.cpp @@ -12,7 +12,7 @@ #include #include "core/Macro.h" #include "math/Vec.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" using Vec4 = MNN::Math::Vec; #define DEFAULT_UNIT 8 diff --git a/source/backend/cpu/x86_x64/avx/GemmAVX2.cpp b/source/backend/cpu/x86_x64/avx/GemmAVX2.cpp index 8a8407a47..56eaf70fb 100644 --- a/source/backend/cpu/x86_x64/avx/GemmAVX2.cpp +++ b/source/backend/cpu/x86_x64/avx/GemmAVX2.cpp @@ -75,7 +75,6 @@ void _AVX_MNNGemmHybridInt4(float* C, const int8_t* A, const int8_t* B, size_t s const float* scale_ptr = param[4]; auto one_int16 = _mm256_set1_epi16(1); auto offset_int8 = _mm256_set1_epi8(128); - auto _int4_signed_8 = _mm256_set1_ps(8); for (int ci = 0; ci < dst_depth_quad; ++ci) { float* dstZ = C + ci * pack * realSize; const int8_t* weight = B + ci * weight_step; @@ -83,14 +82,13 @@ void _AVX_MNNGemmHybridInt4(float* C, const int8_t* A, const int8_t* B, size_t s auto zero = zero_ptr + ci * pack; auto bias = bias_ptr + ci * pack; __m256 alphaValue = _mm256_loadu_ps(alpha); - auto extra_sum = _mm256_mul_ps(_int4_signed_8, alphaValue); for (int j = 0; j < realSize; ++j) { const float* sums = sums_ptr + j; const float* scale = scale_ptr + j; float* dstX = dstZ + j * pack; __m256 scaleValue = _mm256_set1_ps(scale[0]); auto sum_val = _mm256_set1_ps(sums[0]); - __m256 biasValue = _mm256_add_ps(_mm256_loadu_ps(bias), _mm256_mul_ps(_mm256_sub_ps(_mm256_loadu_ps(zero), extra_sum), sum_val)); + __m256 biasValue = _mm256_add_ps(_mm256_loadu_ps(bias), _mm256_mul_ps(_mm256_loadu_ps(zero), sum_val)); const int8_t* srcBatch = A + j * pack; auto oc0123_int16 = _mm256_set1_epi16(0); auto oc4567_int16 = _mm256_set1_epi16(0); @@ -103,10 +101,8 @@ void _AVX_MNNGemmHybridInt4(float* C, const int8_t* A, const int8_t* B, size_t s const uint8_t* weightZ = (uint8_t*)weight + k * weight_stride; auto s0 = _mm256_castpd_si256(_mm256_broadcast_sd((double*)srcZ)); auto wi4 = _mm256_castps_si256(_mm256_loadu_ps((const float*)weightZ)); - auto w_high = _mm256_and_si256(mask, _mm256_srli_epi16(wi4, 4)); - auto w_low = _mm256_and_si256(mask, wi4); - auto w0_ = _mm256_unpacklo_epi8(w_high, w_low); - auto w1_ = _mm256_unpackhi_epi8(w_high, w_low); + auto w0_ = _mm256_and_si256(mask, _mm256_srli_epi16(wi4, 4)); + auto w1_ = _mm256_and_si256(mask, wi4); auto w0 = _mm256_permute2x128_si256(w0_, w1_, 0x20); auto w1 = _mm256_permute2x128_si256(w0_, w1_, 0x31); oc0123_int16 = _mm256_maddubs_epi16(w0, s0); // int16_t sum @@ -194,9 +190,11 @@ void _AVX_MNNGemmHybridInt8(float* C, const int8_t* A, const int8_t* B, size_t s auto oc_04261537 = _mm256_add_epi32(oc_04261537_lo, oc_04261537_hi); auto oc_0426 = _mm256_extractf128_si256(oc_04261537, 0); auto oc_1537 = _mm256_extractf128_si256(oc_04261537, 1); - auto oc_0123 = _mm_unpacklo_epi32(oc_0426, oc_1537); - auto oc_4567 = _mm_unpackhi_epi32(oc_0426, oc_1537); - auto sum8 = _mm256_set_m128i(oc_0123, oc_4567); + auto oc_0145 = _mm_unpacklo_epi32(oc_0426, oc_1537); + auto oc_2367 = _mm_unpackhi_epi32(oc_0426, oc_1537); + auto oc_0123 = _mm_unpacklo_epi64(oc_0145, oc_2367); + auto oc_4567 = _mm_unpackhi_epi64(oc_0145, oc_2367); + auto sum8 = _mm256_set_m128i(oc_4567, oc_0123); __m256 f0 = _mm256_cvtepi32_ps(sum8); __m256 fs = _mm256_mul_ps(_mm256_mul_ps(f0, scaleValue), alphaValue); fs = _mm256_add_ps(biasValue, fs); diff --git a/source/backend/cpu/x86_x64/avx/WinogradFunctions.cpp b/source/backend/cpu/x86_x64/avx/WinogradFunctions.cpp index 8f715a7d8..175962ea1 100644 --- a/source/backend/cpu/x86_x64/avx/WinogradFunctions.cpp +++ b/source/backend/cpu/x86_x64/avx/WinogradFunctions.cpp @@ -9,7 +9,7 @@ #include #include "Vec8.hpp" #include "FunctionSummary.hpp" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #define PACK_UNIT 8 namespace MNN { diff --git a/source/backend/cpu/x86_x64/sse/GemmFunction.hpp b/source/backend/cpu/x86_x64/sse/GemmFunction.hpp index 5c94843b0..57c2558b0 100644 --- a/source/backend/cpu/x86_x64/sse/GemmFunction.hpp +++ b/source/backend/cpu/x86_x64/sse/GemmFunction.hpp @@ -656,8 +656,8 @@ static inline __m128i _load_int4_to_int8(const uint8_t* src) { int32_t data[4]; int8_t temp[16]; for (int i = 0; i < 8; ++i) { - temp[2 * i] = (src[i] >> 4) - 8; - temp[2 * i +1] = (src[i] & c) - 8; + temp[2 * i] = (src[i] >> 4); + temp[2 * i +1] = (src[i] & c); } auto int8_tx16 = _mm_loadu_si128((const __m128i*)temp); return int8_tx16; diff --git a/source/backend/metal/AllShader.cpp b/source/backend/metal/AllShader.cpp index 2ed682837..620e6ce99 100644 --- a/source/backend/metal/AllShader.cpp +++ b/source/backend/metal/AllShader.cpp @@ -1,32 +1,27 @@ #include "AllShader.hpp" const char* shader_MetalReLU6_metal = -"kernel void relu6_x1(const device M *in [[buffer(0)]],\n" -" device M *out [[buffer(1)]],\n" -" constant float4 &minMax [[buffer(2)]],\n" -" uint gid [[thread_position_in_grid]]) {\n" -" out[int(gid)]=clamp(in[int(gid)],(M)(minMax.x),(M)(minMax.y));\n" -"}\n" -"kernel void relu6_x4(const device M4 *in [[buffer(0)]],\n" +"struct Param {\n" +" float minV;\n" +" float maxV;\n" +" int size;\n" +" int remain;\n" +"};\n" +"kernel void relu6(const device M4 *in [[buffer(0)]],\n" " device M4 *out [[buffer(1)]],\n" -" constant float4 &minMax [[buffer(2)]],\n" -" uint gid [[thread_position_in_grid]]) {\n" -" out[int(gid)]=clamp(in[int(gid)],(M4)minMax.x,(M4)minMax.y);\n" -"}\n" -; -const char* shader_MetalReLU_metal = -"kernel void relu_x1(const device M *in [[buffer(0)]],\n" -" device M *out [[buffer(1)]],\n" -" constant float &slope [[buffer(2)]],\n" -" uint gid [[thread_position_in_grid]]) {\n" -" auto V=in[int(gid)];\n" -" out[int(gid)]=fmax(V,(M)0)+fmin(V,(M)0)*M(slope);\n" +" constant Param &p [[buffer(2)]],\n" +" uint3 gid [[thread_position_in_grid]]) {\n" +" if (gid.x= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.slice*cst.batch) return;\n" " \n" -" int oz=gid.z % cst.slice;\n" +" int oz=gid.z/cst.batch;\n" " int offset_x=(int)gid.x*cst.stride_x-cst.pad_x;\n" " int offset_y=(int)gid.y*cst.stride_y-cst.pad_y;\n" " int sx=max(0,(UP_DIV(-offset_x,cst.dilation_x)));\n" @@ -198,16 +193,16 @@ const char* shader_MetalConvolution_metal = " offset_x += sx*cst.dilation_x;\n" " offset_y += sy*cst.dilation_y;\n" " \n" -" auto z_in=in+idx_b*cst.input_slice*cst.input_size+offset_y*cst.input_width+offset_x;\n" +" auto z_in=in+idx_b*cst.input_size+offset_y*cst.input_width+offset_x;\n" " auto z_wt=wt+idx_c*cst.input_slice*cst.kernel_size+sy*cst.kernel_x+sx;\n" -" auto z_out=out+idx_b*cst.output_slice*cst.output_size+(int)idx_c*cst.output_size+(int)gid.y*cst.output_width+(int)gid.x;\n" +" auto z_out=out+idx_b*cst.output_size+(int)idx_c*cst.batch*cst.output_size+(int)gid.y*cst.output_width+(int)gid.x;\n" " int dilation_h=cst.input_width*cst.dilation_y;\n" " FLOAT4 result=FLOAT4(biasTerms[idx_c]);\n" " for (auto z=0; z=cst.input_width || offset_y<0) ? (M4)0.f : *(z_in+0*cst.input_width+1);\n" " auto in02=(offset_x+2>=cst.input_width || offset_y<0) ? (M4)0.f : *(z_in+0*cst.input_width+2);\n" @@ -312,18 +307,18 @@ const char* shader_MetalConvolution_metal = " if (idx_b >= cst.batch || idx_c >= cst.output_slice) return;\n" " bool valid=(idx_w+1\n" "static inline void template_NHWC_to_NC4HW4(const device IType *in,device OType *out,constant tensor_shape &s,uint2 gid) {\n" -" int b=gid.y/s.slice;\n" -" int z=gid.y % s.slice;\n" +" int b=gid.y % s.batch;\n" +" int z=gid.y/s.batch;\n" " int c=z*4;\n" " \n" " auto off_in=in+b*s.size*s.channel+int(gid.x)*s.channel+c;\n" @@ -653,8 +623,8 @@ const char* shader_MetalBackend_metal = "}\n" "template \n" "static inline void template_NC4HW4_to_NHWC(const device IType *in,device OType *out,constant tensor_shape &s,uint2 gid) {\n" -" int b=gid.y/s.slice;\n" -" int z=gid.y % s.slice;\n" +" int b=gid.y % s.batch;\n" +" int z=gid.y/s.batch;\n" " int c=z*4;\n" " auto off_in=in+int(gid.y)*s.size+int(gid.x);\n" " auto off_out=out+b*s.size*s.channel+int(gid.x)*s.channel+c;\n" @@ -691,8 +661,8 @@ const char* shader_MetalBackend_metal = "}\n" "template \n" "static inline void template_NCHW_to_NC4HW4(const device IType *in,device OType *out,constant tensor_shape &s,uint2 gid) {\n" -" int b=gid.y/s.slice;\n" -" int z=gid.y % s.slice;\n" +" int b=gid.y % s.batch;\n" +" int z=gid.y/s.batch;\n" " int c=z*4;\n" " \n" " auto off_in=in+(b*s.channel+c)*s.size+int(gid.x);\n" @@ -728,8 +698,8 @@ const char* shader_MetalBackend_metal = "}\n" "template \n" "static inline void template_NC4HW4_to_NCHW(const device IType *in,device OType *out,constant tensor_shape &s,uint2 gid) {\n" -" int b=gid.y/s.slice;\n" -" int z=gid.y % s.slice;\n" +" int b=gid.y % s.batch;\n" +" int z=gid.y/s.batch;\n" " int c=z*4;\n" " \n" " auto off_in=in+int(gid.y)*s.size+int(gid.x);\n" @@ -767,8 +737,8 @@ const char* shader_MetalBackend_metal = "template\n" "static inline void template_NHWC_to_NCHW(const device IType* in,\n" " device OType* out,constant tensor_shape &s,uint2 gid) {\n" -" int b=gid.y/s.slice;\n" -" int c4=gid.y % s.slice;\n" +" int b=gid.y % s.batch;\n" +" int c4=gid.y/s.batch;\n" " \n" " auto in_off=(b*s.size+gid.x)*s.channel+c4*4;\n" " auto out_off=(b*s.channel+c4*4)*s.size+gid.x;\n" @@ -793,8 +763,8 @@ const char* shader_MetalBackend_metal = "template\n" "static inline void template_NCHW_to_NHWC(const device IType* in,\n" " device OType* out,constant tensor_shape &s,uint2 gid) {\n" -" int b=gid.y/s.slice;\n" -" int c4=gid.y % s.slice;\n" +" int b=gid.y % s.batch;\n" +" int c4=gid.y/s.batch;\n" " \n" " auto in_off=(b*s.channel+c4*4)*s.size+gid.x;\n" " auto out_off=(b*s.size+gid.x)*s.channel+c4*4;\n" @@ -1452,7 +1422,7 @@ const char* shader_MetalScale_metal = " const device float4 *biasTerms [[buffer(4)]],\n" " uint2 gid [[thread_position_in_grid]]) {\n" " if ((int)gid.x >= s.size || (int)gid.y >= s.steps*s.batch) return;\n" -" int z=gid.y % s.steps;\n" +" int z=gid.y/s.batch;\n" " out[int(gid.y)*s.size+int(gid.x)] =\n" " in [int(gid.y)*s.size+int(gid.x)]*M4(scales[z])+M4(biasTerms[z]);\n" "}\n" @@ -1494,8 +1464,8 @@ const char* shader_MetalDeconvolution_metal = " uint3 gid [[thread_position_in_grid]]) {\n" " if ((int)gid.x >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.batch*cst.output_slice) return;\n" " \n" -" int b=gid.z/cst.output_slice;\n" -" int o=gid.z % cst.output_slice;\n" +" int b=gid.z % cst.batch;\n" +" int o=gid.z/cst.batch;\n" " FLOAT4 result=FLOAT4(biasTerms[o]);\n" " int oy=(int)gid.y+cst.pad_y;\n" " int ox=(int)gid.x+cst.pad_x;\n" @@ -1513,12 +1483,12 @@ const char* shader_MetalDeconvolution_metal = " int min_ix=(ox-max_kx*cst.dilation_x)/cst.stride_x;\n" " \n" " auto o_wt=wt+o*cst.input_slice*cst.kernel_size;\n" -" auto b_in=in+b*cst.input_slice*cst.input_size;\n" +" auto b_in=in+b*cst.input_size;\n" " for (auto z=0; z= min_ky; ky -= cst.delta_ky,iy += cst.delta_iy) {\n" " for (auto kx=max_kx,ix=min_ix; kx >= min_kx; kx -= cst.delta_kx,ix += cst.delta_ix) {\n" " auto wt4=o_wt[z*cst.kernel_size+ky*cst.kernel_x+kx];\n" -" auto in4=b_in[z*cst.input_size+iy*cst.input_width+ix];\n" +" auto in4=b_in[z*cst.input_size*cst.batch+iy*cst.input_width+ix];\n" " result += FLOAT4(in4*wt4);\n" " }\n" " }\n" @@ -1534,7 +1504,7 @@ const char* shader_MetalDeconvolution_metal = " uint3 gid [[thread_position_in_grid]]) {\n" " if ((int)gid.x >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.batch*cst.output_slice) return;\n" " \n" -" FLOAT4 result=FLOAT4(biasTerms[(int)(gid.z % cst.input_slice)]);\n" +" FLOAT4 result=FLOAT4(biasTerms[(int)(gid.z/cst.batch)]);\n" " \n" " int oy=(int)gid.y+cst.pad_y;\n" " int ox=(int)gid.x+cst.pad_x;\n" @@ -1631,10 +1601,11 @@ const char* shader_MetalROIPooling_metal = " int input_width;\n" " int input_height;\n" " int input_size;\n" +" int input_batch;\n" " int output_width;\n" " int output_height;\n" " int output_size;\n" -" int slices;\n" +" int batch;\n" " float spatial_scale;\n" "};\n" "kernel void ROI_pooling(const device M4 *in [[buffer(0)]],\n" @@ -1644,10 +1615,10 @@ const char* shader_MetalROIPooling_metal = " uint3 gid [[thread_position_in_grid]]) {\n" " if ((int)gid.x >= s.output_width || (int)gid.y >= s.output_height) return;\n" " \n" -" int ob=gid.z/s.slices;\n" -" int iz=gid.z % s.slices;\n" +" int ob=gid.z % s.batch;\n" +" int iz=gid.z/s.batch;\n" " \n" -" auto b_roi=roi+ob*8; // roundup(5,4)=8\n" +" auto b_roi=roi+ob*5;\n" " int ib=int(b_roi[0]);\n" " int x1=round(float(b_roi[1])*s.spatial_scale);\n" " int y1=round(float(b_roi[2])*s.spatial_scale);\n" @@ -1656,8 +1627,8 @@ const char* shader_MetalROIPooling_metal = " \n" " int roi_w=max(x2-x1+1,1);\n" " int roi_h=max(y2-y1+1,1);\n" -" auto bin_size_w=(M)roi_w/s.output_width;\n" -" auto bin_size_h=(M)roi_h/s.output_height;\n" +" float bin_size_w=(float)roi_w/(float)s.output_width;\n" +" float bin_size_h=(float)roi_h/(float)s.output_height;\n" " \n" " int w_start=clamp(x1+(int)floor(gid.x*bin_size_w) ,0,s.input_width);\n" " int w_end=clamp(x1+(int)ceil((gid.x+1)*bin_size_w),0,s.input_width);\n" @@ -1665,7 +1636,7 @@ const char* shader_MetalROIPooling_metal = " int h_end=clamp(y1+(int)ceil((gid.y+1)*bin_size_h),0,s.input_height);\n" " \n" " int is_empty=(h_end <= h_start) || (w_end <= w_start);\n" -" auto z_in=in+(ib*s.slices+iz)*s.input_size;\n" +" auto z_in=in+(ib+iz*s.input_batch)*s.input_size;\n" " auto max4=is_empty ? 0 : z_in[h_start*s.input_width+w_start];\n" " for (int y=h_start; y= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.batch*cst.output_slice) return;\n" -" int idx_w=gid.x;\n" -" int idx_h=gid.y;\n" -" int idx_c=gid.z % cst.output_slice;\n" -" int idx_b=gid.z/cst.output_slice;\n" -" auto xy_wt=wt+idx_c*cst.input_slice;\n" -" auto xy_in0=in+(int)idx_b*cst.input_slice*cst.input_size+idx_h*cst.output_width+idx_w;\n" -" auto xy_out=out+(int)idx_b*cst.output_slice*cst.output_size+idx_c*cst.output_size+idx_h*cst.output_width+idx_w;\n" -" auto biasValue=FLOAT4(biasTerms[idx_c]);\n" -" FLOAT4 result0=biasValue;\n" -" for (auto z=0; z= cst.output_size || (int)gid.y >= cst.output_slice || (int)gid.z >= cst.batch) return;\n" " int rx=gid.x*CONV_UNROLL;\n" " int uz=gid.y;\n" " auto xy_wt=wt+uz*cst.input_slice;\n" -" auto xy_in0=in+(int)gid.z*cst.input_slice*cst.input_size+rx+0;\n" -" auto xy_out=out+(int)gid.z*cst.output_slice*cst.output_size+uz*cst.output_size+rx;\n" +" auto xy_in0=in+(int)gid.z*cst.input_size+rx+0;\n" +" auto xy_out=out+(int)gid.z*cst.output_size+uz*cst.output_size*cst.batch+rx;\n" " auto biasValue=FLOAT4(biasTerms[uz]);\n" " FLOAT4 result0=biasValue,result1=biasValue,result2=biasValue,result3=biasValue;\n" " int computeSize=min(cst.output_size-rx,CONV_UNROLL);\n" " auto scale=FLOAT4(dequantScale[uz]);\n" -" auto dequant_bias=FLOAT4(dequantBias[uz]);\n" +" auto dequant_bias=FLOAT4(dequantScale[uz+cst.output_slice]);\n" " for (auto z=0; z= cst.output_size || (int)gid.y >= cst.output_slice || (int)gid.z >= cst.batch) return;\n" " int rx=gid.x*CONV_UNROLL;\n" " int uz=gid.y;\n" " auto xy_wt=wt+uz*cst.input_slice;\n" -" auto xy_in0=in+(int)gid.z*cst.input_slice*cst.input_size+rx+0;\n" -" auto xy_out=out+(int)gid.z*cst.output_slice*cst.output_size+uz*cst.output_size+rx;\n" +" auto xy_in0=in+(int)gid.z*cst.input_size+rx+0;\n" +" auto xy_out=out+(int)gid.z*cst.output_size+uz*cst.output_size*cst.batch+rx;\n" " auto biasValue=FLOAT4(biasTerms[uz]);\n" " FLOAT4 result0=biasValue,result1=biasValue,result2=biasValue,result3=biasValue;\n" " int computeSize=min(cst.output_size-rx,CONV_UNROLL);\n" " auto scale=FLOAT4(dequantScale[uz]);\n" -" auto dequant_bias=FLOAT4(dequantBias[uz]);\n" +" auto dequant_bias=FLOAT4(dequantScale[uz+cst.output_slice]);\n" " for (auto z=0; z> 4)-8,(float)(w_int4[i][0] & 15)-8,(float)(w_int4[i][1] >> 4)-8,(float)(w_int4[i][1] & 15)-8);\n" -" FLOAT4 res;\n" -" for (int j=0; j<4; ++j) {\n" -" float wf=w4[j]*scale[i]+dequant_bias[i];\n" -" res[j]=wf;\n" -" }\n" +" FLOAT4 res=w4*scale[i]+dequant_bias[i];\n" " w_dequant[i]=res;\n" " }\n" " \n" @@ -1845,7 +1780,7 @@ const char* shader_MetalConvolution1x1_metal = " result1 += FLOAT4(in41*w_dequant);\n" " result2 += FLOAT4(in42*w_dequant);\n" " result3 += FLOAT4(in43*w_dequant);\n" -" xy_in0 += cst.input_size;\n" +" xy_in0 += cst.input_size*cst.batch;\n" " }\n" " \n" " /* true */ \n" @@ -1874,8 +1809,8 @@ const char* shader_MetalConvolution1x1_metal = " int rx=gid.x*CONV_UNROLL_L;\n" " int uz=gid.y;\n" " auto xy_wt=wt+uz*cst.input_slice;\n" -" auto xy_in0=in+(int)gid.z*cst.input_slice*cst.input_size+rx+0;\n" -" auto xy_out=out+(int)gid.z*cst.output_slice*cst.output_size+uz*cst.output_size+rx;\n" +" auto xy_in0=in+(int)gid.z*cst.input_size+rx+0;\n" +" auto xy_out=out+(int)gid.z*cst.output_size+uz*cst.batch*cst.output_size+rx;\n" " auto biasValue=FLOAT4(biasTerms[uz]);\n" " FLOAT4 result0=biasValue,result1=biasValue,result2=biasValue,result3=biasValue;\n" " FLOAT4 result4=biasValue,result5=biasValue,result6=biasValue,result7=biasValue;\n" @@ -1898,7 +1833,7 @@ const char* shader_MetalConvolution1x1_metal = " result5 += FLOAT4(in45*w);\n" " result6 += FLOAT4(in46*w);\n" " result7 += FLOAT4(in47*w);\n" -" xy_in0 += cst.input_size;\n" +" xy_in0 += cst.input_size*cst.batch;\n" " }\n" " /* true */ *xy_out=activate(M4(result0),cst.activation);\n" " if (computeSize>1) {xy_out[1]=activate(M4(result1),cst.activation); }\n" @@ -1909,71 +1844,20 @@ const char* shader_MetalConvolution1x1_metal = " if (computeSize>6) {xy_out[6]=activate(M4(result6),cst.activation); }\n" " if (computeSize>7) {xy_out[7]=activate(M4(result7),cst.activation); }\n" "}\n" -"kernel void conv1x1_w4h2(const device M4 *in [[buffer(0)]],\n" -" device M4 *out [[buffer(1)]],\n" -" constant conv1x1_constants& cst [[buffer(2)]],\n" -" const device M4x4 *wt [[buffer(3)]],\n" -" const device M4 *biasTerms [[buffer(4)]],\n" -" uint3 gid [[thread_position_in_grid]]) {\n" -" if ((int)gid.x*4 >= cst.output_width || (int)gid.y*2 >= cst.output_height || (int)gid.z >= cst.batch*cst.output_slice) return;\n" -" int idx_w=gid.x << 2;\n" -" int idx_h=gid.y << 1;\n" -" int idx_c=gid.z % cst.output_slice;\n" -" int idx_b=gid.z/cst.output_slice;\n" -" auto xy_wt=wt+idx_c*cst.input_slice;\n" -" auto xy_in0=in+(int)idx_b*cst.input_slice*cst.input_size+idx_h*cst.output_width+idx_w;\n" -" auto xy_out=out+(int)idx_b*cst.output_slice*cst.output_size+idx_c*cst.output_size+idx_h*cst.output_width+idx_w;\n" -" auto biasValue=FLOAT4(biasTerms[idx_c]);\n" -" FLOAT4 result0=biasValue,result1=biasValue,result2=biasValue,result3=biasValue;\n" -" FLOAT4 result4=biasValue,result5=biasValue,result6=biasValue,result7=biasValue;\n" -" for (auto z=0; z1) {xy_out[1]=activate(M4(result1),cst.activation); }\n" -" if (widthSize>2) {xy_out[2]=activate(M4(result2),cst.activation); }\n" -" if (widthSize>3) {xy_out[3]=activate(M4(result3),cst.activation); }\n" -" \n" -" int heightSize=min(cst.output_height-idx_h,2);\n" -" if(heightSize>1) {\n" -" /* true */ {xy_out[cst.output_width+0]=activate(M4(result4),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_width+1]=activate(M4(result5),cst.activation); }\n" -" if (widthSize>2) {xy_out[cst.output_width+2]=activate(M4(result6),cst.activation); }\n" -" if (widthSize>3) {xy_out[cst.output_width+3]=activate(M4(result7),cst.activation); }\n" -" }\n" -"}\n" "kernel void conv1x1_w4h4(const device M4 *in [[buffer(0)]],\n" " device M4 *out [[buffer(1)]],\n" " constant conv1x1_constants& cst [[buffer(2)]],\n" " const device M4x4 *wt [[buffer(3)]],\n" " const device M4 *biasTerms [[buffer(4)]],\n" " uint3 gid [[thread_position_in_grid]]) {\n" -" if ((int)gid.x*4 >= cst.output_width || (int)gid.y*4 >= cst.output_height || (int)gid.z >= cst.batch*cst.output_slice) return;\n" -" int idx_w=gid.x << 2;\n" -" int idx_h=gid.y << 2;\n" -" int idx_c=gid.z % cst.output_slice;\n" -" int idx_b=gid.z/cst.output_slice;\n" +" if ((int)gid.x*16 >= cst.output_width || (int)gid.y >= cst.batch*cst.output_slice) return;\n" +" int idx_w=gid.x << 4;\n" +" int idx_h=0;\n" +" int idx_c=gid.y/cst.batch;\n" +" int idx_b=gid.y % cst.batch;\n" " auto xy_wt=wt+idx_c*cst.input_slice;\n" -" auto xy_in0=in+(int)idx_b*cst.input_slice*cst.input_size+idx_h*cst.output_width+idx_w;\n" -" auto xy_out=out+(int)idx_b*cst.output_slice*cst.output_size+idx_c*cst.output_size+idx_h*cst.output_width+idx_w;\n" +" auto xy_in0=in+(int)idx_b*cst.input_size+idx_h*cst.output_width+idx_w;\n" +" auto xy_out=out+(int)idx_b*cst.output_size+idx_c*cst.output_size*cst.batch+idx_h*cst.output_width+idx_w;\n" " auto biasValue=FLOAT4(biasTerms[idx_c]);\n" " FLOAT4 result00=biasValue,result01=biasValue,result02=biasValue,result03=biasValue;\n" " FLOAT4 result10=biasValue,result11=biasValue,result12=biasValue,result13=biasValue;\n" @@ -1984,19 +1868,19 @@ const char* shader_MetalConvolution1x1_metal = " auto in01=xy_in0[1];\n" " auto in02=xy_in0[2];\n" " auto in03=xy_in0[3];\n" -" auto in10=xy_in0[cst.output_width+0];\n" -" auto in11=xy_in0[cst.output_width+1];\n" -" auto in12=xy_in0[cst.output_width+2];\n" -" auto in13=xy_in0[cst.output_width+3];\n" -" \n" -" auto in20=xy_in0[cst.output_width+cst.output_width+0];\n" -" auto in21=xy_in0[cst.output_width+cst.output_width+1];\n" -" auto in22=xy_in0[cst.output_width+cst.output_width+2];\n" -" auto in23=xy_in0[cst.output_width+cst.output_width+3];\n" -" auto in30=xy_in0[cst.output_width+cst.output_width+cst.output_width+0];\n" -" auto in31=xy_in0[cst.output_width+cst.output_width+cst.output_width+1];\n" -" auto in32=xy_in0[cst.output_width+cst.output_width+cst.output_width+2];\n" -" auto in33=xy_in0[cst.output_width+cst.output_width+cst.output_width+3];\n" +" auto in10=xy_in0[4];\n" +" auto in11=xy_in0[5];\n" +" auto in12=xy_in0[6];\n" +" auto in13=xy_in0[7];\n" +" \n" +" auto in20=xy_in0[8];\n" +" auto in21=xy_in0[9];\n" +" auto in22=xy_in0[10];\n" +" auto in23=xy_in0[11];\n" +" auto in30=xy_in0[12];\n" +" auto in31=xy_in0[13];\n" +" auto in32=xy_in0[14];\n" +" auto in33=xy_in0[15];\n" " auto w=xy_wt[z];\n" " result00 += FLOAT4(in00*w);\n" " result01 += FLOAT4(in01*w);\n" @@ -2016,33 +1900,25 @@ const char* shader_MetalConvolution1x1_metal = " result32 += FLOAT4(in32*w);\n" " result33 += FLOAT4(in33*w);\n" " \n" -" xy_in0 += cst.input_size;\n" +" xy_in0 += cst.input_size*cst.batch;\n" " }\n" -" int widthSize=min(cst.output_width-idx_w,4);\n" +" int widthSize=min(cst.output_width-idx_w,16);\n" " /* true */ *xy_out=activate(M4(result00),cst.activation);\n" " if (widthSize>1) {xy_out[1]=activate(M4(result01),cst.activation); }\n" " if (widthSize>2) {xy_out[2]=activate(M4(result02),cst.activation); }\n" " if (widthSize>3) {xy_out[3]=activate(M4(result03),cst.activation); }\n" -" \n" -" int heightSize=min(cst.output_height-idx_h,4);\n" -" if(heightSize>1) {\n" -" /* true */ {xy_out[cst.output_width+0]=activate(M4(result10),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_width+1]=activate(M4(result11),cst.activation); }\n" -" if (widthSize>2) {xy_out[cst.output_width+2]=activate(M4(result12),cst.activation); }\n" -" if (widthSize>3) {xy_out[cst.output_width+3]=activate(M4(result13),cst.activation); }\n" -" }\n" -" if(heightSize>2) {\n" -" /* true */ {xy_out[cst.output_width+cst.output_width+0]=activate(M4(result20),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_width+cst.output_width+1]=activate(M4(result21),cst.activation); }\n" -" if (widthSize>2) {xy_out[cst.output_width+cst.output_width+2]=activate(M4(result22),cst.activation); }\n" -" if (widthSize>3) {xy_out[cst.output_width+cst.output_width+3]=activate(M4(result23),cst.activation); }\n" -" }\n" -" if(heightSize>3) {\n" -" /* true */ {xy_out[cst.output_width+cst.output_width+cst.output_width+0]=activate(M4(result30),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_width+cst.output_width+cst.output_width+1]=activate(M4(result31),cst.activation); }\n" -" if (widthSize>2) {xy_out[cst.output_width+cst.output_width+cst.output_width+2]=activate(M4(result32),cst.activation); }\n" -" if (widthSize>3) {xy_out[cst.output_width+cst.output_width+cst.output_width+3]=activate(M4(result33),cst.activation); }\n" -" }\n" +" if (widthSize>4) {xy_out[4]=activate(M4(result10),cst.activation); }\n" +" if (widthSize>5) {xy_out[5]=activate(M4(result11),cst.activation); }\n" +" if (widthSize>6) {xy_out[6]=activate(M4(result12),cst.activation); }\n" +" if (widthSize>7) {xy_out[7]=activate(M4(result13),cst.activation); }\n" +" if (widthSize>8) {xy_out[8]=activate(M4(result20),cst.activation); }\n" +" if (widthSize>9) {xy_out[9]=activate(M4(result21),cst.activation); }\n" +" if (widthSize>10) {xy_out[10]=activate(M4(result22),cst.activation); }\n" +" if (widthSize>11) {xy_out[11]=activate(M4(result23),cst.activation); }\n" +" if (widthSize>12) {xy_out[12]=activate(M4(result30),cst.activation); }\n" +" if (widthSize>13) {xy_out[13]=activate(M4(result31),cst.activation); }\n" +" if (widthSize>14) {xy_out[14]=activate(M4(result32),cst.activation); }\n" +" if (widthSize>15) {xy_out[15]=activate(M4(result33),cst.activation); }\n" "}\n" "kernel void conv1x1_w2c2(const device M4 *in [[buffer(0)]],\n" " device M4 *out [[buffer(1)]],\n" @@ -2050,17 +1926,17 @@ const char* shader_MetalConvolution1x1_metal = " const device M4x4 *wt [[buffer(3)]],\n" " const device M4 *biasTerms [[buffer(4)]],\n" " uint3 gid [[thread_position_in_grid]]) {\n" -" if ((int)gid.x*2 >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z*2 >= cst.batch*cst.output_slice) return;\n" +" if ((int)gid.x*2 >= cst.output_width || (int)gid.y*2 >= cst.batch*cst.output_slice) return;\n" " int channel_pack=(cst.output_channel+7) >> 3;\n" " int idx_w=gid.x << 1;\n" -" int idx_h=gid.y;\n" -" int idx_c=(gid.z % channel_pack) << 1;\n" -" int idx_b=gid.z/channel_pack;\n" +" int idx_h=0;\n" +" int idx_c=(gid.y % channel_pack) << 1;\n" +" int idx_b=gid.y/channel_pack;\n" " \n" " if(idx_b >= cst.batch || idx_c >= cst.output_slice) return;\n" " auto xy_wt=wt+idx_c*cst.input_slice;\n" -" auto xy_in0=in+(int)idx_b*cst.input_slice*cst.input_size+idx_h*cst.output_width+idx_w;\n" -" auto xy_out=out+(int)idx_b*cst.output_slice*cst.output_size+idx_c*cst.output_size+idx_h*cst.output_width+idx_w;\n" +" auto xy_in0=in+(int)idx_b*cst.input_size+idx_h*cst.output_width+idx_w;\n" +" auto xy_out=out+(int)idx_b*cst.output_size+idx_c*cst.output_size*cst.batch+idx_h*cst.output_width+idx_w;\n" " auto biasValue0=FLOAT4(biasTerms[idx_c]);\n" " auto biasValue1=FLOAT4(biasTerms[idx_c+1]);\n" " FLOAT4 result0=biasValue0,result1=biasValue0;\n" @@ -2074,7 +1950,7 @@ const char* shader_MetalConvolution1x1_metal = " result1 += FLOAT4(in41*w0);\n" " result4 += FLOAT4(in40*w1);\n" " result5 += FLOAT4(in41*w1);\n" -" xy_in0 += cst.input_size;\n" +" xy_in0 += cst.input_size*cst.batch;\n" " }\n" " int widthSize=min(cst.output_width-idx_w,2);\n" " /* true */ *xy_out=activate(M4(result0),cst.activation);\n" @@ -2082,65 +1958,26 @@ const char* shader_MetalConvolution1x1_metal = " \n" " int channelSize=min(cst.output_slice-idx_c,2);\n" " if(channelSize>1) {\n" -" /* true */ {xy_out[cst.output_size+0]=activate(M4(result4),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_size+1]=activate(M4(result5),cst.activation); }\n" +" /* true */ {xy_out[cst.output_size*cst.batch +0]=activate(M4(result4),cst.activation); }\n" +" if (widthSize>1) {xy_out[cst.output_size*cst.batch +1]=activate(M4(result5),cst.activation); }\n" " }\n" "}\n" -"kernel void conv1x1_w2h2(const device M4 *in [[buffer(0)]],\n" +"kernel void conv1x1_w4c2(const device M4 *in [[buffer(0)]],\n" " device M4 *out [[buffer(1)]],\n" " constant conv1x1_constants& cst [[buffer(2)]],\n" " const device M4x4 *wt [[buffer(3)]],\n" " const device M4 *biasTerms [[buffer(4)]],\n" " uint3 gid [[thread_position_in_grid]]) {\n" -" if ((int)gid.x*2 >= cst.output_width || (int)gid.y*2 >= cst.output_height || (int)gid.z >= cst.batch*cst.output_slice) return;\n" -" int idx_w=gid.x << 1;\n" -" int idx_h=gid.y << 1;\n" -" int idx_c=gid.z % cst.output_slice;\n" -" int idx_b=gid.z/cst.output_slice;\n" -" auto xy_wt=wt+idx_c*cst.input_slice;\n" -" auto xy_in0=in+(int)idx_b*cst.input_slice*cst.input_size+idx_h*cst.output_width+idx_w;\n" -" auto xy_out=out+(int)idx_b*cst.output_slice*cst.output_size+idx_c*cst.output_size+idx_h*cst.output_width+idx_w;\n" -" auto biasValue=FLOAT4(biasTerms[idx_c]);\n" -" FLOAT4 result0=biasValue,result1=biasValue;\n" -" FLOAT4 result4=biasValue,result5=biasValue;\n" -" for (auto z=0; z1) {xy_out[1]=activate(M4(result1),cst.activation); }\n" -" \n" -" int heightSize=min(cst.output_height-idx_h,2);\n" -" if(heightSize>1) {\n" -" /* true */ {xy_out[cst.output_width+0]=activate(M4(result4),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_width+1]=activate(M4(result5),cst.activation); }\n" -" }\n" -"}\n" -"kernel void conv1x1_w2h2c2(const device M4 *in [[buffer(0)]],\n" -" device M4 *out [[buffer(1)]],\n" -" constant conv1x1_constants& cst [[buffer(2)]],\n" -" const device M4x4 *wt [[buffer(3)]],\n" -" const device M4 *biasTerms [[buffer(4)]],\n" -" uint3 gid [[thread_position_in_grid]]) {\n" -" if ((int)gid.x*2 >= cst.output_width || (int)gid.y*2 >= cst.output_height || (int)gid.z*2 >= cst.batch*cst.output_slice) return;\n" +" if ((int)gid.x*4 >= cst.output_width || (int)gid.y*2 >= cst.batch*cst.output_slice) return;\n" " int channel_pack=(cst.output_channel+7) >> 3;\n" -" int idx_w=gid.x << 1;\n" -" int idx_h=gid.y << 1;\n" -" int idx_c=(gid.z % channel_pack) << 1;\n" -" int idx_b=gid.z/channel_pack;\n" +" int idx_w=gid.x << 2;\n" +" int idx_h=0;\n" +" int idx_c=(gid.y % channel_pack) << 1;\n" +" int idx_b=gid.y/channel_pack;\n" " if(idx_b >= cst.batch || idx_c >= cst.output_slice) return;\n" " auto xy_wt=wt+idx_c*cst.input_slice;\n" -" auto xy_in0=in+(int)idx_b*cst.input_slice*cst.input_size+idx_h*cst.output_width+idx_w;\n" -" auto xy_out=out+(int)idx_b*cst.output_slice*cst.output_size+idx_c*cst.output_size+idx_h*cst.output_width+idx_w;\n" +" auto xy_in0=in+(int)idx_b*cst.input_size+idx_h*cst.output_width+idx_w;\n" +" auto xy_out=out+(int)idx_b*cst.output_size+idx_c*cst.output_size*cst.batch+idx_h*cst.output_width+idx_w;\n" " auto biasValue0=FLOAT4(biasTerms[idx_c]);\n" " auto biasValue1=FLOAT4(biasTerms[idx_c+1]);\n" " FLOAT4 result0=biasValue0,result1=biasValue0;\n" @@ -2150,8 +1987,8 @@ const char* shader_MetalConvolution1x1_metal = " for (auto z=0; z1) {xy_out[1]=activate(M4(result1),cst.activation); }\n" -" \n" -" int heightSize=min(cst.output_height-idx_h,2);\n" -" if(heightSize>1) {\n" -" /* true */ {xy_out[cst.output_width+0]=activate(M4(result4),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_width+1]=activate(M4(result5),cst.activation); }\n" -" }\n" +" if (widthSize>2) {xy_out[2]=activate(M4(result4),cst.activation); }\n" +" if (widthSize>3) {xy_out[3]=activate(M4(result5),cst.activation); }\n" " \n" " int channelSize=min(cst.output_slice-idx_c,2);\n" " if(channelSize>1) {\n" -" /* true */ xy_out[cst.output_size]=activate(M4(result2),cst.activation);\n" -" if (widthSize>1) {xy_out[cst.output_size+1]=activate(M4(result3),cst.activation); }\n" -" \n" -" if(heightSize>1) {\n" -" /* true */ {xy_out[cst.output_size+cst.output_width+0]=activate(M4(result6),cst.activation); }\n" -" if (widthSize>1) {xy_out[cst.output_size+cst.output_width+1]=activate(M4(result7),cst.activation); }\n" -" }\n" +" /* true */ xy_out[cst.output_size*cst.batch]=activate(M4(result2),cst.activation);\n" +" if (widthSize>1) {xy_out[cst.output_size*cst.batch +1]=activate(M4(result3),cst.activation); }\n" +" if (widthSize>2) {xy_out[cst.output_size*cst.batch +2]=activate(M4(result6),cst.activation); }\n" +" if (widthSize>3) {xy_out[cst.output_size*cst.batch +3]=activate(M4(result7),cst.activation); }\n" " }\n" "}\n" ; @@ -2341,7 +2171,7 @@ const char* shader_MetalPReLU_metal = " uint3 gid [[thread_position_in_grid]]) { // size,slice,batch\n" " if ((int)gid.x >= s.size || (int)gid.y >= s.slice) return;\n" " \n" -" int z=gid.z*s.slice+gid.y;\n" +" int z=gid.z+gid.y*s.batch;\n" " auto v4=in[z*s.size+int(gid.x)];\n" " out[z*s.size+int(gid.x)]=select(v4,M4(slope[int(gid.y)])*v4,signbit(v4));\n" "}\n" diff --git a/source/backend/metal/AllShader.hpp b/source/backend/metal/AllShader.hpp index b59f8a8e9..d430897b0 100644 --- a/source/backend/metal/AllShader.hpp +++ b/source/backend/metal/AllShader.hpp @@ -1,7 +1,6 @@ #ifndef MNN_METAL_SHADER_AUTO_GENERATE_H #define MNN_METAL_SHADER_AUTO_GENERATE_H extern const char* shader_MetalReLU6_metal; -extern const char* shader_MetalReLU_metal; extern const char* shader_MetalConvolutionDepthwise_metal; extern const char* shader_MetalConvolutionActivation_metal; extern const char* shader_MetalConvolution_metal; diff --git a/source/backend/metal/MNNMetalContext.h b/source/backend/metal/MNNMetalContext.h index 40bf6a0fb..2159ccf1f 100644 --- a/source/backend/metal/MNNMetalContext.h +++ b/source/backend/metal/MNNMetalContext.h @@ -27,14 +27,6 @@ typedef enum { CPUTransparent } MetalAccess; -typedef struct { - /** wrap size */ - NSUInteger threadExecutionWidth; - /** max threads per thread group */ - NSUInteger maxThreadsPerThreadgroup; - /** run concurrently on z axis or not */ - BOOL zAxisProtected; -} MetalBandwidth; } @interface MNNMetalContext : NSObject @@ -62,14 +54,6 @@ typedef struct { - (id)newDeviceBuffer:(NSUInteger)size bytes:(const void *)bytes access:(MNN::MetalAccess)access; -/** - * @brief load encoder with function name. returns maxTotalThreadsPerThreadgroup of pipeline. - * @param name pipline name - * @param encoder command encoder - * @return bandwidth info for function - */ -- (MNN::MetalBandwidth)load:(NSString *)name encoder:(id)encoder fp16:(BOOL)fp16; - /** * @brief load encoder with function name. returns maxTotalThreadsPerThreadgroup of pipeline. * @param name pipline name @@ -86,16 +70,6 @@ typedef struct { - (BOOL) initWithSharedContext:(const MNNMetalSharedContext*)context dev:(id)device; -/** - * @brief dispatch encoder with default settings - * @param encoder command encoder - * @param threads threads size - * @param bandwidth bandwidth - */ -- (void)dispatchEncoder:(id)encoder - threads:(MTLSize)threads - bandwidth:(MNN::MetalBandwidth)bandwidth; - /** * @brief dispatch encoder with designated threads per threadgroup * @param encoder command encoder @@ -103,10 +77,6 @@ typedef struct { * @param threadsPerGroup thread size per group * @param bandwidth bandwidth */ -- (void)dispatchEncoder:(id)encoder - threads:(MTLSize)threads - threadsPerGroup:(MTLSize)threadsPerGroup - bandwidth:(MNN::MetalBandwidth)bandwidth; - (id)pipelineWithName:(NSString *)name fp16:(BOOL)fp16; - (id)pipelineWithSourceOption:(NSString *)source name:(NSString *)name options:(MTLCompileOptions *)options; - (MTLSize)computeBestGroup:(id) pipeline threads:(MTLSize)threads; diff --git a/source/backend/metal/MNNMetalContext.mm b/source/backend/metal/MNNMetalContext.mm index 6db27d64c..e23fda331 100644 --- a/source/backend/metal/MNNMetalContext.mm +++ b/source/backend/metal/MNNMetalContext.mm @@ -181,25 +181,6 @@ - (MTLResourceOptions)optionForAccess:(MNN::MetalAccess)access { return result; } -- (MetalBandwidth)load:(NSString *)name encoder:(id)encoder fp16:(BOOL)fp16 { - id pipeline = [self pipelineWithName:name fp16:fp16]; - MNN_ASSERT(nil != pipeline); - [encoder setComputePipelineState:pipeline]; -#if MNN_METAL_DEBUG || MNN_METAL_BENCHMARK - if (!name) { - } else if (!encoder.label) { - encoder.label = name; - } else { - NSArray *components = [encoder.label componentsSeparatedByString:@","]; - if (![components containsObject:name]) { - components = [components arrayByAddingObject:name]; - } - encoder.label = [components componentsJoinedByString:@","]; - } -#endif - return {pipeline.threadExecutionWidth, pipeline.maxTotalThreadsPerThreadgroup, NO}; -} - - (NSUInteger)timeUsed:(id)buffer { // Get ns precision time auto start = mach_absolute_time(); @@ -393,37 +374,6 @@ static NSUInteger smallest_log2(NSUInteger integer) { } - (MTLSize)computeBestGroup:(id) bw threads:(MTLSize)t { - if (bw.maxTotalThreadsPerThreadgroup > 64) { - auto res = MTLSizeMake(8, 8, 8); - int reduceNumber = 0; - if (t.depth < 4) { - res.depth = 1; - reduceNumber++; - } - if (t.width < 4) { - res.width = 1; - reduceNumber++; - } - if (t.height < 4) { - res.height = 1; - reduceNumber++; - } - if (reduceNumber == 0) { - return MTLSizeMake(4, 4, 4); - } - if (reduceNumber == 2) { - if (res.width > 1) { - res.width = 64; - } - if (res.height > 1) { - res.height = 64; - } - if (res.depth > 1) { - res.depth = 64; - } - } - return res; - } auto pwarp = smallest_log2(bw.threadExecutionWidth); auto px = smallest_log2(t.width), sx = (NSUInteger)ceil(log2(t.width)); auto py = smallest_log2(t.height), sy = (NSUInteger)ceil(log2(t.height)); @@ -463,91 +413,6 @@ - (MTLSize)computeBestGroup:(id) bw threads:(MTLSize)t } -- (MTLSize)threadsPerGroupWithThreads:(MTLSize)t bandwidth:(MetalBandwidth)bw { - auto pwarp = smallest_log2(bw.threadExecutionWidth); - auto px = smallest_log2(t.width), sx = (NSUInteger)ceil(log2(t.width)); - auto py = smallest_log2(t.height), sy = (NSUInteger)ceil(log2(t.height)); - - // accurately match on x - if (px >= pwarp) { - return {bw.threadExecutionWidth, 1, 1}; - } - // accurately match on xy - else if (px + py >= pwarp && sx < pwarp / 2) { - NSUInteger x = pow(2, px); - return {x, bw.threadExecutionWidth / x, 1}; - } - // similarly match on x - else if (sx >= pwarp) { - return {bw.threadExecutionWidth, 1, 1}; - } - // similarly match on xy - else if (sx + sy >= pwarp) { - NSUInteger x = pow(2, sx); - return {x, bw.threadExecutionWidth / x, 1}; - } - - // on xyz (for most shaders do not protect gid.z, z axis must be accurately match) - auto pz = smallest_log2(t.depth); - auto sz = bw.zAxisProtected ? ceil(log2(t.depth)) : pz; - if (px + py + pz >= pwarp) { - NSUInteger x = pow(2, px), y = pow(2, py); - return {x, y, bw.threadExecutionWidth / x / y}; - } else if (sx + sy + sz >= pwarp) { - NSUInteger x = pow(2, sx), z = pow(2, MIN(sz, pwarp - sx)); - return {x, bw.threadExecutionWidth / x / z, z}; - } else { - NSUInteger z = pow(2, sz); - return {t.width, t.height, z}; - } -} - -- (void)dispatchEncoder:(id)encoder - threads:(MTLSize)threads - bandwidth:(MetalBandwidth)bandwidth { - [self dispatchEncoder:encoder - threads:threads - threadsPerGroup:[self threadsPerGroupWithThreads:threads bandwidth:bandwidth] - bandwidth:bandwidth]; -} - -- (void)dispatchEncoder:(id)encoder - threads:(MTLSize)threads - threadsPerGroup:(MTLSize)threadsPerGroup - bandwidth:(MetalBandwidth)bandwidth { -#if MNN_METAL_DEBUG - if (threads.width == 0 || threads.height == 0 || threads.depth == 0 || threadsPerGroup.width == 0 || - threadsPerGroup.height == 0 || threadsPerGroup.depth == 0) { - printf("[METAL] dispatch error %td %td %td / %td %td %td\n", threads.width, threads.height, threads.depth, - threadsPerGroup.width, threadsPerGroup.height, threadsPerGroup.depth); - } -#endif - - // NSLog(@"dispatch {%td %td %td} with {%td %td %td}", - // threads.width, threads.height, threads.depth, - // threadsPerGroup.width, threadsPerGroup.height, threadsPerGroup.depth); - threadsPerGroup.width = MIN(threadsPerGroup.width, bandwidth.maxThreadsPerThreadgroup); - threadsPerGroup.height = MIN(threadsPerGroup.height, bandwidth.maxThreadsPerThreadgroup); - threadsPerGroup.depth = MIN(threadsPerGroup.depth, bandwidth.maxThreadsPerThreadgroup); -#ifdef MNN_BUILD_FOR_IOS - if (@available(iOS 11.0, *)) { - if ([_device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1]) { - [encoder dispatchThreads:threads threadsPerThreadgroup:threadsPerGroup]; - return; - } - } -#endif - MTLSize groups = { - UP_DIV(threads.width, threadsPerGroup.width), UP_DIV(threads.height, threadsPerGroup.height), - UP_DIV(threads.depth, threadsPerGroup.depth), - }; - MNN_ASSERT(threadsPerGroup.width >= 1); - MNN_ASSERT(threadsPerGroup.height >= 1); - MNN_ASSERT(threadsPerGroup.depth >= 1); - - [encoder dispatchThreadgroups:groups threadsPerThreadgroup:threadsPerGroup]; -} - #if MNN_METAL_DEBUG #pragma mark debug - (void)printTensor:(const Tensor *)tensor { diff --git a/source/backend/metal/MetalArgMax.mm b/source/backend/metal/MetalArgMax.mm index b867b9d67..ba0f1e76a 100644 --- a/source/backend/metal/MetalArgMax.mm +++ b/source/backend/metal/MetalArgMax.mm @@ -1,3 +1,11 @@ +// +// MetalArgMax.mm +// MNN +// +// Created by MNN on 2023/12/29. +// Copyright © 2018, Alibaba Group Holding Limited +// + #import "core/Macro.h" #import "MetalCast.hpp" #import "MetalBackend.hpp" diff --git a/source/backend/metal/MetalAttention.mm b/source/backend/metal/MetalAttention.mm new file mode 100644 index 000000000..324266913 --- /dev/null +++ b/source/backend/metal/MetalAttention.mm @@ -0,0 +1,425 @@ +// +// MetalAttention.mm +// MNN +// +// Created by MNN on b'2024/04/29'. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include +#import "core/Macro.h" +#import "MetalCast.hpp" +#import "MetalBackend.hpp" +#import "MNNMetalContext.h" +#include "MNN_generated.h" + +#if MNN_METAL_ENABLED +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE + +static const char* gMatMulDivMask = R"metal( +#include +#include +using namespace metal; +struct Param { + int query_seq_len; + int key_seq_len; + int head_num; + int head_dim; + float scale; +}; + +kernel void main0(const device T* input0 [[buffer(0)]], + const device T* input1 [[buffer(1)]], + device T* output [[buffer(2)]], + device T* past_key [[buffer(3)]], + const device int* mask [[buffer(4)]], + constant Param& param [[buffer(5)]], + uint3 gid[[thread_position_in_grid]]) { + const int x = gid.x; // query_seq_len + const int y = gid.y; // head_num + const int z = gid.z; // key_seq_len + if (x >= param.query_seq_len || y >= param.head_num || z >= param.key_seq_len) { + return; + } + int query_seq_len = param.query_seq_len; + int key_seq_len = param.key_seq_len; + int head_num = param.head_num; + int head_dim = param.head_dim; + + const int offset = head_num * head_dim; + const int offset_head = y * head_dim; + const device T* A_offset = input0 + x * offset + offset_head; + device T* Pastkey_offset = past_key + z * offset + offset_head; + float Vscale = (float)param.scale; +#ifdef FOR_PREFILL + device const T* B_offset = input1 + z * offset + offset_head; + const int output_offset = y * query_seq_len * key_seq_len; + float out0 = 0.0; + + for(int i = 0; i < head_dim; ++i){ + float A = (float)(A_offset[i]); + float B = (float)(B_offset[i]); + out0 += B * A; + Pastkey_offset[i] = (T)B; + } + + out0 *= Vscale; + + out0 = mask[((x + 0) * key_seq_len + (z + 0))] == 0 ? -FLT_MAX : out0; + output[output_offset + x * key_seq_len + z] = (T)out0; +#else + const device T *B_offset = input1 + offset_head; + float out = 0.0; + if (z == key_seq_len - 1) { + for(int i = 0; i < head_dim; ++i){ + float A = (float)(A_offset[i]); + float B = (float)(B_offset[i]); + out += B * A; + Pastkey_offset[i] = (T)B; + } + } else { + for(int i = 0; i < head_dim; ++i){ + float A = A_offset[i]; + float B = (float)Pastkey_offset[i]; + + out += A * B; + } + } + out *= Vscale; + output[y + z * head_num] = (T)out; +#endif +} + +)metal"; + + +static const char* gMatMulQKV = R"metal( +#include +#include +using namespace metal; +struct Param { + int query_seq_len; + int key_seq_len; + int head_num; + int head_dim; + float scale; +}; +kernel void main0(const device T* input0 [[buffer(0)]], + const device T* input1 [[buffer(1)]], + device T* output [[buffer(2)]], + device T* past_value [[buffer(3)]], + constant Param& param [[buffer(4)]], + uint3 gid[[thread_position_in_grid]]) { + const int x = gid.x; // query_seq_len + const int y = gid.y; // head_num + const int z = gid.z; // head_dim + if (x >= param.query_seq_len || y >= param.head_num || z >= param.head_dim) { + return; + } + int qk_seq_len = param.query_seq_len; + int value_seq_len = param.key_seq_len; + int head_num = param.head_num; + int head_dim = param.head_dim; + const int offset = head_num * head_dim; + const int offset_head = y * head_dim + z; +#ifdef FOR_PREFILL + device const T *A_offset = input0 + (y * qk_seq_len + x) * value_seq_len; + device const T *B_offset = input1 + offset_head; + device T *Pastvalue_offset = past_value + offset_head; + float out = 0.0; + + for(int i = 0; i < value_seq_len; ++i){ + float A0 = (float)A_offset[i]; + float B = (float)B_offset[i*offset]; + out += A0 * B; + Pastvalue_offset[i*offset] = B; + } + output[ x * offset + (y * head_dim + z)] = out; +#else + device const T *A_offset = input0 + y; + device const T *B_offset = input1 + offset_head; + device T *Pastvalue_offset = past_value + offset_head; + float out = 0; + + for(int i = 0; i < value_seq_len - 1; ++i){ + float A = (float)A_offset[i * head_num]; + float B = (float)Pastvalue_offset[i * offset]; + + out += A * B; + } + out += (float)A_offset[(value_seq_len - 1)*head_num] * (float)B_offset[0]; + Pastvalue_offset[(value_seq_len - 1)*offset] = B_offset[0]; + output[(y * head_dim + z)] = (T)out; +#endif + +} +)metal"; + +namespace MNN { +class AttentionBufExecution : public MetalExecution { +public: + struct SharedCache { + std::shared_ptr mPastKey; + std::shared_ptr mPastValue; + int mPastLength = 0, mMaxLength = 0, mKv_seq_len = 0; + }; + AttentionBufExecution(Backend *backend, bool kv_cache); + + virtual ~AttentionBufExecution() = default; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; + virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override { + if (nullptr == dst) { + return true; + } + auto exe = new AttentionBufExecution(bn, mKVCache); + exe->mCache = mCache; + *dst = exe; + return true; + } + +private: + void _init(); + void reallocKVCache(); + bool mKVCache; + std::shared_ptr mCache; + float mScale; + const int mExpandChunk = 64; + bool mIsDecode = false; + std::shared_ptr mTempQK, mTempSoftMax; + int mNumHead = 0, mHeadDim = 0, mValueH = 0; + id mKernel_softmax; + + id mKernel_qk; + id mKernel_qkv; + id mKernelPrefill_qk; + id mKernelPrefill_qkv; + id mParamQKV; + id mParamSoftmax; +}; + +struct Param { + int query_seq_len; + int key_seq_len; + int head_num; + int head_dim; + float scale; +}; +AttentionBufExecution::AttentionBufExecution(Backend *backend, bool kv_cahce) + : MetalExecution(backend) , mKVCache(kv_cahce){ + _init(); +} +void AttentionBufExecution::_init() { + mCache.reset(new SharedCache); + auto mtbn = static_cast(backend()); + auto context = (__bridge MNNMetalContext *)mtbn->context(); + mKernel_softmax = [context pipelineWithName:@"softmax_plane" fp16:mtbn->useFp16InsteadFp32()]; + mParamQKV = [context newDeviceBuffer:sizeof(Param) access:CPUWriteOnly]; + mParamSoftmax = [context newDeviceBuffer:4 * sizeof(int) access:CPUWriteOnly]; + auto rt = mtbn->runtime(); + std::string T = "float"; + if (mtbn->useFp16InsteadFp32()) { + T = "half"; + } + std::vector keys = { + "matmul_qk_div_mask", + T + }; + auto pipeline = rt->findPipeline(keys); + if (nil == pipeline) { + // Rebuild Pipeline + MTLCompileOptions *decodeOption = [[MTLCompileOptions alloc] init]; + decodeOption.preprocessorMacros = @{ + @"T" : @(T.c_str()), + }; + + MTLCompileOptions* encodeOption = [[MTLCompileOptions alloc] init]; + encodeOption.preprocessorMacros = @{ + @"T" : @(T.c_str()), + @"FOR_PREFILL": @"1" + }; + mKernel_qk = mtbn->makeComputePipelineWithSourceOption(gMatMulDivMask, "main0", decodeOption); + mKernelPrefill_qk = mtbn->makeComputePipelineWithSourceOption(gMatMulDivMask, "main0", encodeOption); + mKernel_qkv = mtbn->makeComputePipelineWithSourceOption(gMatMulQKV, "main0", decodeOption); + mKernelPrefill_qkv = mtbn->makeComputePipelineWithSourceOption(gMatMulQKV, "main0", encodeOption); + + rt->insertPipeline({"matmul_qk_div_mask", T}, mKernel_qk); + rt->insertPipeline({"matmul_qk_div_mask", T, "PREFILL"}, mKernelPrefill_qk); + rt->insertPipeline({"matmul_qkv", T}, mKernel_qkv); + rt->insertPipeline({"matmul_qkv", T, "PREFILL"}, mKernelPrefill_qkv); + } else { + mKernel_qk = rt->findPipeline({"matmul_qk_div_mask", T}); + mKernelPrefill_qk = rt->findPipeline({"matmul_qk_div_mask", T, "PREFILL"}); + mKernel_qkv = rt->findPipeline({"matmul_qkv", T}); + mKernelPrefill_qkv = rt->findPipeline({"matmul_qkv", T, "PREFILL"}); + } + MNN_ASSERT(nil != mKernel_qk); + MNN_ASSERT(nil != mKernel_qkv); + MNN_ASSERT(nil != mKernelPrefill_qk); + MNN_ASSERT(nil != mKernelPrefill_qkv); +} + +void AttentionBufExecution::reallocKVCache() { + if (mCache->mPastLength < mCache->mMaxLength || nullptr == mTempQK || (!mIsDecode)) { + if (mIsDecode) { + mTempQK.reset(Tensor::createDevice({mNumHead, mCache->mMaxLength})); + mTempSoftMax.reset(Tensor::createDevice({mNumHead, mCache->mMaxLength})); + } else { + mTempQK.reset(Tensor::createDevice({mNumHead, mCache->mPastLength, mCache->mPastLength})); + mTempSoftMax.reset(Tensor::createDevice({mNumHead, mCache->mPastLength, mCache->mPastLength})); + } + backend()->onAcquireBuffer(mTempQK.get(), Backend::STATIC); + backend()->onAcquireBuffer(mTempSoftMax.get(), Backend::STATIC); + } + if (!mKVCache || mCache->mPastLength < mCache->mMaxLength) { + return; + } + auto mtbn = static_cast(backend()); + int byte = 4; + if(mtbn->useFp16InsteadFp32()) { + byte = 2; + } + bool needCopy = mCache->mMaxLength > 0; + + size_t old_size = mNumHead * mCache->mMaxLength * mHeadDim * byte; + mCache->mMaxLength = mCache->mPastLength + mExpandChunk; + // past_key: [1, numhead, headdim, maxlen] + auto new_key = Tensor::createDevice({mCache->mMaxLength, mNumHead, mHeadDim}); + // past_value: [1, numhead, maxlen, headdim] + auto new_value = Tensor::createDevice({mCache->mMaxLength, mNumHead, mHeadDim}); + size_t size = mNumHead * mCache->mMaxLength * mHeadDim * byte; + backend()->onAcquireBuffer(new_key, Backend::STATIC); + backend()->onAcquireBuffer(new_value, Backend::STATIC); + if (needCopy) { + auto newKeyBuf = MetalBackend::getBuffer(new_key); + auto new_key_ptr = (uint8_t*)[newKeyBuf.first contents] + newKeyBuf.second; + auto keyBuf = MetalBackend::getBuffer(mCache->mPastKey.get()); + auto key_ptr = (uint8_t*)[keyBuf.first contents] + keyBuf.second;; + ::memcpy(new_key_ptr, key_ptr, old_size); + + auto newValueBuf = MetalBackend::getBuffer(new_value); + auto new_value_ptr = (uint8_t*)[newValueBuf.first contents] + newValueBuf.second; + auto valueBuf = MetalBackend::getBuffer(mCache->mPastValue.get()); + auto value_ptr = (uint8_t*)[valueBuf.first contents] + valueBuf.second; + ::memcpy(new_value_ptr, value_ptr, old_size); + } + mCache->mPastKey.reset(new_key); + mCache->mPastValue.reset(new_value); +} + + +void AttentionBufExecution::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto query = inputs[0]; + auto key = inputs[1]; + auto value = inputs[2]; + auto mask = inputs[3]; + auto mtbn = static_cast(backend()); + auto context = (__bridge MNNMetalContext *)mtbn->context(); + auto shape = query->shape(); + + int seq_len = shape[1]; + mNumHead = shape[2]; + mHeadDim = shape[3]; + mScale = 1.0 / sqrt(mHeadDim); + mIsDecode = seq_len == 1; + if (mCache->mPastLength == 0 || seq_len > 1) { + mCache->mPastLength = seq_len; + } + mCache->mKv_seq_len = mCache->mPastLength; + if(mIsDecode){ + mCache->mKv_seq_len = mCache->mPastLength + 1; + } + reallocKVCache(); + + // Update Parameters + { + auto param = (Param*)mParamQKV.contents; + param->scale = mScale; + param->head_dim = mHeadDim; + param->key_seq_len = mCache->mKv_seq_len; + param->head_num = mNumHead; + param->query_seq_len = seq_len; + } + // For softmax parameter + int inside, outside; + if (mIsDecode) { + inside = mNumHead; + outside = 1; + } else { + inside = 1; + outside = mCache->mKv_seq_len * mNumHead; + } + int axis = mCache->mKv_seq_len; + { + auto softmax = (int*)mParamSoftmax.contents; + // Inside, axis, outside, plane(invalid) + softmax[0] = inside; + softmax[1] = axis; + softmax[2] = outside; + softmax[3] = 0; + } + // Run QK Kernel + { + id pipeline; + if (mIsDecode) { + pipeline = mKernel_qk; + } else { + pipeline = mKernelPrefill_qk; + } + [encoder setComputePipelineState:pipeline]; + MetalBackend::setTensor(query, encoder, 0); + MetalBackend::setTensor(key, encoder, 1); + MetalBackend::setTensor(mTempQK.get(), encoder, 2); + MetalBackend::setTensor(mCache->mPastKey.get(), encoder, 3); + MetalBackend::setTensor(mask, encoder, 4); + [encoder setBuffer:mParamQKV offset:0 atIndex:5]; + auto gl = [context computeBestGroupAndLocal:pipeline threads:MTLSizeMake(seq_len, mNumHead, mCache->mKv_seq_len)]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; + } + // Run Softmax Kernel + { + [encoder setComputePipelineState:mKernel_softmax]; + MetalBackend::setTensor(mTempQK.get(), encoder, 0); + MetalBackend::setTensor(mTempSoftMax.get(), encoder, 1); + [encoder setBuffer:mParamSoftmax offset:0 atIndex:2]; + auto gl = [context computeBestGroupAndLocal: mKernel_softmax threads:MTLSizeMake(inside, outside, 1)]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; + } + // Run QKV Kernel + { + id pipeline; + if (mIsDecode) { + pipeline = mKernel_qkv; + } else { + pipeline = mKernelPrefill_qkv; + } + [encoder setComputePipelineState:pipeline]; + MetalBackend::setTensor(mTempSoftMax.get(), encoder, 0); + MetalBackend::setTensor(value, encoder, 1); + MetalBackend::setTensor(outputs[0], encoder, 2); + MetalBackend::setTensor(mCache->mPastValue.get(), encoder, 3); + [encoder setBuffer:mParamQKV offset:0 atIndex:4]; + auto gl = [context computeBestGroupAndLocal:pipeline threads:MTLSizeMake(seq_len, mNumHead, mHeadDim)]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; + } + // Update status + if(mIsDecode){ + mCache->mPastLength += 1; + mCache->mKv_seq_len = mCache->mPastLength + 1; + } + + return; +} + +class AttentionBufCreator : public MetalBackend::Creator { +public: + virtual Execution *onCreate(const std::vector &inputs, const MNN::Op *op, Backend *backend, const std::vector &outputs) const override { + auto param = op->main_as_AttentionParam(); + return new AttentionBufExecution(backend, param->kv_cache()); + } +}; +REGISTER_METAL_OP_TRANSFORMER_CREATOR(AttentionBufCreator, OpType_Attention); + +} // namespace MNN +#endif/* MNN_SUPPORT_TRANSFORMER_FUSE */ +#endif + diff --git a/source/backend/metal/MetalBackend.hpp b/source/backend/metal/MetalBackend.hpp index fe7107911..786a89351 100644 --- a/source/backend/metal/MetalBackend.hpp +++ b/source/backend/metal/MetalBackend.hpp @@ -137,7 +137,7 @@ class MetalBackend : public Backend { * @param creator registering creator. */ static void addCreator(OpType type, Creator *creator); - static void setTensor(MNN::Tensor* tensor, id encoder, int index); + static void setTensor(const MNN::Tensor* tensor, id encoder, int index); static std::pair, int> getBuffer(MNN::Tensor* tensor); size_t getTensorSizeInBytes(const Tensor* tensor) const; virtual bool onSelectDynamicAllocator(int index, int maxIndex) override; @@ -264,5 +264,10 @@ class MetalCreatorRegister { MetalBackend::addCreator(opType, new name); \ } +#define REGISTER_METAL_OP_TRANSFORMER_CREATOR(name, opType) \ + void ___##name##__##opType##__() { \ + MetalBackend::addCreator(opType, new name); \ + } + #endif /* MNN_METAL_ENABLED */ #endif /* MetalBackend_hpp */ diff --git a/source/backend/metal/MetalBackend.mm b/source/backend/metal/MetalBackend.mm index 35636c6c3..64187b36c 100644 --- a/source/backend/metal/MetalBackend.mm +++ b/source/backend/metal/MetalBackend.mm @@ -5,12 +5,12 @@ // Created by MNN on 2019/01/30. // Copyright © 2018, Alibaba Group Holding Limited // + #import "backend/metal/MetalBackend.hpp" #define MNN_METAL #import #define METAL_CONST_BUFFER_LIMIT 128 #if MNN_METAL_ENABLED -#import #import "backend/metal/MNNMetalContext.h" #import "core/Macro.h" #import "core/TensorUtils.hpp" @@ -126,24 +126,30 @@ MemChunk chunk() override { auto format = TensorUtils::getDescribe(tensor)->dimensionFormat; size_t size; if (MNN_DATA_FORMAT_NC4HW4 == format && tensor->dimensions() >= 2) { - size_t width = 1; - size_t height = 1; - auto batch = tensor->length(0); - auto channel = tensor->length(1); + int width = 1; + int height = 1; + int batch = tensor->length(0); + int channel = tensor->length(1); if (tensor->dimensions() >= 3) { height = tensor->length(2); } for (int i=3; idimensions(); ++i) { width *= tensor->length(i); } - auto alignC = ROUND_UP(channel, 4); - auto hR = ROUND_UP(height, 4) - height; + int alignC = ROUND_UP(channel, 4); + int hR = ROUND_UP(height, 4) - height; // width parallel 4, may exceed 3 elements - auto wR = ROUND_UP(width + 3, 4) - width; + int wR = ROUND_UP(width + 3, 4) - width; + int bhw = batch * width * height; + int bhwR = UP_DIV(bhw, 16) * 16 - bhw; + int extraPadding = ALIMAX(bhwR, (hR * width + wR)); size = batch * alignC * width * height; - size = size + hR * width * 4 + wR * 4; + size = size + extraPadding * 4; } else { - size = tensor->elementSize(); + size = 1; + for (int i=0; idimensions(); ++i) { + size *= tensor->length(i); + } size = ROUND_UP(size, 4); } if (0 == size) { @@ -356,7 +362,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { // shape ((int *)shape.contents)[0] = s; ((int *)shape.contents)[1] = c; - ((int *)shape.contents)[2] = z; + ((int *)shape.contents)[2] = b; ((int *)shape.contents)[3] = b * z; // threads @@ -459,13 +465,6 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { auto dfmt = TensorUtils::getDescribe(dst)->dimensionFormat; auto device = (id)((MetalRuntimeAllocator::MetalBufferAlloc *) (dst->deviceId()))->getBuffer(); auto floats = src->getType().code == halide_type_float; - std::unique_ptr tempSrc; - if (sfmt == dfmt && sfmt == MNN_DATA_FORMAT_NC4HW4) { - tempSrc.reset(new Tensor(src, Tensor::CAFFE)); - MNNCPUCopyBuffer(src, tempSrc.get()); - src = tempSrc.get(); - sfmt = TensorUtils::getDescribe(src)->dimensionFormat; - } // For command queue from user, need user to make sure last frame's gpu work is ready bool needWait = !mRuntime->userSync(); // cast @@ -486,7 +485,8 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { }; ::memcpy(mShapeH2D.contents, limits, sizeof(limits)); auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; - auto bandwidth = [ctx load: @"downcast_float4" encoder:encoder fp16:mUseFloatAsFp16]; + auto pipeline = [ctx pipelineWithName:@"downcast_float4" fp16:mUseFloatAsFp16]; + [encoder setComputePipelineState:pipeline]; [encoder setBuffer:host offset:0 atIndex:0]; [encoder setBuffer:device offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; @@ -494,7 +494,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { //[ctx dispatchEncoder:encoder threads:{sizeC4, 1, 1} bandwidth:bandwidth]; std::pair threads; threads.first = {sizeC4, 1, 1}; - threads.second = {bandwidth.maxThreadsPerThreadgroup, 1, 1}; + threads.second = {[pipeline maxTotalThreadsPerThreadgroup], 1, 1}; threads.second.width = threads.second.width <= threads.first.width ? threads.second.width : threads.first.width; threads.first.width = UP_DIV(threads.first.width, threads.second.width); [encoder dispatchThreadgroups:threads.first threadsPerThreadgroup:threads.second]; @@ -520,13 +520,14 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; auto kernel = kernelForConvert(src->getType(), sfmt, dfmt, Down); MNN_ASSERT(kernel != nil); // unsupported sfmt to dfmt - - auto bandwidth = [ctx load:kernel encoder:encoder fp16:mUseFloatAsFp16]; + auto pipeline = [ctx pipelineWithName:kernel fp16:mUseFloatAsFp16]; + [encoder setComputePipelineState:pipeline]; [encoder setBuffer:buffer offset:0 atIndex:0]; [encoder setBuffer:device offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; [encoder setBuffer:mShapeH2D offset:0 atIndex:2]; - [ctx dispatchEncoder:encoder threads:size bandwidth:bandwidth]; + auto gl = [ctx computeBestGroupAndLocal:pipeline threads:size]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; [encoder endEncoding]; commit(); //[ctx wait]; @@ -539,16 +540,6 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { auto dfmt = TensorUtils::getDescribe(dst)->dimensionFormat; auto device = (id)((MetalRuntimeAllocator::MetalBufferAlloc *)src->deviceId())->getBuffer(); auto floats = src->getType().code == halide_type_float; - std::shared_ptr tempDst; - if (sfmt == dfmt && sfmt == MNN_DATA_FORMAT_NC4HW4) { - tempDst.reset(new Tensor(dst, Tensor::CAFFE), [dst](void* t) { - auto tensor = (Tensor*)t; - MNNCPUCopyBuffer(tensor, dst); - delete tensor; - }); - dst = tempDst.get(); - dfmt = TensorUtils::getDescribe(dst)->dimensionFormat; - } // cast if (sfmt == dfmt || src->dimensions() <= 1) { if (floats && mUseFloatAsFp16) { @@ -558,7 +549,8 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { NSUInteger size = src->elementSize(); auto encoder = [getCommandBufferForBufferCopy() computeCommandEncoder]; - auto bandwidth = [ctx load: @"upcast_float4" encoder:encoder fp16:mUseFloatAsFp16]; + auto pipeline = [ctx pipelineWithName:@"upcast_float4" fp16:mUseFloatAsFp16]; + [encoder setComputePipelineState:pipeline]; [encoder setBuffer:device offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:buffer offset:0 atIndex:1]; auto sizeC4 = UP_DIV(size, 4); @@ -573,7 +565,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { //[ctx dispatchEncoder:encoder threads:{sizeC4, 1, 1} bandwidth:bandwidth]; std::pair threads; threads.first = {sizeC4, 1, 1}; - threads.second = {bandwidth.maxThreadsPerThreadgroup, 1, 1}; + threads.second = {[pipeline maxTotalThreadsPerThreadgroup], 1, 1}; threads.second.width = threads.second.width <= threads.first.width ? threads.second.width : threads.first.width; threads.first.width = UP_DIV(threads.first.width, threads.second.width); [encoder dispatchThreadgroups:threads.first threadsPerThreadgroup:threads.second]; @@ -597,18 +589,28 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { auto kernel = kernelForConvert(src->getType(), sfmt, dfmt, Up); MNN_ASSERT(kernel != nil); // unsupported sfmt to dfmt - auto bandwidth = [ctx load:kernel encoder:encoder fp16:mUseFloatAsFp16]; + auto pipeline = [ctx pipelineWithName:kernel fp16:mUseFloatAsFp16]; + [encoder setComputePipelineState:pipeline]; [encoder setBuffer:device offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:buffer offset:0 atIndex:1]; [encoder setBuffer:mShapeD2H offset:0 atIndex:2]; - [ctx dispatchEncoder:encoder threads:size bandwidth:bandwidth]; + auto gl = [ctx computeBestGroupAndLocal:pipeline threads:size]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; [encoder endEncoding]; commit(); wait(); memcpy(dst->host(), buffer.contents, dst->size()); } } - +static const char* gCopy = R"metal( +#include +#include +using namespace metal; +kernel void main0(const device int4 *in [[buffer(0)]], device int4 *out [[buffer(1)]], constant uint4& limit [[buffer(2)]], uint gid [[thread_position_in_grid]]) { + if (gid < limit.x) { + out[int(gid)] = in[int(gid)]; + } +})metal"; void MetalBackend::onCopyDeviceToDevice(const Tensor *src, const Tensor *dst, id encoder, id shape) const { auto ctx = (__bridge MNNMetalContext *)context(); @@ -619,12 +621,28 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { // copy if (sfmt == dfmt || src->dimensions() <= 1) { - auto flt = dst->getType().code == halide_type_float; - auto size = flt ? dst->elementSize() : dst->size(); - auto bandwidth = [ctx load:flt ? @"copy_float" : @"copy_byte" encoder:encoder fp16:mUseFloatAsFp16]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)src->deviceId())->getBuffer() offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)dst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; - [ctx dispatchEncoder:encoder threads:{(NSUInteger)size, 1, 1} bandwidth:bandwidth]; + auto size = dst->usize(); + if (mUseFloatAsFp16 && dst->getType().code == halide_type_float) { + size = size / 2; + } + size = UP_DIV(size, (4 * sizeof(float))); + std::vector keys = { + "copyC4" + }; + id pipeline = mRuntime->findPipeline(keys); + if (nil == pipeline) { + pipeline = makeComputePipelineWithSourceOption(gCopy, "main0", nil); + mRuntime->insertPipeline(keys, pipeline); + } + [encoder setComputePipelineState:pipeline]; + if (shape == nil) { + shape = getConstBuffer(4 * sizeof(int)); + } + ((uint32_t*)[shape contents])[0] = size; + setTensor(src, encoder, 0); + setTensor(dst, encoder, 1); + [encoder setBuffer:shape offset:0 atIndex:2]; + [encoder dispatchThreadgroups:MTLSizeMake(UP_DIV(size, 256), 1, 1) threadsPerThreadgroup:MTLSizeMake(256, 1, 1)]; } // convert else { @@ -635,11 +653,13 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { } auto size = getTensorShape(shape, src); - auto bandwidth = [ctx load:kernel encoder:encoder fp16:mUseFloatAsFp16]; + auto pipeline = [ctx pipelineWithName:kernel fp16:mUseFloatAsFp16]; + [encoder setComputePipelineState:pipeline]; [encoder setBuffer:( id)((MetalRuntimeAllocator::MetalBufferAlloc *)(src->buffer().device))->getBuffer() offset:TensorUtils::getDescribe(src)->extra.offset atIndex:0]; [encoder setBuffer:( id)((MetalRuntimeAllocator::MetalBufferAlloc *)(dst->buffer().device))->getBuffer() offset:TensorUtils::getDescribe(dst)->extra.offset atIndex:1]; [encoder setBuffer:shape offset:0 atIndex:2]; - [ctx dispatchEncoder:encoder threads:size bandwidth:bandwidth]; + auto gl = [ctx computeBestGroupAndLocal:pipeline threads:size]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; } if (standalone) { @@ -712,7 +732,7 @@ MTLSize getTensorShape(id shape, const Tensor *tensor) { return _commandBuffer_net; } -void MetalBackend::setTensor(MNN::Tensor* tensor, id encoder, int index) { +void MetalBackend::setTensor(const MNN::Tensor* tensor, id encoder, int index) { [encoder setBuffer:((MetalRuntimeAllocator::MetalBufferAlloc *)tensor->deviceId())->getBuffer() offset:TensorUtils::getDescribe(tensor)->extra.offset atIndex:index]; } std::pair, int> MetalBackend::getBuffer(MNN::Tensor* tensor) { diff --git a/source/backend/metal/MetalCodeGen.py b/source/backend/metal/MetalCodeGen.py index 59af20ef5..9d63fd988 100644 --- a/source/backend/metal/MetalCodeGen.py +++ b/source/backend/metal/MetalCodeGen.py @@ -18,6 +18,7 @@ def genRegister(): f.write(" namespace MNN {\n") f.write("#if MNN_METAL_ENABLED\n") funcs=[] + transformerFuncs = [] for shapath in shaders: with open(shapath,"r") as sha: lines=sha.readlines() @@ -27,10 +28,22 @@ def genRegister(): funcname="___"+x[0]+"__"+x[1]+"__();" funcs.append(funcname) f.write(" extern void "+funcname+"\n") + elif l.startswith('REGISTER_METAL_OP_TRANSFORMER_CREATOR('): + x=l.replace("REGISTER_METAL_OP_TRANSFORMER_CREATOR(","").replace(")","").replace(" ","").replace(";","").replace("\n","").split(",") + funcname="___"+x[0]+"__"+x[1]+"__();" + transformerFuncs.append(funcname) + f.write("#ifdef MNN_SUPPORT_TRANSFORMER_FUSE\n") + f.write(" extern void "+funcname+"\n") + f.write('#endif\n') + pass f.write("void registerMetalOps() {\n") for func in funcs: f.write(" "+func+"\n") + f.write('#ifdef MNN_SUPPORT_TRANSFORMER_FUSE\n') + for func in transformerFuncs: + f.write(" "+func+"\n") + f.write('#endif\n') f.write("}\n#endif\n}") if os.path.isdir(renderPath): shaders=[] diff --git a/source/backend/metal/MetalConvolution.hpp b/source/backend/metal/MetalConvolution.hpp index 150b61eae..139f6a427 100644 --- a/source/backend/metal/MetalConvolution.hpp +++ b/source/backend/metal/MetalConvolution.hpp @@ -22,7 +22,7 @@ class MetalConvolution : public MetalConvolutionCommon { virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; protected: - virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: MetalConvolution(Backend *backend, const MNN::Op *op, std::shared_ptr weight, std::shared_ptr bias); diff --git a/source/backend/metal/MetalConvolution.mm b/source/backend/metal/MetalConvolution.mm index e614b4df0..c1b6ee37c 100755 --- a/source/backend/metal/MetalConvolution.mm +++ b/source/backend/metal/MetalConvolution.mm @@ -175,14 +175,13 @@ return NO_ERROR; } -void MetalConvolution::onFloat(const Tensor *input, const Tensor *output, id encoder) { - auto oc_4 = UP_DIV(output->channel(), 4); +void MetalConvolution::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0]; + auto output = outputs[0]; - auto bandwidth = (MetalBandwidth){mPipeline.threadExecutionWidth, mPipeline.maxTotalThreadsPerThreadgroup, NO}; - [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + MetalBackend::setTensor(input, encoder, 0); + MetalBackend::setTensor(output, encoder, 1); [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; MetalBackend::setTensor(mWeight.get(), encoder, 3); MetalBackend::setTensor(mBias.get(), encoder, 4); diff --git a/source/backend/metal/MetalConvolution1x1.hpp b/source/backend/metal/MetalConvolution1x1.hpp index 7e81d41ba..672d433b6 100644 --- a/source/backend/metal/MetalConvolution1x1.hpp +++ b/source/backend/metal/MetalConvolution1x1.hpp @@ -21,10 +21,9 @@ class MetalConvolution1x1 : public MetalConvolutionCommon { virtual ~MetalConvolution1x1() = default; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; -protected: - virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: - MetalConvolution1x1(Backend *backend, const MNN::Op *op, std::shared_ptr weight, std::shared_ptr bias, std::shared_ptr dequantScale, std::shared_ptr dequantBias, int dequantBits); + MetalConvolution1x1(Backend *backend, const MNN::Op *op, std::shared_ptr weight, std::shared_ptr bias, std::shared_ptr dequantScale, int dequantBits); id mPipeline; std::pair mThreads; }; diff --git a/source/backend/metal/MetalConvolution1x1.mm b/source/backend/metal/MetalConvolution1x1.mm index b768cd4d4..9ca59c59c 100644 --- a/source/backend/metal/MetalConvolution1x1.mm +++ b/source/backend/metal/MetalConvolution1x1.mm @@ -31,11 +31,10 @@ loadWeight(op->main_as_Convolution2D(), ldInt8Weight); } -MetalConvolution1x1::MetalConvolution1x1(Backend *backend, const MNN::Op *op, std::shared_ptr weight, std::shared_ptr bias, std::shared_ptr dequantScale, std::shared_ptr dequantBias, int dequantBits) : MetalConvolutionCommon(backend, op, bias) { +MetalConvolution1x1::MetalConvolution1x1(Backend *backend, const MNN::Op *op, std::shared_ptr weight, std::shared_ptr bias, std::shared_ptr dequantScale, int dequantBits) : MetalConvolutionCommon(backend, op, bias) { mWeight = weight; mBias = bias; - mDequantScale = dequantScale; - mDequantZero = dequantBias; + mDequantScaleBias = dequantScale; mDequantBits = dequantBits; } @@ -47,7 +46,7 @@ if (nullptr == dst) { return true; } - *dst = new MetalConvolution1x1(bn, op, mWeight, mBias, mDequantScale, mDequantZero, mDequantBits); + *dst = new MetalConvolution1x1(bn, op, mWeight, mBias, mDequantScaleBias, mDequantBits); return true; } @@ -55,15 +54,18 @@ MetalConvolutionCommon::onResize(inputs, outputs); // prepare + // For C4NHW4 format, NHW can be fuse to W auto input = inputs[0]; auto output = outputs[0]; - - auto is = input->width() * input->height(); - auto ic_4 = UP_DIV(input->channel(), 4); - auto ow = output->width(); - auto oh = output->height(); - auto os = ow * oh; - auto ob = output->batch(); + int is = input->batch(); + for (int i=2; idimensions(); ++i) { + is *= input->length(i); + } + int ic_4 = UP_DIV(input->channel(), 4); + int ow = is; + int oh = 1; + int os = ow; + int ob = 1; auto oc = output->channel(); auto oc_4 = UP_DIV(output->channel(), 4); auto backend = static_cast(this->backend()); @@ -75,7 +77,7 @@ ::memcpy(mConstBuffer.contents, constants, sizeof(constants)); MetalRuntime* rt = (MetalRuntime *)backend->runtime(); - if (ow == input->width() && oh == input->height() && mDequantScale.get()) { + if (mDequantScaleBias.get()) { NSUInteger gid_x = UP_DIV(ow * oh, 4); NSUInteger gid_y = oc_4; NSUInteger gid_z = ob; @@ -89,8 +91,8 @@ (id)(((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId()))->getBuffer(), mConstBuffer, (((MetalRuntimeAllocator::MetalBufferAlloc *)mWeight->deviceId()))->getBuffer(), ((MetalRuntimeAllocator::MetalBufferAlloc *)mBias->deviceId())->getBuffer(), - (((MetalRuntimeAllocator::MetalBufferAlloc *)mDequantScale->deviceId()))->getBuffer(), - (((MetalRuntimeAllocator::MetalBufferAlloc *)mDequantZero->deviceId()))->getBuffer(), nil]; + (((MetalRuntimeAllocator::MetalBufferAlloc *)mDequantScaleBias->deviceId()))->getBuffer(), + nil]; const Tensor* weight = mWeight.get(); const Tensor* bias = mBias.get(); int buffer_offset[] = { @@ -99,8 +101,7 @@ 0, TensorUtils::getDescribe(weight)->extra.offset, TensorUtils::getDescribe(bias)->extra.offset, - TensorUtils::getDescribe(mDequantScale.get())->extra.offset, - TensorUtils::getDescribe(mDequantZero.get())->extra.offset, + TensorUtils::getDescribe(mDequantScaleBias.get())->extra.offset, 0}; MetalRuntime *rt = (MetalRuntime *)backend->runtime(); @@ -147,9 +148,8 @@ //printf("conv1x1_z4, %d %d %d %d\n", ow, oh, oc_4, ic_4); } } else { - NSString* shaderName[] = {@"conv1x1_w4h2", @"conv1x1_w2h2", @"conv1x1_w4h4", @"conv1x1_w2c2", @"conv1x1_w2h2c2"}; - int itemW[] = {4, 2, 4, 2, 2}; - int itemH[] = {2, 2, 4, 1, 2}; + NSString* shaderName[] = {@"conv1x1_g1z8", @"conv1x1_g1z4", @"conv1x1_w4h4", @"conv1x1_w2c2", @"conv1x1_w4c2"}; + int itemW[] = {8, 4, 16, 2, 4}; int itemC[] = {4, 4, 4, 8, 8}; int actual_kernel = 5; if (oc_4 % 2 != 0) { @@ -168,8 +168,8 @@ for(int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { id pipeline = [context pipelineWithName:shaderName[knl_idx] fp16:backend->useFp16InsteadFp32()]; NSUInteger gid_x = UP_DIV(ow, itemW[knl_idx]); - NSUInteger gid_y = UP_DIV(oh, itemH[knl_idx]); - NSUInteger gid_z = ob * UP_DIV(oc, itemC[knl_idx]); + NSUInteger gid_y = UP_DIV(oc, itemC[knl_idx]); + NSUInteger gid_z = 1; std::string name = [shaderName[knl_idx] UTF8String]; auto ret = [context getGridAndThreadgroup:pipeline gid:MTLSizeMake(gid_x, gid_y, gid_z) loop:10 buffer:arr runtime:rt shaderName:name offsets:buffer_offset queue:backend->queue()]; @@ -188,16 +188,17 @@ return NO_ERROR; } -void MetalConvolution1x1::onFloat(const Tensor *input, const Tensor *output, id encoder) { +void MetalConvolution1x1::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0]; + auto output = outputs[0]; [encoder setComputePipelineState:mPipeline]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; MetalBackend::setTensor(mWeight.get(), encoder, 3); MetalBackend::setTensor(mBias.get(), encoder, 4); - if (mDequantScale && mDequantZero) { - MetalBackend::setTensor(mDequantScale.get(), encoder, 5); - MetalBackend::setTensor(mDequantZero.get(), encoder, 6); + if (mDequantScaleBias) { + MetalBackend::setTensor(mDequantScaleBias.get(), encoder, 5); } [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } diff --git a/source/backend/metal/MetalConvolutionCommon.hpp b/source/backend/metal/MetalConvolutionCommon.hpp index de1b00333..299551922 100644 --- a/source/backend/metal/MetalConvolutionCommon.hpp +++ b/source/backend/metal/MetalConvolutionCommon.hpp @@ -20,12 +20,10 @@ class MetalConvolutionCommon : public MetalExecution { public: MetalConvolutionCommon(Backend *backend, const MNN::Op *op, std::shared_ptr bias); virtual ~MetalConvolutionCommon() = default; - virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; protected: void loadWeight(const MNN::Convolution2D *conv, bool loadWeightInt8 = false); - virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) = 0; virtual std::shared_ptr weightTransform(int group, int oc, int ic, int kh, int kw, const float *src, bool int8Weight = false, bool int4Weight = false); private: @@ -42,8 +40,7 @@ class MetalConvolutionCommon : public MetalExecution { std::shared_ptr mWeight; std::shared_ptr mBias; - std::shared_ptr mDequantScale; - std::shared_ptr mDequantZero; + std::shared_ptr mDequantScaleBias; int mDequantBits; id mConstBuffer = nil; }; diff --git a/source/backend/metal/MetalConvolutionCommon.mm b/source/backend/metal/MetalConvolutionCommon.mm index 297c17b00..5bdeea2b0 100644 --- a/source/backend/metal/MetalConvolutionCommon.mm +++ b/source/backend/metal/MetalConvolutionCommon.mm @@ -68,10 +68,6 @@ } } -void MetalConvolutionCommon::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { - return onFloat(inputs[0], outputs[0], encoder); -} - template void weightInBlock(int group, int oc, int ic, int kh, int kw, const FType *src, uint8_t* dstOrigion) { auto goc = oc / group; @@ -101,25 +97,24 @@ void weightInBlock(int group, int oc, int ic, int kh, int kw, const FType *src, } } -static std::vector> getDequantScale(float* scale, int size, MetalBackend *backend, bool asymmetric) { +static std::shared_ptr getDequantScale(float* scale, int size, MetalBackend *backend, bool asymmetric) { int outputCount = 0; if (asymmetric) { outputCount = size / 2; } else { outputCount = size; } - std::vector> scaleBias(2); - std::shared_ptr dequantScale(MNN::Tensor::createDevice({outputCount * 4})); - std::shared_ptr dequantBias(MNN::Tensor::createDevice({outputCount * 4})); - bool res = backend->onAcquireBuffer(dequantScale.get(), Backend::STATIC) && backend->onAcquireBuffer(dequantBias.get(), Backend::STATIC); + int alignOutputCount = ALIGN_UP4(outputCount); + std::shared_ptr dequantScale(MNN::Tensor::createDevice({(int)(alignOutputCount * sizeof(float) * 2)})); + bool res = backend->onAcquireBuffer(dequantScale.get(), Backend::STATIC); if (!res) { MNN_ERROR("Buffer allocated error!\n"); - return scaleBias; + return nullptr; } auto buffer0 = MetalBackend::getBuffer(dequantScale.get()); auto dst_scale = (uint8_t*)[buffer0.first contents] + buffer0.second; - auto buffer1 = MetalBackend::getBuffer(dequantBias.get()); - auto dst_bias = (uint8_t*)[buffer1.first contents] + buffer1.second; + ::memset(dst_scale, 0, alignOutputCount * 2 * sizeof(float)); + auto dst_bias = dst_scale + alignOutputCount * sizeof(float); for (int o = 0; o < outputCount; ++o) { float min = 0.0f; float alpha = 0.0f; @@ -131,10 +126,8 @@ void weightInBlock(int group, int oc, int ic, int kh, int kw, const FType *src, } ((float*)dst_scale)[o] = alpha; ((float*)dst_bias)[o] = min; - } - scaleBias[0] = dequantScale; - scaleBias[1] = dequantBias; - return scaleBias; + } + return dequantScale; } void MetalConvolutionCommon::loadWeight(const MNN::Convolution2D *conv, bool loadWeightInt8) { std::shared_ptr qnt = NULL; @@ -157,8 +150,7 @@ void weightInBlock(int group, int oc, int ic, int kh, int kw, const FType *src, auto backend = static_cast(this->backend()); mWeight = weightTransform(group, oc, ic, kh, kw, (float*)qnt->weight.get(), !qnt->canUseInt4, qnt->canUseInt4); auto dequantParams = getDequantScale(qnt->alpha.get(), qnt->alpha.size(), backend, qnt->asymmetric); - mDequantScale = dequantParams[0]; - mDequantZero = dequantParams[1]; + mDequantScaleBias = dequantParams; mDequantBits = qnt->canUseInt4 ? 4:8; } else if (qnt && qnt->weightFloat.size() > 0) { mWeight = weightTransform(group, oc, ic, kh, kw, qnt->weightFloat.get(), false, false); diff --git a/source/backend/metal/MetalConvolutionDepthwise.hpp b/source/backend/metal/MetalConvolutionDepthwise.hpp index ffced0a64..9078c3058 100644 --- a/source/backend/metal/MetalConvolutionDepthwise.hpp +++ b/source/backend/metal/MetalConvolutionDepthwise.hpp @@ -21,7 +21,7 @@ class MetalConvolutionDepthwise : public MetalConvolutionCommon { virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; protected: - virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual std::shared_ptr weightTransform(int group, int oc, int ic, int kh, int kw, const float *src, bool int8Weight=false, bool int4Weight=false) override; private: id mPipeline; diff --git a/source/backend/metal/MetalConvolutionDepthwise.mm b/source/backend/metal/MetalConvolutionDepthwise.mm index 8cabaca7f..546896bb9 100755 --- a/source/backend/metal/MetalConvolutionDepthwise.mm +++ b/source/backend/metal/MetalConvolutionDepthwise.mm @@ -82,12 +82,10 @@ return NO_ERROR; } -void MetalConvolutionDepthwise::onFloat(const Tensor *input, const Tensor *output, id encoder) { +void MetalConvolutionDepthwise::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { [encoder setComputePipelineState:mPipeline]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset: TensorUtils::getDescribe(input)->extra.offset -atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset: TensorUtils::getDescribe(output)->extra.offset -atIndex:1]; + MetalBackend::setTensor(inputs[0], encoder, 0); + MetalBackend::setTensor(outputs[0], encoder, 1); [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; MetalBackend::setTensor(mWeight.get(), encoder, 3); MetalBackend::setTensor(mBias.get(), encoder, 4); diff --git a/source/backend/metal/MetalConvolutionWinograd.hpp b/source/backend/metal/MetalConvolutionWinograd.hpp index d734147d7..bd589ad25 100644 --- a/source/backend/metal/MetalConvolutionWinograd.hpp +++ b/source/backend/metal/MetalConvolutionWinograd.hpp @@ -23,7 +23,7 @@ class MetalConvolutionWinograd : public MetalConvolutionCommon { virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; protected: - virtual void onFloat(const Tensor *input, const Tensor *output, id encoder) override; + virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual std::shared_ptr weightTransform(int group, int oc, int ic, int kh, int kw, const float *src, bool int8Weight=false, bool int4Weight=false) override; private: diff --git a/source/backend/metal/MetalConvolutionWinograd.mm b/source/backend/metal/MetalConvolutionWinograd.mm index 2848f9779..dcc321782 100644 --- a/source/backend/metal/MetalConvolutionWinograd.mm +++ b/source/backend/metal/MetalConvolutionWinograd.mm @@ -141,32 +141,40 @@ return NO_ERROR; } -void MetalConvolutionWinograd::onFloat(const Tensor *input, const Tensor *output, id encoder) { +void MetalConvolutionWinograd::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { + auto input = inputs[0]; + auto output = outputs[0]; auto backend = static_cast(this->backend()); auto context = (__bridge MNNMetalContext *)backend->context(); { // transform - auto bandwidth = [context load:mKernelX == 3 ? @"winograd_transform_source2_3_1" : @"winograd_transform_source2_5_1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempSrc->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempSrc.get())->extra.offset atIndex:1]; + auto pipeline = [context pipelineWithName:mKernelX == 3 ? @"winograd_transform_source2_3_1" : @"winograd_transform_source2_5_1" fp16:backend->useFp16InsteadFp32()]; + [encoder setComputePipelineState:pipeline]; + MetalBackend::setTensor(input, encoder, 0); + MetalBackend::setTensor(mTempSrc.get(), encoder, 1); [encoder setBuffer:mConstBuffer offset:0 atIndex:2]; - [context dispatchEncoder:encoder threads:mInputTransformThreads bandwidth:bandwidth]; + auto gl = [context computeBestGroupAndLocal:pipeline threads:mInputTransformThreads]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; } { // gemm - auto bandwidth = [context load:@"matmul4x4" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempSrc->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempSrc.get())->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempDst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempDst.get())->extra.offset atIndex:1]; + auto pipeline = [context pipelineWithName:@"matmul4x4" fp16:backend->useFp16InsteadFp32()]; + [encoder setComputePipelineState:pipeline]; + MetalBackend::setTensor(mTempSrc.get(), encoder, 0); + MetalBackend::setTensor(mTempDst.get(), encoder, 1); MetalBackend::setTensor(mWeight.get(), encoder, 2); [encoder setBuffer:mShapeBuffer offset:0 atIndex:3]; - [context dispatchEncoder:encoder threads:mMatMulThreads bandwidth:bandwidth]; + auto gl = [context computeBestGroupAndLocal:pipeline threads:mMatMulThreads]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; } { // transform - auto bandwidth = [context load:mKernelX == 3 ? @"winograd_transform_dest2_3_1" : @"winograd_transform_dest2_5_1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)mTempDst->deviceId())->getBuffer() offset:TensorUtils::getDescribe(mTempDst.get())->extra.offset atIndex:0]; + auto pipeline = [context pipelineWithName:mKernelX == 3 ? @"winograd_transform_dest2_3_1" : @"winograd_transform_dest2_5_1" fp16:backend->useFp16InsteadFp32()]; + [encoder setComputePipelineState:pipeline]; + MetalBackend::setTensor(mTempDst.get(), encoder, 0); MetalBackend::setTensor(mBias.get(), encoder, 1); - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; + MetalBackend::setTensor(output, encoder, 2); [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; - [context dispatchEncoder:encoder threads:mOutputTransformThreads bandwidth:bandwidth]; + auto gl = [context computeBestGroupAndLocal:pipeline threads:mOutputTransformThreads]; + [encoder dispatchThreadgroups:gl.first threadsPerThreadgroup:gl.second]; } } std::shared_ptr MetalConvolutionWinograd::weightTransform(int group, int oc, int ic, int kh, int kw, const float *src, bool int8Weight, bool int4Weight) { diff --git a/source/backend/metal/MetalExecution.hpp b/source/backend/metal/MetalExecution.hpp index 5aab8b7a4..6b90a5241 100644 --- a/source/backend/metal/MetalExecution.hpp +++ b/source/backend/metal/MetalExecution.hpp @@ -1,3 +1,11 @@ +// +// MetalExecution.hpp +// MNN +// +// Created by MNN on 2023/11/09. +// Copyright © 2018, Alibaba Group Holding Limited +// + #ifndef MetalExecution_hpp #define MetalExecution_hpp diff --git a/source/backend/metal/MetalExecution.mm b/source/backend/metal/MetalExecution.mm index 1d28023aa..35de88d24 100644 --- a/source/backend/metal/MetalExecution.mm +++ b/source/backend/metal/MetalExecution.mm @@ -1,3 +1,11 @@ +// +// MetalExecution.mm +// MNN +// +// Created by MNN on 2023/11/09. +// Copyright © 2018, Alibaba Group Holding Limited +// + #include "MetalExecution.hpp" #import "backend/metal/MetalBackend.hpp" diff --git a/source/backend/metal/MetalLoop.mm b/source/backend/metal/MetalLoop.mm index 419d8503f..be64819ff 100644 --- a/source/backend/metal/MetalLoop.mm +++ b/source/backend/metal/MetalLoop.mm @@ -1,3 +1,11 @@ +// +// MetalLoop.mm +// MNN +// +// Created by MNN on 2023/12/28. +// Copyright © 2018, Alibaba Group Holding Limited +// + #import "core/Macro.h" #import "MetalCast.hpp" #import "MetalBinary.hpp" diff --git a/source/backend/metal/MetalMatMul.hpp b/source/backend/metal/MetalMatMul.hpp index 258fd5a38..8e70629d2 100644 --- a/source/backend/metal/MetalMatMul.hpp +++ b/source/backend/metal/MetalMatMul.hpp @@ -18,7 +18,7 @@ namespace MNN { class MetalMatMul : public MetalExecution { public: - MetalMatMul(Backend *backend, const MatMul *matmul); + MetalMatMul(Backend *backend, const MatMul *matmul, bool withBias); virtual ~MetalMatMul(); virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; @@ -27,6 +27,8 @@ class MetalMatMul : public MetalExecution { id mConstBuffer = nil; bool mTransposeA = false; bool mTransposeB = false; + id mPipeline; + std::pair mThreads; }; } // namespace MNN diff --git a/source/backend/metal/MetalMatMul.mm b/source/backend/metal/MetalMatMul.mm index db741398e..a6454df06 100755 --- a/source/backend/metal/MetalMatMul.mm +++ b/source/backend/metal/MetalMatMul.mm @@ -18,11 +18,17 @@ int size[4]; int stride[4]; }; -MetalMatMul::MetalMatMul(Backend *backend, const MatMul *matmul) : MetalExecution(backend) { +MetalMatMul::MetalMatMul(Backend *backend, const MatMul *matmul, bool withBias) : MetalExecution(backend) { mTransposeA = matmul->transposeA(); mTransposeB = matmul->transposeB(); auto mkbn = static_cast(backend); mConstBuffer = mkbn->getConstBuffer(sizeof(matP)); + auto context = (__bridge MNNMetalContext *)mkbn->context(); + if (withBias) { + mPipeline = [context pipelineWithName:@"matmul_bias" fp16:mkbn->useFp16InsteadFp32()]; + } else { + mPipeline = [context pipelineWithName:@"matmul" fp16:mkbn->useFp16InsteadFp32()]; + } } MetalMatMul::~MetalMatMul() { auto mkbn = static_cast(backend()); @@ -59,6 +65,9 @@ } ::memcpy(mConstBuffer.contents, &buffer, sizeof(matP)); + auto backend = static_cast(this->backend()); + auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); + mThreads = [context computeBestGroupAndLocal:mPipeline threads: MTLSizeMake(h, e, 1)]; return NO_ERROR; } @@ -71,25 +80,20 @@ auto h = C->length(1); if (inputs.size() > 2) { - auto bandwidth = [context load:@"matmul_bias" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)inputs[2]->deviceId())->getBuffer() offset:TensorUtils::getDescribe(inputs[2])->extra.offset atIndex:2]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:3]; + [encoder setComputePipelineState:mPipeline]; + MetalBackend::setTensor(input0, encoder, 0); + MetalBackend::setTensor(input1, encoder, 1); + MetalBackend::setTensor(inputs[2], encoder, 2); + MetalBackend::setTensor(output, encoder, 3); [encoder setBuffer:mConstBuffer offset:0 atIndex:4]; - [context dispatchEncoder:encoder - threads:{ (NSUInteger)h, (NSUInteger)e, (NSUInteger)1 } - bandwidth:bandwidth]; } else { - auto bandwidth = [context load:@"matmul" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input0->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input0)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input1->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input1)->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; + [encoder setComputePipelineState:mPipeline]; + MetalBackend::setTensor(input0, encoder, 0); + MetalBackend::setTensor(input1, encoder, 1); + MetalBackend::setTensor(output, encoder, 2); [encoder setBuffer:mConstBuffer offset:0 atIndex:3]; - [context dispatchEncoder:encoder - threads:{ (NSUInteger)h, (NSUInteger)e, (NSUInteger)1 } - bandwidth:bandwidth]; } + [encoder dispatchThreadgroups:mThreads.first threadsPerThreadgroup:mThreads.second]; } class MetalMatMulCreator : public MetalBackend::Creator { @@ -100,7 +104,7 @@ MNN_PRINT("metal not support matmul inpt size less than 2\n"); return nullptr; } - return new MetalMatMul(backend, op->main_as_MatMul()); + return new MetalMatMul(backend, op->main_as_MatMul(), inputs.size() > 2); } }; REGISTER_METAL_OP_CREATOR(MetalMatMulCreator, OpType_MatMul); diff --git a/source/backend/metal/MetalOPRegister.mm b/source/backend/metal/MetalOPRegister.mm index 96606e7f3..ef99461a1 100644 --- a/source/backend/metal/MetalOPRegister.mm +++ b/source/backend/metal/MetalOPRegister.mm @@ -12,13 +12,15 @@ extern void ___MetalEltwiseCreator__OpType_Eltwise__(); extern void ___MetalConvolutionCreator__OpType_Convolution__(); extern void ___MetalLayerNormCreator__OpType_LayerNorm__(); +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE + extern void ___AttentionBufCreator__OpType_Attention__(); +#endif extern void ___MetalMatMulCreator__OpType_MatMul__(); extern void ___MetalBinaryCreator__OpType_BinaryOp__(); extern void ___MetalConvolutionDepthwiseCreator__OpType_ConvolutionDepthwise__(); extern void ___MetalDeconvolutionCreator__OpType_Deconvolution__(); extern void ___MetalDeconvolutionCreator__OpType_DeconvolutionDepthwise__(); extern void ___MetalLoopCreator__OpType_While__(); - extern void ___MetalReLUCreator__OpType_ReLU__(); extern void ___MetalPoolingCreator__OpType_Pooling__(); extern void ___MetalScaleCreator__OpType_Scale__(); extern void ___MetalInterpCreator__OpType_Interp__(); @@ -31,6 +33,7 @@ extern void ___MetalFuseCreator__OpType_Extra__(); extern void ___MetalPReLUCreator__OpType_PReLU__(); extern void ___MetalReLU6Creator__OpType_ReLU6__(); + extern void ___MetalReLU6Creator__OpType_ReLU__(); void registerMetalOps() { ___MetalArgMaxCreator__OpType_ArgMax__(); ___MetalArgMaxCreator__OpType_ArgMin__(); @@ -48,7 +51,6 @@ void registerMetalOps() { ___MetalDeconvolutionCreator__OpType_Deconvolution__(); ___MetalDeconvolutionCreator__OpType_DeconvolutionDepthwise__(); ___MetalLoopCreator__OpType_While__(); - ___MetalReLUCreator__OpType_ReLU__(); ___MetalPoolingCreator__OpType_Pooling__(); ___MetalScaleCreator__OpType_Scale__(); ___MetalInterpCreator__OpType_Interp__(); @@ -61,6 +63,10 @@ void registerMetalOps() { ___MetalFuseCreator__OpType_Extra__(); ___MetalPReLUCreator__OpType_PReLU__(); ___MetalReLU6Creator__OpType_ReLU6__(); + ___MetalReLU6Creator__OpType_ReLU__(); +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE + ___AttentionBufCreator__OpType_Attention__(); +#endif } #endif } \ No newline at end of file diff --git a/source/backend/metal/MetalROIPooling.hpp b/source/backend/metal/MetalROIPooling.hpp index 4b707864e..09e70d238 100644 --- a/source/backend/metal/MetalROIPooling.hpp +++ b/source/backend/metal/MetalROIPooling.hpp @@ -24,6 +24,7 @@ class MetalROIPooling : public MetalExecution { private: float mSpatialScale; id mShape; + id mPipeline; }; } // namespace MNN diff --git a/source/backend/metal/MetalROIPooling.mm b/source/backend/metal/MetalROIPooling.mm index 786b3f49d..9407c0c9a 100755 --- a/source/backend/metal/MetalROIPooling.mm +++ b/source/backend/metal/MetalROIPooling.mm @@ -16,7 +16,10 @@ MetalROIPooling::MetalROIPooling(Backend *backend, float spatialScale) : MetalExecution(backend), mSpatialScale(spatialScale) { - // nothing to do + auto mtbn = static_cast(backend); + auto context = (__bridge MNNMetalContext *)mtbn->context(); + mShape = [context newDeviceBuffer:8 * sizeof(int) + sizeof(float) access:CPUWriteOnly]; + mPipeline = [context pipelineWithName:@"ROI_pooling" fp16:mtbn->useFp16InsteadFp32()]; } ErrorCode MetalROIPooling::onResize(const std::vector &inputs, const std::vector &outputs) { auto backend = static_cast(this->backend()); @@ -25,16 +28,15 @@ int iw = input->width(), ih = input->height(); int ow = output->width(), oh = output->height(), oz = UP_DIV(output->channel(), 4), ob = output->batch(); - auto shape = [context newDeviceBuffer:7 * sizeof(int) + sizeof(float) access:CPUWriteOnly]; - ((int *)shape.contents)[0] = iw; - ((int *)shape.contents)[1] = ih; - ((int *)shape.contents)[2] = iw * ih; - ((int *)shape.contents)[3] = ow; - ((int *)shape.contents)[4] = oh; - ((int *)shape.contents)[5] = ow * oh; - ((int *)shape.contents)[6] = oz; - ((float *)shape.contents)[7] = mSpatialScale; - mShape = shape; + ((int *)mShape.contents)[0] = iw; + ((int *)mShape.contents)[1] = ih; + ((int *)mShape.contents)[2] = iw * ih; + ((int *)mShape.contents)[3] = input->batch(); + ((int *)mShape.contents)[4] = ow; + ((int *)mShape.contents)[5] = oh; + ((int *)mShape.contents)[6] = ow * oh; + ((int *)mShape.contents)[7] = ob; + ((float *)mShape.contents)[8] = mSpatialScale; return NO_ERROR; } @@ -44,18 +46,22 @@ auto input = inputs[0], roi = inputs[1], output = outputs[0]; int iw = input->width(), ih = input->height(); int ow = output->width(), oh = output->height(), oz = UP_DIV(output->channel(), 4), ob = output->batch(); - - auto bandwidth = [context load:@"ROI_pooling" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)roi->deviceId())->getBuffer() offset:TensorUtils::getDescribe(roi)->extra.offset atIndex:1]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:2]; + [encoder setComputePipelineState:mPipeline]; + MetalBackend::setTensor(input, encoder, 0); + MetalBackend::setTensor(roi, encoder, 1); + MetalBackend::setTensor(output, encoder, 2); [encoder setBuffer:mShape offset:0 atIndex:3]; + [encoder dispatchThreadgroups:MTLSizeMake(UP_DIV(ow, 16), UP_DIV(oh, 16), ob * oz) threadsPerThreadgroup:MTLSizeMake(16, 16, 1)]; } class MetalROIPoolingCreator : public MetalBackend::Creator { public: virtual Execution *onCreate(const std::vector &inputs, const MNN::Op *op, Backend *backend, const std::vector& outputs) const { + auto roi = inputs[1]; + if (TensorUtils::getDescribe(roi)->dimensionFormat == MNN_DATA_FORMAT_NC4HW4) { + // Don't support old roipooling + return nullptr; + } return new MetalROIPooling(backend, op->main_as_RoiParameters()->spatialScale()); } }; diff --git a/source/backend/metal/MetalRaster.mm b/source/backend/metal/MetalRaster.mm index 28934ed7f..8383b10e6 100644 --- a/source/backend/metal/MetalRaster.mm +++ b/source/backend/metal/MetalRaster.mm @@ -210,7 +210,7 @@ kernel void main0(device int4 *out [[buffer(0)]], fast = false; break; } - if (!OpCommonUtils::canBlitFast(slice, output)) { + if (!OpCommonUtils::canBlitFast(slice, output, 4, true)) { fast = false; break; } @@ -239,7 +239,7 @@ kernel void main0(device int4 *out [[buffer(0)]], for (int v=0; vregions[iter.second[v]]; Tensor::InsideDescribe::Region slice; - OpCommonUtils::turnToPackRegion(oldr, slice, output, 4); + OpCommonUtils::turnToPackRegion(oldr, slice, output, 4, true); slice.dst.offset /= 4; slice.src.offset /= 4; writeSamplerInfo(infoP[v], slice); diff --git a/source/backend/metal/MetalReLU.hpp b/source/backend/metal/MetalReLU.hpp deleted file mode 100644 index 1b968e05e..000000000 --- a/source/backend/metal/MetalReLU.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// MetalReLU.hpp -// MNN -// -// Created by MNN on 2019/01/30. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#ifndef MetalReLU_hpp -#define MetalReLU_hpp - -#import "MetalExecution.hpp" -#if MNN_METAL_ENABLED -namespace MNN { - -class MetalReLU : public MetalExecution { -public: - MetalReLU(Backend *backend, float slope); - virtual ~MetalReLU() = default; - virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; - -private: - id mSlope; -}; - -} // namespace MNN -#endif /* MNN_METAL_ENABLED */ -#endif /* MetalReLU_hpp */ diff --git a/source/backend/metal/MetalReLU.mm b/source/backend/metal/MetalReLU.mm deleted file mode 100755 index 9f60ab335..000000000 --- a/source/backend/metal/MetalReLU.mm +++ /dev/null @@ -1,51 +0,0 @@ -// -// MetalReLU.mm -// MNN -// -// Created by MNN on 2019/01/30. -// Copyright © 2018, Alibaba Group Holding Limited -// - -#import "backend/metal/MetalReLU.hpp" -#import "backend/metal/MNNMetalContext.h" -#import "core/Macro.h" -#import "core/Macro.h" -#import "backend/metal/MetalBackend.hpp" - -#if MNN_METAL_ENABLED -namespace MNN { - -MetalReLU::MetalReLU(Backend *backend, float slope) : MetalExecution(backend) { - auto context = (__bridge MNNMetalContext *)static_cast(backend)->context(); - mSlope = [context newDeviceBuffer:sizeof(float) bytes:&slope access:CPUWriteOnly]; -} - -void MetalReLU::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { - auto backend = static_cast(this->backend()); - auto context = (__bridge MNNMetalContext *)backend->context(); - - auto input = inputs[0], output = outputs[0]; - NSUInteger size = output->elementSize(); - auto simd = size % 4 == 0; - if (simd) { - size /= 4; - } - - MNN_ASSERT(mSlope.length == sizeof(float)); - auto bandwidth = [context load:simd ? @"relu_x4" : @"relu_x1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; - [encoder setBuffer:mSlope offset:0 atIndex:2]; - [context dispatchEncoder:encoder threads:{ size, 1, 1 } bandwidth:bandwidth]; - MNN_PRINT_ENCODER(context, encoder); -} - -class MetalReLUCreator : public MetalBackend::Creator { -public: - virtual Execution *onCreate(const std::vector &inputs, const MNN::Op *op, Backend *backend, const std::vector& outputs) const { - return new MetalReLU(backend, op->main_as_Relu()->slope()); - } -}; -REGISTER_METAL_OP_CREATOR(MetalReLUCreator, OpType_ReLU); -} // namespace MNN -#endif /* MNN_METAL_ENABLED */ diff --git a/source/backend/metal/MetalReLU6.hpp b/source/backend/metal/MetalReLU6.hpp index 96b1929be..69840923f 100644 --- a/source/backend/metal/MetalReLU6.hpp +++ b/source/backend/metal/MetalReLU6.hpp @@ -16,11 +16,12 @@ namespace MNN { class MetalReLU6 : public MetalExecution { public: - MetalReLU6(Backend *backend, float minValue, float maxValue); + MetalReLU6(Backend *backend, float minValue, float maxValue, bool isRelu); virtual ~MetalReLU6() = default; virtual void onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) override; private: id mConst; + id mPipeline; }; } // namespace MNN diff --git a/source/backend/metal/MetalReLU6.mm b/source/backend/metal/MetalReLU6.mm index cd95e1975..6c677bf44 100755 --- a/source/backend/metal/MetalReLU6.mm +++ b/source/backend/metal/MetalReLU6.mm @@ -15,33 +15,39 @@ #if MNN_METAL_ENABLED namespace MNN { -MetalReLU6::MetalReLU6(Backend *backend, float minV, float maxV) : MetalExecution(backend) { +MetalReLU6::MetalReLU6(Backend *backend, float minV, float maxV, bool isRelu) : MetalExecution(backend) { + // For Relu use minV and slope auto metal = static_cast(backend); auto context = (__bridge MNNMetalContext *)metal->context(); - mConst = [context newDeviceBuffer:4 * sizeof(float) access:CPUWriteOnly]; + mConst = [context newDeviceBuffer:4 * sizeof(float) access:CPUWriteOnly]; ((float*)mConst.contents)[0] = minV; ((float*)mConst.contents)[1] = maxV; + if (isRelu) { + mPipeline = [context pipelineWithName:@"relu" fp16:metal->useFp16InsteadFp32()]; + } else { + mPipeline = [context pipelineWithName:@"relu6" fp16:metal->useFp16InsteadFp32()]; + } } void MetalReLU6::onEncode(const std::vector &inputs, const std::vector &outputs, id encoder) { - auto backend = static_cast(this->backend()); - auto context = (__bridge MNNMetalContext *)backend->context(); auto input = inputs[0], output = outputs[0]; - NSUInteger size = output->elementSize(); - auto simd = size % 4 == 0; - if (simd) { - size /= 4; - } + int size = output->elementSize(); + size = UP_DIV(size, 4); + ((int*)mConst.contents)[2] = size; + ((int*)mConst.contents)[3] = size; - auto bandwidth = [context load:simd ? @"relu6_x4" : @"relu6_x1" encoder:encoder fp16:backend->useFp16InsteadFp32()]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)input->deviceId())->getBuffer() offset:TensorUtils::getDescribe(input)->extra.offset atIndex:0]; - [encoder setBuffer:(id)((MetalRuntimeAllocator::MetalBufferAlloc *)output->deviceId())->getBuffer() offset:TensorUtils::getDescribe(output)->extra.offset atIndex:1]; + [encoder setComputePipelineState:mPipeline]; + MetalBackend::setTensor(input, encoder, 0); + MetalBackend::setTensor(output, encoder, 1); [encoder setBuffer:mConst offset:0 atIndex:2]; - [context dispatchEncoder:encoder threads:{ size, 1, 1 } bandwidth:bandwidth]; + [encoder dispatchThreadgroups:MTLSizeMake(UP_DIV(size, 256), 1, 1) threadsPerThreadgroup:MTLSizeMake(256, 1, 1)]; } class MetalReLU6Creator : public MetalBackend::Creator { public: virtual Execution *onCreate(const std::vector &inputs, const MNN::Op *op, Backend *backend, const std::vector& outputs) const { + if (op->type() == OpType_ReLU) { + return new MetalReLU6(backend, op->main_as_Relu()->slope(), 0.0f, true); + } float minV = 0.0f; float maxV = 6.0f; if (nullptr != op->main()) { @@ -49,9 +55,10 @@ minV = p->minValue(); maxV = p->maxValue(); } - return new MetalReLU6(backend, minV, maxV); + return new MetalReLU6(backend, minV, maxV, false); } }; REGISTER_METAL_OP_CREATOR(MetalReLU6Creator, OpType_ReLU6); +REGISTER_METAL_OP_CREATOR(MetalReLU6Creator, OpType_ReLU); } // namespace MNN #endif /* MNN_METAL_ENABLED */ diff --git a/source/backend/metal/ShaderMap.cpp b/source/backend/metal/ShaderMap.cpp index 622d1f9da..0b6b74780 100644 --- a/source/backend/metal/ShaderMap.cpp +++ b/source/backend/metal/ShaderMap.cpp @@ -3,7 +3,6 @@ namespace MNN { void ShaderMap::init() { mMaps.insert(std::make_pair("shader_MetalReLU6_metal", shader_MetalReLU6_metal)); -mMaps.insert(std::make_pair("shader_MetalReLU_metal", shader_MetalReLU_metal)); mMaps.insert(std::make_pair("shader_MetalConvolutionDepthwise_metal", shader_MetalConvolutionDepthwise_metal)); mMaps.insert(std::make_pair("shader_MetalConvolutionActivation_metal", shader_MetalConvolutionActivation_metal)); mMaps.insert(std::make_pair("shader_MetalConvolution_metal", shader_MetalConvolution_metal)); diff --git a/source/backend/metal/shader/MetalBackend.metal b/source/backend/metal/shader/MetalBackend.metal index f59716c13..973f50fc4 100644 --- a/source/backend/metal/shader/MetalBackend.metal +++ b/source/backend/metal/shader/MetalBackend.metal @@ -1,38 +1,10 @@ struct tensor_shape { int size; int channel; - int slice; + int batch; int batch_slices; }; -kernel void version_func_002(const device uchar *in [[buffer(0)]], - device uchar *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - // do nothing, just for verifying match between mnn and metallib -} - -kernel void copy_byte(const device uchar *in [[buffer(0)]], - device uchar *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = in[int(gid)]; -} - -kernel void copy_float(const device ftype *in [[buffer(0)]], - device ftype *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = in[int(gid)]; -} - -kernel void upcast_float(const device ftype *in [[buffer(0)]], - device float *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = in[int(gid)]; -} -kernel void downcast_float(const device float *in [[buffer(0)]], - device ftype *out [[buffer(1)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = in[int(gid)]; -} struct Limit { uint4 size; }; @@ -55,8 +27,8 @@ kernel void downcast_float4(const device float4 *in [[buffer(0)]], template static inline void template_NHWC_to_NC4HW4(const device IType *in, device OType *out, constant tensor_shape &s, uint2 gid) { - int b = gid.y / s.slice; - int z = gid.y % s.slice; + int b = gid.y % s.batch; + int z = gid.y / s.batch; int c = z * 4; auto off_in = in + b * s.size * s.channel + int(gid.x) * s.channel + c; @@ -93,8 +65,8 @@ kernel void cvt_f_NHWC_to_NC4HW4(const device ftype *in [[buffer(0)]], template static inline void template_NC4HW4_to_NHWC(const device IType *in, device OType *out, constant tensor_shape &s, uint2 gid) { - int b = gid.y / s.slice; - int z = gid.y % s.slice; + int b = gid.y % s.batch; + int z = gid.y / s.batch; int c = z * 4; auto off_in = in + int(gid.y) * s.size + int(gid.x); auto off_out = out + b * s.size * s.channel + int(gid.x) * s.channel + c; @@ -132,8 +104,8 @@ kernel void cvt_f_NC4HW4_to_NHWC(const device ftype4 *in [[buffer(0)]], template static inline void template_NCHW_to_NC4HW4(const device IType *in, device OType *out, constant tensor_shape &s, uint2 gid) { - int b = gid.y / s.slice; - int z = gid.y % s.slice; + int b = gid.y % s.batch; + int z = gid.y / s.batch; int c = z * 4; auto off_in = in + (b * s.channel + c) * s.size + int(gid.x); @@ -170,8 +142,8 @@ kernel void cvt_f_NCHW_to_NC4HW4(const device ftype *in [[buffer(0)]], template static inline void template_NC4HW4_to_NCHW(const device IType *in, device OType *out, constant tensor_shape &s, uint2 gid) { - int b = gid.y / s.slice; - int z = gid.y % s.slice; + int b = gid.y % s.batch; + int z = gid.y / s.batch; int c = z * 4; auto off_in = in + int(gid.y) * s.size + int(gid.x); @@ -210,8 +182,8 @@ kernel void cvt_f_NC4HW4_to_NCHW(const device ftype4 *in [[buffer(0)]], template static inline void template_NHWC_to_NCHW(const device IType* in, device OType* out, constant tensor_shape &s, uint2 gid) { - int b = gid.y / s.slice; - int c4 = gid.y % s.slice; + int b = gid.y % s.batch; + int c4 = gid.y / s.batch; auto in_off = (b * s.size + gid.x) * s.channel + c4 * 4; auto out_off = (b * s.channel + c4 * 4) * s.size + gid.x; @@ -238,8 +210,8 @@ kernel void upcast_f_NHWC_to_NCHW(const device ftype *in [[buffer(0)]], template static inline void template_NCHW_to_NHWC(const device IType* in, device OType* out, constant tensor_shape &s, uint2 gid) { - int b = gid.y / s.slice; - int c4 = gid.y % s.slice; + int b = gid.y % s.batch; + int c4 = gid.y / s.batch; auto in_off = (b * s.channel + c4 * 4) * s.size + gid.x; auto out_off = (b * s.size + gid.x) * s.channel + c4 * 4; diff --git a/source/backend/metal/shader/MetalConvolution.metal b/source/backend/metal/shader/MetalConvolution.metal index 94da2bef7..89a41567c 100644 --- a/source/backend/metal/shader/MetalConvolution.metal +++ b/source/backend/metal/shader/MetalConvolution.metal @@ -102,9 +102,9 @@ kernel void conv(const device ftype4 *in [[buffer(0)]], offset_x += sx * cst.dilation_x; offset_y += sy * cst.dilation_y; - auto z_in = in + idx_b * cst.input_slice * cst.input_size + offset_y * cst.input_width + offset_x; + auto z_in = in + idx_b * cst.input_size + offset_y * cst.input_width + offset_x; auto z_wt = wt + idx_c * cst.input_slice * cst.kernel_size + sy * cst.kernel_x + sx; - auto z_out = out + idx_b * cst.output_slice * cst.output_size + (int)idx_c * cst.output_size + (int)gid.y * cst.output_width + (int)gid.x; + auto z_out = out + idx_b * cst.output_size + (int)idx_c * cst.batch * cst.output_size + (int)gid.y * cst.output_width + (int)gid.x; int dilation_h = cst.input_width * cst.dilation_y; FLOAT4 result = FLOAT4(biasTerms[idx_c]); @@ -112,7 +112,7 @@ kernel void conv(const device ftype4 *in [[buffer(0)]], for (auto y = 0; y < kh; y++) { for (auto x = 0; x < kw; x++) { auto wt4 = z_wt[z * cst.kernel_size + y * cst.kernel_x + x]; - auto in4 = z_in[z * cst.input_size + y * dilation_h + x * cst.dilation_x]; + auto in4 = z_in[z * cst.input_size * cst.batch + y * dilation_h + x * cst.dilation_x]; result += FLOAT4(in4 * wt4); } } @@ -141,15 +141,15 @@ kernel void convk3s1d1p1_w2z4(const device ftype4 *in [[buffer(0)]], int offset_x = (int)gid.x * 2 - cst.pad_x; int offset_y = (int)gid.y - cst.pad_y; - auto z_in = in + idx_b * cst.input_slice * cst.input_size + offset_y * cst.input_width + offset_x; + auto z_in = in + idx_b * cst.input_size + offset_y * cst.input_width + offset_x; auto z_flt = wt + uz[0] * cst.input_slice * cst.kernel_size; - auto z_out = out + idx_b * cst.output_slice * cst.output_size + uz[0] * cst.output_size + idx_h * cst.output_width + idx_w; + auto z_out = out + idx_b * cst.output_size + uz[0] * cst.batch * cst.output_size + idx_h * cst.output_width + idx_w; int ws = cst.input_slice * cst.kernel_size; FLOAT4 result0 = 0, result1 = 0, result2 = 0, result3 = 0; FLOAT4 result4 = 0, result5 = 0, result6 = 0, result7 = 0; - for (auto z = 0; z < cst.input_slice; z++, z_flt += cst.kernel_size, z_in += cst.input_size) { + for (auto z = 0; z < cst.input_slice; z++, z_flt += cst.kernel_size, z_in += (cst.input_size * cst.batch)) { auto in00 = (offset_x<0 || offset_y<0) ? (ftype4)0.f : *(z_in+0*cst.input_width+0); auto in01 = (offset_x+1>=cst.input_width || offset_y<0) ? (ftype4)0.f : *(z_in+0*cst.input_width+1); auto in02 = (offset_x+2>=cst.input_width || offset_y<0) ? (ftype4)0.f : *(z_in+0*cst.input_width+2); @@ -228,19 +228,19 @@ kernel void conv_s1d1p0_w2(const device ftype4 *in [[buffer(0)]], bool valid = (idx_w + 1 < cst.output_width); - auto z_in = in + idx_b * cst.input_slice * cst.input_size + idx_h * cst.input_width + idx_w; + auto z_in = in + idx_b * cst.input_size + idx_h * cst.input_width + idx_w; auto z_wt = wt + idx_c * cst.input_slice * cst.kernel_size; - auto z_out = out + idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; + auto z_out = out + idx_b * cst.output_size + idx_c * cst.batch * cst.output_size + idx_h * cst.output_width + idx_w; FLOAT4 result0 = FLOAT4(biasTerms[idx_c]); FLOAT4 result1 = result0; for (auto z = 0; z < cst.input_slice; z++) { for (auto y = 0; y < cst.kernel_y; y++) { auto wt4 = z_wt[z * cst.kernel_size + y * cst.kernel_x]; - auto in4_0 = z_in[z * cst.input_size + y * cst.input_width]; + auto in4_0 = z_in[z * cst.batch * cst.input_size + y * cst.input_width]; result0 += FLOAT4(in4_0 * wt4); for (auto x = 1; x < cst.kernel_x; x++) { - in4_0 = z_in[z * cst.input_size + y * cst.input_width + x]; + in4_0 = z_in[z * cst.batch * cst.input_size + y * cst.input_width + x]; result1 += FLOAT4(in4_0 * wt4); wt4 = z_wt[z * cst.kernel_size + y * cst.kernel_x + x]; result0 += FLOAT4(in4_0 * wt4); @@ -271,9 +271,9 @@ kernel void conv_s1d1p0_w4(const device ftype4 *in [[buffer(0)]], int3 uz = idx_w + int3(1, 2, 3); bool3 valids = uz.xyz < cst.output_width; - auto z_in = in + idx_b * cst.input_slice * cst.input_size + idx_h * cst.input_width + idx_w; + auto z_in = in + idx_b * cst.input_size + idx_h * cst.input_width + idx_w; auto z_wt = wt + idx_c * cst.input_slice * cst.kernel_size; - auto z_out = out + idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; + auto z_out = out + idx_b * cst.output_size + idx_c * cst.batch * cst.output_size + idx_h * cst.output_width + idx_w; FLOAT4 result0 = FLOAT4(biasTerms[idx_c]); FLOAT4 result1 = result0; @@ -286,7 +286,7 @@ kernel void conv_s1d1p0_w4(const device ftype4 *in [[buffer(0)]], auto wt4_1 = wt_base[1]; auto wt4_2 = wt_base[2]; - auto z_in_base = z_in + z * cst.input_size + y * cst.input_width; + auto z_in_base = z_in + z * cst.batch * cst.input_size + y * cst.input_width; auto in4_0 = z_in_base[0]; result0 += FLOAT4(in4_0 * wt4_0); @@ -346,14 +346,14 @@ kernel void conv_z4(const device ftype4 *in [[buffer(0)]], offset_x += sx * cst.dilation_x; offset_y += sy * cst.dilation_y; - auto z_in = in + idx_b * cst.input_slice * cst.input_size + offset_y * cst.input_width + offset_x; + auto z_in = in + idx_b * cst.input_size + offset_y * cst.input_width + offset_x; auto z_wt = wt + uz[0] * cst.input_slice * cst.kernel_size + sy * cst.kernel_x + sx; - auto z_out = out + idx_b * cst.output_slice * cst.output_size + uz[0] * cst.output_size + idx_h * cst.output_width + idx_w; + auto z_out = out + idx_b * cst.output_size + uz[0] * cst.batch * cst.output_size + idx_h * cst.output_width + idx_w; int ws = cst.input_slice * cst.kernel_size; int dilation_h = cst.input_width * cst.dilation_y; FLOAT4 result0 = 0, result1 = 0, result2 = 0, result3 = 0; - for (auto z = 0; z < cst.input_slice; z++, z_wt += cst.kernel_size, z_in += cst.input_size) { + for (auto z = 0; z < cst.input_slice; z++, z_wt += cst.kernel_size, z_in += cst.input_size * cst.batch) { for (auto y = 0; y < kh; y++) { for (auto x = 0; x < kw; x++) { auto x_wt = z_wt + y * cst.kernel_x + x; @@ -400,14 +400,14 @@ kernel void conv_z2(const device ftype4 *in [[buffer(0)]], offset_x += sx * cst.dilation_x; offset_y += sy * cst.dilation_y; - auto z_in = in + idx_b * cst.input_slice * cst.input_size + offset_y * cst.input_width + offset_x; + auto z_in = in + idx_b * cst.input_size + offset_y * cst.input_width + offset_x; auto z_wt = wt + uz[0] * cst.input_slice * cst.kernel_size + sy * cst.kernel_x + sx; - auto z_out = out + idx_b * cst.output_slice * cst.output_size + uz[0] * cst.output_size + idx_h * cst.output_width + idx_w; + auto z_out = out + idx_b * cst.output_size + uz[0] * cst.batch * cst.output_size + idx_h * cst.output_width + idx_w; int ws = cst.input_slice * cst.kernel_size; int dilation_h = cst.input_width * cst.dilation_y; FLOAT4 result0 = 0, result1 = 0; - for (auto z = 0; z < cst.input_slice; z++, z_wt += cst.kernel_size, z_in += cst.input_size) { + for (auto z = 0; z < cst.input_slice; z++, z_wt += cst.kernel_size, z_in += cst.input_size * cst.batch) { for (auto y = 0; y < kh; y++) { for (auto x = 0; x < kw; x++) { auto x_wt = z_wt + y * cst.kernel_x + x; @@ -418,5 +418,5 @@ kernel void conv_z2(const device ftype4 *in [[buffer(0)]], } } /* true */ *z_out = activate(ftype4(result0 + FLOAT4(biasTerms[uz[0]])), cst.activation); - if (valids) { z_out += cst.output_size; *z_out = activate(ftype4(result1 + FLOAT4(biasTerms[uz[1]])), cst.activation); } + if (valids) { z_out += cst.output_size * cst.batch; *z_out = activate(ftype4(result1 + FLOAT4(biasTerms[uz[1]])), cst.activation); } } diff --git a/source/backend/metal/shader/MetalConvolution1x1.metal b/source/backend/metal/shader/MetalConvolution1x1.metal index 1bddbb596..07b177dd9 100644 --- a/source/backend/metal/shader/MetalConvolution1x1.metal +++ b/source/backend/metal/shader/MetalConvolution1x1.metal @@ -13,36 +13,6 @@ struct conv1x1_constants { conv_activation_type activation; }; -kernel void conv1x1_w1h1(const device ftype4 *in [[buffer(0)]], - device ftype4 *out [[buffer(1)]], - constant conv1x1_constants& cst [[buffer(2)]], - const device ftype4x4 *wt [[buffer(3)]], - const device ftype4 *biasTerms [[buffer(4)]], - uint3 gid [[thread_position_in_grid]]) { - if ((int)gid.x >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.batch * cst.output_slice) return; - int idx_w = gid.x; - int idx_h = gid.y; - int idx_c = gid.z % cst.output_slice; - int idx_b = gid.z / cst.output_slice; - - auto xy_wt = wt + idx_c * cst.input_slice; - auto xy_in0 = in + (int)idx_b * cst.input_slice * cst.input_size + idx_h * cst.output_width + idx_w; - - auto xy_out = out + (int)idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; - auto biasValue = FLOAT4(biasTerms[idx_c]); - FLOAT4 result0 = biasValue; - - for (auto z = 0; z < cst.input_slice; z++) { - auto in40 = xy_in0[0]; - auto w = xy_wt[z]; - - result0 += FLOAT4(in40 * w); - xy_in0 += cst.input_size; - } - - /* true */ *xy_out = activate(ftype4(result0), cst.activation); -} - kernel void conv1x1_g1z4(const device ftype4 *in [[buffer(0)]], device ftype4 *out [[buffer(1)]], constant conv1x1_constants& cst [[buffer(2)]], @@ -54,8 +24,8 @@ kernel void conv1x1_g1z4(const device ftype4 *in [[buffer(0)]], int rx = gid.x * CONV_UNROLL; int uz = gid.y; auto xy_wt = wt + uz * cst.input_slice; - auto xy_in0 = in + (int)gid.z * cst.input_slice * cst.input_size + rx + 0; - auto xy_out = out + (int)gid.z * cst.output_slice * cst.output_size + uz * cst.output_size + rx; + auto xy_in0 = in + (int)gid.z * cst.input_size + rx + 0; + auto xy_out = out + (int)gid.z * cst.output_size + uz * cst.output_size * cst.batch + rx; auto biasValue = FLOAT4(biasTerms[uz]); FLOAT4 result0 = biasValue, result1 = biasValue, result2 = biasValue, result3 = biasValue; int computeSize = min(cst.output_size - rx, CONV_UNROLL); @@ -71,7 +41,7 @@ kernel void conv1x1_g1z4(const device ftype4 *in [[buffer(0)]], result1 += FLOAT4(in41 * w); result2 += FLOAT4(in42 * w); result3 += FLOAT4(in43 * w); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } /* true */ *xy_out = activate(ftype4(result0), cst.activation); @@ -86,20 +56,19 @@ kernel void conv1x1_g1z4_w8(const device ftype4 *in [[buffer(0)]], const device MNN::char4x4 *wt [[buffer(3)]], const device ftype4 *biasTerms [[buffer(4)]], const device float4 *dequantScale [[buffer(5)]], - const device float4 *dequantBias [[buffer(6)]], uint3 gid [[thread_position_in_grid]]) { if ((int)gid.x * CONV_UNROLL >= cst.output_size || (int)gid.y >= cst.output_slice || (int)gid.z >= cst.batch) return; int rx = gid.x * CONV_UNROLL; int uz = gid.y; auto xy_wt = wt + uz * cst.input_slice; - auto xy_in0 = in + (int)gid.z * cst.input_slice * cst.input_size + rx + 0; - auto xy_out = out + (int)gid.z * cst.output_slice * cst.output_size + uz * cst.output_size + rx; + auto xy_in0 = in + (int)gid.z * cst.input_size + rx + 0; + auto xy_out = out + (int)gid.z * cst.output_size + uz * cst.output_size * cst.batch + rx; auto biasValue = FLOAT4(biasTerms[uz]); FLOAT4 result0 = biasValue, result1 = biasValue, result2 = biasValue, result3 = biasValue; int computeSize = min(cst.output_size - rx, CONV_UNROLL); auto scale = FLOAT4(dequantScale[uz]); - auto dequant_bias = FLOAT4(dequantBias[uz]); + auto dequant_bias = FLOAT4(dequantScale[uz + cst.output_slice]); for (auto z = 0; z < cst.input_slice; z++) { auto in40 = (FLOAT4)*xy_in0; @@ -112,20 +81,14 @@ kernel void conv1x1_g1z4_w8(const device ftype4 *in [[buffer(0)]], FLOAT4x4 w_fp32 = FLOAT4x4(FLOAT4(w[0]), FLOAT4(w[1]), FLOAT4(w[2]), FLOAT4(w[3])); FLOAT4x4 w_dequant; for (int i = 0; i < 4; ++i) { - FLOAT4 w4 = w_fp32[i]; - FLOAT4 res; - for (int j = 0; j < 4; ++j) { - float wf = w4[j] * scale[i] + dequant_bias[i]; - res[j] = wf; - } - w_dequant[i] = res; + w_dequant[i] = w_fp32[i] * scale[i] + dequant_bias[i]; } result0 += FLOAT4(in40 * w_dequant); result1 += FLOAT4(in41 * w_dequant); result2 += FLOAT4(in42 * w_dequant); result3 += FLOAT4(in43 * w_dequant); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } /* true */ @@ -141,20 +104,19 @@ kernel void conv1x1_g1z4_w4(const device ftype4 *in [[buffer(0)]], const device MNN::uchar4x2 *wt [[buffer(3)]], const device ftype4 *biasTerms [[buffer(4)]], const device float4 *dequantScale [[buffer(5)]], - const device float4 *dequantBias [[buffer(6)]], uint3 gid [[thread_position_in_grid]]) { if ((int)gid.x * CONV_UNROLL >= cst.output_size || (int)gid.y >= cst.output_slice || (int)gid.z >= cst.batch) return; int rx = gid.x * CONV_UNROLL; int uz = gid.y; auto xy_wt = wt + uz * cst.input_slice; - auto xy_in0 = in + (int)gid.z * cst.input_slice * cst.input_size + rx + 0; - auto xy_out = out + (int)gid.z * cst.output_slice * cst.output_size + uz * cst.output_size + rx; + auto xy_in0 = in + (int)gid.z * cst.input_size + rx + 0; + auto xy_out = out + (int)gid.z * cst.output_size + uz * cst.output_size * cst.batch + rx; auto biasValue = FLOAT4(biasTerms[uz]); FLOAT4 result0 = biasValue, result1 = biasValue, result2 = biasValue, result3 = biasValue; int computeSize = min(cst.output_size - rx, CONV_UNROLL); auto scale = FLOAT4(dequantScale[uz]); - auto dequant_bias = FLOAT4(dequantBias[uz]); + auto dequant_bias = FLOAT4(dequantScale[uz + cst.output_slice]); for (auto z = 0; z < cst.input_slice; z++) { auto in40 = (FLOAT4)*xy_in0; @@ -169,11 +131,7 @@ kernel void conv1x1_g1z4_w4(const device ftype4 *in [[buffer(0)]], for (int i = 0; i < 4; ++i) { // ftype4 w4 = ftype4(w_fp32[i]); FLOAT4 w4 = FLOAT4((float)(w_int4[i][0] >> 4) - 8, (float)(w_int4[i][0] & 15) - 8, (float)(w_int4[i][1] >> 4) - 8, (float)(w_int4[i][1] & 15) - 8); - FLOAT4 res; - for (int j = 0; j < 4; ++j) { - float wf = w4[j] * scale[i] + dequant_bias[i]; - res[j] = wf; - } + FLOAT4 res = w4 * scale[i] + dequant_bias[i]; w_dequant[i] = res; } @@ -181,7 +139,7 @@ kernel void conv1x1_g1z4_w4(const device ftype4 *in [[buffer(0)]], result1 += FLOAT4(in41 * w_dequant); result2 += FLOAT4(in42 * w_dequant); result3 += FLOAT4(in43 * w_dequant); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } /* true */ @@ -213,9 +171,9 @@ kernel void conv1x1_g1z8(const device ftype4 *in [[buffer(0)]], int rx = gid.x * CONV_UNROLL_L; int uz = gid.y; auto xy_wt = wt + uz * cst.input_slice; - auto xy_in0 = in + (int)gid.z * cst.input_slice * cst.input_size + rx + 0; + auto xy_in0 = in + (int)gid.z * cst.input_size + rx + 0; - auto xy_out = out + (int)gid.z * cst.output_slice * cst.output_size + uz * cst.output_size + rx; + auto xy_out = out + (int)gid.z * cst.output_size + uz * cst.batch * cst.output_size + rx; auto biasValue = FLOAT4(biasTerms[uz]); FLOAT4 result0 = biasValue, result1 = biasValue, result2 = biasValue, result3 = biasValue; FLOAT4 result4 = biasValue, result5 = biasValue, result6 = biasValue, result7 = biasValue; @@ -241,7 +199,7 @@ kernel void conv1x1_g1z8(const device ftype4 *in [[buffer(0)]], result5 += FLOAT4(in45 * w); result6 += FLOAT4(in46 * w); result7 += FLOAT4(in47 * w); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } /* true */ *xy_out = activate(ftype4(result0), cst.activation); @@ -254,84 +212,23 @@ kernel void conv1x1_g1z8(const device ftype4 *in [[buffer(0)]], if (computeSize > 7) {xy_out[7] = activate(ftype4(result7), cst.activation); } } - -kernel void conv1x1_w4h2(const device ftype4 *in [[buffer(0)]], - device ftype4 *out [[buffer(1)]], - constant conv1x1_constants& cst [[buffer(2)]], - const device ftype4x4 *wt [[buffer(3)]], - const device ftype4 *biasTerms [[buffer(4)]], - uint3 gid [[thread_position_in_grid]]) { - if ((int)gid.x * 4 >= cst.output_width || (int)gid.y * 2 >= cst.output_height || (int)gid.z >= cst.batch * cst.output_slice) return; - - int idx_w = gid.x << 2; - int idx_h = gid.y << 1; - int idx_c = gid.z % cst.output_slice; - int idx_b = gid.z / cst.output_slice; - - auto xy_wt = wt + idx_c * cst.input_slice; - auto xy_in0 = in + (int)idx_b * cst.input_slice * cst.input_size + idx_h * cst.output_width + idx_w; - - auto xy_out = out + (int)idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; - auto biasValue = FLOAT4(biasTerms[idx_c]); - FLOAT4 result0 = biasValue, result1 = biasValue, result2 = biasValue, result3 = biasValue; - FLOAT4 result4 = biasValue, result5 = biasValue, result6 = biasValue, result7 = biasValue; - - for (auto z = 0; z < cst.input_slice; z++) { - auto in40 = xy_in0[0]; - auto in41 = xy_in0[1]; - auto in42 = xy_in0[2]; - auto in43 = xy_in0[3]; - auto in44 = xy_in0[cst.output_width+0]; - auto in45 = xy_in0[cst.output_width+1]; - auto in46 = xy_in0[cst.output_width+2]; - auto in47 = xy_in0[cst.output_width+3]; - - auto w = xy_wt[z]; - - result0 += FLOAT4(in40 * w); - result1 += FLOAT4(in41 * w); - result2 += FLOAT4(in42 * w); - result3 += FLOAT4(in43 * w); - result4 += FLOAT4(in44 * w); - result5 += FLOAT4(in45 * w); - result6 += FLOAT4(in46 * w); - result7 += FLOAT4(in47 * w); - xy_in0 += cst.input_size; - } - - int widthSize = min(cst.output_width - idx_w, 4); - /* true */ *xy_out = activate(ftype4(result0), cst.activation); - if (widthSize > 1) {xy_out[1] = activate(ftype4(result1), cst.activation); } - if (widthSize > 2) {xy_out[2] = activate(ftype4(result2), cst.activation); } - if (widthSize > 3) {xy_out[3] = activate(ftype4(result3), cst.activation); } - - int heightSize = min(cst.output_height - idx_h, 2); - if(heightSize > 1) { - /* true */ {xy_out[cst.output_width+0] = activate(ftype4(result4), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_width+1] = activate(ftype4(result5), cst.activation); } - if (widthSize > 2) {xy_out[cst.output_width+2] = activate(ftype4(result6), cst.activation); } - if (widthSize > 3) {xy_out[cst.output_width+3] = activate(ftype4(result7), cst.activation); } - } -} - - kernel void conv1x1_w4h4(const device ftype4 *in [[buffer(0)]], device ftype4 *out [[buffer(1)]], constant conv1x1_constants& cst [[buffer(2)]], const device ftype4x4 *wt [[buffer(3)]], const device ftype4 *biasTerms [[buffer(4)]], uint3 gid [[thread_position_in_grid]]) { - if ((int)gid.x * 4 >= cst.output_width || (int)gid.y * 4 >= cst.output_height || (int)gid.z >= cst.batch * cst.output_slice) return; + if ((int)gid.x * 16 >= cst.output_width || (int)gid.y >= cst.batch * cst.output_slice) return; - int idx_w = gid.x << 2; - int idx_h = gid.y << 2; - int idx_c = gid.z % cst.output_slice; - int idx_b = gid.z / cst.output_slice; + int idx_w = gid.x << 4; + int idx_h = 0; + int idx_c = gid.y / cst.batch; + int idx_b = gid.y % cst.batch; auto xy_wt = wt + idx_c * cst.input_slice; - auto xy_in0 = in + (int)idx_b * cst.input_slice * cst.input_size + idx_h * cst.output_width + idx_w; + auto xy_in0 = in + (int)idx_b * cst.input_size + idx_h * cst.output_width + idx_w; - auto xy_out = out + (int)idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; + auto xy_out = out + (int)idx_b * cst.output_size + idx_c * cst.output_size * cst.batch + idx_h * cst.output_width + idx_w; auto biasValue = FLOAT4(biasTerms[idx_c]); FLOAT4 result00 = biasValue, result01 = biasValue, result02 = biasValue, result03 = biasValue; FLOAT4 result10 = biasValue, result11 = biasValue, result12 = biasValue, result13 = biasValue; @@ -343,19 +240,19 @@ kernel void conv1x1_w4h4(const device ftype4 *in [[buffer(0)]], auto in01 = xy_in0[1]; auto in02 = xy_in0[2]; auto in03 = xy_in0[3]; - auto in10 = xy_in0[cst.output_width+0]; - auto in11 = xy_in0[cst.output_width+1]; - auto in12 = xy_in0[cst.output_width+2]; - auto in13 = xy_in0[cst.output_width+3]; + auto in10 = xy_in0[4]; + auto in11 = xy_in0[5]; + auto in12 = xy_in0[6]; + auto in13 = xy_in0[7]; - auto in20 = xy_in0[cst.output_width+cst.output_width+0]; - auto in21 = xy_in0[cst.output_width+cst.output_width+1]; - auto in22 = xy_in0[cst.output_width+cst.output_width+2]; - auto in23 = xy_in0[cst.output_width+cst.output_width+3]; - auto in30 = xy_in0[cst.output_width+cst.output_width+cst.output_width+0]; - auto in31 = xy_in0[cst.output_width+cst.output_width+cst.output_width+1]; - auto in32 = xy_in0[cst.output_width+cst.output_width+cst.output_width+2]; - auto in33 = xy_in0[cst.output_width+cst.output_width+cst.output_width+3]; + auto in20 = xy_in0[8]; + auto in21 = xy_in0[9]; + auto in22 = xy_in0[10]; + auto in23 = xy_in0[11]; + auto in30 = xy_in0[12]; + auto in31 = xy_in0[13]; + auto in32 = xy_in0[14]; + auto in33 = xy_in0[15]; auto w = xy_wt[z]; @@ -378,34 +275,26 @@ kernel void conv1x1_w4h4(const device ftype4 *in [[buffer(0)]], result32 += FLOAT4(in32 * w); result33 += FLOAT4(in33 * w); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } - int widthSize = min(cst.output_width - idx_w, 4); + int widthSize = min(cst.output_width - idx_w, 16); /* true */ *xy_out = activate(ftype4(result00), cst.activation); if (widthSize > 1) {xy_out[1] = activate(ftype4(result01), cst.activation); } if (widthSize > 2) {xy_out[2] = activate(ftype4(result02), cst.activation); } if (widthSize > 3) {xy_out[3] = activate(ftype4(result03), cst.activation); } - - int heightSize = min(cst.output_height - idx_h, 4); - if(heightSize > 1) { - /* true */ {xy_out[cst.output_width+0] = activate(ftype4(result10), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_width+1] = activate(ftype4(result11), cst.activation); } - if (widthSize > 2) {xy_out[cst.output_width+2] = activate(ftype4(result12), cst.activation); } - if (widthSize > 3) {xy_out[cst.output_width+3] = activate(ftype4(result13), cst.activation); } - } - if(heightSize > 2) { - /* true */ {xy_out[cst.output_width+cst.output_width+0] = activate(ftype4(result20), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_width+cst.output_width+1] = activate(ftype4(result21), cst.activation); } - if (widthSize > 2) {xy_out[cst.output_width+cst.output_width+2] = activate(ftype4(result22), cst.activation); } - if (widthSize > 3) {xy_out[cst.output_width+cst.output_width+3] = activate(ftype4(result23), cst.activation); } - } - if(heightSize > 3) { - /* true */ {xy_out[cst.output_width+cst.output_width+cst.output_width+0] = activate(ftype4(result30), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_width+cst.output_width+cst.output_width+1] = activate(ftype4(result31), cst.activation); } - if (widthSize > 2) {xy_out[cst.output_width+cst.output_width+cst.output_width+2] = activate(ftype4(result32), cst.activation); } - if (widthSize > 3) {xy_out[cst.output_width+cst.output_width+cst.output_width+3] = activate(ftype4(result33), cst.activation); } - } + if (widthSize > 4) {xy_out[4] = activate(ftype4(result10), cst.activation); } + if (widthSize > 5) {xy_out[5] = activate(ftype4(result11), cst.activation); } + if (widthSize > 6) {xy_out[6] = activate(ftype4(result12), cst.activation); } + if (widthSize > 7) {xy_out[7] = activate(ftype4(result13), cst.activation); } + if (widthSize > 8) {xy_out[8] = activate(ftype4(result20), cst.activation); } + if (widthSize > 9) {xy_out[9] = activate(ftype4(result21), cst.activation); } + if (widthSize > 10) {xy_out[10] = activate(ftype4(result22), cst.activation); } + if (widthSize > 11) {xy_out[11] = activate(ftype4(result23), cst.activation); } + if (widthSize > 12) {xy_out[12] = activate(ftype4(result30), cst.activation); } + if (widthSize > 13) {xy_out[13] = activate(ftype4(result31), cst.activation); } + if (widthSize > 14) {xy_out[14] = activate(ftype4(result32), cst.activation); } + if (widthSize > 15) {xy_out[15] = activate(ftype4(result33), cst.activation); } } @@ -415,19 +304,19 @@ kernel void conv1x1_w2c2(const device ftype4 *in [[buffer(0)]], const device ftype4x4 *wt [[buffer(3)]], const device ftype4 *biasTerms [[buffer(4)]], uint3 gid [[thread_position_in_grid]]) { - if ((int)gid.x * 2 >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z * 2 >= cst.batch * cst.output_slice) return; + if ((int)gid.x * 2 >= cst.output_width || (int)gid.y * 2 >= cst.batch * cst.output_slice) return; int channel_pack = (cst.output_channel + 7) >> 3; int idx_w = gid.x << 1; - int idx_h = gid.y; - int idx_c = (gid.z % channel_pack) << 1; - int idx_b = gid.z / channel_pack; + int idx_h = 0; + int idx_c = (gid.y % channel_pack) << 1; + int idx_b = gid.y / channel_pack; if(idx_b >= cst.batch || idx_c >= cst.output_slice) return; auto xy_wt = wt + idx_c * cst.input_slice; - auto xy_in0 = in + (int)idx_b * cst.input_slice * cst.input_size + idx_h * cst.output_width + idx_w; + auto xy_in0 = in + (int)idx_b * cst.input_size + idx_h * cst.output_width + idx_w; - auto xy_out = out + (int)idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; + auto xy_out = out + (int)idx_b * cst.output_size + idx_c * cst.output_size * cst.batch + idx_h * cst.output_width + idx_w; auto biasValue0 = FLOAT4(biasTerms[idx_c]); auto biasValue1 = FLOAT4(biasTerms[idx_c+1]); @@ -445,7 +334,7 @@ kernel void conv1x1_w2c2(const device ftype4 *in [[buffer(0)]], result1 += FLOAT4(in41 * w0); result4 += FLOAT4(in40 * w1); result5 += FLOAT4(in41 * w1); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } int widthSize = min(cst.output_width - idx_w, 2); @@ -454,79 +343,30 @@ kernel void conv1x1_w2c2(const device ftype4 *in [[buffer(0)]], int channelSize = min(cst.output_slice - idx_c, 2); if(channelSize > 1) { - /* true */ {xy_out[cst.output_size+0] = activate(ftype4(result4), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_size+1] = activate(ftype4(result5), cst.activation); } + /* true */ {xy_out[cst.output_size * cst.batch +0] = activate(ftype4(result4), cst.activation); } + if (widthSize > 1) {xy_out[cst.output_size * cst.batch +1] = activate(ftype4(result5), cst.activation); } } } - -kernel void conv1x1_w2h2(const device ftype4 *in [[buffer(0)]], +kernel void conv1x1_w4c2(const device ftype4 *in [[buffer(0)]], device ftype4 *out [[buffer(1)]], constant conv1x1_constants& cst [[buffer(2)]], const device ftype4x4 *wt [[buffer(3)]], const device ftype4 *biasTerms [[buffer(4)]], uint3 gid [[thread_position_in_grid]]) { - if ((int)gid.x * 2 >= cst.output_width || (int)gid.y * 2 >= cst.output_height || (int)gid.z >= cst.batch * cst.output_slice) return; - - int idx_w = gid.x << 1; - int idx_h = gid.y << 1; - int idx_c = gid.z % cst.output_slice; - int idx_b = gid.z / cst.output_slice; - - auto xy_wt = wt + idx_c * cst.input_slice; - auto xy_in0 = in + (int)idx_b * cst.input_slice * cst.input_size + idx_h * cst.output_width + idx_w; - - auto xy_out = out + (int)idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; - auto biasValue = FLOAT4(biasTerms[idx_c]); - FLOAT4 result0 = biasValue, result1 = biasValue; - FLOAT4 result4 = biasValue, result5 = biasValue; - - for (auto z = 0; z < cst.input_slice; z++) { - auto in40 = xy_in0[0]; - auto in41 = xy_in0[1]; - auto in44 = xy_in0[cst.output_width+0]; - auto in45 = xy_in0[cst.output_width+1]; - - auto w = xy_wt[z]; - - result0 += FLOAT4(in40 * w); - result1 += FLOAT4(in41 * w); - result4 += FLOAT4(in44 * w); - result5 += FLOAT4(in45 * w); - xy_in0 += cst.input_size; - } - - int widthSize = min(cst.output_width - idx_w, 2); - /* true */ *xy_out = activate(ftype4(result0), cst.activation); - if (widthSize > 1) {xy_out[1] = activate(ftype4(result1), cst.activation); } - - int heightSize = min(cst.output_height - idx_h, 2); - if(heightSize > 1) { - /* true */ {xy_out[cst.output_width+0] = activate(ftype4(result4), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_width+1] = activate(ftype4(result5), cst.activation); } - } -} - - -kernel void conv1x1_w2h2c2(const device ftype4 *in [[buffer(0)]], - device ftype4 *out [[buffer(1)]], - constant conv1x1_constants& cst [[buffer(2)]], - const device ftype4x4 *wt [[buffer(3)]], - const device ftype4 *biasTerms [[buffer(4)]], - uint3 gid [[thread_position_in_grid]]) { - if ((int)gid.x * 2 >= cst.output_width || (int)gid.y * 2 >= cst.output_height || (int)gid.z * 2 >= cst.batch * cst.output_slice) return; + if ((int)gid.x * 4 >= cst.output_width || (int)gid.y * 2 >= cst.batch * cst.output_slice) return; int channel_pack = (cst.output_channel + 7) >> 3; - int idx_w = gid.x << 1; - int idx_h = gid.y << 1; - int idx_c = (gid.z % channel_pack) << 1; - int idx_b = gid.z / channel_pack; + int idx_w = gid.x << 2; + int idx_h = 0; + int idx_c = (gid.y % channel_pack) << 1; + int idx_b = gid.y / channel_pack; if(idx_b >= cst.batch || idx_c >= cst.output_slice) return; auto xy_wt = wt + idx_c * cst.input_slice; - auto xy_in0 = in + (int)idx_b * cst.input_slice * cst.input_size + idx_h * cst.output_width + idx_w; + auto xy_in0 = in + (int)idx_b * cst.input_size + idx_h * cst.output_width + idx_w; - auto xy_out = out + (int)idx_b * cst.output_slice * cst.output_size + idx_c * cst.output_size + idx_h * cst.output_width + idx_w; + auto xy_out = out + (int)idx_b * cst.output_size + idx_c * cst.output_size * cst.batch + idx_h * cst.output_width + idx_w; auto biasValue0 = FLOAT4(biasTerms[idx_c]); auto biasValue1 = FLOAT4(biasTerms[idx_c+1]); @@ -537,8 +377,8 @@ kernel void conv1x1_w2h2c2(const device ftype4 *in [[buffer(0)]], for (auto z = 0; z < cst.input_slice; z++) { auto in40 = xy_in0[0]; auto in41 = xy_in0[1]; - auto in44 = xy_in0[cst.output_width+0]; - auto in45 = xy_in0[cst.output_width+1]; + auto in44 = xy_in0[2]; + auto in45 = xy_in0[3]; auto w0 = xy_wt[z]; auto w1 = xy_wt[cst.input_slice+z]; @@ -551,27 +391,20 @@ kernel void conv1x1_w2h2c2(const device ftype4 *in [[buffer(0)]], result3 += FLOAT4(in41 * w1); result6 += FLOAT4(in44 * w1); result7 += FLOAT4(in45 * w1); - xy_in0 += cst.input_size; + xy_in0 += cst.input_size * cst.batch; } - int widthSize = min(cst.output_width - idx_w, 2); + int widthSize = min(cst.output_width - idx_w, 4); /* true */ *xy_out = activate(ftype4(result0), cst.activation); if (widthSize > 1) {xy_out[1] = activate(ftype4(result1), cst.activation); } - - int heightSize = min(cst.output_height - idx_h, 2); - if(heightSize > 1) { - /* true */ {xy_out[cst.output_width+0] = activate(ftype4(result4), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_width+1] = activate(ftype4(result5), cst.activation); } - } - + if (widthSize > 2) {xy_out[2] = activate(ftype4(result4), cst.activation); } + if (widthSize > 3) {xy_out[3] = activate(ftype4(result5), cst.activation); } + int channelSize = min(cst.output_slice - idx_c, 2); if(channelSize > 1) { - /* true */ xy_out[cst.output_size] = activate(ftype4(result2), cst.activation); - if (widthSize > 1) {xy_out[cst.output_size+1] = activate(ftype4(result3), cst.activation); } - - if(heightSize > 1) { - /* true */ {xy_out[cst.output_size+cst.output_width+0] = activate(ftype4(result6), cst.activation); } - if (widthSize > 1) {xy_out[cst.output_size+cst.output_width+1] = activate(ftype4(result7), cst.activation); } - } + /* true */ xy_out[cst.output_size * cst.batch] = activate(ftype4(result2), cst.activation); + if (widthSize > 1) {xy_out[cst.output_size * cst.batch +1] = activate(ftype4(result3), cst.activation); } + if (widthSize > 2) {xy_out[cst.output_size * cst.batch +2] = activate(ftype4(result6), cst.activation); } + if (widthSize > 3) {xy_out[cst.output_size * cst.batch +3] = activate(ftype4(result7), cst.activation); } } } diff --git a/source/backend/metal/shader/MetalConvolutionDepthwise.metal b/source/backend/metal/shader/MetalConvolutionDepthwise.metal index 268ebeb02..bff754d7f 100644 --- a/source/backend/metal/shader/MetalConvolutionDepthwise.metal +++ b/source/backend/metal/shader/MetalConvolutionDepthwise.metal @@ -28,7 +28,7 @@ kernel void conv_depthwise(const device ftype4 *in [[buffer(0)]], uint3 gid [[thread_position_in_grid]]) { if ((int)gid.x >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.slice * cst.batch) return; - int oz = gid.z % cst.slice; + int oz = gid.z / cst.batch; int offset_x = (int)gid.x * cst.stride_x - cst.pad_x; int offset_y = (int)gid.y * cst.stride_y - cst.pad_y; int sx = max(0, (UP_DIV(-offset_x, cst.dilation_x))); diff --git a/source/backend/metal/shader/MetalDeconvolution.metal b/source/backend/metal/shader/MetalDeconvolution.metal index 0f5a86fcf..133ca74fa 100644 --- a/source/backend/metal/shader/MetalDeconvolution.metal +++ b/source/backend/metal/shader/MetalDeconvolution.metal @@ -36,8 +36,8 @@ kernel void deconv(const device ftype4 *in [[buffer(0)]], uint3 gid [[thread_position_in_grid]]) { if ((int)gid.x >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.batch * cst.output_slice) return; - int b = gid.z / cst.output_slice; - int o = gid.z % cst.output_slice; + int b = gid.z % cst.batch; + int o = gid.z / cst.batch; FLOAT4 result = FLOAT4(biasTerms[o]); int oy = (int)gid.y + cst.pad_y; @@ -56,12 +56,12 @@ kernel void deconv(const device ftype4 *in [[buffer(0)]], int min_ix = (ox - max_kx * cst.dilation_x) / cst.stride_x; auto o_wt = wt + o * cst.input_slice * cst.kernel_size; - auto b_in = in + b * cst.input_slice * cst.input_size; + auto b_in = in + b * cst.input_size; for (auto z = 0; z < cst.input_slice; z++) { for (auto ky = max_ky, iy = min_iy; ky >= min_ky; ky -= cst.delta_ky, iy += cst.delta_iy) { for (auto kx = max_kx, ix = min_ix; kx >= min_kx; kx -= cst.delta_kx, ix += cst.delta_ix) { auto wt4 = o_wt[z * cst.kernel_size + ky * cst.kernel_x + kx]; - auto in4 = b_in[z * cst.input_size + iy * cst.input_width + ix]; + auto in4 = b_in[z * cst.input_size * cst.batch + iy * cst.input_width + ix]; result += FLOAT4(in4 * wt4); } } @@ -78,7 +78,7 @@ kernel void deconv_depthwise(const device ftype4 *in [[buffer(0)]], uint3 gid [[thread_position_in_grid]]) { if ((int)gid.x >= cst.output_width || (int)gid.y >= cst.output_height || (int)gid.z >= cst.batch * cst.output_slice) return; - FLOAT4 result = FLOAT4(biasTerms[(int)(gid.z % cst.input_slice)]); + FLOAT4 result = FLOAT4(biasTerms[(int)(gid.z / cst.batch)]); int oy = (int)gid.y + cst.pad_y; int ox = (int)gid.x + cst.pad_x; diff --git a/source/backend/metal/shader/MetalPReLU.metal b/source/backend/metal/shader/MetalPReLU.metal index 7082fdca5..24ab1bab7 100644 --- a/source/backend/metal/shader/MetalPReLU.metal +++ b/source/backend/metal/shader/MetalPReLU.metal @@ -19,7 +19,7 @@ kernel void prelu_slopes(const device ftype4 *in [[buffer(0)]], uint3 gid [[thread_position_in_grid]]) { // size, slice, batch if ((int)gid.x >= s.size || (int)gid.y >= s.slice) return; - int z = gid.z * s.slice + gid.y; + int z = gid.z + gid.y * s.batch; auto v4 = in[z * s.size + int(gid.x)]; out[z * s.size + int(gid.x)] = select(v4, ftype4(slope[int(gid.y)]) * v4, signbit(v4)); } diff --git a/source/backend/metal/shader/MetalROIPooling.metal b/source/backend/metal/shader/MetalROIPooling.metal index d5423adc5..a9b8d554e 100644 --- a/source/backend/metal/shader/MetalROIPooling.metal +++ b/source/backend/metal/shader/MetalROIPooling.metal @@ -2,10 +2,11 @@ struct ROI_shape { int input_width; int input_height; int input_size; + int input_batch; int output_width; int output_height; int output_size; - int slices; + int batch; float spatial_scale; }; kernel void ROI_pooling(const device ftype4 *in [[buffer(0)]], @@ -15,10 +16,10 @@ kernel void ROI_pooling(const device ftype4 *in [[buffer(0)]], uint3 gid [[thread_position_in_grid]]) { if ((int)gid.x >= s.output_width || (int)gid.y >= s.output_height) return; - int ob = gid.z / s.slices; - int iz = gid.z % s.slices; + int ob = gid.z % s.batch; + int iz = gid.z / s.batch; - auto b_roi = roi + ob * 8; // roundup(5, 4) = 8 + auto b_roi = roi + ob * 5; int ib = int(b_roi[0]); int x1 = round(float(b_roi[1]) * s.spatial_scale); int y1 = round(float(b_roi[2]) * s.spatial_scale); @@ -27,8 +28,8 @@ kernel void ROI_pooling(const device ftype4 *in [[buffer(0)]], int roi_w = max(x2 - x1 + 1, 1); int roi_h = max(y2 - y1 + 1, 1); - auto bin_size_w = (ftype)roi_w / s.output_width; - auto bin_size_h = (ftype)roi_h / s.output_height; + float bin_size_w = (float)roi_w / (float)s.output_width; + float bin_size_h = (float)roi_h / (float)s.output_height; int w_start = clamp(x1 + (int)floor(gid.x * bin_size_w) , 0, s.input_width); int w_end = clamp(x1 + (int)ceil((gid.x + 1) * bin_size_w), 0, s.input_width); @@ -36,7 +37,7 @@ kernel void ROI_pooling(const device ftype4 *in [[buffer(0)]], int h_end = clamp(y1 + (int)ceil((gid.y + 1) * bin_size_h), 0, s.input_height); int is_empty = (h_end <= h_start) || (w_end <= w_start); - auto z_in = in + (ib * s.slices + iz) * s.input_size; + auto z_in = in + (ib + iz * s.input_batch) * s.input_size; auto max4 = is_empty ? 0 : z_in[h_start * s.input_width + w_start]; for (int y = h_start; y < h_end; y++) { auto y_in = z_in + y * s.input_width; diff --git a/source/backend/metal/shader/MetalReLU.metal b/source/backend/metal/shader/MetalReLU.metal deleted file mode 100644 index ef4ef4f13..000000000 --- a/source/backend/metal/shader/MetalReLU.metal +++ /dev/null @@ -1,15 +0,0 @@ -kernel void relu_x1(const device ftype *in [[buffer(0)]], - device ftype *out [[buffer(1)]], - constant float &slope [[buffer(2)]], - uint gid [[thread_position_in_grid]]) { - auto value = in[int(gid)]; - out[int(gid)] = fmax(value, (ftype)0) + fmin(value, (ftype)0) * ftype(slope); -} - -kernel void relu_x4(const device ftype4 *in [[buffer(0)]], - device ftype4 *out [[buffer(1)]], - constant float &slope [[buffer(2)]], - uint gid [[thread_position_in_grid]]) { - auto value = in[int(gid)]; - out[int(gid)] = fmax(value, (ftype4)0) + fmin(value, (ftype4)0) * ftype4(slope); -} diff --git a/source/backend/metal/shader/MetalReLU6.metal b/source/backend/metal/shader/MetalReLU6.metal index 829c0d90c..7e83b07d6 100644 --- a/source/backend/metal/shader/MetalReLU6.metal +++ b/source/backend/metal/shader/MetalReLU6.metal @@ -1,13 +1,24 @@ -kernel void relu6_x1(const device ftype *in [[buffer(0)]], - device ftype *out [[buffer(1)]], - constant float4 &minMax [[buffer(2)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = clamp(in[int(gid)], (ftype)(minMax.x), (ftype)(minMax.y)); +struct Param { + float minV; + float maxV; + int size; + int remain; +}; +kernel void relu6(const device ftype4 *in [[buffer(0)]], + device ftype4 *out [[buffer(1)]], + constant Param &p [[buffer(2)]], + uint3 gid [[thread_position_in_grid]]) { + if (gid.x < p.size) { + out[int(gid.x)] = clamp(in[int(gid.x)], (ftype4)p.minV, (ftype4)p.maxV); + } } -kernel void relu6_x4(const device ftype4 *in [[buffer(0)]], - device ftype4 *out [[buffer(1)]], - constant float4 &minMax [[buffer(2)]], - uint gid [[thread_position_in_grid]]) { - out[int(gid)] = clamp(in[int(gid)], (ftype4)minMax.x, (ftype4)minMax.y); -} +kernel void relu(const device ftype4 *in [[buffer(0)]], + device ftype4 *out [[buffer(1)]], + constant Param &p [[buffer(2)]], + uint3 gid [[thread_position_in_grid]]) { + if (gid.x < p.size) { + auto value = in[int(gid.x)]; + out[int(gid.x)] = fmax(value, (ftype4)0) + fmin(value, (ftype4)0) * ftype4(p.minV); + } +} \ No newline at end of file diff --git a/source/backend/metal/shader/MetalScale.metal b/source/backend/metal/shader/MetalScale.metal index 78790d5fe..ead56d11e 100644 --- a/source/backend/metal/shader/MetalScale.metal +++ b/source/backend/metal/shader/MetalScale.metal @@ -12,7 +12,7 @@ kernel void scale_ca(const device ftype4 *in [[buffer(0)]], uint2 gid [[thread_position_in_grid]]) { if ((int)gid.x >= s.size || (int)gid.y >= s.steps * s.batch) return; - int z = gid.y % s.steps; + int z = gid.y / s.batch; out[int(gid.y) * s.size + int(gid.x)] = in [int(gid.y) * s.size + int(gid.x)] * ftype4(scales[z]) + ftype4(biasTerms[z]); } diff --git a/source/backend/opencl/core/OpenCLBackend.cpp b/source/backend/opencl/core/OpenCLBackend.cpp index b730cf5dc..74f765912 100644 --- a/source/backend/opencl/core/OpenCLBackend.cpp +++ b/source/backend/opencl/core/OpenCLBackend.cpp @@ -294,6 +294,23 @@ class CLMemReleaseImage : public Backend::MemObj { ImagePool* mBufferPool; }; +float OpenCLBackend::getBytes(const Tensor* tensor) { + float bytes = (float)tensor->getType().bytes(); + if (getOpenCLRuntime()->isSupportedFP16()) {// Fp16 + if (halide_type_float == tensor->getType().code) { + bytes = 2.0; + } + } + auto quant = TensorUtils::getDescribe(tensor)->quantAttr.get(); + if (nullptr != quant && TensorUtils::getDescribe(tensor)->type == DataType_DT_INT8) { + bytes = 1.0; + } + if(tensor->getType().bits == 4) { + bytes = 0.5; + } + return bytes; +} + Backend::MemObj* OpenCLBackend::onAcquire(const Tensor* nativeTensor, StorageType storageType) { #ifdef LOG_VERBOSE MNN_PRINT("Start OpenCLBackend::onAcquireBuffer !\n"); @@ -312,7 +329,7 @@ Backend::MemObj* OpenCLBackend::onAcquire(const Tensor* nativeTensor, StorageTyp #ifndef MNN_OPENCL_BUFFER_CLOSED if(mOpenCLRuntime->getGpuMemType() == BUFFER) { size_t size; - size_t typeSize = 4; + float typeSize = getBytes(nativeTensor); if (nativeTensor->dimensions() >= 2) { auto alignC = ROUND_UP(C, 8); // increment of height and width @@ -331,16 +348,9 @@ Backend::MemObj* OpenCLBackend::onAcquire(const Tensor* nativeTensor, StorageTyp size_t imageHeight = (size_t)N * H; size = imageWidth*imageHeight*cPack; } - cl_channel_type dataType = CL_FLOAT; - //when support and want fp16, use half datatype - if ((nativeTensor->getType().code == halide_type_int || nativeTensor->getType().code == halide_type_uint)){ - if(nativeTensor->getType().bits == 8){ - typeSize = 1; - } - } else if (getOpenCLRuntime()->isSupportedFP16()) { - typeSize = 2; - } - + // Align when int4 memory + size = ROUND_UP(size, 2); + if (storageType == DYNAMIC_SEPERATE) { auto buffer = mBufferPool->alloc(size*typeSize, true); ((Tensor*)nativeTensor)->buffer().device = (uint64_t)buffer; @@ -352,23 +362,8 @@ Backend::MemObj* OpenCLBackend::onAcquire(const Tensor* nativeTensor, StorageTyp return new CLMemReleaseBuffer(buffer, mBufferPool); } MNN_ASSERT(storageType == STATIC); -#ifdef MNN_LOW_MEMORY - // for weight quant model's weight - if ((nativeTensor->getType().code == halide_type_int) && - (nativeTensor->getType().bits == 8 || nativeTensor->getType().bits == 4)) { - // int8 quant - size_t alloc_size = size; - if (nativeTensor->getType().bits == 4) { - // int4 quant - alloc_size = size / 2; - } - auto buffer = mStaticBufferPool->alloc(alloc_size); - ((Tensor*)nativeTensor)->buffer().device = (uint64_t)buffer; - return new CLMemReleaseBuffer(buffer, mStaticBufferPool.get()); - } -#endif - auto buffer = mStaticBufferPool->alloc(size* - (dataType == CL_HALF_FLOAT ? sizeof(half_float::half) : sizeof(float))); + + auto buffer = mStaticBufferPool->alloc(size*typeSize); ((Tensor*)nativeTensor)->buffer().device = (uint64_t)buffer; // fix return new CLMemReleaseBuffer(buffer, mStaticBufferPool.get()); } @@ -569,7 +564,7 @@ ErrorCode OpenCLBackend::onResizeEnd() { mOpenCLRuntime->setCommandQueueProfileDisable(); #endif if(!mRecordings.empty()){ - endRecord(mRecordings.back(), true); + endRecord(mRecordings.back().record, true); } return NO_ERROR; } @@ -1188,8 +1183,25 @@ void OpenCLBackend::clearRecord() const{ #if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) if(mUseRecordQueue && mDevideOpRecord){ for(int i = 0; i < mRecordings.size(); ++i){ - cl_int res = mOpenCLRuntime->commandQueue().EnqueueRecordingQCOM(mRecordings[i], 0, nullptr, 0, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr, nullptr); + std::vector update_kernel_args; + std::vector update_global_size; + std::vector update_local_size; + for (int j = 0; j < mRecordings[i].updateInfo.size(); ++j){ + for(int k = 0; k < mRecordings[i].updateInfo[j]->update_kernel_args.size(); ++k){ + update_kernel_args.emplace_back(mRecordings[i].updateInfo[j]->update_kernel_args[k]); + update_kernel_args.back().dispatch_index = j; + } + for(int k = 0; k < mRecordings[i].updateInfo[j]->update_global_size.size(); ++k){ + update_global_size.emplace_back(mRecordings[i].updateInfo[j]->update_global_size[k]); + update_global_size.back().dispatch_index = j; + } + for(int k = 0; k < mRecordings[i].updateInfo[j]->update_local_size.size(); ++k){ + update_local_size.emplace_back(mRecordings[i].updateInfo[j]->update_local_size[k]); + update_local_size.back().dispatch_index = j; + } + } + cl_int res = mOpenCLRuntime->commandQueue().EnqueueRecordingQCOM(mRecordings[i].record, update_kernel_args.size(), update_kernel_args.data(), 0, nullptr, + update_global_size.size(), update_global_size.data(), update_local_size.size(), update_local_size.data(), 0, nullptr, nullptr); MNN_CHECK_CL_SUCCESS(res, "EnqueueRecordingQCOM"); } mOpenCLRuntime->commandQueue().finish(); @@ -1202,8 +1214,22 @@ void OpenCLBackend::enqeueRecord() const{ #if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) if(mUseRecordQueue && !mDevideOpRecord){ for(int i = 0; i < mRecordings.size(); ++i){ - cl_int res = mOpenCLRuntime->commandQueue().EnqueueRecordingQCOM(mRecordings[i], 0, nullptr, 0, nullptr, - 0, nullptr, 0, nullptr, 0, nullptr, nullptr); + std::vector update_kernel_args; + std::vector update_global_size; + std::vector update_local_size; + for (int j = 0; j < mRecordings[i].updateInfo.size(); ++j){ + for(int k = 0; k < mRecordings[i].updateInfo[j]->update_kernel_args.size(); ++k){ + update_kernel_args.emplace_back(mRecordings[i].updateInfo[j]->update_kernel_args[k]); + } + for(int k = 0; k < mRecordings[i].updateInfo[j]->update_global_size.size(); ++k){ + update_global_size.emplace_back(mRecordings[i].updateInfo[j]->update_global_size[k]); + } + for(int k = 0; k < mRecordings[i].updateInfo[j]->update_local_size.size(); ++k){ + update_local_size.emplace_back(mRecordings[i].updateInfo[j]->update_local_size[k]); + } + } + cl_int res = mOpenCLRuntime->commandQueue().EnqueueRecordingQCOM(mRecordings[i].record, update_kernel_args.size(), update_kernel_args.data(), 0, nullptr, + update_global_size.size(), update_global_size.data(), update_local_size.size(), update_local_size.data(), 0, nullptr, nullptr); MNN_CHECK_CL_SUCCESS(res, "EnqueueRecordingQCOM"); } mOpenCLRuntime->commandQueue().finish(); @@ -1215,7 +1241,7 @@ void OpenCLBackend::releaseRecord(){ #if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) if(mUseRecordQueue && !mDevideOpRecord){ for(int i = 0; i < mRecordings.size(); ++i){ - cl_int res = clReleaseRecordingQCOM(mRecordings[i]); + cl_int res = clReleaseRecordingQCOM(mRecordings[i].record); MNN_CHECK_CL_SUCCESS(res, "clReleaseRecordingQCOM"); } mRecordings.clear(); @@ -1258,8 +1284,9 @@ void OpenCLBackend::endRecord(cl_recording_qcom &recording, bool flag){ res = clEndRecordingQCOM(recording); MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); } else if(flag) { + // endRecord for last kernel be recorded when record mode is MNN_GPU_RECORD_BATCH if(!mRecordings.empty()){ - cl_int res = clEndRecordingQCOM(mRecordings.back()); + cl_int res = clEndRecordingQCOM(mRecordings.back().record); mRecordNums = 0; MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); } @@ -1270,7 +1297,18 @@ void OpenCLBackend::endRecord(cl_recording_qcom &recording, bool flag){ #endif //ENABLE_OPENCL_TIME_PROFILER } -void OpenCLBackend::recordKernel2d(const std::shared_ptr &kernelW, const std::vector &gws, const std::vector &lws) { +void OpenCLBackend::addRecord(cl_recording_qcom &record, std::vectorupdateInfo){ + if(mDevideOpRecord){ + RecordInfo info; + info.record = record; + for(int i = 0; i < updateInfo.size(); ++i) { + info.updateInfo.emplace_back(updateInfo[i]); + } + mRecordings.emplace_back(info); + } +} + +void OpenCLBackend::recordKernel2d(const std::shared_ptr &kernelW, const std::vector &gws, const std::vector &lws, RecordUpdateInfo *updateInfo) { #if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) if(!mUseRecordQueue){ return; @@ -1281,17 +1319,35 @@ void OpenCLBackend::recordKernel2d(const std::shared_ptr &kernelW, c #endif cl_int res = CL_SUCCESS; if(!mDevideOpRecord){ + RecordInfo info; + if(updateInfo != nullptr){ + for(int i = 0; i < updateInfo->update_kernel_args.size(); ++i){ + updateInfo->update_kernel_args[i].dispatch_index = mRecordNums; + } + for(int i = 0; i < updateInfo->update_global_size.size(); ++i){ + updateInfo->update_global_size[i].dispatch_index = mRecordNums; + } + for(int i = 0; i < updateInfo->update_local_size.size(); ++i){ + updateInfo->update_local_size[i].dispatch_index = mRecordNums; + } + info.updateInfo.emplace_back(updateInfo); + } if(mRecordNums == 0){ cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - mRecordings.emplace_back(recording); + info.record = recording; + mRecordings.emplace_back(info); }else if(mRecordNums == mUseRecordableQueueSize){ - res = clEndRecordingQCOM(mRecordings.back()); + res = clEndRecordingQCOM(mRecordings.back().record); MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - mRecordings.emplace_back(recording); + info.record = recording; + mRecordings.emplace_back(info); mRecordNums = 0; + } else if(updateInfo != nullptr){ + auto &lastInfo = mRecordings.back(); + lastInfo.updateInfo.emplace_back(updateInfo); } mRecordNums++; } @@ -1317,7 +1373,7 @@ void OpenCLBackend::recordKernel2d(const std::shared_ptr &kernelW, c #endif //ENABLE_OPENCL_TIME_PROFILER } -void OpenCLBackend::recordKernel3d(const std::shared_ptr &kernelW, const std::vector &gws, const std::vector &lws) { +void OpenCLBackend::recordKernel3d(const std::shared_ptr &kernelW, const std::vector &gws, const std::vector &lws, RecordUpdateInfo *updateInfo) { #if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) if(!mUseRecordQueue){ return; @@ -1332,17 +1388,35 @@ void OpenCLBackend::recordKernel3d(const std::shared_ptr &kernelW, c internalGlobalWS[i] = ROUND_UP(gws[i], std::max((uint32_t)1, lws[i])); } if(!mDevideOpRecord){ + RecordInfo info; + if(updateInfo != nullptr){ + for(int i = 0; i < updateInfo->update_kernel_args.size(); ++i){ + updateInfo->update_kernel_args[i].dispatch_index = mRecordNums; + } + for(int i = 0; i < updateInfo->update_global_size.size(); ++i){ + updateInfo->update_global_size[i].dispatch_index = mRecordNums; + } + for(int i = 0; i < updateInfo->update_local_size.size(); ++i){ + updateInfo->update_local_size[i].dispatch_index = mRecordNums; + } + info.updateInfo.emplace_back(updateInfo); + } if(mRecordNums == 0){ cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - mRecordings.emplace_back(recording); + info.record = recording; + mRecordings.emplace_back(info); }else if(mRecordNums == mUseRecordableQueueSize){ - res = clEndRecordingQCOM(mRecordings.back()); + res = clEndRecordingQCOM(mRecordings.back().record); MNN_CHECK_CL_SUCCESS(res, "clEndRecordingQCOM"); cl_recording_qcom recording = mOpenCLRuntime->recordableQueue().NewRecordingQCOM(&res); MNN_CHECK_CL_SUCCESS(res, "clNewRecordingQCOM"); - mRecordings.emplace_back(recording); + info.record = recording; + mRecordings.emplace_back(info); mRecordNums = 0; + } else if(updateInfo != nullptr){ + auto &lastInfo = mRecordings.back(); + lastInfo.updateInfo.emplace_back(updateInfo); } mRecordNums++; } diff --git a/source/backend/opencl/core/OpenCLBackend.hpp b/source/backend/opencl/core/OpenCLBackend.hpp index 3e57bc941..ca998b7f4 100644 --- a/source/backend/opencl/core/OpenCLBackend.hpp +++ b/source/backend/opencl/core/OpenCLBackend.hpp @@ -34,6 +34,15 @@ namespace MNN { namespace OpenCL { struct TuneInfo; +struct RecordUpdateInfo{ + std::vector update_kernel_args; + std::vector update_global_size; + std::vector update_local_size; +}; +struct RecordInfo{ + cl_recording_qcom record; + std::vector updateInfo; +}; class CLRuntime : public Runtime { public: CLRuntime(const Backend::Info& info, int platformSize, int platformId, int deviceId = 0, void *contextPtr = nullptr, void *glshared = nullptr); @@ -111,6 +120,7 @@ class OpenCLBackend : public Backend { return mMemory; } + float getBytes(const Tensor* tensor); DataType getDataType(const Tensor* tensor); cl_channel_type fpType(); @@ -125,11 +135,9 @@ class OpenCLBackend : public Backend { bool isDevideOpRecord(){ return mDevideOpRecord; } - void addRecord(cl_recording_qcom &record){ - mRecordings.emplace_back(record); - } - void recordKernel2d(const std::shared_ptr &kernel, const std::vector &gws, const std::vector &lws); - void recordKernel3d(const std::shared_ptr &kernel, const std::vector &gws, const std::vector &lws); + void addRecord(cl_recording_qcom &record, std::vectorupdateInfo); + void recordKernel2d(const std::shared_ptr &kernel, const std::vector &gws, const std::vector &lws, RecordUpdateInfo *updateInfo = nullptr); + void recordKernel3d(const std::shared_ptr &kernel, const std::vector &gws, const std::vector &lws, RecordUpdateInfo *updateInfo = nullptr); void startRecord(cl_recording_qcom &recording); void endRecord(cl_recording_qcom &recording, bool flag = false); @@ -167,7 +175,7 @@ class OpenCLBackend : public Backend { BackendConfig::PrecisionMode mPrecision; BackendConfig::MemoryMode mMemory; bool mIsCreateError{false}; - mutable std::vector mRecordings; + mutable std::vector mRecordings; bool mUseRecordQueue = false; bool mDevideOpRecord = false; uint32_t mRecordNums = 0; @@ -202,6 +210,17 @@ class OpenCLCreatorRegister { } #endif +#ifdef MNN_OPENCL_SEP_BUILD +#define REGISTER_OPENCL_OP_CREATOR_TRANSFORMER(name, opType, memObj) \ + OpenCLCreatorRegister ___OpenCL##name##__##opType##__##memObj##__(opType, memObj) +#else +#define REGISTER_OPENCL_OP_CREATOR_TRANSFORMER(name, opType, memObj) \ + void ___OpenCL##name##__##opType##__##memObj##__() { \ + static name _temp; \ + OpenCLBackend::addCreator(std::make_pair(opType, memObj), &_temp); \ + } +#endif + template class TypedCreator : public OpenCLBackend::Creator { diff --git a/source/backend/opencl/core/OpenCLOPRegister.cpp b/source/backend/opencl/core/OpenCLOPRegister.cpp index 9af375e4c..538a6963d 100644 --- a/source/backend/opencl/core/OpenCLOPRegister.cpp +++ b/source/backend/opencl/core/OpenCLOPRegister.cpp @@ -1,122 +1,127 @@ // This file is generated by Shell for ops register #ifndef MNN_OPENCL_SEP_BUILD - namespace MNN { namespace OpenCL { +extern void ___OpenCLInterp3DBufCreator__OpType_Interp3D__BUFFER__(); +extern void ___OpenCLReductionBufCreator__OpType_Reduction__BUFFER__(); extern void ___OpenCLArgMaxBufCreator__OpType_ArgMax__BUFFER__(); extern void ___OpenCLArgMaxBufCreator__OpType_ArgMin__BUFFER__(); -extern void ___OpenCLScaleCreator__OpType_Scale__IMAGE__(); -extern void ___OpenCLScaleBufCreator__OpType_Scale__BUFFER__(); +extern void ___OpenCLMatMulBufCreator__OpType_MatMul__BUFFER__(); +extern void ___OpenCLRasterBufCreator__OpType_Raster__BUFFER__(); +extern void ___OpenCLLayerNormBufCreator__OpType_LayerNorm__BUFFER__(); +extern void ___OpenCLDepthwiseConvolutionBufCreator__OpType_ConvolutionDepthwise__BUFFER__(); +extern void ___OpenCLInterpBufCreator__OpType_Interp__BUFFER__(); +extern void ___OpenCLBinaryBufCreator__OpType_Eltwise__BUFFER__(); +extern void ___OpenCLBinaryBufCreator__OpType_BinaryOp__BUFFER__(); +extern void ___OpenCLConvolutionBufCreator__OpType_Convolution__BUFFER__(); extern void ___OpenCLSelectBufCreator__OpType_Select__BUFFER__(); -extern void ___OpenCLSoftmaxCreator__OpType_Softmax__IMAGE__(); -extern void ___OpenCLSoftmaxBufCreator__OpType_Softmax__BUFFER__(); +extern void ___OpenCLPoolBufCreator__OpType_Pooling__BUFFER__(); +extern void ___OpenCLDeconvolutionBufCreator__OpType_Deconvolution__BUFFER__(); extern void ___OpenCLCastBufCreator__OpType_Cast__BUFFER__(); -extern void ___OpenCLInterpCreator__OpType_Interp__IMAGE__(); -extern void ___OpenCLInterpBufCreator__OpType_Interp__BUFFER__(); -extern void ___OpenCLGridSampleCreator__OpType_GridSample__IMAGE__(); +extern void ___OpenCLReluBufCreator__OpType_ReLU__BUFFER__(); +extern void ___OpenCLReluBufCreator__OpType_PReLU__BUFFER__(); +extern void ___OpenCLReluBufCreator__OpType_ReLU6__BUFFER__(); +extern void ___OpenCLSoftmaxBufCreator__OpType_Softmax__BUFFER__(); +extern void ___OpenCLLoopBufCreator__OpType_While__BUFFER__(); +extern void ___OpenCLRangeBufCreator__OpType_Range__BUFFER__(); +extern void ___OpenCLUnaryBufCreator__OpType_UnaryOp__BUFFER__(); +extern void ___OpenCLUnaryBufCreator__OpType_Sigmoid__BUFFER__(); +extern void ___OpenCLUnaryBufCreator__OpType_TanH__BUFFER__(); extern void ___OpenCLGridSampleBufCreator__OpType_GridSample__BUFFER__(); +extern void ___OpenCLScaleBufCreator__OpType_Scale__BUFFER__(); +extern void ___OpenCLDepthwiseConvolutionCreator__OpType_ConvolutionDepthwise__IMAGE__(); extern void ___OpenCLMatMulCreator__OpType_MatMul__IMAGE__(); -extern void ___OpenCLMatMulBufCreator__OpType_MatMul__BUFFER__(); -extern void ___OpenCLDeconvolutionCreator__OpType_Deconvolution__IMAGE__(); -extern void ___OpenCLDeconvolutionBufCreator__OpType_Deconvolution__BUFFER__(); -extern void ___OpenCLEltwiseCreator__OpType_BinaryOp__IMAGE__(); -extern void ___OpenCLBinaryBufCreator__OpType_BinaryOp__BUFFER__(); -extern void ___OpenCLEltwiseCreator__OpType_Eltwise__IMAGE__(); -extern void ___OpenCLBinaryBufCreator__OpType_Eltwise__BUFFER__(); -extern void ___OpenCLPoolCreator__OpType_Pooling__IMAGE__(); -extern void ___OpenCLPoolBufCreator__OpType_Pooling__BUFFER__(); -extern void ___OpenCLRoiPoolingCreator__OpType_ROIPooling__IMAGE__(); extern void ___OpenCLUnaryCreator__OpType_UnaryOp__IMAGE__(); extern void ___OpenCLUnaryCreator__OpType_Sigmoid__IMAGE__(); extern void ___OpenCLUnaryCreator__OpType_TanH__IMAGE__(); -extern void ___OpenCLUnaryBufCreator__OpType_UnaryOp__BUFFER__(); -extern void ___OpenCLUnaryBufCreator__OpType_Sigmoid__BUFFER__(); -extern void ___OpenCLUnaryBufCreator__OpType_TanH__BUFFER__(); -extern void ___OpenCLReductionCreator__OpType_Reduction__IMAGE__(); -extern void ___OpenCLReductionBufCreator__OpType_Reduction__BUFFER__(); +extern void ___OpenCLScaleCreator__OpType_Scale__IMAGE__(); +extern void ___OpenCLSoftmaxCreator__OpType_Softmax__IMAGE__(); +extern void ___OpenCLEltwiseCreator__OpType_Eltwise__IMAGE__(); +extern void ___OpenCLEltwiseCreator__OpType_BinaryOp__IMAGE__(); +extern void ___OpenCLRangeCreator__OpType_Range__IMAGE__(); +extern void ___OpenCLRasterCreator__OpType_Raster__IMAGE__(); +extern void ___OpenCLFuseCreator__OpType_Extra__IMAGE__(); +extern void ___OpenCLLoopCreator__OpType_While__IMAGE__(); +extern void ___OpenCLTrainableParamCreator__OpType_TrainableParam__IMAGE__(); extern void ___OpenCLReluCreator__OpType_ReLU__IMAGE__(); extern void ___OpenCLReluCreator__OpType_PReLU__IMAGE__(); extern void ___OpenCLReluCreator__OpType_ReLU6__IMAGE__(); -extern void ___OpenCLReluBufCreator__OpType_ReLU__BUFFER__(); -extern void ___OpenCLReluBufCreator__OpType_PReLU__BUFFER__(); -extern void ___OpenCLReluBufCreator__OpType_ReLU6__BUFFER__(); -extern void ___OpenCLDepthwiseDeconvolutionCreator__OpType_DeconvolutionDepthwise__IMAGE__(); -extern void ___OpenCLRasterCreator__OpType_Raster__IMAGE__(); -extern void ___OpenCLRasterBufCreator__OpType_Raster__BUFFER__(); -extern void ___OpenCLDepthwiseConvolutionCreator__OpType_ConvolutionDepthwise__IMAGE__(); -extern void ___OpenCLDepthwiseConvolutionBufCreator__OpType_ConvolutionDepthwise__BUFFER__(); -extern void ___OpenCLRangeBufCreator__OpType_Range__BUFFER__(); -extern void ___OpenCLInterp3DCreator__OpType_Interp3D__IMAGE__(); -extern void ___OpenCLInterp3DBufCreator__OpType_Interp3D__BUFFER__(); extern void ___OpenCLConvolutionCreator__OpType_Convolution__IMAGE__(); -extern void ___OpenCLConvolutionBufCreator__OpType_Convolution__BUFFER__(); extern void ___OpenCLLayerNormCreator__OpType_LayerNorm__IMAGE__(); -extern void ___OpenCLLayerNormBufCreator__OpType_LayerNorm__BUFFER__(); -extern void ___OpenCLLoopCreator__OpType_While__IMAGE__(); -extern void ___OpenCLLoopBufCreator__OpType_While__BUFFER__(); -extern void ___OpenCLTrainableParamCreator__OpType_TrainableParam__IMAGE__(); -extern void ___OpenCLFuseCreator__OpType_Extra__IMAGE__(); -extern void ___OpenCLRangeCreator__OpType_Range__IMAGE__(); -extern void ___OpenCLCastCreator__OpType_Cast__IMAGE__(); +extern void ___OpenCLReductionCreator__OpType_Reduction__IMAGE__(); +extern void ___OpenCLRoiPoolingCreator__OpType_ROIPooling__IMAGE__(); +extern void ___OpenCLPoolCreator__OpType_Pooling__IMAGE__(); extern void ___OpenCLSelectCreator__OpType_Select__IMAGE__(); +extern void ___OpenCLDeconvolutionCreator__OpType_Deconvolution__IMAGE__(); +extern void ___OpenCLDepthwiseDeconvolutionCreator__OpType_DeconvolutionDepthwise__IMAGE__(); +extern void ___OpenCLInterp3DCreator__OpType_Interp3D__IMAGE__(); +extern void ___OpenCLCastCreator__OpType_Cast__IMAGE__(); +extern void ___OpenCLInterpCreator__OpType_Interp__IMAGE__(); +extern void ___OpenCLGridSampleCreator__OpType_GridSample__IMAGE__(); +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE +extern void ___OpenCLAttentionBufCreator__OpType_Attention__BUFFER__(); +#endif void registerOpenCLOps() { - ___OpenCLArgMaxBufCreator__OpType_ArgMax__BUFFER__(); - ___OpenCLArgMaxBufCreator__OpType_ArgMin__BUFFER__(); - ___OpenCLScaleCreator__OpType_Scale__IMAGE__(); - ___OpenCLScaleBufCreator__OpType_Scale__BUFFER__(); - ___OpenCLSelectBufCreator__OpType_Select__BUFFER__(); - ___OpenCLSoftmaxCreator__OpType_Softmax__IMAGE__(); - ___OpenCLSoftmaxBufCreator__OpType_Softmax__BUFFER__(); - ___OpenCLCastBufCreator__OpType_Cast__BUFFER__(); - ___OpenCLInterpCreator__OpType_Interp__IMAGE__(); - ___OpenCLInterpBufCreator__OpType_Interp__BUFFER__(); - ___OpenCLGridSampleCreator__OpType_GridSample__IMAGE__(); - ___OpenCLGridSampleBufCreator__OpType_GridSample__BUFFER__(); - ___OpenCLMatMulCreator__OpType_MatMul__IMAGE__(); - ___OpenCLMatMulBufCreator__OpType_MatMul__BUFFER__(); - ___OpenCLDeconvolutionCreator__OpType_Deconvolution__IMAGE__(); - ___OpenCLDeconvolutionBufCreator__OpType_Deconvolution__BUFFER__(); - ___OpenCLEltwiseCreator__OpType_BinaryOp__IMAGE__(); - ___OpenCLBinaryBufCreator__OpType_BinaryOp__BUFFER__(); - ___OpenCLEltwiseCreator__OpType_Eltwise__IMAGE__(); - ___OpenCLBinaryBufCreator__OpType_Eltwise__BUFFER__(); - ___OpenCLPoolCreator__OpType_Pooling__IMAGE__(); - ___OpenCLPoolBufCreator__OpType_Pooling__BUFFER__(); - ___OpenCLRoiPoolingCreator__OpType_ROIPooling__IMAGE__(); - ___OpenCLUnaryCreator__OpType_UnaryOp__IMAGE__(); - ___OpenCLUnaryCreator__OpType_Sigmoid__IMAGE__(); - ___OpenCLUnaryCreator__OpType_TanH__IMAGE__(); - ___OpenCLUnaryBufCreator__OpType_UnaryOp__BUFFER__(); - ___OpenCLUnaryBufCreator__OpType_Sigmoid__BUFFER__(); - ___OpenCLUnaryBufCreator__OpType_TanH__BUFFER__(); - ___OpenCLReductionCreator__OpType_Reduction__IMAGE__(); - ___OpenCLReductionBufCreator__OpType_Reduction__BUFFER__(); - ___OpenCLReluCreator__OpType_ReLU__IMAGE__(); - ___OpenCLReluCreator__OpType_PReLU__IMAGE__(); - ___OpenCLReluCreator__OpType_ReLU6__IMAGE__(); - ___OpenCLReluBufCreator__OpType_ReLU__BUFFER__(); - ___OpenCLReluBufCreator__OpType_PReLU__BUFFER__(); - ___OpenCLReluBufCreator__OpType_ReLU6__BUFFER__(); - ___OpenCLDepthwiseDeconvolutionCreator__OpType_DeconvolutionDepthwise__IMAGE__(); - ___OpenCLRasterCreator__OpType_Raster__IMAGE__(); - ___OpenCLRasterBufCreator__OpType_Raster__BUFFER__(); - ___OpenCLDepthwiseConvolutionCreator__OpType_ConvolutionDepthwise__IMAGE__(); - ___OpenCLDepthwiseConvolutionBufCreator__OpType_ConvolutionDepthwise__BUFFER__(); - ___OpenCLRangeBufCreator__OpType_Range__BUFFER__(); - ___OpenCLInterp3DCreator__OpType_Interp3D__IMAGE__(); - ___OpenCLInterp3DBufCreator__OpType_Interp3D__BUFFER__(); - ___OpenCLConvolutionCreator__OpType_Convolution__IMAGE__(); - ___OpenCLConvolutionBufCreator__OpType_Convolution__BUFFER__(); - ___OpenCLLayerNormCreator__OpType_LayerNorm__IMAGE__(); - ___OpenCLLayerNormBufCreator__OpType_LayerNorm__BUFFER__(); - ___OpenCLLoopCreator__OpType_While__IMAGE__(); - ___OpenCLLoopBufCreator__OpType_While__BUFFER__(); - ___OpenCLTrainableParamCreator__OpType_TrainableParam__IMAGE__(); - ___OpenCLFuseCreator__OpType_Extra__IMAGE__(); - ___OpenCLRangeCreator__OpType_Range__IMAGE__(); - ___OpenCLCastCreator__OpType_Cast__IMAGE__(); - ___OpenCLSelectCreator__OpType_Select__IMAGE__(); +___OpenCLInterp3DBufCreator__OpType_Interp3D__BUFFER__(); +___OpenCLReductionBufCreator__OpType_Reduction__BUFFER__(); +___OpenCLArgMaxBufCreator__OpType_ArgMax__BUFFER__(); +___OpenCLArgMaxBufCreator__OpType_ArgMin__BUFFER__(); +___OpenCLMatMulBufCreator__OpType_MatMul__BUFFER__(); +___OpenCLRasterBufCreator__OpType_Raster__BUFFER__(); +___OpenCLLayerNormBufCreator__OpType_LayerNorm__BUFFER__(); +___OpenCLDepthwiseConvolutionBufCreator__OpType_ConvolutionDepthwise__BUFFER__(); +___OpenCLInterpBufCreator__OpType_Interp__BUFFER__(); +___OpenCLBinaryBufCreator__OpType_Eltwise__BUFFER__(); +___OpenCLBinaryBufCreator__OpType_BinaryOp__BUFFER__(); +___OpenCLConvolutionBufCreator__OpType_Convolution__BUFFER__(); +___OpenCLSelectBufCreator__OpType_Select__BUFFER__(); +___OpenCLPoolBufCreator__OpType_Pooling__BUFFER__(); +___OpenCLDeconvolutionBufCreator__OpType_Deconvolution__BUFFER__(); +___OpenCLCastBufCreator__OpType_Cast__BUFFER__(); +___OpenCLReluBufCreator__OpType_ReLU__BUFFER__(); +___OpenCLReluBufCreator__OpType_PReLU__BUFFER__(); +___OpenCLReluBufCreator__OpType_ReLU6__BUFFER__(); +___OpenCLSoftmaxBufCreator__OpType_Softmax__BUFFER__(); +___OpenCLLoopBufCreator__OpType_While__BUFFER__(); +___OpenCLRangeBufCreator__OpType_Range__BUFFER__(); +___OpenCLUnaryBufCreator__OpType_UnaryOp__BUFFER__(); +___OpenCLUnaryBufCreator__OpType_Sigmoid__BUFFER__(); +___OpenCLUnaryBufCreator__OpType_TanH__BUFFER__(); +___OpenCLGridSampleBufCreator__OpType_GridSample__BUFFER__(); +___OpenCLScaleBufCreator__OpType_Scale__BUFFER__(); +___OpenCLDepthwiseConvolutionCreator__OpType_ConvolutionDepthwise__IMAGE__(); +___OpenCLMatMulCreator__OpType_MatMul__IMAGE__(); +___OpenCLUnaryCreator__OpType_UnaryOp__IMAGE__(); +___OpenCLUnaryCreator__OpType_Sigmoid__IMAGE__(); +___OpenCLUnaryCreator__OpType_TanH__IMAGE__(); +___OpenCLScaleCreator__OpType_Scale__IMAGE__(); +___OpenCLSoftmaxCreator__OpType_Softmax__IMAGE__(); +___OpenCLEltwiseCreator__OpType_Eltwise__IMAGE__(); +___OpenCLEltwiseCreator__OpType_BinaryOp__IMAGE__(); +___OpenCLRangeCreator__OpType_Range__IMAGE__(); +___OpenCLRasterCreator__OpType_Raster__IMAGE__(); +___OpenCLFuseCreator__OpType_Extra__IMAGE__(); +___OpenCLLoopCreator__OpType_While__IMAGE__(); +___OpenCLTrainableParamCreator__OpType_TrainableParam__IMAGE__(); +___OpenCLReluCreator__OpType_ReLU__IMAGE__(); +___OpenCLReluCreator__OpType_PReLU__IMAGE__(); +___OpenCLReluCreator__OpType_ReLU6__IMAGE__(); +___OpenCLConvolutionCreator__OpType_Convolution__IMAGE__(); +___OpenCLLayerNormCreator__OpType_LayerNorm__IMAGE__(); +___OpenCLReductionCreator__OpType_Reduction__IMAGE__(); +___OpenCLRoiPoolingCreator__OpType_ROIPooling__IMAGE__(); +___OpenCLPoolCreator__OpType_Pooling__IMAGE__(); +___OpenCLSelectCreator__OpType_Select__IMAGE__(); +___OpenCLDeconvolutionCreator__OpType_Deconvolution__IMAGE__(); +___OpenCLDepthwiseDeconvolutionCreator__OpType_DeconvolutionDepthwise__IMAGE__(); +___OpenCLInterp3DCreator__OpType_Interp3D__IMAGE__(); +___OpenCLCastCreator__OpType_Cast__IMAGE__(); +___OpenCLInterpCreator__OpType_Interp__IMAGE__(); +___OpenCLGridSampleCreator__OpType_GridSample__IMAGE__(); +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE +___OpenCLAttentionBufCreator__OpType_Attention__BUFFER__(); +#endif } } } diff --git a/source/backend/opencl/core/OpenCLRunningUtils.cpp b/source/backend/opencl/core/OpenCLRunningUtils.cpp index 28c87e3c1..bddba3fe4 100644 --- a/source/backend/opencl/core/OpenCLRunningUtils.cpp +++ b/source/backend/opencl/core/OpenCLRunningUtils.cpp @@ -548,9 +548,7 @@ void runKernel2D(const ::std::shared_ptr &kernelw, const std::vector void copyBufferToImage(OpenCLRuntime *runtime, const cl::Buffer &buffer, const cl::Image &image, int w, int h) { std::set buildOptions; - if(runtime->isWeightCpuTransHalf() == false) { - buildOptions.emplace("-DBUFFER_INP_FP32"); - } + buildOptions.emplace("-DBUFFER_INP_FP32"); auto kernelW = runtime->buildKernelWithCache("copy_buffer_to_image2d", "copy_buffer_to_image2d", buildOptions); auto kernel = kernelW->get(); auto status = kernel.setArg(0, buffer); diff --git a/source/backend/opencl/core/runtime/OpenCLRuntime.cpp b/source/backend/opencl/core/runtime/OpenCLRuntime.cpp index 99407c9bb..040993b23 100644 --- a/source/backend/opencl/core/runtime/OpenCLRuntime.cpp +++ b/source/backend/opencl/core/runtime/OpenCLRuntime.cpp @@ -230,9 +230,11 @@ OpenCLRuntime::OpenCLRuntime(const BackendConfig::PrecisionMode precision, const mFirstGPUDevicePtr->getInfo(CL_DEVICE_MAX_COMPUTE_UNITS, &mGPUComputeUnits); mFirstGPUDevicePtr->getInfo(CL_DEVICE_MAX_CLOCK_FREQUENCY, &mMaxFreq); mFirstGPUDevicePtr->getInfo(CL_DEVICE_MAX_MEM_ALLOC_SIZE, &mMaxMemAllocSize); - cl_device_fp_config fpConfig; + cl_device_fp_config fpConfig; auto success = mFirstGPUDevicePtr->getInfo(CL_DEVICE_HALF_FP_CONFIG, &fpConfig); mIsDeviceSupportedFP16 = CL_SUCCESS == success && fpConfig > 0; + bool checkFp16Exetension = getDeviceSupportsExtension(*(mFirstGPUDevicePtr.get()), "cl_khr_fp16"); + mIsDeviceSupportedFP16 = (mIsDeviceSupportedFP16 && checkFp16Exetension); //set gpu mode, tuning level and memory object setGpuMode(cl_mode); @@ -245,11 +247,17 @@ OpenCLRuntime::OpenCLRuntime(const BackendConfig::PrecisionMode precision, const } } - auto permitFloat16 = false; - if (precision == BackendConfig::Precision_Low || (mMemType == BUFFER && precision == BackendConfig::Precision_Normal)) {//buffer mode not support Normal Precision yet - permitFloat16 = true; + mPrecisionLevel = 1; + if (mIsDeviceSupportedFP16) { + if (precision == BackendConfig::Precision_Low) { + mPrecisionLevel = 2; + } else if (precision == BackendConfig::Precision_Normal && mMemType == BUFFER) { + mPrecisionLevel = 0; + } } - mIsSupportedFP16 = mIsDeviceSupportedFP16 && permitFloat16; + + // Is supported fp16 IO storage + mIsSupportedFP16 = (mPrecisionLevel == 2 || mPrecisionLevel == 0); if(getDeviceSupportsExtension(*(mFirstGPUDevicePtr.get()), "cl_arm_integer_dot_product_int8")){ mSupportDotInt8 = true; @@ -257,7 +265,7 @@ OpenCLRuntime::OpenCLRuntime(const BackendConfig::PrecisionMode precision, const if(getDeviceSupportsExtension(*(mFirstGPUDevicePtr.get()), "cl_arm_integer_dot_product_accumulate_int8")){ mSupportDotAccInt8 = true; } - + #if !defined(ENABLE_OPENCL_TIME_PROFILER) && defined(MNN_USE_LIB_WRAPPER) { if((false == OpenCLSymbolsOperator::getOpenclSymbolsPtr()->isQcomError()) @@ -267,7 +275,7 @@ OpenCLRuntime::OpenCLRuntime(const BackendConfig::PrecisionMode precision, const cl_int err; if(MaxRecordableQueueSize > 0){ // TODO: Use setSessionHint to set the number of mUseRecordableQueueSize - mUseRecordableQueueSize = 10; + mUseRecordableQueueSize = MaxRecordableQueueSize; mUseRecordableQueueSize = MaxRecordableQueueSize < mUseRecordableQueueSize ? MaxRecordableQueueSize : mUseRecordableQueueSize; mUseRecordQueue = true; mRecordableQueuePtr = std::make_shared(*mContext, *mFirstGPUDevicePtr, CL_QUEUE_RECORDABLE_QCOM, &err); @@ -435,13 +443,6 @@ std::vector OpenCLRuntime::getMaxImage2DSize() { bool OpenCLRuntime::isSupportedFP16() const { return mIsSupportedFP16; } -bool OpenCLRuntime::isWeightCpuTransHalf() const { -#ifdef USE_HALF_WEIGHT_MEMORY - return mIsSupportedFP16; -#else - return false;//most of time -#endif -} bool OpenCLRuntime::isDeviceSupportedFP16() const { return mIsDeviceSupportedFP16; @@ -536,10 +537,12 @@ std::shared_ptr OpenCLRuntime::buildKernel(const std::string &progra std::shared_ptr OpenCLRuntime::buildKernelWithCache(const std::string &programName, const std::string &kernelName, const std::set &buildOptions, const Tensor *input, const Tensor *output, bool useCache) { std::string buildOptionsStr; - if (mIsSupportedFP16) { - buildOptionsStr = "-DFLOAT=half -DFLOAT2=half2 -DFLOAT3=half3 -DFLOAT4=half4 -DFLOAT8=half8 -DFLOAT16=half16 -DRI_F=read_imageh -DWI_F=write_imageh -DCONVERT_FLOAT4=convert_half4 -DCONVERT_FLOAT8=convert_half8 -DCONVERT_FLOAT16=convert_half16 -DMNN_SUPPORT_FP16"; - } else { - buildOptionsStr = "-DFLOAT=float -DFLOAT2=float2 -DFLOAT3=float3 -DFLOAT4=float4 -DFLOAT8=float8 -DRI_F=read_imagef -DFLOAT16=float16 -DWI_F=write_imagef -DCONVERT_FLOAT4=convert_float4 -DCONVERT_FLOAT8=convert_float8 -DCONVERT_FLOAT16=convert_float16"; + if (mPrecisionLevel == 2) {// Fp16 Memory and fp16 compute + buildOptionsStr = "-DFLOAT=half -DFLOAT2=half2 -DFLOAT3=half3 -DFLOAT4=half4 -DFLOAT8=half8 -DFLOAT16=half16 -DCOMPUTE_FLOAT=half -DCOMPUTE_FLOAT2=half2 -DCOMPUTE_FLOAT3=half3 -DCOMPUTE_FLOAT4=half4 -DCOMPUTE_FLOAT8=half8 -DCOMPUTE_FLOAT16=half16 -DCONVERT_COMPUTE_FLOAT2=convert_half2 -DCONVERT_COMPUTE_FLOAT4=convert_half4 -DCONVERT_COMPUTE_FLOAT8=convert_half8 -DCONVERT_COMPUTE_FLOAT16=convert_half16 -DRI_F=read_imageh -DWI_F=write_imageh -DCONVERT_FLOAT2=convert_half2 -DCONVERT_FLOAT4=convert_half4 -DCONVERT_FLOAT8=convert_half8 -DCONVERT_FLOAT16=convert_half16 -DMNN_SUPPORT_FP16"; + } else if (mPrecisionLevel == 0) {// Fp16 Memory and fp32 compute + buildOptionsStr = "-DFLOAT=half -DFLOAT2=half2 -DFLOAT3=half3 -DFLOAT4=half4 -DFLOAT8=half8 -DFLOAT16=half16 -DCOMPUTE_FLOAT=float -DCOMPUTE_FLOAT2=float2 -DCOMPUTE_FLOAT3=float3 -DCOMPUTE_FLOAT4=float4 -DCOMPUTE_FLOAT8=float8 -DCOMPUTE_FLOAT16=float16 -DCONVERT_COMPUTE_FLOAT2=convert_float2 -DCONVERT_COMPUTE_FLOAT4=convert_float4 -DCONVERT_COMPUTE_FLOAT8=convert_float8 -DCONVERT_COMPUTE_FLOAT16=convert_float16 -DCONVERT_FLOAT2=convert_half2 -DCONVERT_FLOAT4=convert_half4 -DCONVERT_FLOAT8=convert_half8 -DCONVERT_FLOAT16=convert_half16 -DRI_F=read_imageh -DWI_F=write_imageh -DMNN_SUPPORT_FP16"; + } else {// Fp32 Memory and fp32 compute + buildOptionsStr = "-DFLOAT=float -DFLOAT2=float2 -DFLOAT3=float3 -DFLOAT4=float4 -DFLOAT8=float8 -DFLOAT16=float16 -DCOMPUTE_FLOAT=float -DCOMPUTE_FLOAT2=float2 -DCOMPUTE_FLOAT3=float3 -DCOMPUTE_FLOAT4=float4 -DCOMPUTE_FLOAT8=float8 -DCOMPUTE_FLOAT16=float16 -DCONVERT_COMPUTE_FLOAT2=convert_float2 -DCONVERT_COMPUTE_FLOAT4=convert_float4 -DCONVERT_COMPUTE_FLOAT8=convert_float8 -DCONVERT_COMPUTE_FLOAT16=convert_float16 -DRI_F=read_imagef -DFLOAT16=float16 -DWI_F=write_imagef -DCONVERT_FLOAT2=convert_float2 -DCONVERT_FLOAT4=convert_float4 -DCONVERT_FLOAT8=convert_float8 -DCONVERT_FLOAT16=convert_float16"; } if(nullptr != input){ @@ -907,6 +910,7 @@ void OpenCLRuntime::printEventTime(){ return; } int raster_num = 0, raster_time = 0; + unsigned int conv_time = 0, while_time = 0; for(int i = 0; i < mEvents.size(); ++i){ auto event = &mEvents[i].second; cl_int res = event->wait(); @@ -915,10 +919,16 @@ void OpenCLRuntime::printEventTime(){ auto StopNanos = event->getProfilingInfo(); auto kernel_time = (unsigned int)((StopNanos - StartNanos) / 1000.0); mKernelTime += kernel_time; + if(mEvents[i].first == "ConvBuf2D" || (mEvents[i].first.length() >= 11 && mEvents[i].first.substr(0, 11) == "Convolution")) { + conv_time += kernel_time; + } + if((mEvents[i].first.length() >= 5 && mEvents[i].first.substr(0, 5) == "While")) { + while_time += kernel_time; + } MNN_PRINT("kernel time = %d us %s\n", kernel_time, mEvents[i].first.c_str()); } mEvents.clear(); - MNN_PRINT("total kernel time = %d us\n", mKernelTime); + MNN_PRINT("total kernel time = %d us, conv time = %d us, while time = %d us\n", mKernelTime, conv_time, while_time); #endif } } // namespace MNN diff --git a/source/backend/opencl/core/runtime/OpenCLRuntime.hpp b/source/backend/opencl/core/runtime/OpenCLRuntime.hpp index ea7085db9..3e208e806 100644 --- a/source/backend/opencl/core/runtime/OpenCLRuntime.hpp +++ b/source/backend/opencl/core/runtime/OpenCLRuntime.hpp @@ -74,7 +74,6 @@ class OpenCLRuntime { OpenCLRuntime &operator=(const OpenCLRuntime &) = delete; bool isSupportedFP16() const; - bool isWeightCpuTransHalf() const; bool isDeviceSupportedFP16() const; bool isDeviceSupportedLowPower() const; bool isSupportedDotInt8() const; @@ -197,7 +196,9 @@ class OpenCLRuntime { uint32_t mUseRecordableQueueSize; bool mUseRecordQueue = false; bool mDevideOpRecord = true; - bool mIsSupportedFP16 = false; + int mPrecisionLevel; + + bool mIsSupportedFP16 = false; bool mIsDeviceSupportedFP16 = false; bool mIsDeviceSupportedLowPower = false; bool mSupportDotInt8 = false; diff --git a/source/backend/opencl/core/runtime/OpenCLWrapper.cpp b/source/backend/opencl/core/runtime/OpenCLWrapper.cpp index 62cda7e4e..deaf9b627 100644 --- a/source/backend/opencl/core/runtime/OpenCLWrapper.cpp +++ b/source/backend/opencl/core/runtime/OpenCLWrapper.cpp @@ -33,6 +33,14 @@ bool OpenCLSymbols::LoadOpenCLLibrary() { "libGLES_mali.so", "libmali.so", "libOpenCL-pixel.so", + /* + #elif defined(__OHOS__) + "/vendor/lib64/chipsetsdk/libGLES_mali.so", + "/system/lib64/libGLES_mali.so", + "libGLES_mali.so", + "/vendor/lib64/chipsetsdk/libhvgr_v200.so", + "/vendor/lib64/chipsetsdk/libEGI_imp1.so", + */ #if defined(__aarch64__) // Qualcomm Adreno "/system/vendor/lib64/libOpenCL.so", @@ -110,7 +118,7 @@ bool OpenCLSymbols::isSvmError() { bool OpenCLSymbols::isPropError() { return mPropError; } - + bool OpenCLSymbols::isQcomError() { return mQcomError; } @@ -118,11 +126,11 @@ bool OpenCLSymbols::isQcomError() { bool OpenCLSymbols::isGlError() { return mGlError; } - + bool OpenCLSymbols::isCL1_2Error() { return mCL_12Error; } - + bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { #if defined(WIN32) handle_ = LoadLibraryA(library_path.c_str()); @@ -133,38 +141,38 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mIsError = true; \ } - + #define MNN_LOAD_SVM_PTR(func_name) func_name = reinterpret_cast(GetProcAddress(handle_, #func_name)); \ if(func_name == nullptr){ \ mSvmError = true; \ } - + #define MNN_LOAD_PROP_PTR(func_name) func_name = reinterpret_cast(GetProcAddress(handle_, #func_name)); \ if(func_name == nullptr){ \ mPropError = true; \ } - + #define MNN_LOAD_QCOM_PTR(func_name) func_name = reinterpret_cast(GetProcAddress(handle_, #func_name)); \ if(func_name == nullptr){ \ mQcomError = true; \ } - + #define MNN_LOAD_CL_12_PTR(func_name) func_name = reinterpret_cast(GetProcAddress(handle_, #func_name)); \ if(func_name == nullptr){ \ mCL_12Error = true; \ } - + #define MNN_LOAD_GL_PTR(func_name) func_name = reinterpret_cast(GetProcAddress(handle_, #func_name)); \ if(func_name == nullptr){ \ mGlError = true; \ } - + #else handle_ = dlopen(library_path.c_str(), RTLD_NOW | RTLD_LOCAL); if (handle_ == nullptr) { return false; } - + typedef void* (*loadOpenCLPointerFunc)(const char* name); typedef void (*enableOpenCLFunc)(); loadOpenCLPointerFunc loadOpenCLPointer = nullptr; @@ -180,7 +188,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mIsError = true; \ } - + #define MNN_LOAD_SVM_PTR(func_name) func_name = reinterpret_cast(dlsym(handle_, #func_name)); \ if(func_name == nullptr && loadOpenCLPointer != nullptr){ \ func_name = reinterpret_cast(loadOpenCLPointer(#func_name)); \ @@ -188,7 +196,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mSvmError = true; \ } - + #define MNN_LOAD_PROP_PTR(func_name) func_name = reinterpret_cast(dlsym(handle_, #func_name)); \ if(func_name == nullptr && loadOpenCLPointer != nullptr){ \ func_name = reinterpret_cast(loadOpenCLPointer(#func_name)); \ @@ -196,7 +204,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mPropError = true; \ } - + #define MNN_LOAD_QCOM_PTR(func_name) func_name = reinterpret_cast(dlsym(handle_, #func_name)); \ if(func_name == nullptr && loadOpenCLPointer != nullptr){ \ func_name = reinterpret_cast(loadOpenCLPointer(#func_name)); \ @@ -204,7 +212,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mQcomError = true; \ } - + #define MNN_LOAD_CL_12_PTR(func_name) func_name = reinterpret_cast(dlsym(handle_, #func_name)); \ if(func_name == nullptr && loadOpenCLPointer != nullptr){ \ func_name = reinterpret_cast(loadOpenCLPointer(#func_name)); \ @@ -212,7 +220,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mCL_12Error = true; \ } - + #define MNN_LOAD_GL_PTR(func_name) func_name = reinterpret_cast(dlsym(handle_, #func_name)); \ if(func_name == nullptr && loadOpenCLPointer != nullptr){ \ func_name = reinterpret_cast(loadOpenCLPointer(#func_name)); \ @@ -220,7 +228,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { if(func_name == nullptr){ \ mGlError = true; \ } - + #endif MNN_LOAD_FUNCTION_PTR(clGetPlatformIDs); @@ -277,7 +285,7 @@ bool OpenCLSymbols::LoadLibraryFromPath(const std::string &library_path) { MNN_LOAD_CL_12_PTR(clCreateImage); MNN_LOAD_CL_12_PTR(clRetainDevice); MNN_LOAD_CL_12_PTR(clReleaseDevice); - + MNN_LOAD_PROP_PTR(clCreateCommandQueueWithProperties); MNN_LOAD_SVM_PTR(clSVMAlloc); MNN_LOAD_SVM_PTR(clSVMFree); @@ -707,7 +715,7 @@ cl_mem CL_API_CALL clCreateFromGLTexture(cl_context context, auto func = MNN::OpenCLSymbolsOperator::getOpenclSymbolsPtr()->clCreateFromGLTexture; MNN_CHECK_NOTNULL(func); return func(context, flags, target, miplevel, texture, errcode_ret); - + } cl_int CL_API_CALL clEnqueueAcquireGLObjects(cl_command_queue command_queue, diff --git a/source/backend/opencl/execution/buffer/AttentionBufExecution.cpp b/source/backend/opencl/execution/buffer/AttentionBufExecution.cpp new file mode 100644 index 000000000..6006882fd --- /dev/null +++ b/source/backend/opencl/execution/buffer/AttentionBufExecution.cpp @@ -0,0 +1,427 @@ +// +// SoftmaxBufExecution.cpp +// MNN +// +// Created by MNN on 2024/04/11. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef MNN_OPENCL_BUFFER_CLOSED + +#include "backend/opencl/execution/buffer/AttentionBufExecution.hpp" + +namespace MNN { +namespace OpenCL { + +AttentionBufImpl::AttentionBufImpl(const MNN::Op *op, Backend *backend, bool kv_cahce) + : mKVCache(kv_cahce){ + mOpenCLBackend = static_cast(backend); + auto kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("softmax_buf", "softmax_channel", {"-DSOFTMAX_LOCAL_SIZE=512"}); + mMaxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel)); +} + +void AttentionBufImpl::allocKVCache() { + if (!mKVCache || mPastLength < mMaxLength) { + return; + } + mMaxLength = mPastLength + mExpandChunk; + int byte = 4; + if(mOpenCLBackend->getOpenCLRuntime()->isSupportedFP16()){ + byte = 2; + } + size_t buffer_size = UP_DIV(mMaxLength, 4) * mNumHead * mHeadDim * 4 * byte; + // past_key: [1, numhead, headdim, maxlen] + mPastKey.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + // past_value: [1, numhead, maxlen, headdim] + mPastValue.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); +} + +void AttentionBufImpl::reallocKVCache() { + if (!mKVCache || mPastLength < mMaxLength) { + return; + } + int byte = 4; + if(mOpenCLBackend->getOpenCLRuntime()->isSupportedFP16()){ + byte = 2; + } + size_t old_size = mNumHead * UP_DIV(mMaxLength, 4) * mHeadDim * 4 * byte; + mMaxLength = mPastLength + mExpandChunk; + size_t buffer_size = UP_DIV(mMaxLength, 4) * mNumHead * mHeadDim * 4 * byte; + // past_key: [1, numhead, headdim, maxlen] + auto new_key = new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); + // past_value: [1, numhead, maxlen, headdim] + auto new_value = new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); + // copy + cl_int res; + auto new_key_ptr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*new_key, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + auto key_ptr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*mPastKey.get(), true, CL_MAP_READ, 0, old_size, nullptr, nullptr, &res); + if(new_key_ptr != nullptr && key_ptr != nullptr && res == CL_SUCCESS){ + ::memcpy(new_key_ptr, key_ptr, old_size); + }else{ + MNN_ERROR("Map error key_ptr == nullptr \n"); + MNN_ASSERT(false); + } + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*new_key, new_key_ptr); + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*mPastKey.get(), key_ptr); + + auto new_value_ptr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*new_value, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + auto value_ptr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*mPastValue.get(), true, CL_MAP_READ, 0, old_size, nullptr, nullptr, &res); + if(new_value_ptr != nullptr && value_ptr != nullptr && res == CL_SUCCESS){ + ::memcpy(new_value_ptr, value_ptr, old_size); + }else{ + MNN_ERROR("Map error value_ptr == nullptr \n"); + MNN_ASSERT(false); + } + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*new_value, new_value_ptr); + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*mPastValue.get(), value_ptr); + + mPastKey.reset(new_key); + mPastValue.reset(new_value); + size_t temp_size = UP_DIV(mMaxLength, 4) * mNumHead * 4 * byte; + mTempQK.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, temp_size)); + mTempSoftMax.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, temp_size)); + + // reset memory for args + if(mOpenCLBackend->isUseRecordQueue()){ + mQkUpdateInfo.update_kernel_args[1].arg_value = &(*(mTempQK.get()))(); + mQkUpdateInfo.update_kernel_args[2].arg_value = &(*(mPastKey.get()))(); + mSoftMaxUpdateInfo.update_kernel_args[0].arg_value = &(*(mTempQK.get()))(); + mSoftMaxUpdateInfo.update_kernel_args[1].arg_value = &(*(mTempSoftMax.get()))(); + mQkvUpdateInfo.update_kernel_args[0].arg_value = &(*(mTempSoftMax.get()))(); + mQkvUpdateInfo.update_kernel_args[1].arg_value = &(*(mPastValue.get()))(); + }else{ + cl_int ret = CL_SUCCESS; + ret |= mKernel_qk->get().setArg(5, *mTempQK.get()); + ret |= mKernel_qk->get().setArg(6, *mPastKey.get()); + ret |= mKernel_softmax->get().setArg(3, *mTempQK.get()); + ret |= mKernel_softmax->get().setArg(4, *mTempSoftMax.get()); + ret |= mKernel_qkv->get().setArg(3, *mTempSoftMax.get()); + ret |= mKernel_qkv->get().setArg(6, *mPastValue.get()); + MNN_CHECK_CL_SUCCESS(ret, "reset memory arg for AttentionBufExecution"); + } +} + +int AttentionBufImpl::getLocalSize(int size, int maxGroupSize){ + int local_size = 1; + while(local_size * 2 <= maxGroupSize && local_size * 2 <= size){ + local_size *= 2; + } + return local_size; +} + +ErrorCode AttentionBufImpl::onResize(Backend *backend, const std::vector &inputs, const std::vector &outputs) { + mOpenCLBackend = static_cast(backend); + mOpenCLBackend->startRecord(mRecording); + //clear update arg vector, if prefill and decode use the same one + mOpRecordUpdateInfo.clear(); + mQkUpdateInfo.update_kernel_args.clear(); + mQkUpdateInfo.update_global_size.clear(); + mQkUpdateInfo.update_local_size.clear(); + mSoftMaxUpdateInfo.update_kernel_args.clear(); + mSoftMaxUpdateInfo.update_global_size.clear(); + mSoftMaxUpdateInfo.update_local_size.clear(); + mQkvUpdateInfo.update_kernel_args.clear(); + mQkvUpdateInfo.update_global_size.clear(); + mQkvUpdateInfo.update_local_size.clear(); + + auto query = inputs[0]; + auto key = inputs[1]; + auto value = inputs[2]; + auto mask = inputs[3]; + auto runtime = mOpenCLBackend->getOpenCLRuntime(); + auto shape = query->shape(); + + int seq_len = shape[1]; + mNumHead = shape[2]; + mHeadDim = shape[3]; + mScale = 1.0 / sqrt(mHeadDim); + mIsDecode = seq_len == 1; + mIsFirstDecode = true; + if (mPastLength == 0 || seq_len > 1) { + mPastLength = seq_len; + } + mKv_seq_len = mPastLength; + if(mIsDecode){ + mKv_seq_len = mPastLength + 1; + } + + allocKVCache(); + int byte = 4; + if(mOpenCLBackend->getOpenCLRuntime()->isSupportedFP16()){ + byte = 2; + } + if (mIsDecode) { + size_t buffer_size = UP_DIV(mMaxLength, 4) * mNumHead * 4 * byte; + mTempQK.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + mTempSoftMax.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + } else { + size_t buffer_size = UP_DIV(mPastLength, 4) * mPastLength * mNumHead * 4 * byte; + mTempQK.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + mTempSoftMax.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + } + + // query * key -> div -> select + { + std::set buildOption; + if(!mIsDecode){ + buildOption.emplace("-DOPENCL_PREFILL_ATTENTION"); + } + if((mHeadDim % 4) != 0){ + buildOption.emplace("-DHEADDIM_LEAVE"); + } + mKernel_qk = runtime->buildKernel("attention_buf", "matmul_qk_div_mask", buildOption, inputs[0], outputs[0]); + mGlobalWorkSizeQk = {static_cast(UP_DIV(seq_len, 4)), static_cast(mNumHead), static_cast(UP_DIV(mKv_seq_len, 4))}; + auto maxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel_qk)); + mGlobalWorkSizeQk2 = UP_DIV(mKv_seq_len, 4); + + uint32_t index = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel_qk->get().setArg(index++, mGlobalWorkSizeQk[0]); + ret |= mKernel_qk->get().setArg(index++, mGlobalWorkSizeQk[1]); + ret |= mKernel_qk->get().setArg(index++, mGlobalWorkSizeQk2); + ret |= mKernel_qk->get().setArg(index++, openCLBuffer(query)); + ret |= mKernel_qk->get().setArg(index++, openCLBuffer(key)); + ret |= mKernel_qk->get().setArg(index++, *mTempQK.get()); + ret |= mKernel_qk->get().setArg(index++, *mPastKey.get()); + ret |= mKernel_qk->get().setArg(index++, openCLBuffer(mask)); + ret |= mKernel_qk->get().setArg(index++, mScale); + ret |= mKernel_qk->get().setArg(index++, seq_len); + ret |= mKernel_qk->get().setArg(index++, mKv_seq_len); + ret |= mKernel_qk->get().setArg(index++, mNumHead); + ret |= mKernel_qk->get().setArg(index++, mHeadDim); + MNN_CHECK_CL_SUCCESS(ret, "setArg matmul_qk_div_mask"); + + mLocalWorkSizeQk = localWS3DDefault(mGlobalWorkSizeQk, maxWorkGroupSize, runtime, "matmul_qk_div_mask", mKernel_qk).first; + mGlobalWorkSizeQk[0] = ROUND_UP(mGlobalWorkSizeQk[0], std::max((uint32_t)1, mLocalWorkSizeQk[0])); + mGlobalWorkSizeQk[1] = ROUND_UP(mGlobalWorkSizeQk[1], std::max((uint32_t)1, mLocalWorkSizeQk[1])); + mGlobalWorkSizeQk[2] = ROUND_UP(mGlobalWorkSizeQk[2], std::max((uint32_t)1, mLocalWorkSizeQk[2])); + mQkUpdateInfo.update_kernel_args.push_back({0, 2, sizeof(mGlobalWorkSizeQk2), &mGlobalWorkSizeQk2}); + mQkUpdateInfo.update_kernel_args.push_back({0, 5, sizeof(cl_mem), &(*(mTempQK.get()))()}); + mQkUpdateInfo.update_kernel_args.push_back({0, 6, sizeof(cl_mem), &(*(mPastKey.get()))()}); + mQkUpdateInfo.update_kernel_args.push_back({0, 10, sizeof(mKv_seq_len), &mKv_seq_len}); + mQkGlobal_size[0] = mGlobalWorkSizeQk[0]; + mQkGlobal_size[1] = mGlobalWorkSizeQk[1]; + mQkGlobal_size[2] = mGlobalWorkSizeQk[2]; + mQkUpdateInfo.update_global_size.push_back({0, mQkGlobal_size}); + mOpRecordUpdateInfo.emplace_back(&mQkUpdateInfo); + mOpenCLBackend->recordKernel3d(mKernel_qk, mGlobalWorkSizeQk, mLocalWorkSizeQk, &mQkUpdateInfo); + } + + // softmax + { + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); + int localSize = getLocalSize(mKv_seq_len, MaxLocalSize); + if(localSize < 4){ + localSize = 1; + } + int past_len4 = UP_DIV(mKv_seq_len, 4); + mSoftMaxRemainChannels = past_len4 * 4 - mKv_seq_len; + mSoftmaxShape[0] = mNumHead; + mSoftmaxShape[1] = past_len4; + mSoftmaxShape[2] = 1; + mSoftmaxShape[3] = mPastLength; + std::set buildOption; + buildOption.emplace("-DSOFTMAX_LOCAL_SIZE=" + std::to_string(localSize)); + if(!mIsDecode){ + mKernel_softmax = runtime->buildKernel("softmax_buf", "softmax_width", buildOption, inputs[0], outputs[0]); + mGlobalWorkSizeSoftMax = {static_cast(localSize), static_cast(past_len4), static_cast(mNumHead)}; + } else{ + mKernel_softmax = runtime->buildKernel("softmax_buf", "softmax_channel", buildOption, inputs[0], outputs[0]); + mSoftmaxShape[3] = 1; + mGlobalWorkSizeSoftMax = {static_cast(localSize), static_cast(1), static_cast(mNumHead)}; + } + auto maxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel_softmax)); + + uint32_t index = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel_softmax->get().setArg(index++, mGlobalWorkSizeSoftMax[0]); + ret |= mKernel_softmax->get().setArg(index++, mGlobalWorkSizeSoftMax[1]); + ret |= mKernel_softmax->get().setArg(index++, mGlobalWorkSizeSoftMax[2]); + ret |= mKernel_softmax->get().setArg(index++, *mTempQK.get()); + ret |= mKernel_softmax->get().setArg(index++, *mTempSoftMax.get()); + ret |= mKernel_softmax->get().setArg(index++, mSoftMaxRemainChannels); + ret |= mKernel_softmax->get().setArg(index++, mSoftmaxShape); + MNN_CHECK_CL_SUCCESS(ret, "setArg softmax"); + + mLocalWorkSizeSoftMax = {static_cast(localSize), 1, 1}; + if(localSize == 1){ + mLocalWorkSizeSoftMax = localWS3DDefault(mGlobalWorkSizeSoftMax, maxWorkGroupSize, runtime, "softmax", mKernel_softmax).first; + } + mGlobalWorkSizeSoftMax[0] = ROUND_UP(mGlobalWorkSizeSoftMax[0], std::max((uint32_t)1, mLocalWorkSizeSoftMax[0])); + mGlobalWorkSizeSoftMax[1] = ROUND_UP(mGlobalWorkSizeSoftMax[1], std::max((uint32_t)1, mLocalWorkSizeSoftMax[1])); + mGlobalWorkSizeSoftMax[2] = ROUND_UP(mGlobalWorkSizeSoftMax[2], std::max((uint32_t)1, mLocalWorkSizeSoftMax[2])); + mSoftMaxUpdateInfo.update_kernel_args.push_back({0, 3, sizeof(cl_mem), &(*(mTempQK.get()))()}); + mSoftMaxUpdateInfo.update_kernel_args.push_back({0, 4, sizeof(cl_mem), &(*(mTempSoftMax.get()))()}); + mSoftMaxUpdateInfo.update_kernel_args.push_back({0, 5, sizeof(mSoftMaxRemainChannels), &mSoftMaxRemainChannels}); + mSoftMaxUpdateInfo.update_kernel_args.push_back({0, 6, sizeof(mSoftmaxShape), &mSoftmaxShape}); + mOpRecordUpdateInfo.emplace_back(&mSoftMaxUpdateInfo); + mOpenCLBackend->recordKernel3d(mKernel_softmax, mGlobalWorkSizeSoftMax, mLocalWorkSizeSoftMax, &mSoftMaxUpdateInfo); + } + + // qk * value + { + std::set buildOption; + if(!mIsDecode){ + buildOption.emplace("-DOPENCL_PREFILL_ATTENTION"); + } + if((mHeadDim % 4) != 0){ + buildOption.emplace("-DHEADDIM_LEAVE"); + } + mKernel_qkv = runtime->buildKernel("attention_buf", "matmul_qkv", buildOption, inputs[0], outputs[0]); + auto maxWorkGroupSize = static_cast(runtime->getMaxWorkGroupSize(mKernel_qkv)); + mGlobalWorkSizeQkv = {static_cast(UP_DIV(seq_len, 4)), static_cast(mNumHead), static_cast(mHeadDim)}; + if(mIsDecode){ + mGlobalWorkSizeQkv = {static_cast(1), static_cast(mNumHead), static_cast(UP_DIV(mHeadDim, 4))}; + } + + uint32_t index = 0; + cl_int ret = CL_SUCCESS; + ret |= mKernel_qkv->get().setArg(index++, mGlobalWorkSizeQkv[0]); + ret |= mKernel_qkv->get().setArg(index++, mGlobalWorkSizeQkv[1]); + ret |= mKernel_qkv->get().setArg(index++, mGlobalWorkSizeQkv[2]); + ret |= mKernel_qkv->get().setArg(index++, *mTempSoftMax.get()); + ret |= mKernel_qkv->get().setArg(index++, openCLBuffer(value)); + ret |= mKernel_qkv->get().setArg(index++, openCLBuffer(outputs[0])); + ret |= mKernel_qkv->get().setArg(index++, *mPastValue.get()); + ret |= mKernel_qkv->get().setArg(index++, seq_len); + ret |= mKernel_qkv->get().setArg(index++, mKv_seq_len); + ret |= mKernel_qkv->get().setArg(index++, mNumHead); + ret |= mKernel_qkv->get().setArg(index++, mHeadDim); + MNN_CHECK_CL_SUCCESS(ret, "setArg matmul_qkv"); + + mLocalWorkSizeQkv = localWS3DDefault(mGlobalWorkSizeQkv, maxWorkGroupSize, runtime, "matmul_qkv", mKernel_qkv).first; + mGlobalWorkSizeQkv[0] = ROUND_UP(mGlobalWorkSizeQkv[0], std::max((uint32_t)1, mLocalWorkSizeQkv[0])); + mGlobalWorkSizeQkv[1] = ROUND_UP(mGlobalWorkSizeQkv[1], std::max((uint32_t)1, mLocalWorkSizeQkv[1])); + mGlobalWorkSizeQkv[2] = ROUND_UP(mGlobalWorkSizeQkv[2], std::max((uint32_t)1, mLocalWorkSizeQkv[2])); + + mQkvUpdateInfo.update_kernel_args.push_back({0, 3, sizeof(cl_mem), &(*(mTempSoftMax.get()))()}); + mQkvUpdateInfo.update_kernel_args.push_back({0, 6, sizeof(cl_mem), &(*(mPastValue.get()))()}); + mQkvUpdateInfo.update_kernel_args.push_back({0, 8, sizeof(mKv_seq_len), &mKv_seq_len}); + mOpRecordUpdateInfo.emplace_back(&mQkvUpdateInfo); + mOpenCLBackend->recordKernel3d(mKernel_qkv, mGlobalWorkSizeQkv, mLocalWorkSizeQkv, &mQkvUpdateInfo); + } + + mOpenCLBackend->endRecord(mRecording); + return NO_ERROR; +} + +ErrorCode AttentionBufImpl::onExecute(Backend *backend, const std::vector &inputs, const std::vector &outputs) { +#ifdef LOG_VERBOSE + MNN_PRINT("start AttentionBufExecution onExecute !\n"); +#endif + mOpenCLBackend = static_cast(backend); + reallocKVCache(); +#ifdef ENABLE_OPENCL_TIME_PROFILER + { + cl::Event event; + run3DKernelDefault(mKernel_qk, mGlobalWorkSizeQk, mLocalWorkSizeQk, + mOpenCLBackend->getOpenCLRuntime(), &event); + + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"matmul_qk_div_mask", event}); + } + { + cl::Event event; + run3DKernelDefault(mKernel_softmax, mGlobalWorkSizeSoftMax, mLocalWorkSizeSoftMax, + mOpenCLBackend->getOpenCLRuntime(), &event); + + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"softmax", event}); + } + { + cl::Event event; + run3DKernelDefault(mKernel_qkv, mGlobalWorkSizeQkv, mLocalWorkSizeQkv, + mOpenCLBackend->getOpenCLRuntime(), &event); + + mOpenCLBackend->getOpenCLRuntime()->pushEvent({"matmul_qkv", event}); + } +#else + if(mOpenCLBackend->isUseRecordQueue()){ + mOpenCLBackend->addRecord(mRecording, mOpRecordUpdateInfo); + if(mIsDecode){ + if(mIsFirstDecode){ + mIsFirstDecode = false; + }else{ + mPastLength += 1; + mKv_seq_len = mPastLength + 1; + int past_len4 = UP_DIV(mKv_seq_len, 4); + mSoftMaxRemainChannels = past_len4 * 4 - mKv_seq_len; + mSoftmaxShape[1] = past_len4; + mGlobalWorkSizeQk2 = past_len4; + mQkGlobal_size[2] = ROUND_UP(mGlobalWorkSizeQk2, std::max((uint32_t)1, mLocalWorkSizeQk[2])); + } + } +#ifdef LOG_VERBOSE + MNN_PRINT("End AttentionBufExecution onExecute... \n"); +#endif + return NO_ERROR; + } + run3DKernelDefault(mKernel_qk, mGlobalWorkSizeQk, mLocalWorkSizeQk, mOpenCLBackend->getOpenCLRuntime()); + run3DKernelDefault(mKernel_softmax, mGlobalWorkSizeSoftMax, mLocalWorkSizeSoftMax, mOpenCLBackend->getOpenCLRuntime()); + run3DKernelDefault(mKernel_qkv, mGlobalWorkSizeQkv, mLocalWorkSizeQkv, mOpenCLBackend->getOpenCLRuntime()); +#endif + + // decode + if(mIsDecode){ + mPastLength += 1; + mKv_seq_len = mPastLength + 1; + int past_len4 = UP_DIV(mKv_seq_len, 4); + mSoftMaxRemainChannels = past_len4 * 4 - mKv_seq_len; + mSoftmaxShape[1] = past_len4; + cl_int ret = CL_SUCCESS; + mGlobalWorkSizeQk2 = past_len4; + mGlobalWorkSizeQk[2] = ROUND_UP(mGlobalWorkSizeQk2, std::max((uint32_t)1, mLocalWorkSizeQk[2])); + ret |= mKernel_qk->get().setArg(2, mGlobalWorkSizeQk2); + ret |= mKernel_qk->get().setArg(10, mKv_seq_len); + ret |= mKernel_softmax->get().setArg(5, mSoftMaxRemainChannels); + ret |= mKernel_softmax->get().setArg(6, mSoftmaxShape); + ret |= mKernel_qkv->get().setArg(8, mKv_seq_len); + MNN_CHECK_CL_SUCCESS(ret, "reset arg for AttentionBufExecution"); + } +#ifdef LOG_VERBOSE + MNN_PRINT("end AttentionBufExecution onExecute !\n"); +#endif + + return NO_ERROR; +} + +AttentionBufExecution::AttentionBufExecution(const MNN::Op *op, Backend* backend, bool kv_cahce) : CommonExecution(backend, op) { + mImpl.reset(new AttentionBufImpl(op, backend, kv_cahce)); +} + +AttentionBufExecution::AttentionBufExecution(std::shared_ptr impl, const MNN::Op *op, Backend *backend) : CommonExecution(backend, op), mImpl(impl) {} + +ErrorCode AttentionBufExecution::onResize(const std::vector& inputs, const std::vector& outputs) { + return mImpl->onResize(backend(), inputs, outputs); +} + +ErrorCode AttentionBufExecution::onExecute(const std::vector& inputs, const std::vector& outputs) { + return mImpl->onExecute(backend(), inputs, outputs); +} + +bool AttentionBufExecution::onClone(Backend* bn, const Op* op, Execution** dst) { + if (nullptr == dst) { + return true; + } + *dst = new AttentionBufExecution(mImpl, op, bn); + return true; +} + +class AttentionBufCreator : public OpenCLBackend::Creator { +public: + virtual Execution *onCreate(const std::vector &inputs, const std::vector &outputs, + const MNN::Op *op, Backend *backend) const override { + for (int i = 0; i < inputs.size(); ++i) { + TensorUtils::setTensorSupportPack(inputs[i], false); + } + for (int i = 0; i < outputs.size(); ++i) { + TensorUtils::setTensorSupportPack(outputs[i], false); + } + auto param = op->main_as_AttentionParam(); + return new AttentionBufExecution(op, backend, param->kv_cache()); + } +}; +REGISTER_OPENCL_OP_CREATOR(AttentionBufCreator, OpType_Attention, BUFFER); + +} // namespace OpenCL +} // namespace MNN +#endif/* MNN_OPENCL_BUFFER_CLOSED */ + diff --git a/source/backend/opencl/execution/buffer/AttentionBufExecution.hpp b/source/backend/opencl/execution/buffer/AttentionBufExecution.hpp new file mode 100644 index 000000000..1d6ac005b --- /dev/null +++ b/source/backend/opencl/execution/buffer/AttentionBufExecution.hpp @@ -0,0 +1,82 @@ +// +// AttentionBufExecution.hpp +// MNN +// +// Created by MNN on 2024/04/11. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef MNN_OPENCL_BUFFER_CLOSED + +#ifndef AttentionBufExecution_hpp +#define AttentionBufExecution_hpp + +#include "backend/opencl/execution/image/CommonExecution.hpp" + +namespace MNN { +namespace OpenCL { + +class AttentionBufImpl { +public: + AttentionBufImpl(const MNN::Op *op, Backend *backend, bool kv_cache); + + ~AttentionBufImpl() { + if(mRecording != NULL){ +#ifdef MNN_USE_LIB_WRAPPER + clReleaseRecordingQCOM(mRecording); +#endif + } + } + ErrorCode onResize(Backend *backend, const std::vector &inputs, const std::vector &outputs); + ErrorCode onExecute(Backend *backend, const std::vector &inputs, const std::vector &outputs); + +private: + int getLocalSize(int size, int maxGroupSize); + void allocKVCache(); + void reallocKVCache(); + bool mKVCache; + float mScale; + const int mExpandChunk = 64; + bool mIsDecode = false; + bool mIsFirstDecode = true; + int mPastLength = 0, mMaxLength = 0, mKv_seq_len = 0, mSoftMaxRemainChannels = 0; + std::shared_ptr mPastKey, mPastValue, mTempQK, mTempSoftMax; + int mNumHead = 0, mHeadDim = 0, mValueH = 0; + std::shared_ptr mKernel_qk; + std::shared_ptr mKernel_softmax; + std::shared_ptr mKernel_qkv; + std::vector mGlobalWorkSizeQk{1, 1, 1}; + std::vector mLocalWorkSizeQk{1, 1, 1, 1}; + std::vector mGlobalWorkSizeSoftMax{1, 1, 1}; + std::vector mLocalWorkSizeSoftMax{1, 1, 1, 1}; + std::vector mGlobalWorkSizeQkv{1, 1, 1}; + std::vector mLocalWorkSizeQkv{1, 1, 1, 1}; + uint32_t mMaxWorkGroupSize; + OpenCLBackend *mOpenCLBackend; + RecordUpdateInfo mQkUpdateInfo; + RecordUpdateInfo mSoftMaxUpdateInfo; + RecordUpdateInfo mQkvUpdateInfo; + int mGlobalWorkSizeQk2 = 0; + size_t mQkGlobal_size[3]; + int mSoftmaxShape[4]; + cl_recording_qcom mRecording{NULL}; + std::vector mOpRecordUpdateInfo; +}; + +class AttentionBufExecution : public CommonExecution { +public: + AttentionBufExecution(const MNN::Op *op, Backend *backend, bool kv_cache); + AttentionBufExecution(std::shared_ptr impl, const MNN::Op *op, Backend *backend); + + virtual ~AttentionBufExecution() = default; + virtual ErrorCode onResize(const std::vector &inputs, const std::vector &outputs) override; + virtual ErrorCode onExecute(const std::vector &inputs, const std::vector &outputs) override; + virtual bool onClone(Backend* bn, const Op* op, Execution** dst) override; + +private: + std::shared_ptr mImpl; +}; +} // namespace OpenCL +} // namespace MNN +#endif /* AttentionBufExecution_hpp */ +#endif /* MNN_OPENCL_BUFFER_CLOSED */ diff --git a/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp b/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp index 75d604db0..2455d7943 100644 --- a/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/BinaryBufExecution.cpp @@ -379,7 +379,7 @@ class BinaryBufCreator : public OpenCLBackend::Creator { case BinaryOpOperation_NOTEQUAL: return new BinaryBufExecution(inputs, "convert_float4(-isnotequal(in0,in1))", op, backend); case BinaryOpOperation_MOD: - return new BinaryBufExecution(inputs, "in0-floor(sign(in1)*in0/(fabs(in1)>(float4)((float)0.0000001)?fabs(in1):(float4)((float)0.0000001)))*in1", op, backend); + return new BinaryBufExecution(inputs, "fmod(in0,in1)", op, backend); default: break; } diff --git a/source/backend/opencl/execution/buffer/ConvBufExecution.cpp b/source/backend/opencl/execution/buffer/ConvBufExecution.cpp index 3d5e1c000..e0d6697b9 100644 --- a/source/backend/opencl/execution/buffer/ConvBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/ConvBufExecution.cpp @@ -354,12 +354,7 @@ ConvBufExecution::ConvBufExecution(const std::vector &inputs, const st std::shared_ptr filterBuffer( Tensor::createDevice({mResource->mOutputChannel, ROUND_UP(mResource->mInputChannel, 4), mResource->mKernelWidth, mResource->mKernelHeight})); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + int buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); @@ -367,25 +362,10 @@ ConvBufExecution::ConvBufExecution(const std::vector &inputs, const st auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); if(ptrCL != nullptr && res == CL_SUCCESS) { ::memset(ptrCL, 0, buffer_size); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int oc=0; ocmOutputChannel; oc++) { - for(int ic=0; icmInputChannel; ic++) { - for(int kh=0; khmKernelHeight; kh++) { - for(int kw=0; kwmKernelWidth; kw++) { - int dst_idx = ((oc * ROUND_UP(mResource->mInputChannel, 4) + ic) * mResource->mKernelHeight + kh)* mResource->mKernelWidth + kw; - int src_idx = ((oc * mResource->mInputChannel + ic) * mResource->mKernelHeight + kh)* mResource->mKernelWidth + kw; - - ((half_float::half*)ptrCL)[dst_idx] = (half_float::half)(mFilterDataPtr[src_idx]); - } - } - } - } - }else{ - const int copy_size = mResource->mKernelWidth * mResource->mKernelHeight * sizeof(float); - for(int oc=0; ocmOutputChannel; oc++) { - for(int ic=0; icmInputChannel; ic++) { - ::memcpy((float *)ptrCL + (oc * ROUND_UP(mResource->mInputChannel, 4) + ic) * mResource->mKernelWidth * mResource->mKernelHeight, mFilterDataPtr + (oc * mResource->mInputChannel + ic) * mResource->mKernelWidth * mResource->mKernelHeight, copy_size); - } + const int copy_size = mResource->mKernelWidth * mResource->mKernelHeight * sizeof(float); + for(int oc=0; ocmOutputChannel; oc++) { + for(int ic=0; icmInputChannel; ic++) { + ::memcpy((float *)ptrCL + (oc * ROUND_UP(mResource->mInputChannel, 4) + ic) * mResource->mKernelWidth * mResource->mKernelHeight, mFilterDataPtr + (oc * mResource->mInputChannel + ic) * mResource->mKernelWidth * mResource->mKernelHeight, copy_size); } } }else{ @@ -397,10 +377,7 @@ ConvBufExecution::ConvBufExecution(const std::vector &inputs, const st mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - bool needTrans = false; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - needTrans = true; - } + bool needTrans = true; bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->mFilter.get(), needTrans); } } @@ -697,8 +674,7 @@ ErrorCode ConvBufExecution::onExecute(const std::vector &inputs, const mOpenCLBackend->getOpenCLRuntime()->pushEvent({"ConvBuf2D", event}); #else if(mOpenCLBackend->isUseRecordQueue()){ - if(mOpenCLBackend->isDevideOpRecord()) - mOpenCLBackend->addRecord(mRecording); + mOpenCLBackend->addRecord(mRecording, mOpRecordUpdateInfo); #ifdef LOG_VERBOSE MNN_PRINT("End ConvExecution onExecute... \n"); #endif @@ -729,7 +705,7 @@ class ConvolutionBufCreator : public OpenCLBackend::Creator { #ifdef MNN_LOW_MEMORY { auto conv2dParams = op->main_as_Convolution2D(); - if ((static_cast(backend)->getMemory() == BackendConfig::Memory_Low) && (conv2dParams->quanParameter() != nullptr)) { + if (conv2dParams->quanParameter() != nullptr) { if (((conv2dParams->quanParameter()->type() == 4) || (conv2dParams->quanParameter()->type() == 1) || (conv2dParams->quanParameter()->type() == 2))) { diff --git a/source/backend/opencl/execution/buffer/ConvBufExecution.hpp b/source/backend/opencl/execution/buffer/ConvBufExecution.hpp index 10e3deda2..06fd52127 100644 --- a/source/backend/opencl/execution/buffer/ConvBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/ConvBufExecution.hpp @@ -19,6 +19,7 @@ struct ConvBufResource { const Convolution2DCommon *mConv2dCommonParams; const Convolution2D *mConv2dParams; std::shared_ptr mKernelBuffer; + std::shared_ptr mKernelImage; std::shared_ptr dequantScale; std::shared_ptr dequantOffset; std::shared_ptr mFilter; @@ -33,6 +34,7 @@ struct ConvBufResource { bool mConv1x1Opt = false; bool mConv1x1C8Opt = false; std::shared_ptr mRasterExe; + bool mUseImage = false; }; class ConvBufCommonExecution { diff --git a/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp b/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp index 20e860f77..af8012c8a 100644 --- a/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp +++ b/source/backend/opencl/execution/buffer/ConvBufLowMemoryExecution.cpp @@ -13,7 +13,7 @@ namespace OpenCL { // set mDequantScale mDequantOffset mNumQuantBit mFilterDataPtr from mConv2dParams void ConvBufLowMemoryExecution::getInfoFromOpLowMemory(std::shared_ptr & quanCommon) { quanCommon = ConvolutionCommon::load(mResource->mConv2dParams, this->backend(), false, true); - if ((mOpenCLBackend->getMemory() == BackendConfig::Memory_Low) && (mResource->mConv2dParams->quanParameter() != nullptr)) { + if (mResource->mConv2dParams->quanParameter() != nullptr) { mLowMemoryFlag = true; } else { MNN_ERROR("Conv buf low memory init error.\n"); @@ -30,44 +30,34 @@ void ConvBufLowMemoryExecution::getInfoFromOpLowMemory(std::shared_ptrmOutputChannel; // set mDequantScale mDequantOffset int numAlphaPack = ROUND_UP(numAlpha, 16); - mResource->dequantScale.reset(Tensor::createDevice({numAlphaPack})); - mResource->dequantOffset.reset(Tensor::createDevice({numAlphaPack})); + mResource->dequantScale.reset(Tensor::createDevice({numAlphaPack})); + mResource->dequantOffset.reset(Tensor::createDevice({numAlphaPack})); + mOpenCLBackend->onAcquireBuffer(mResource->dequantScale.get(), Backend::STATIC); mOpenCLBackend->onAcquireBuffer(mResource->dequantOffset.get(), Backend::STATIC); cl::Buffer &dequantScaleBuffer = openCLBuffer(mResource->dequantScale.get()); cl::Buffer &dequantOffsetBuffer = openCLBuffer(mResource->dequantOffset.get()); // transfer data from src in cpu to dst in gpu - int bytes = mOpenCLBackend->fpBytes(); + int fpBytes = mOpenCLBackend->fpBytes(); cl_int resBias, resScale, resOffset; - void * dequantScaleBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(dequantScaleBuffer, true, CL_MAP_WRITE, 0, numAlphaPack * bytes, nullptr, nullptr, &resScale); - void * dequantOffsetBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(dequantOffsetBuffer, true, CL_MAP_WRITE, 0, numAlphaPack * bytes, nullptr, nullptr, &resOffset); - ::memset(dequantScaleBufferMap, -1, numAlphaPack * bytes); - ::memset(dequantOffsetBufferMap, 0, numAlphaPack * bytes); + + void * dequantScaleBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(dequantScaleBuffer, true, CL_MAP_WRITE, 0, numAlphaPack * sizeof(int32_t), nullptr, nullptr, &resScale); + void * dequantOffsetBufferMap = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(dequantOffsetBuffer, true, CL_MAP_WRITE, 0, numAlphaPack * sizeof(int32_t), nullptr, nullptr, &resOffset); + + ::memset(dequantScaleBufferMap, -1, numAlphaPack * sizeof(int32_t)); + ::memset(dequantOffsetBufferMap, 0, numAlphaPack * sizeof(int32_t)); + if (dequantScaleBufferMap != nullptr && dequantOffsetBufferMap != nullptr && resScale == CL_SUCCESS && resOffset == CL_SUCCESS) { - if (bytes == 2) { - if (quanCommon->asymmetric) { - for (int i = 0; i < numAlpha; ++i) { - ((half_float::half *)dequantOffsetBufferMap)[i] = (half_float::half)dequantAlpha[2 * i]; - ((half_float::half *)dequantScaleBufferMap)[i] = (half_float::half)dequantAlpha[2 * i + 1]; - } - } else { - for (int i = 0; i < numAlpha; ++i) { - ((half_float::half *)dequantScaleBufferMap)[i] = (half_float::half)dequantAlpha[i]; - ((half_float::half *)dequantOffsetBufferMap)[i] = 0.0f; - } + if (quanCommon->asymmetric) { + for (int i = 0; i < numAlpha; ++i) { + ((float *)dequantOffsetBufferMap)[i] = dequantAlpha[2 * i]; + ((float *)dequantScaleBufferMap)[i] = dequantAlpha[2 * i + 1]; } } else { - if (quanCommon->asymmetric) { - for (int i = 0; i < numAlpha; ++i) { - ((float *)dequantOffsetBufferMap)[i] = dequantAlpha[2 * i]; - ((float *)dequantScaleBufferMap)[i] = dequantAlpha[2 * i + 1]; - } - } else { - for (int i = 0; i < numAlpha; ++i) { - ((float *)dequantScaleBufferMap)[i] = dequantAlpha[i]; - ((float *)dequantOffsetBufferMap)[i] = 0.0f; - } + for (int i = 0; i < numAlpha; ++i) { + ((float *)dequantScaleBufferMap)[i] = dequantAlpha[i]; + ((float *)dequantOffsetBufferMap)[i] = 0.0f; } } } else { @@ -82,7 +72,7 @@ void ConvBufLowMemoryExecution::getInfoFromOpLowMemory(std::shared_ptr & quanCommon) { cl_int res; - std::shared_ptr filterBuffer(Tensor::createDevice({ROUND_UP(mResource->mOutputChannel, 8)/*Cout pack set to max 8*/, ROUND_UP(mResource->mInputChannel, packCin), mResource->mKernelWidth, mResource->mKernelHeight})); + std::shared_ptr filterBuffer(Tensor::createDevice({ROUND_UP(mResource->mOutputChannel, packCout), ROUND_UP(mResource->mInputChannel, packCin), mResource->mKernelWidth, mResource->mKernelHeight})); size_t buffer_size = filterBuffer->usize() / sizeof(float); float *dequantAlpha = quanCommon->alpha.get(); // shared part for all cases @@ -93,43 +83,66 @@ void ConvBufLowMemoryExecution::set1x1WeightLowMemory(int packCout, int packCin, // int4 case buffer_size /= 2; } else {/* More types to be supported. */} - mResource->mKernelBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); - auto kernelBufferPtr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->mKernelBuffer.get()), true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); - if(kernelBufferPtr != nullptr && res == CL_SUCCESS){ - ::memset(kernelBufferPtr, 0, buffer_size); - + + // Use Image load weights + void *mapPtr = nullptr; + size_t row_pitch; + size_t slice_pitch; + if(UP_DIV(mResource->mInputChannel, packCin) <= 16384 && ROUND_UP(mResource->mOutputChannel, packCout) <= 16384){ + mResource->mUseImage = true; + } + if(mResource->mUseImage) { + if(mNumQuantBit == 4){ + packCin *= 2; + } + size_t w = ROUND_UP(mResource->mOutputChannel, packCout); + size_t h = UP_DIV(mResource->mInputChannel, packCin); + mResource->mKernelImage.reset(new cl::Image2D(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE, cl::ImageFormat(CL_RGBA, CL_FLOAT), w, h, 0, nullptr, &res)); + if (nullptr == mResource->mKernelImage.get() || res != CL_SUCCESS) { + MNN_ERROR("Alloc Image %d x %d error, code:%d \n", w, h, res); + } + mapPtr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapImage(*(mResource->mKernelImage.get()), true, CL_MAP_WRITE, {0, 0, 0}, {w, h, 1}, &row_pitch, &slice_pitch, nullptr, nullptr, &res); + if(mNumQuantBit == 4){ + row_pitch *= 2; + } + } else{ + mResource->mKernelBuffer.reset(new cl::Buffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); + mapPtr = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(*(mResource->mKernelBuffer.get()), true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &res); + row_pitch = ROUND_UP(mResource->mOutputChannel, packCout) * packCin; + } + if(mapPtr != nullptr && res == CL_SUCCESS){ for(int o = 0; o < mResource->mOutputChannel; o++){ float zero = 0; if(quanCommon->asymmetric){ zero = (-dequantAlpha[2 * o + 1])/dequantAlpha[2 * o]; } int i = 0; - for(; i < mResource->mInputChannel; i++){ - int bufferIdx = (o/packCout) * packCin*packCout + (i/packCin)*packCin*ROUND_UP(mResource->mOutputChannel, packCout) + (o%packCout)*packCin + (i%packCin);//(Ci/packCin, Co/packCout,packCout, packCin) + for(; i < mResource->mInputChannel ; i++){ + int bufferIdx = (i/packCin) * row_pitch + o*packCin + (i%packCin);//(Ci/packCin, Co/packCout * packCout * packCin) int filterIdx = o*mResource->mInputChannel + i; if (mNumQuantBit == 8) { // int8 case - ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(((int8_t *)filterDataPtr)[filterIdx]); + ((int8_t *)mapPtr)[bufferIdx] = (int8_t)(((int8_t *)filterDataPtr)[filterIdx]); } else if (mNumQuantBit == 4){ // int4 case if (bufferIdx % 2 == 0) { - ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((((int8_t *)filterDataPtr)[filterIdx] + 8) * 16); + ((uint8_t *)mapPtr)[bufferIdx / 2] += (uint8_t)((((int8_t *)filterDataPtr)[filterIdx] + 8) * 16); } else { - ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(((int8_t *)filterDataPtr)[filterIdx] + 8); + ((uint8_t *)mapPtr)[bufferIdx / 2] += (uint8_t)(((int8_t *)filterDataPtr)[filterIdx] + 8); } } else {/* More types to be supported. */} } - for(; i < ROUND_UP(mResource->mInputChannel, 4); i++){ - int bufferIdx = (o/packCout) * packCin*packCout + (i/packCin)*packCin*ROUND_UP(mResource->mOutputChannel, packCout) + (i%packCin)*packCout + (o%packCout);//(Ci/packCin, Co/packCout, packCin, packCout) + for(; i < ROUND_UP(mResource->mInputChannel, packCin); i++){ + int bufferIdx = (i/packCin) * row_pitch + o*packCin + (i%packCin);//(Ci/packCin, Co/packCout * packCout * packCin) if (mNumQuantBit == 8) { // int8 case - ((int8_t *)kernelBufferPtr)[bufferIdx] = (int8_t)(zero); + ((int8_t *)mapPtr)[bufferIdx] = (int8_t)(zero); } else if (mNumQuantBit == 4){ // int4 case if (bufferIdx % 2 == 0) { - ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)((zero + 8) * 16); + ((uint8_t *)mapPtr)[bufferIdx / 2] += (uint8_t)((zero + 8) * 16); } else { - ((uint8_t *)kernelBufferPtr)[bufferIdx / 2] += (uint8_t)(zero + 8); + ((uint8_t *)mapPtr)[bufferIdx / 2] += (uint8_t)(zero + 8); } } } @@ -138,7 +151,11 @@ void ConvBufLowMemoryExecution::set1x1WeightLowMemory(int packCout, int packCin, MNN_ERROR("set1x1WeightLowMemory: Map error ptrCL == nullptr \n"); MNN_ASSERT(false); } - mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->mKernelBuffer.get()), kernelBufferPtr); + if(mResource->mUseImage){ + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->mKernelImage.get()), mapPtr); + } else{ + mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueUnmapMemObject(*(mResource->mKernelBuffer.get()), mapPtr); + } } // set mFilter for the general kernels void ConvBufLowMemoryExecution::setGeneralWeightLowMemory(void* filterDataPtr, std::shared_ptr & quanCommon) { @@ -321,13 +338,11 @@ void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * outpu const int width = outputShape.at(2); const int inputChannelBlocks = UP_DIV(inputChannels, 4); const int outputChannelBlocks = UP_DIV(outChannel, 4); - std::string kernelname = "gemm_conv_buf"; - int global_x = outputChannelBlocks; + int global_y = batch * height; - - const int total_kernel = 3; - std::string kernelName[total_kernel] = {"gemm_conv_c1_buf", "gemm_conv_c2_buf", "gemm_conv_c4_buf",}; - int itemC[total_kernel] = {1, 2, 4}; + const int total_kernel = 5; + std::string kernelName[total_kernel] = {"gemm_conv_c1_buf", "gemm_conv_c2_buf", "gemm_conv_c4_buf", "gemm_conv_c1_image", "gemm_conv_c2_image"}; + int itemC[total_kernel] = {1, 2, 4, 1, 2}; int actual_kernel = total_kernel; std::shared_ptr kernel[total_kernel]; std::vector globalWorkSize[total_kernel]; @@ -337,12 +352,27 @@ void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * outpu if(width == 1 && height == 1){ buildOption.emplace("-DWIDTH_HEIGHT_1"); } + if(inputChannels % 16 != 0){ buildOption.emplace("-DINPUT_CHANNEL_LEAVE"); + } else if (mResource->mUseImage && mNumQuantBit == 4 && inputChannels % 32 != 0) { + // Image weight-int4 use load32 + buildOption.emplace("-DINPUT_CHANNEL_LEAVE"); } std::string info = std::to_string(inputChannels) + "_" + std::to_string(outChannel); - for (int knl_idx = 0; knl_idx < actual_kernel; knl_idx++) { - kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("gemm_buf", kernelName[knl_idx], buildOption); + if(batch > 1){ + global_y = UP_DIV(batch, 2) * height; + buildOption.emplace("-DBACTH_BLOCK2"); + info += "_BATCH_BLOCK2"; + } + int knl_idx = 0; + actual_kernel = 3; + if(mResource->mUseImage){ + knl_idx = 3; + actual_kernel = total_kernel; + } + for (; knl_idx < actual_kernel; knl_idx++) { + kernel[knl_idx] = mOpenCLBackend->getOpenCLRuntime()->buildKernel("gemv_conv1x1_buf", kernelName[knl_idx], buildOption); uint32_t maxWorkGroupSize = static_cast(mOpenCLBackend->getOpenCLRuntime()->getMaxWorkGroupSize(kernel[knl_idx])); globalWorkSize[knl_idx] = {static_cast(UP_DIV(outChannel, itemC[knl_idx]) * width), static_cast(global_y)}; @@ -351,7 +381,11 @@ void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * outpu ret |= kernel[knl_idx]->get().setArg(idx++, globalWorkSize[knl_idx][0]); ret |= kernel[knl_idx]->get().setArg(idx++, globalWorkSize[knl_idx][1]); ret |= kernel[knl_idx]->get().setArg(idx++, openCLBuffer(input)); - ret |= kernel[knl_idx]->get().setArg(idx++, *mResource->mKernelBuffer.get()); + if(mResource->mUseImage){ + ret |= kernel[knl_idx]->get().setArg(idx++, *mResource->mKernelImage.get()); + }else{ + ret |= kernel[knl_idx]->get().setArg(idx++, *mResource->mKernelBuffer.get()); + } ret |= kernel[knl_idx]->get().setArg(idx++, openCLBuffer(mResource->dequantScale.get())); ret |= kernel[knl_idx]->get().setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); ret |= kernel[knl_idx]->get().setArg(idx++, openCLBuffer(mResource->mBias.get())); @@ -361,7 +395,7 @@ void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * outpu ret |= kernel[knl_idx]->get().setArg(idx++, static_cast(batch)); ret |= kernel[knl_idx]->get().setArg(idx++, static_cast(height)); ret |= kernel[knl_idx]->get().setArg(idx++, static_cast(width)); - MNN_CHECK_CL_SUCCESS(ret, "setArg gemm_conv_buf Kernel Select"); + MNN_CHECK_CL_SUCCESS(ret, "setArg gemv_conv1x1_buf Kernel Select"); std::pair, int> retTune; retTune = gws2dLwsTune(kernel[knl_idx], globalWorkSize[knl_idx], kernelName[knl_idx] + info, maxWorkGroupSize); if(min_cost.first > retTune.second) { @@ -374,14 +408,18 @@ void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * outpu mGlobalWorkSize = {globalWorkSize[min_index][0], globalWorkSize[min_index][1]}; - unit.kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("gemm_buf", kernelName[min_index], buildOption); + unit.kernel = mOpenCLBackend->getOpenCLRuntime()->buildKernel("gemv_conv1x1_buf", kernelName[min_index], buildOption); //MNN_PRINT("Kernel is %d.\n", min_index); uint32_t idx = 0; cl_int ret = CL_SUCCESS; ret |= unit.kernel->get().setArg(idx++, mGlobalWorkSize[0]); ret |= unit.kernel->get().setArg(idx++, mGlobalWorkSize[1]); ret |= unit.kernel->get().setArg(idx++, openCLBuffer(input)); - ret |= unit.kernel->get().setArg(idx++, *mResource->mKernelBuffer.get()); + if(mResource->mUseImage){ + ret |= unit.kernel->get().setArg(idx++, *mResource->mKernelImage.get()); + }else{ + ret |= unit.kernel->get().setArg(idx++, *mResource->mKernelBuffer.get()); + } ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mResource->dequantScale.get())); ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mResource->dequantOffset.get())); ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mResource->mBias.get())); @@ -391,7 +429,7 @@ void ConvBufLowMemoryExecution::tuneGemmLowMemory(Tensor * input, Tensor * outpu ret |= unit.kernel->get().setArg(idx++, static_cast(batch)); ret |= unit.kernel->get().setArg(idx++, static_cast(height)); ret |= unit.kernel->get().setArg(idx++, static_cast(width)); - MNN_CHECK_CL_SUCCESS(ret, "setArg gemm_conv_buf"); + MNN_CHECK_CL_SUCCESS(ret, "setArg gemv_conv1x1_buf"); mOpenCLBackend->recordKernel2d(unit.kernel, mGlobalWorkSize, mLocalWorkSize); unit.globalWorkSize = {mGlobalWorkSize[0], mGlobalWorkSize[1]}; unit.localWorkSize = {mLocalWorkSize[0], mLocalWorkSize[1]}; @@ -422,7 +460,7 @@ ConvBufLowMemoryExecution::ConvBufLowMemoryExecution(const std::vector // prepare mDequantScale mDequantOffset mFilterDataPtr getInfoFromOpLowMemory(quanCommon); //select opt conv method - if (mResource->mKernelHeight == mResource->mKernelWidth && mResource->mKernelHeight == 1 && mResource->mStrides[0] == 1 && mResource->mStrides[1] == 1) { + if (mResource->mKernelHeight == mResource->mKernelWidth && mResource->mKernelHeight == 1 && mResource->mStrides[0] == 1 && mResource->mStrides[1] == 1 && conv2dCommonParams->padX() == 0 && conv2dCommonParams->padY() == 0 && conv2dCommonParams->dilateX() == 1 && conv2dCommonParams->dilateY() == 1) { set1x1WeightLowMemory(4, 16, mFilterDataPtr, quanCommon); mResource->mConv1x1Opt = true; }else { diff --git a/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp b/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp index 21d447038..4f1b990b7 100644 --- a/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/DeconvBufExecution.cpp @@ -48,24 +48,13 @@ DeconvBufExecution::DeconvBufExecution(const std::vector &inputs, cons std::shared_ptr filterBuffer( Tensor::createDevice({outputChannel, inputChannel, kernelHeight, kernelWidth})); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); cl_int error; auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(ptrCL != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i=0; ielementSize(); i++) { - ((half_float::half*)ptrCL)[i] = (half_float::half)(filterDataPtrTransformed[i]); - } - }else{ - ::memcpy(ptrCL, filterDataPtrTransformed.data(), filterBuffer->size()); - } + ::memcpy(ptrCL, filterDataPtrTransformed.data(), filterBuffer->size()); }else{ MNN_ERROR("Map error ptrCL == nullptr \n"); } @@ -75,10 +64,7 @@ DeconvBufExecution::DeconvBufExecution(const std::vector &inputs, cons mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - bool needTrans = false; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - needTrans = true; - } + bool needTrans = true; bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->mFilter.get(), needTrans); mResource->mBuildOptions.emplace("-DBIAS"); if (conv2dCommonParams->relu() == true) { diff --git a/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp b/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp index 2937f4eaa..606e0bda4 100644 --- a/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/DepthwiseConvBufExecution.cpp @@ -39,24 +39,13 @@ DepthwiseConvBufExecution::DepthwiseConvBufExecution(const std::vector mResource->mFilter.reset(Tensor::createDevice({1, ROUND_UP(filterImageShape[1], 2)/*for kernel C8 read*/, 1, 4 * filterImageShape[0]})); std::shared_ptr filterBuffer(Tensor::createDevice(filterShape)); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); cl_int error; auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(ptrCL != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for (int i = 0; i < filterBuffer->elementSize(); i++) { - ((half_float::half *)ptrCL)[i] = (half_float::half)(filterDataPtr[i]); - } - } else { - ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); - } + ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); }else{ MNN_ERROR("Map error ptrCL == nullptr \n"); } @@ -65,10 +54,7 @@ DepthwiseConvBufExecution::DepthwiseConvBufExecution(const std::vector mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - bool needTrans = false; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - needTrans = true; - } + bool needTrans = true; bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::DW_CONV2D_FILTER, mResource->mFilter.get(), needTrans); if (mResource->mConv2dCommonParams->relu() == true) { diff --git a/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp b/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp index e01dc538b..673713141 100644 --- a/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/LayerNormBufExecution.cpp @@ -94,7 +94,7 @@ ErrorCode LayerNormBufExecution::onEncode(const std::vector &inputs, c Tensor *input = inputs[0]; Tensor *output = outputs[0]; auto runtime = ((OpenCLBackend *)backend())->getOpenCLRuntime(); - auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize) / 4; std::vector inputShape = tensorShapeFormat(input); std::vector outputShape = tensorShapeFormat(output); @@ -114,6 +114,14 @@ ErrorCode LayerNormBufExecution::onEncode(const std::vector &inputs, c inner_size *= inputs.at(0)->length(i); } + if (group_ > 1) { + outter_size = inputs[0]->length(0) * group_; + inner_size = 1; + for (int i = 1; i < rank; i++) { + inner_size *= inputs[0]->length(i); + } + inner_size /= group_; + } std::set buildOptions; if(RMSNorm){ @@ -150,6 +158,111 @@ ErrorCode LayerNormBufExecution::onEncode(const std::vector &inputs, c mGWS = {static_cast(local_size), static_cast(1), static_cast(inputBatch)}; + } else if(inner_size == inputWidth * inputHeight * inputChannels / group_ && outter_size == inputBatch * group_){ + mUnits.clear(); + mUnits.resize(3); + std::vector inputShape = tensorShapeFormat(inputs[0]); + int inputWH[] = {inputShape[2], inputShape[1]}; + int region[] = {inputShape[0], UP_DIV(inputShape[3], 4), inputShape[1], inputShape[2]}; + + mInputPlain = std::make_shared(Tensor::createDevice(std::vector{inputShape[0], inputShape[3], ROUND_UP(inputShape[1] * inputShape[2], 4), 1}, Tensor::CAFFE)); + mOpenCLBackend->onAcquireBuffer(mInputPlain.get(), Backend::DYNAMIC); + mOutputPlain = std::make_shared(Tensor::createDevice(std::vector{inputShape[0], inputShape[3], ROUND_UP(inputShape[1] * inputShape[2], 4), 1}, Tensor::CAFFE)); + mOpenCLBackend->onAcquireBuffer(mOutputPlain.get(), Backend::DYNAMIC); + + // convert nc4hw4 to nchw + { + auto &unit = mUnits[0]; + unit.kernel = runtime->buildKernel("buffer_convert_buf", "nc4hw4_buffer_to_nchw_buffer", {}, inputs[0], outputs[0]); + + mGWS = {(uint32_t)(UP_DIV(region[3] * region[1], 16) * 16), + (uint32_t)(UP_DIV(region[2] * region[0], 16) * 16)}; + mLWS = {16, 16}; + unit.globalWorkSize = {mGWS[0], mGWS[1]}; + unit.localWorkSize = {mLWS[0], mLWS[1]}; + + int global_dim0 = region[3] * region[1]; + int global_dim1 = region[2] * region[0]; + + //MNN_CHECK_CL_SUCCESS + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= unit.kernel->get().setArg(idx++, global_dim0); + ret |= unit.kernel->get().setArg(idx++, global_dim1); + ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mInputPlain.get())); + ret |= unit.kernel->get().setArg(idx++, inputWH[1]); + ret |= unit.kernel->get().setArg(idx++, inputWH[0]); + ret |= unit.kernel->get().setArg(idx++, inputShape[3]); + ret |= unit.kernel->get().setArg(idx++, openCLBuffer(input)); + MNN_CHECK_CL_SUCCESS(ret, "setArg LayerNormBufExecution with group, convert nc4hw4 to nchw"); + + mOpenCLBackend->recordKernel2d(unit.kernel, mGWS, mLWS); + } + // do group layernorm + { + auto &unit = mUnits[1]; + kernelName = "layernorm_plain_buf"; + local_size = getLocalSize(UP_DIV(inner_size, 4), MaxLocalSize); + buildOptions.emplace("-DLOCAL_SIZE=" + std::to_string(local_size)); + unit.kernel = runtime->buildKernel("layernorm_buf", kernelName, buildOptions); + + mGWS = {static_cast(local_size), + static_cast(1), + static_cast(outter_size)}; + + mLWS = {static_cast(local_size), 1, 1}; + + unit.globalWorkSize = {mGWS[0], mGWS[1], mGWS[2]}; + unit.localWorkSize = {mLWS[0], mLWS[1], mLWS[2]}; + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= unit.kernel->get().setArg(idx++, mGWS[0]); + ret |= unit.kernel->get().setArg(idx++, mGWS[1]); + ret |= unit.kernel->get().setArg(idx++, mGWS[2]); + ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mInputPlain.get())); + ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mOutputPlain.get())); + ret |= unit.kernel->get().setArg(idx++, static_cast(inner_size)); + ret |= unit.kernel->get().setArg(idx++, static_cast(outter_size)); + if(has_gamma_beta_){ + ret |= unit.kernel->get().setArg(idx++, *mGammaBuffer.get()); + ret |= unit.kernel->get().setArg(idx++, *mBetaBuffer.get()); + } + ret |= unit.kernel->get().setArg(idx++, epsilon_); + MNN_CHECK_CL_SUCCESS(ret, "setArg LayerNormBufExecution with group, do group layernorm"); + mOpenCLBackend->recordKernel3d(unit.kernel, mGWS, mLWS); + } + // convert nchw to nc4hw4 + { + auto &unit = mUnits[2]; + + unit.kernel = runtime->buildKernel("buffer_convert_buf", "nchw_buffer_to_nc4hw4_buffer", {}, inputs[0], outputs[0]); + mLWS = {16, 16}; + mGWS = {(uint32_t)UP_DIV(region[3] * region[1], 16) * 16, + (uint32_t)UP_DIV(region[2] * region[0], 16) * 16}; + + unit.globalWorkSize = {mGWS[0], mGWS[1]}; + unit.localWorkSize = {mLWS[0], mLWS[1]}; + + int global_dim0 = region[3] * region[1]; + int global_dim1 = region[2] * region[0]; + + uint32_t idx = 0; + cl_int ret = CL_SUCCESS; + ret |= unit.kernel->get().setArg(idx++, global_dim0); + ret |= unit.kernel->get().setArg(idx++, global_dim1); + ret |= unit.kernel->get().setArg(idx++, openCLBuffer(mOutputPlain.get())); + ret |= unit.kernel->get().setArg(idx++, inputWH[1]); + ret |= unit.kernel->get().setArg(idx++, inputWH[0]); + ret |= unit.kernel->get().setArg(idx++, inputShape[3]); + ret |= unit.kernel->get().setArg(idx++, openCLBuffer(output)); + MNN_CHECK_CL_SUCCESS(ret, "setArg LayerNormBufExecution with group, convert nchw to nc4hw4"); + mOpenCLBackend->recordKernel2d(unit.kernel, mGWS, mLWS); + } + + mOpenCLBackend->onReleaseBuffer(mInputPlain.get(), Backend::DYNAMIC); + mOpenCLBackend->onReleaseBuffer(mOutputPlain.get(), Backend::DYNAMIC); + return NO_ERROR; } mLWS = {static_cast(local_size), 1, 1}; @@ -189,10 +302,6 @@ class LayerNormBufCreator : public OpenCLBackend::Creator { TensorUtils::setTensorSupportPack(outputs[i], false); } const auto* layer_norm_param = op->main_as_LayerNorm(); - int group = layer_norm_param->group(); - if(group > 1){ - return nullptr; - } return new LayerNormBufExecution(inputs, op, backend); } }; diff --git a/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp b/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp index 0b9164732..dc925b9d5 100644 --- a/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp +++ b/source/backend/opencl/execution/buffer/LayerNormBufExecution.hpp @@ -35,6 +35,7 @@ class LayerNormBufExecution : public CommonExecution { std::shared_ptr mGammaBuffer; std::shared_ptr mBetaBuffer; + std::shared_ptr mInputPlain, mOutputPlain; bool has_gamma_beta_ = false; uint32_t mMaxWorkGroupSize; }; diff --git a/source/backend/opencl/execution/buffer/LoopBufExecution.cpp b/source/backend/opencl/execution/buffer/LoopBufExecution.cpp index 175d55e29..60d795ea2 100644 --- a/source/backend/opencl/execution/buffer/LoopBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/LoopBufExecution.cpp @@ -208,7 +208,8 @@ ErrorCode LoopBatchMatMulBufExecution::onEncode(const std::vector &inp const int Width = Shape.at(2); const int Height = Shape.at(1); const int Batch = Shape.at(0); - mTmpTensors[i] = std::make_shared(Tensor::createDevice(std::vector{Batch, Channel, ROUND_UP(Height, 4), ROUND_UP(Width, 4)}, Tensor::CAFFE)); + mTmpTensors[i] = std::make_shared(Tensor::createDevice(std::vector{Batch, Channel, Height, Width}, Tensor::CAFFE)); + mOpenCLBackend->onAcquireBuffer(mTmpTensors[i].get(), Backend::DYNAMIC); Unit unit; diff --git a/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp b/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp index 09dca38d5..7b8807382 100644 --- a/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/SoftmaxBufExecution.cpp @@ -54,7 +54,9 @@ ErrorCode SoftmaxBufExecution::onEncode(const std::vector &inputs, con const auto dims = input->buffer().dimensions; auto runtime = mOpenCLBackend->getOpenCLRuntime(); - auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize); + + auto MaxLocalSize = std::min(runtime->getMaxWorkItemSizes()[0], mMaxWorkGroupSize) / 4; + int inside = 1; int outside = 1; int channel = 1; diff --git a/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp b/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp index e176e5c1c..75897d2fe 100644 --- a/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp +++ b/source/backend/opencl/execution/buffer/UnaryBufExecution.cpp @@ -253,6 +253,9 @@ class UnaryBufCreator : public OpenCLBackend::Creator { return new UnaryBufExecution("convert_float4(in)>(float4)(-3.0f)?(convert_float4(in)<(float4)(3.0f)?((convert_float4(in)*(convert_float4(in)+(float4)3.0f))/(float4)6.0f):convert_float4(in)):(float4)(0.0f)", op, backend); case UnaryOpOperation_GELU: return new UnaryBufExecution("gelu(convert_float4(in))", op, backend); + case UnaryOpOperation_GELU_STANDARD: + return new UnaryBufExecution("(erf(convert_float4(in)*(float4)0.7071067932881648)+(float4)1.0)*convert_float4(in)*(float4)0.5", op, backend); + default: break; } diff --git a/source/backend/opencl/execution/cl/attention_buf.cl b/source/backend/opencl/execution/cl/attention_buf.cl new file mode 100644 index 000000000..1d7ca6db3 --- /dev/null +++ b/source/backend/opencl/execution/cl/attention_buf.cl @@ -0,0 +1,316 @@ +#ifdef MNN_SUPPORT_FP16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +#define GLOBAL_SIZE_3_DIMS \ + __private const int global_size_dim0, __private const int global_size_dim1, __private const int global_size_dim2, + +#define DEAL_NON_UNIFORM_DIM3(input1, input2, input3) \ + if (input1 >= global_size_dim0 || input2 >= global_size_dim1 || input3 >= global_size_dim2) { \ + return; \ + } + + +__kernel void matmul_qk_div_mask(GLOBAL_SIZE_3_DIMS + __global const FLOAT *input0, // query [1 query_seq_len/4 head_num head_dim 4] + __global const FLOAT *input1, // key [1 key_seq_len/4 head_num head_dim 4] + __global FLOAT *output, // prefill [1 head_num query_seq_len/4 key_seq_len 4] decode[1 head_num key_seq_len/4 4] + __global FLOAT *past_key, // [1 key_seq_len/4 head_num head_dim 4] + __global const int* mask, // [1 1 query_seq_len key_seq_len 4] + __private const float scale, + __private const int query_seq_len, + __private const int key_seq_len, + __private const int head_num, + __private const int head_dim) { + + const int x = get_global_id(0); // query_seq_len / 4 for prefill 1 for decode + const int y = get_global_id(1); // head_num + const int z = get_global_id(2); // key_seq_len / 4 + DEAL_NON_UNIFORM_DIM3(x, y, z); + + const int offset = head_num * head_dim * 4; + const int offset_head = y * head_dim * 4; + __global const FLOAT *A_offset = input0 + x * offset + offset_head; + __global FLOAT *Pastkey_offset = past_key + z * offset + offset_head; + const int z4 = z << 2; + COMPUTE_FLOAT4 Vscale = (COMPUTE_FLOAT4)scale; +#ifdef OPENCL_PREFILL_ATTENTION + __global const FLOAT *B_offset = input1 + z * offset + offset_head; + const int x4 = x << 2; + const int query_seq_len4 = (query_seq_len + 3) / 4; + const int output_offset = y * query_seq_len4 * key_seq_len * 4; + COMPUTE_FLOAT4 out0 = 0; + COMPUTE_FLOAT4 out1 = 0; + COMPUTE_FLOAT4 out2 = 0; + COMPUTE_FLOAT4 out3 = 0; + + const int head_dim4 = (head_dim + 3) / 4; +#ifdef HEADDIM_LEAVE + for(int i = 0; i < head_dim4 - 1; ++i){ + COMPUTE_FLOAT16 A = CONVERT_COMPUTE_FLOAT16(vload16(i, A_offset)); + COMPUTE_FLOAT16 B = CONVERT_COMPUTE_FLOAT16(vload16(i, B_offset)); + + out0 = mad(A.s0123, (COMPUTE_FLOAT4)B.s0, out0); + out1 = mad(A.s0123, (COMPUTE_FLOAT4)B.s1, out1); + out2 = mad(A.s0123, (COMPUTE_FLOAT4)B.s2, out2); + out3 = mad(A.s0123, (COMPUTE_FLOAT4)B.s3, out3); + + out0 = mad(A.s4567, (COMPUTE_FLOAT4)B.s4, out0); + out1 = mad(A.s4567, (COMPUTE_FLOAT4)B.s5, out1); + out2 = mad(A.s4567, (COMPUTE_FLOAT4)B.s6, out2); + out3 = mad(A.s4567, (COMPUTE_FLOAT4)B.s7, out3); + + out0 = mad(A.s89ab, (COMPUTE_FLOAT4)B.s8, out0); + out1 = mad(A.s89ab, (COMPUTE_FLOAT4)B.s9, out1); + out2 = mad(A.s89ab, (COMPUTE_FLOAT4)B.sa, out2); + out3 = mad(A.s89ab, (COMPUTE_FLOAT4)B.sb, out3); + + out0 = mad(A.scdef, (COMPUTE_FLOAT4)B.sc, out0); + out1 = mad(A.scdef, (COMPUTE_FLOAT4)B.sd, out1); + out2 = mad(A.scdef, (COMPUTE_FLOAT4)B.se, out2); + out3 = mad(A.scdef, (COMPUTE_FLOAT4)B.sf, out3); + + vstore16(CONVERT_FLOAT16(B), i, Pastkey_offset); + } + for(int i = (head_dim4 - 1) * 4; i < head_dim; ++i){ + COMPUTE_FLOAT4 A = CONVERT_COMPUTE_FLOAT4(vload4(i, A_offset)); + COMPUTE_FLOAT4 B = CONVERT_COMPUTE_FLOAT4(vload4(i, B_offset)); + + out0 = mad(A, (COMPUTE_FLOAT4)B.s0, out0); + out1 = mad(A, (COMPUTE_FLOAT4)B.s1, out1); + out2 = mad(A, (COMPUTE_FLOAT4)B.s2, out2); + out3 = mad(A, (COMPUTE_FLOAT4)B.s3, out3); + + vstore4(CONVERT_FLOAT4(B), i, Pastkey_offset); + } +#else + for(int i = 0; i < head_dim4; ++i){ + COMPUTE_FLOAT16 A = CONVERT_COMPUTE_FLOAT16(vload16(i, A_offset)); + COMPUTE_FLOAT16 B = CONVERT_COMPUTE_FLOAT16(vload16(i, B_offset)); + + out0 = mad(A.s0123, (COMPUTE_FLOAT4)B.s0, out0); + out1 = mad(A.s0123, (COMPUTE_FLOAT4)B.s1, out1); + out2 = mad(A.s0123, (COMPUTE_FLOAT4)B.s2, out2); + out3 = mad(A.s0123, (COMPUTE_FLOAT4)B.s3, out3); + + out0 = mad(A.s4567, (COMPUTE_FLOAT4)B.s4, out0); + out1 = mad(A.s4567, (COMPUTE_FLOAT4)B.s5, out1); + out2 = mad(A.s4567, (COMPUTE_FLOAT4)B.s6, out2); + out3 = mad(A.s4567, (COMPUTE_FLOAT4)B.s7, out3); + + out0 = mad(A.s89ab, (COMPUTE_FLOAT4)B.s8, out0); + out1 = mad(A.s89ab, (COMPUTE_FLOAT4)B.s9, out1); + out2 = mad(A.s89ab, (COMPUTE_FLOAT4)B.sa, out2); + out3 = mad(A.s89ab, (COMPUTE_FLOAT4)B.sb, out3); + + out0 = mad(A.scdef, (COMPUTE_FLOAT4)B.sc, out0); + out1 = mad(A.scdef, (COMPUTE_FLOAT4)B.sd, out1); + out2 = mad(A.scdef, (COMPUTE_FLOAT4)B.se, out2); + out3 = mad(A.scdef, (COMPUTE_FLOAT4)B.sf, out3); + + vstore16(CONVERT_FLOAT16(B), i, Pastkey_offset); + } +#endif + + out0 *= Vscale; + out1 *= Vscale; + out2 *= Vscale; + out3 *= Vscale; + + out0.s0 = mask[((x4 + 0) * key_seq_len + (z4 + 0)) * 4] == 0 ? -FLT_MAX : out0.s0; + out1.s0 = mask[((x4 + 0) * key_seq_len + (z4 + 1)) * 4] == 0 ? -FLT_MAX : out1.s0; + out2.s0 = mask[((x4 + 0) * key_seq_len + (z4 + 2)) * 4] == 0 ? -FLT_MAX : out2.s0; + out3.s0 = mask[((x4 + 0) * key_seq_len + (z4 + 3)) * 4] == 0 ? -FLT_MAX : out3.s0; + + out0.s1 = mask[((x4 + 1) * key_seq_len + (z4 + 0)) * 4] == 0 ? -FLT_MAX : out0.s1; + out1.s1 = mask[((x4 + 1) * key_seq_len + (z4 + 1)) * 4] == 0 ? -FLT_MAX : out1.s1; + out2.s1 = mask[((x4 + 1) * key_seq_len + (z4 + 2)) * 4] == 0 ? -FLT_MAX : out2.s1; + out3.s1 = mask[((x4 + 1) * key_seq_len + (z4 + 3)) * 4] == 0 ? -FLT_MAX : out3.s1; + + out0.s2 = mask[((x4 + 2) * key_seq_len + (z4 + 0)) * 4] == 0 ? -FLT_MAX : out0.s2; + out1.s2 = mask[((x4 + 2) * key_seq_len + (z4 + 1)) * 4] == 0 ? -FLT_MAX : out1.s2; + out2.s2 = mask[((x4 + 2) * key_seq_len + (z4 + 2)) * 4] == 0 ? -FLT_MAX : out2.s2; + out3.s2 = mask[((x4 + 2) * key_seq_len + (z4 + 3)) * 4] == 0 ? -FLT_MAX : out3.s2; + + out0.s3 = mask[((x4 + 3) * key_seq_len + (z4 + 0)) * 4] == 0 ? -FLT_MAX : out0.s3; + out1.s3 = mask[((x4 + 3) * key_seq_len + (z4 + 1)) * 4] == 0 ? -FLT_MAX : out1.s3; + out2.s3 = mask[((x4 + 3) * key_seq_len + (z4 + 2)) * 4] == 0 ? -FLT_MAX : out2.s3; + out3.s3 = mask[((x4 + 3) * key_seq_len + (z4 + 3)) * 4] == 0 ? -FLT_MAX : out3.s3; + + vstore4(CONVERT_FLOAT4(out0), 0, output + output_offset + x * key_seq_len * 4 + z4 * 4); + if(z4 + 1 >= key_seq_len) return; + vstore4(CONVERT_FLOAT4(out1), 0, output + output_offset + x * key_seq_len * 4 + (z4 + 1) * 4); + if(z4 + 2 >= key_seq_len) return; + vstore4(CONVERT_FLOAT4(out2), 0, output + output_offset + x * key_seq_len * 4 + (z4 + 2) * 4); + if(z4 + 3 >= key_seq_len) return; + vstore4(CONVERT_FLOAT4(out3), 0, output + output_offset + x * key_seq_len * 4 + (z4 + 3) * 4); +#else + __global const FLOAT *B_offset = input1 + offset_head; + const int key_seq_len4 = (key_seq_len + 3) / 4; + COMPUTE_FLOAT4 out = 0; + const int head_dim4 = (head_dim + 3) / 4; + +#ifdef HEADDIM_LEAVE + for(int i = 0; i < head_dim4 - 1; ++i){ + COMPUTE_FLOAT16 A = CONVERT_COMPUTE_FLOAT16(vload16(i, A_offset)); + COMPUTE_FLOAT16 B = CONVERT_COMPUTE_FLOAT16(vload16(i, Pastkey_offset)); + + out = mad((COMPUTE_FLOAT4)A.s0, B.s0123, out); + out = mad((COMPUTE_FLOAT4)A.s4, B.s4567, out); + out = mad((COMPUTE_FLOAT4)A.s8, B.s89ab, out); + out = mad((COMPUTE_FLOAT4)A.sc, B.scdef, out); + } + for(int i = (head_dim4 - 1) * 4; i < head_dim; ++i){ + COMPUTE_FLOAT4 A = CONVERT_COMPUTE_FLOAT4(vload4(i, A_offset)); + COMPUTE_FLOAT4 B = CONVERT_COMPUTE_FLOAT4(vload4(i, Pastkey_offset)); + + out = mad((COMPUTE_FLOAT4)A.s0, B, out); + } +#else + for(int i = 0; i < head_dim4; ++i){ + COMPUTE_FLOAT16 A = CONVERT_COMPUTE_FLOAT16(vload16(i, A_offset)); + COMPUTE_FLOAT16 B = CONVERT_COMPUTE_FLOAT16(vload16(i, Pastkey_offset)); + + out = mad((COMPUTE_FLOAT4)A.s0, B.s0123, out); + out = mad((COMPUTE_FLOAT4)A.s4, B.s4567, out); + out = mad((COMPUTE_FLOAT4)A.s8, B.s89ab, out); + out = mad((COMPUTE_FLOAT4)A.sc, B.scdef, out); + } +#endif + if(z == key_seq_len4 - 1){ + int remain = key_seq_len - z * 4 - 1; + Pastkey_offset += remain; + COMPUTE_FLOAT tmp = 0; + for(int i = 0; i < head_dim; ++i){ + COMPUTE_FLOAT A = A_offset[i*4]; + COMPUTE_FLOAT B = B_offset[i*4]; + Pastkey_offset[i * 4] = B; + tmp += A * B; + } + COMPUTE_FLOAT *out_ptr = (COMPUTE_FLOAT*)&out; + out_ptr[remain] = tmp; + } + out *= Vscale; + vstore4(CONVERT_FLOAT4(out), 0, output + y * key_seq_len4 * 4 + z4); +#endif +} + +__kernel void matmul_qkv(GLOBAL_SIZE_3_DIMS + __global const FLOAT *input0, // qk prefill [1 head_num qk_seq_len/4 value_seq_len 4] decode[1 head_num value_seq_len/4 4] + __global const FLOAT *input1, // [1 value_seq_len/4 head_num head_dim 4] + __global FLOAT *output, // [1 qk_seq_len head_num*head_dim 1 4] + __global FLOAT *past_value, // [1 value_seq_len/4 head_num head_dim 4] + __private const int qk_seq_len, + __private const int value_seq_len, + __private const int head_num, + __private const int head_dim) { + + const int x = get_global_id(0); // prefill qk_seq_len / 4 decode 1 + const int y = get_global_id(1); // head_num + const int z = get_global_id(2); // head_dim + DEAL_NON_UNIFORM_DIM3(x, y, z); + +#ifdef OPENCL_PREFILL_ATTENTION + const int offset = head_num * head_dim * 4; + const int offset_head = y * head_dim * 4 + z * 4; + const int value_seq_len4 = (value_seq_len + 3) / 4; + const int qk_seq_len4 = (qk_seq_len + 3) / 4; + __global const FLOAT *A_offset = input0 + (y * qk_seq_len4 + x) * value_seq_len * 4; + __global const FLOAT *B_offset = input1 + offset_head; + __global FLOAT *Pastvalue_offset = past_value + offset_head; + COMPUTE_FLOAT4 out = 0; + + for(int i = 0; i < value_seq_len4 - 1; ++i){ + int index = i << 2; + COMPUTE_FLOAT4 A0 = CONVERT_COMPUTE_FLOAT4(vload4(index, A_offset)); + COMPUTE_FLOAT4 A1 = CONVERT_COMPUTE_FLOAT4(vload4(index + 1, A_offset)); + COMPUTE_FLOAT4 A2 = CONVERT_COMPUTE_FLOAT4(vload4(index + 2, A_offset)); + COMPUTE_FLOAT4 A3 = CONVERT_COMPUTE_FLOAT4(vload4(index + 3, A_offset)); + COMPUTE_FLOAT4 B = CONVERT_COMPUTE_FLOAT4(vload4(0, B_offset + i * offset)); + + out = mad(A0, (COMPUTE_FLOAT4)B.s0, out); + out = mad(A1, (COMPUTE_FLOAT4)B.s1, out); + out = mad(A2, (COMPUTE_FLOAT4)B.s2, out); + out = mad(A3, (COMPUTE_FLOAT4)B.s3, out); + + vstore4(CONVERT_FLOAT4(B), 0, Pastvalue_offset + i * offset); + } + + COMPUTE_FLOAT4 B = CONVERT_COMPUTE_FLOAT4(vload4(0, B_offset + (value_seq_len4 - 1) * offset)); + vstore4(CONVERT_FLOAT4(B), 0, Pastvalue_offset + (value_seq_len4 - 1) * offset); + COMPUTE_FLOAT *B_ptr = (COMPUTE_FLOAT*)&B; + for(int i = (value_seq_len4 - 1) * 4, j = 0; i < value_seq_len; ++i, ++j){ + COMPUTE_FLOAT4 A0 = CONVERT_COMPUTE_FLOAT4(vload4(i, A_offset)); + out = mad(A0, (COMPUTE_FLOAT4)B_ptr[j], out); + } + vstore4(CONVERT_FLOAT4(out), 0, output + x * offset + (y * head_dim + z) * 4); +#else + const int z4 = z << 2; + const int value_seq_len4 = (value_seq_len + 3) / 4; + const int offset = head_num * head_dim * 4; + const int offset_head = y * head_dim * 4 + z4 * 4; + const int loop = (value_seq_len + 2) / 4; + __global const FLOAT *A_offset = input0 + y * value_seq_len4 * 4; + __global const FLOAT *B_offset = input1 + offset_head; + __global FLOAT *Pastvalue_offset = past_value + offset_head; + COMPUTE_FLOAT4 out = 0; + + for(int i = 0; i < loop - 1; i++){ + COMPUTE_FLOAT4 A = CONVERT_COMPUTE_FLOAT4(vload4(i, A_offset)); + COMPUTE_FLOAT16 B = CONVERT_COMPUTE_FLOAT16(vload16(0, Pastvalue_offset + i * offset)); + + out.s0 += dot(A, B.s0123); + out.s1 += dot(A, B.s4567); + out.s2 += dot(A, B.s89ab); + out.s3 += dot(A, B.scdef); + } + int start = (loop - 1) < 0 ? 0 : (loop - 1); + COMPUTE_FLOAT16 B_Vec = CONVERT_COMPUTE_FLOAT16(vload16(0, Pastvalue_offset + start * offset)); + COMPUTE_FLOAT *B_ptr = (COMPUTE_FLOAT *)&B_Vec; + for(int i = start * 4; i < value_seq_len - 1; ++i){ + COMPUTE_FLOAT A = A_offset[i]; + + int index = i % 4; + out.s0 += A * B_ptr[index]; + out.s1 += A * B_ptr[index+4]; + out.s2 += A * B_ptr[index+8]; + out.s3 += A * B_ptr[index+12]; + } + COMPUTE_FLOAT A = A_offset[value_seq_len - 1]; + COMPUTE_FLOAT B0 = B_offset[0]; + COMPUTE_FLOAT B1 = B_offset[4]; + COMPUTE_FLOAT B2 = B_offset[8]; + COMPUTE_FLOAT B3 = B_offset[12]; + out.s0 += A * B0; + out.s1 += A * B1; + out.s2 += A * B2; + out.s3 += A * B3; + int index = ((value_seq_len - 1) >> 2) * offset + ((value_seq_len - 1) % 4); + +#ifdef HEADDIM_LEAVE + Pastvalue_offset[index] = B0; + output[(y * head_dim + z4) * 4] = out.s0; + if(z4 + 1 >= head_dim) return; + Pastvalue_offset[index + 4] = B1; + output[(y * head_dim + z4 + 1) * 4] = out.s1; + if(z4 + 2 >= head_dim) return; + Pastvalue_offset[index + 8] = B2; + output[(y * head_dim + z4 + 2) * 4] = out.s2; + if(z4 + 3 >= head_dim) return; + Pastvalue_offset[index + 12] = B3; + output[(y * head_dim + z4 + 3) * 4] = out.s3; +#else + Pastvalue_offset[index] = B0; + Pastvalue_offset[index + 4] = B1; + Pastvalue_offset[index + 8] = B2; + Pastvalue_offset[index + 12] = B3; + + output[(y * head_dim + z4) * 4] = out.s0; + output[(y * head_dim + z4 + 1) * 4] = out.s1; + output[(y * head_dim + z4 + 2) * 4] = out.s2; + output[(y * head_dim + z4 + 3) * 4] = out.s3; +#endif + +#endif +} + diff --git a/source/backend/opencl/execution/cl/conv_2d_buf.cl b/source/backend/opencl/execution/cl/conv_2d_buf.cl index c9936deca..ce041937c 100644 --- a/source/backend/opencl/execution/cl/conv_2d_buf.cl +++ b/source/backend/opencl/execution/cl/conv_2d_buf.cl @@ -1,19 +1,6 @@ #ifdef MNN_SUPPORT_FP16 #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif -#define READ_INPUT_IMAGE(i, base) \ - int in_width_value##i = in_width##i + base; \ - in_width_value##i = \ - select(in_idx + in_width_value##i, -1, (in_width_value##i < 0 || in_width_value##i >= input_shape.y)); \ - in_w_idx = in_width_value##i % input_shape.y; \ - inp_offset = (((in_b_idx*in_channel_block_length + in_channel_block_idx)*input_shape.x + in_h_idx)* input_shape.y + in_w_idx)*4; \ - in##i = (in_width_value##i)==-1 ? (FLOAT4)0 : vload4(0, input+inp_offset); - -#define CALCULATE_OUTPUT(i) \ - out##i = mad(in##i.x, weights0, out##i); \ - out##i = mad(in##i.y, weights1, out##i); \ - out##i = mad(in##i.z, weights2, out##i); \ - out##i = mad(in##i.w, weights3, out##i); #define GLOBAL_SIZE_2_DIMS __private const int global_size_dim0, __private const int global_size_dim1, @@ -46,10 +33,10 @@ void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_h_idx = out_b_h_idx % out_h; // equal to in_h_idx const int out_w4_idx = mul24(out_w_idx, 4); - FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias_ptr)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; const int intput_width_idx0 = out_w4_idx; @@ -59,15 +46,15 @@ void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int inp_add = out_h*out_w*4; for (ushort in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { - FLOAT4 in0 = vload4(0, input+inp_offset); - FLOAT4 in1 = vload4(1, input+inp_offset); - FLOAT4 in2 = vload4(2, input+inp_offset); - FLOAT4 in3 = vload4(3, input+inp_offset); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4(vload4(1, input+inp_offset)); + COMPUTE_FLOAT4 in2 = CONVERT_COMPUTE_FLOAT4(vload4(2, input+inp_offset)); + COMPUTE_FLOAT4 in3 = CONVERT_COMPUTE_FLOAT4(vload4(3, input+inp_offset)); - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); + COMPUTE_FLOAT4 weights0 = CONVERT_COMPUTE_FLOAT4(vload4(offset, kernel_ptr)); + COMPUTE_FLOAT4 weights1 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 1, kernel_ptr)); + COMPUTE_FLOAT4 weights2 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 2, kernel_ptr)); + COMPUTE_FLOAT4 weights3 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 3, kernel_ptr)); out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); @@ -94,34 +81,34 @@ void conv_2d_1x1_c4h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w4_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_w - out_w4_idx; if (remain >= 4) { - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); } else if (remain == 3) { - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - vstore4(out2, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2, output+out_offset); } else if (remain == 2) { - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); } else if (remain == 1) { - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); #endif } @@ -148,15 +135,15 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx const int out_w4_idx = mul24(out_w_idx, 4); - FLOAT4 out0 = vload4(out_c_idx<<1, (__global FLOAT *)bias_ptr); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx<<1, bias_ptr)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; - FLOAT4 out4 = vload4((out_c_idx<<1)+1, (__global FLOAT *)bias_ptr); - FLOAT4 out5 = out4; - FLOAT4 out6 = out4; - FLOAT4 out7 = out4; + COMPUTE_FLOAT4 out4 = CONVERT_COMPUTE_FLOAT4(vload4((out_c_idx<<1)+1, bias_ptr)); + COMPUTE_FLOAT4 out5 = out4; + COMPUTE_FLOAT4 out6 = out4; + COMPUTE_FLOAT4 out7 = out4; const int intput_width_idx0 = out_w4_idx; @@ -167,19 +154,19 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int inp_offset = (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; - FLOAT4 in0 = vload4(0, input+inp_offset); - FLOAT4 in1 = vload4(1, input+inp_offset);; - FLOAT4 in2 = vload4(2, input+inp_offset);; - FLOAT4 in3 = vload4(3, input+inp_offset);; - - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); - FLOAT4 weights4 = vload4(offset + 4, (__global FLOAT *)kernel_ptr); - FLOAT4 weights5 = vload4(offset + 5, (__global FLOAT *)kernel_ptr); - FLOAT4 weights6 = vload4(offset + 6, (__global FLOAT *)kernel_ptr); - FLOAT4 weights7 = vload4(offset + 7, (__global FLOAT *)kernel_ptr); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4(vload4(1, input+inp_offset)); + COMPUTE_FLOAT4 in2 = CONVERT_COMPUTE_FLOAT4(vload4(2, input+inp_offset)); + COMPUTE_FLOAT4 in3 = CONVERT_COMPUTE_FLOAT4(vload4(3, input+inp_offset)); + + COMPUTE_FLOAT4 weights0 = CONVERT_COMPUTE_FLOAT4(vload4(offset, kernel_ptr)); + COMPUTE_FLOAT4 weights1 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 1, kernel_ptr)); + COMPUTE_FLOAT4 weights2 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 2, kernel_ptr)); + COMPUTE_FLOAT4 weights3 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 3, kernel_ptr)); + COMPUTE_FLOAT4 weights4 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 4, kernel_ptr)); + COMPUTE_FLOAT4 weights5 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 5, kernel_ptr)); + COMPUTE_FLOAT4 weights6 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 6, kernel_ptr)); + COMPUTE_FLOAT4 weights7 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 7, kernel_ptr)); out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); @@ -223,45 +210,45 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); - out4 = fmax(out4, (FLOAT4)0); - out5 = fmax(out5, (FLOAT4)0); - out6 = fmax(out6, (FLOAT4)0); - out7 = fmax(out7, (FLOAT4)0); + out4 = fmax(out4, (COMPUTE_FLOAT4)0); + out5 = fmax(out5, (COMPUTE_FLOAT4)0); + out6 = fmax(out6, (COMPUTE_FLOAT4)0); + out7 = fmax(out7, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); - out4 = clamp(out4, (FLOAT4)0, (FLOAT4)6); - out5 = clamp(out5, (FLOAT4)0, (FLOAT4)6); - out6 = clamp(out6, (FLOAT4)0, (FLOAT4)6); - out7 = clamp(out7, (FLOAT4)0, (FLOAT4)6); + out4 = clamp(out4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out5 = clamp(out5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out6 = clamp(out6, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out7 = clamp(out7, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_block + out_c_idx*2)*out_h + out_h_idx)* out_w + out_w4_idx)*4; - __global FLOAT* _tempoutput = output + out_offset; - __global FLOAT* _tempoutput1 = _tempoutput + 4*out_h*out_w; + __global FLOAT * _tempoutput = output + out_offset; + __global FLOAT * _tempoutput1 = _tempoutput + 4*out_h*out_w; #ifdef BLOCK_LEAVE const int remain = out_w - out_w4_idx; if (remain >= 4) { - vstore16((FLOAT16)(out0, out1, out2, out3), 0, _tempoutput); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, _tempoutput); } else if (remain == 3) { - vstore8((FLOAT8)(out0, out1), 0, _tempoutput); - vstore4(out2, 2, _tempoutput); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, _tempoutput); + vstore4(CONVERT_FLOAT4(out2), 2, _tempoutput); } else if (remain == 2) { - vstore8((FLOAT8)(out0, out1), 0, _tempoutput); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, _tempoutput); } else if (remain == 1) { - vstore4(out0, 0, _tempoutput); + vstore4(CONVERT_FLOAT4(out0), 0, _tempoutput); } #ifdef CHANNEL_LEAVE if(out_c_idx*2+1 >= out_c_block) { @@ -269,23 +256,23 @@ void conv_2d_1x1_c8h1w4(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #endif if (remain >= 4) { - vstore16((FLOAT16)(out4, out5, out6, out7), 0, _tempoutput1); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out4, out5, out6, out7)), 0, _tempoutput1); } else if (remain == 3) { - vstore8((FLOAT8)(out4, out5), 0, _tempoutput1); - vstore4(out6, 2, _tempoutput1); + vstore8(CONVERT_FLOAT8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5))), 0, _tempoutput1); + vstore4(CONVERT_FLOAT4(out6), 2, _tempoutput1); } else if (remain == 2) { - vstore8((FLOAT8)(out4, out5), 0, _tempoutput1); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, _tempoutput1); } else if (remain == 1) { - vstore4(out4, 0, _tempoutput1); + vstore4(CONVERT_FLOAT4(out4), 0, _tempoutput1); } #else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, _tempoutput); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, _tempoutput); #ifdef CHANNEL_LEAVE if(out_c_idx*2+1 >= out_c_block) { return; } #endif - vstore16((FLOAT16)(out4, out5, out6, out7), 0, _tempoutput1); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out4, out5, out6, out7)), 0, _tempoutput1); #endif } @@ -312,11 +299,11 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx const int out_w2_idx = mul24(out_w_idx, 2); - FLOAT4 out0 = vload4(out_c_idx<<1, (__global FLOAT *)bias_ptr); - FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx<<1, bias_ptr)); + COMPUTE_FLOAT4 out1 = out0; - FLOAT4 out4 = vload4((out_c_idx<<1)+1, (__global FLOAT *)bias_ptr); - FLOAT4 out5 = out4; + COMPUTE_FLOAT4 out4 = CONVERT_COMPUTE_FLOAT4(vload4((out_c_idx<<1)+1, bias_ptr)); + COMPUTE_FLOAT4 out5 = out4; const int intput_width_idx0 = out_w2_idx; @@ -327,17 +314,17 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int inp_offset = (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; - FLOAT4 in0 = vload4(0, input+inp_offset); - FLOAT4 in1 = vload4(1, input+inp_offset);; - - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); - FLOAT4 weights4 = vload4(offset + 4, (__global FLOAT *)kernel_ptr); - FLOAT4 weights5 = vload4(offset + 5, (__global FLOAT *)kernel_ptr); - FLOAT4 weights6 = vload4(offset + 6, (__global FLOAT *)kernel_ptr); - FLOAT4 weights7 = vload4(offset + 7, (__global FLOAT *)kernel_ptr); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4(vload4(1, input+inp_offset)); + + COMPUTE_FLOAT4 weights0 = CONVERT_COMPUTE_FLOAT4(vload4(offset, kernel_ptr)); + COMPUTE_FLOAT4 weights1 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 1, kernel_ptr)); + COMPUTE_FLOAT4 weights2 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 2, kernel_ptr)); + COMPUTE_FLOAT4 weights3 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 3, kernel_ptr)); + COMPUTE_FLOAT4 weights4 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 4, kernel_ptr)); + COMPUTE_FLOAT4 weights5 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 5, kernel_ptr)); + COMPUTE_FLOAT4 weights6 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 6, kernel_ptr)); + COMPUTE_FLOAT4 weights7 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 7, kernel_ptr)); out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); @@ -361,33 +348,33 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); - out4 = fmax(out4, (FLOAT4)0); - out5 = fmax(out5, (FLOAT4)0); + out4 = fmax(out4, (COMPUTE_FLOAT4)0); + out5 = fmax(out5, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); - out4 = clamp(out4, (FLOAT4)0, (FLOAT4)6); - out5 = clamp(out5, (FLOAT4)0, (FLOAT4)6); + out4 = clamp(out4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out5 = clamp(out5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_block + out_c_idx*2)*out_h + out_h_idx)* out_w + out_w2_idx)*4; - __global FLOAT* _tempoutput = output + out_offset; - __global FLOAT* _tempoutput1 = _tempoutput + 4*out_h*out_w; + __global FLOAT * _tempoutput = output + out_offset; + __global FLOAT * _tempoutput1 = _tempoutput + 4*out_h*out_w; #ifdef BLOCK_LEAVE const int remain = out_w - out_w2_idx; if (remain >= 2) { - vstore8((FLOAT8)(out0, out1), 0, _tempoutput); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, _tempoutput); } else if (remain == 1) { - vstore4(out0, 0, _tempoutput); + vstore4(CONVERT_FLOAT4(out0), 0, _tempoutput); } #ifdef CHANNEL_LEAVE if(out_c_idx*2+1 >= out_c_block) { @@ -395,18 +382,18 @@ void conv_2d_1x1_c8h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #endif if (remain >= 2) { - vstore8((FLOAT8)(out4, out5), 0, _tempoutput1); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, _tempoutput1); } else if (remain == 1) { - vstore4(out4, 0, _tempoutput1); + vstore4(CONVERT_FLOAT4(out4), 0, _tempoutput1); } #else - vstore8((FLOAT8)(out0, out1), 0, _tempoutput); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, _tempoutput); #ifdef CHANNEL_LEAVE if(out_c_idx*2+1 >= out_c_block) { return; } #endif - vstore8((FLOAT8)(out4, out5), 0, _tempoutput1); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, _tempoutput1); #endif } @@ -431,7 +418,7 @@ void conv_2d_1x1_c4h1w1(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_b_idx = out_b_h_idx / out_h;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_h;//equal to in_h_idx - FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias_ptr)); const int intput_width_idx0 = out_w_idx; for (int in_channel_block_idx = 0; in_channel_block_idx < in_c_block; ++in_channel_block_idx) { @@ -441,12 +428,12 @@ void conv_2d_1x1_c4h1w1(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int inp_offset = (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; - FLOAT4 in0 = vload4(0, input+inp_offset); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); + COMPUTE_FLOAT4 weights0 = CONVERT_COMPUTE_FLOAT4(vload4(offset, kernel_ptr)); + COMPUTE_FLOAT4 weights1 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 1, kernel_ptr)); + COMPUTE_FLOAT4 weights2 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 2, kernel_ptr)); + COMPUTE_FLOAT4 weights3 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 3, kernel_ptr)); out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); @@ -455,16 +442,16 @@ void conv_2d_1x1_c4h1w1(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w_idx)*4; - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } @@ -491,8 +478,8 @@ void conv_2d_1x1_c4h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int out_w2_idx = mul24(out_w_idx, 2); - FLOAT4 out0 = vload4(out_c_idx, (__global FLOAT *)bias_ptr); - FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias_ptr)); + COMPUTE_FLOAT4 out1 = out0; const int intput_width_idx0 = out_w2_idx; @@ -503,13 +490,13 @@ void conv_2d_1x1_c4h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int inp_offset = (((out_b_idx*in_c_block + in_channel_block_idx)*out_h + out_h_idx)* out_w + intput_width_idx0)*4; - FLOAT4 in0 = vload4(0, input+inp_offset); - FLOAT4 in1 = vload4(1, input+inp_offset); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4(vload4(1, input+inp_offset)); - FLOAT4 weights0 = vload4(offset, (__global FLOAT *)kernel_ptr); - FLOAT4 weights1 = vload4(offset + 1, (__global FLOAT *)kernel_ptr); - FLOAT4 weights2 = vload4(offset + 2, (__global FLOAT *)kernel_ptr); - FLOAT4 weights3 = vload4(offset + 3, (__global FLOAT *)kernel_ptr); + COMPUTE_FLOAT4 weights0 = CONVERT_COMPUTE_FLOAT4(vload4(offset, kernel_ptr)); + COMPUTE_FLOAT4 weights1 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 1, kernel_ptr)); + COMPUTE_FLOAT4 weights2 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 2, kernel_ptr)); + COMPUTE_FLOAT4 weights3 = CONVERT_COMPUTE_FLOAT4(vload4(offset + 3, kernel_ptr)); out0.x += dot(weights0, in0); out0.y += dot(weights1, in0); @@ -523,13 +510,13 @@ void conv_2d_1x1_c4h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_block + out_c_idx)*out_h + out_h_idx)* out_w + out_w2_idx)*4; @@ -538,12 +525,12 @@ void conv_2d_1x1_c4h1w2(GLOBAL_SIZE_2_DIMS __private const int out_w_blocks, const int remain = out_w - out_w2_idx; if (remain >= 2) { - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); } else if (remain == 1) { - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #else - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); #endif } @@ -574,7 +561,7 @@ void conv_2d_c4h1w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 out0 = vload4(out_c_idx, bias); + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); @@ -596,14 +583,14 @@ void conv_2d_c4h1w1(GLOBAL_SIZE_2_DIMS for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { for(int ix = in_w_idx_start; ix < in_w_idx_end; ix += dilate_hw.y) { int inp_offset = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + ix) * 4; - FLOAT4 in0 = vload4(0, input+inp_offset); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); const int filter_w_inc = (ix-in_w_idx_start)/dilate_hw.y; - FLOAT4 weight0 = vload4(filter_w_inc, weight+weight_offset); - FLOAT4 weight1 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*3); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(filter_w_inc, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(filter_w_inc, weight+weight_offset+weight_oc_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -615,15 +602,15 @@ void conv_2d_c4h1w1(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } @@ -654,8 +641,8 @@ void conv_2d_c4h1w2(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out1 = out0; const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; @@ -679,13 +666,13 @@ void conv_2d_c4h1w2(GLOBAL_SIZE_2_DIMS const int in_w0_idx = fw * dilate_hw.y + in_w0_idx_base; const int in_w1_idx = fw * dilate_hw.y + in_w1_idx_base; - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w0_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w1_idx, input+inp_offset_base)); - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -702,22 +689,22 @@ void conv_2d_c4h1w2(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); if(out_w_idx + 1 >= out_hw.y) return; - vstore4(out1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), 1, output+out_offset); #else - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); #endif } @@ -748,10 +735,10 @@ void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; @@ -779,15 +766,15 @@ void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS const int in_w2_idx = fw * dilate_hw.y + in_w2_idx_base; const int in_w3_idx = fw * dilate_hw.y + in_w3_idx_base; - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); - FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); - FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w0_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w1_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w2_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w3_idx, input+inp_offset_base)); - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -814,17 +801,17 @@ void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; @@ -832,17 +819,17 @@ void conv_2d_c4h1w4(GLOBAL_SIZE_2_DIMS const int remain = out_hw.y - out_w_idx; if (remain >= 4) { - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); }else if(remain == 3){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - vstore4(out2, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2, output+out_offset); }else if(remain == 2){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); #endif } @@ -873,10 +860,10 @@ void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 2; - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); @@ -904,15 +891,15 @@ void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS const int in_h3_idx = (iy * dilate_hw.x + in_h3_idx_base) * in_hw.y; for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { - FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); - FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); - FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base); - FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base); - - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_oc_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); + COMPUTE_FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h0_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h1_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h2_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h3_idx + fw, input+inp_offset_base)); + + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -939,42 +926,42 @@ void conv_2d_c4h4w1(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.x - out_h_idx; if(remain >= 4){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); }else if(remain == 3){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); }else if(remain == 2){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #else - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); #endif } @@ -1005,14 +992,14 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 2; - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; - FLOAT4 out4 = vload4(out_c_idx + 1, bias); - FLOAT4 out5 = out4; - FLOAT4 out6 = out4; - FLOAT4 out7 = out4; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; + COMPUTE_FLOAT4 out4 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx + 1, bias)); + COMPUTE_FLOAT4 out5 = out4; + COMPUTE_FLOAT4 out6 = out4; + COMPUTE_FLOAT4 out7 = out4; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); @@ -1041,15 +1028,15 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS const int in_h3_idx = (iy * dilate_hw.x + in_h3_idx_base) * in_hw.y; for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { - FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); - FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); - FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base); - FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base); - - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_ic_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); + COMPUTE_FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h0_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h1_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h2_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h3_idx + fw, input+inp_offset_base)); + + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -1071,10 +1058,10 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS out3 = mad(in3.z, weight2, out3); out3 = mad(in3.w, weight3, out3); - weight0 = vload4(0, weight+weight_offset+weight_oc_offset); - weight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); - weight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); - weight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); + weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset)); + weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset)); + weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2)); + weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3)); out4 = mad(in0.x, weight0, out4); out4 = mad(in0.y, weight1, out4); @@ -1101,44 +1088,44 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); - out4 = fmax(out4, (FLOAT4)0); - out5 = fmax(out5, (FLOAT4)0); - out6 = fmax(out6, (FLOAT4)0); - out7 = fmax(out7, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); + out4 = fmax(out4, (COMPUTE_FLOAT4)0); + out5 = fmax(out5, (COMPUTE_FLOAT4)0); + out6 = fmax(out6, (COMPUTE_FLOAT4)0); + out7 = fmax(out7, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); - out4 = clamp(out4, (FLOAT4)0, (FLOAT4)6); - out5 = clamp(out5, (FLOAT4)0, (FLOAT4)6); - out6 = clamp(out6, (FLOAT4)0, (FLOAT4)6); - out7 = clamp(out7, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out4 = clamp(out4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out5 = clamp(out5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out6 = clamp(out6, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out7 = clamp(out7, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.x - out_h_idx; if(remain >= 4){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); }else if(remain == 3){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); }else if(remain == 2){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ @@ -1147,35 +1134,35 @@ void conv_2d_c8h4w1(GLOBAL_SIZE_2_DIMS #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; if(remain >= 4){ - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); - vstore4(out6, 2 * out_hw.y, output+out_offset); - vstore4(out7, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out7), 3 * out_hw.y, output+out_offset); }else if(remain == 3){ - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); - vstore4(out6, 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2 * out_hw.y, output+out_offset); }else if(remain == 2){ - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out4, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); } #else - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ return; } #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); - vstore4(out6, 2 * out_hw.y, output+out_offset); - vstore4(out7, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out7), 3 * out_hw.y, output+out_offset); #endif } @@ -1206,10 +1193,10 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 1; - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = vload4(out_c_idx + 1, bias); - FLOAT4 out3 = out2; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx + 1, bias)); + COMPUTE_FLOAT4 out3 = out2; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); @@ -1235,12 +1222,12 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS const int in_h1_idx = (iy * dilate_hw.x + in_h1_idx_base) * in_hw.y; for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { - FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); - FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_ic_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); + COMPUTE_FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h0_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_h1_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -1252,10 +1239,10 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS out1 = mad(in1.z, weight2, out1); out1 = mad(in1.w, weight3, out1); - weight0 = vload4(0, weight+weight_offset+weight_oc_offset); - weight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); - weight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); - weight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); + weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset)); + weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset)); + weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2)); + weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3)); out2 = mad(in0.x, weight0, out2); out2 = mad(in0.y, weight1, out2); @@ -1272,27 +1259,27 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.x - out_h_idx; if(remain >= 2){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ @@ -1301,22 +1288,22 @@ void conv_2d_c8h2w1(GLOBAL_SIZE_2_DIMS #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; if(remain >= 2){ - vstore4(out2, 0, output+out_offset); - vstore4(out3, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out2, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 0, output+out_offset); } #else - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ return; } #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out2, 0, output+out_offset); - vstore4(out3, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), out_hw.y, output+out_offset); #endif } @@ -1347,15 +1334,15 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + COMPUTE_FLOAT4 out0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; - FLOAT4 out4 = vload4(out_c_idx + 1, bias); - FLOAT4 out5 = out4; - FLOAT4 out6 = out4; - FLOAT4 out7 = out4; + COMPUTE_FLOAT4 out4 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx + 1, bias)); + COMPUTE_FLOAT4 out5 = out4; + COMPUTE_FLOAT4 out6 = out4; + COMPUTE_FLOAT4 out7 = out4; const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; @@ -1384,15 +1371,15 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS const int in_w2_idx = fw * dilate_hw.y + in_w2_idx_base; const int in_w3_idx = fw * dilate_hw.y + in_w3_idx_base; - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); - FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); - FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w0_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w1_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w2_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_w3_idx, input+inp_offset_base)); - FLOAT4 weight0 = vload4(0, weight+weight_offset); - FLOAT4 weight1 = vload4(0, weight+weight_offset+weight_ic_offset); - FLOAT4 weight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); - FLOAT4 weight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset)); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset)); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset*2)); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_ic_offset*3)); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); @@ -1414,10 +1401,10 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS out3 = mad(in3.z, weight2, out3); out3 = mad(in3.w, weight3, out3); - weight0 = vload4(0, weight+weight_offset+weight_oc_offset); - weight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); - weight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); - weight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); + weight0 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset)); + weight1 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset)); + weight2 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2)); + weight3 = CONVERT_COMPUTE_FLOAT4(vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3)); out4 = mad(in0.x, weight0, out4); out4 = mad(in0.y, weight1, out4); @@ -1444,60 +1431,60 @@ void conv_2d_c8h1w4(GLOBAL_SIZE_2_DIMS } } #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); - out4 = fmax(out4, (FLOAT4)0); - out5 = fmax(out5, (FLOAT4)0); - out6 = fmax(out6, (FLOAT4)0); - out7 = fmax(out7, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); + out4 = fmax(out4, (COMPUTE_FLOAT4)0); + out5 = fmax(out5, (COMPUTE_FLOAT4)0); + out6 = fmax(out6, (COMPUTE_FLOAT4)0); + out7 = fmax(out7, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); - out4 = clamp(out4, (FLOAT4)0, (FLOAT4)6); - out5 = clamp(out5, (FLOAT4)0, (FLOAT4)6); - out6 = clamp(out6, (FLOAT4)0, (FLOAT4)6); - out7 = clamp(out7, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out4 = clamp(out4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out5 = clamp(out5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out6 = clamp(out6, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out7 = clamp(out7, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.y - out_w_idx; if(remain >= 4){ - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); }else if(remain == 3){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - vstore4(out2, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2, output+out_offset); }else if(remain == 2){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks)return; #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; if(remain >= 4){ - vstore16((FLOAT16)(out4, out5, out6, out7), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out4, out5, out6, out7)), 0, output+out_offset); }else if(remain == 3){ - vstore8((FLOAT8)(out4, out5), 0, output+out_offset); - vstore4(out6, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2, output+out_offset); }else if(remain == 2){ - vstore8((FLOAT8)(out4, out5), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, output+out_offset); }else if(remain == 1){ - vstore4(out4, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); } #else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks)return; #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore16((FLOAT16)(out4, out5, out6, out7), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out4, out5, out6, out7)), 0, output+out_offset); #endif } diff --git a/source/backend/opencl/execution/cl/conv_2d_c16_subgroup_buf.cl b/source/backend/opencl/execution/cl/conv_2d_c16_subgroup_buf.cl index 3bac8c873..a64f6d9ab 100644 --- a/source/backend/opencl/execution/cl/conv_2d_c16_subgroup_buf.cl +++ b/source/backend/opencl/execution/cl/conv_2d_c16_subgroup_buf.cl @@ -98,19 +98,19 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b2( const uint filter_offset = feature_block * filter_os_pitch; #if SLM_DIV_FACTOR == 1 - FLOAT2 dst = (FLOAT2)(GROUP_READ(biases, feature_block * 16)); + COMPUTE_FLOAT2 dst = (COMPUTE_FLOAT2)((GROUP_READ(biases, feature_block * 16))); #else - FLOAT2 dst; + COMPUTE_FLOAT2 dst; if (feature_sub_block == 0) { - dst = (FLOAT2)(GROUP_READ(biases, feature_block * 16)); + dst = (COMPUTE_FLOAT2)((GROUP_READ(biases, feature_block * 16))); } else { - dst = (FLOAT2)0; + dst = (COMPUTE_FLOAT2)0; } #endif #if SLM_DIV_FACTOR > 1 - __local FLOAT2 sum[WORK_GROUP_SIZE]; + __local COMPUTE_FLOAT2 sum[WORK_GROUP_SIZE]; #endif @@ -129,10 +129,10 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b2( { int xb = 0; for (; xb + 8 <= INPUT_LINE_SIZE; xb += 8) { - FLOAT8 tmp = GROUP_READ8(input, input_offset + + COMPUTE_FLOAT8 tmp = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -144,10 +144,10 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b2( line_cache[xb + 7] = tmp[7]; } for (; xb + 4 <= INPUT_LINE_SIZE; xb += 4) { - FLOAT4 tmp = GROUP_READ4(input, input_offset + + COMPUTE_FLOAT4 tmp = CONVERT_COMPUTE_FLOAT4(GROUP_READ4(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -173,31 +173,31 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b2( src[i] = line_cache[kw * DILATION_WIDTH + STRIDE_WIDTH * i]; #endif } - FLOAT8 weight0 = GROUP_READ8(weights, filter_offset + + COMPUTE_FLOAT8 weight0 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + - kw * filter_x_pitch); - FLOAT8 weight1 = GROUP_READ8(weights, filter_offset + + kw * filter_x_pitch)); + COMPUTE_FLOAT8 weight1 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + kw * filter_x_pitch + - 8 * filter_isv_pitch); - const FLOAT2 src0 = GROUP_SHUFFLE2(src, 0); - const FLOAT2 src1 = GROUP_SHUFFLE2(src, 1); - const FLOAT2 src2 = GROUP_SHUFFLE2(src, 2); - const FLOAT2 src3 = GROUP_SHUFFLE2(src, 3); - const FLOAT2 src4 = GROUP_SHUFFLE2(src, 4); - const FLOAT2 src5 = GROUP_SHUFFLE2(src, 5); - const FLOAT2 src6 = GROUP_SHUFFLE2(src, 6); - const FLOAT2 src7 = GROUP_SHUFFLE2(src, 7); - const FLOAT2 src8 = GROUP_SHUFFLE2(src, 8); - const FLOAT2 src9 = GROUP_SHUFFLE2(src, 9); - const FLOAT2 src10 = GROUP_SHUFFLE2(src, 10); - const FLOAT2 src11 = GROUP_SHUFFLE2(src, 11); - const FLOAT2 src12 = GROUP_SHUFFLE2(src, 12); - const FLOAT2 src13 = GROUP_SHUFFLE2(src, 13); - const FLOAT2 src14 = GROUP_SHUFFLE2(src, 14); - const FLOAT2 src15 = GROUP_SHUFFLE2(src, 15); + 8 * filter_isv_pitch)); + const COMPUTE_FLOAT2 src0 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 0)); + const COMPUTE_FLOAT2 src1 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 1)); + const COMPUTE_FLOAT2 src2 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 2)); + const COMPUTE_FLOAT2 src3 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 3)); + const COMPUTE_FLOAT2 src4 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 4)); + const COMPUTE_FLOAT2 src5 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 5)); + const COMPUTE_FLOAT2 src6 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 6)); + const COMPUTE_FLOAT2 src7 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 7)); + const COMPUTE_FLOAT2 src8 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 8)); + const COMPUTE_FLOAT2 src9 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 9)); + const COMPUTE_FLOAT2 src10 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 10)); + const COMPUTE_FLOAT2 src11 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 11)); + const COMPUTE_FLOAT2 src12 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 12)); + const COMPUTE_FLOAT2 src13 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 13)); + const COMPUTE_FLOAT2 src14 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 14)); + const COMPUTE_FLOAT2 src15 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 15)); dst = mad(weight0.s0, src0, dst); dst = mad(weight0.s1, src1, dst); @@ -229,11 +229,11 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b2( #endif #ifdef RELU - dst = fmax(dst, (FLOAT2)0); + dst = fmax(dst, (COMPUTE_FLOAT2)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT2)0, (FLOAT2)6); + dst = clamp(dst, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); #endif const uint lid_x = sglid % 4; @@ -242,13 +242,13 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b2( if ((feature_block+1)*16 >= output_channel) { for (int i = 0; i < 2 && (x + i) < output_width; i++) { if ((feature_block*16 + lid_y * 4 + lid_x < output_channel)) - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } else { for (int i = 0; i < 2 && (x + i) < output_width; i++) { - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } #if SLM_DIV_FACTOR > 1 @@ -319,19 +319,19 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( const uint filter_offset = feature_block * filter_os_pitch; #if SLM_DIV_FACTOR == 1 - FLOAT4 dst = (FLOAT4)(GROUP_READ(biases, feature_block * 16)); + COMPUTE_FLOAT4 dst = (COMPUTE_FLOAT4)((GROUP_READ(biases, feature_block * 16))); #else - FLOAT4 dst; + COMPUTE_FLOAT4 dst; if (feature_sub_block == 0) { - dst = (FLOAT4)(GROUP_READ(biases, feature_block * 16)); + dst = (COMPUTE_FLOAT4)((GROUP_READ(biases, feature_block * 16))); } else { - dst = (FLOAT4)0; + dst = (COMPUTE_FLOAT4)0; } #endif #if SLM_DIV_FACTOR > 1 - __local FLOAT4 sum[WORK_GROUP_SIZE]; + __local COMPUTE_FLOAT4 sum[WORK_GROUP_SIZE]; #endif @@ -350,10 +350,10 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( { int xb = 0; for (; xb + 8 <= INPUT_LINE_SIZE; xb += 8) { - FLOAT8 tmp = GROUP_READ8(input, input_offset + + COMPUTE_FLOAT8 tmp = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -365,10 +365,10 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( line_cache[xb + 7] = tmp[7]; } for (; xb + 4 <= INPUT_LINE_SIZE; xb += 4) { - FLOAT4 tmp = GROUP_READ4(input, input_offset + + COMPUTE_FLOAT4 tmp = CONVERT_COMPUTE_FLOAT4(GROUP_READ4(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -376,7 +376,7 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( line_cache[xb + 3] = tmp[3]; } for (; xb < INPUT_LINE_SIZE; xb++) { - line_cache[xb] = GROUP_READ(input, input_offset + + line_cache[xb] = (COMPUTE_FLOAT)GROUP_READ(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + xb * input_x_pitch); @@ -394,31 +394,31 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( src[i] = line_cache[kw * DILATION_WIDTH + STRIDE_WIDTH * i]; #endif } - FLOAT8 weight0 = GROUP_READ8(weights, filter_offset + + COMPUTE_FLOAT8 weight0 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + - kw * filter_x_pitch); - FLOAT8 weight1 = GROUP_READ8(weights, filter_offset + + kw * filter_x_pitch)); + COMPUTE_FLOAT8 weight1 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + kw * filter_x_pitch + - 8 * filter_isv_pitch); - const FLOAT4 src0 = GROUP_SHUFFLE4(src, 0); - const FLOAT4 src1 = GROUP_SHUFFLE4(src, 1); - const FLOAT4 src2 = GROUP_SHUFFLE4(src, 2); - const FLOAT4 src3 = GROUP_SHUFFLE4(src, 3); - const FLOAT4 src4 = GROUP_SHUFFLE4(src, 4); - const FLOAT4 src5 = GROUP_SHUFFLE4(src, 5); - const FLOAT4 src6 = GROUP_SHUFFLE4(src, 6); - const FLOAT4 src7 = GROUP_SHUFFLE4(src, 7); - const FLOAT4 src8 = GROUP_SHUFFLE4(src, 8); - const FLOAT4 src9 = GROUP_SHUFFLE4(src, 9); - const FLOAT4 src10 = GROUP_SHUFFLE4(src, 10); - const FLOAT4 src11 = GROUP_SHUFFLE4(src, 11); - const FLOAT4 src12 = GROUP_SHUFFLE4(src, 12); - const FLOAT4 src13 = GROUP_SHUFFLE4(src, 13); - const FLOAT4 src14 = GROUP_SHUFFLE4(src, 14); - const FLOAT4 src15 = GROUP_SHUFFLE4(src, 15); + 8 * filter_isv_pitch)); + const COMPUTE_FLOAT4 src0 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 0)); + const COMPUTE_FLOAT4 src1 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 1)); + const COMPUTE_FLOAT4 src2 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 2)); + const COMPUTE_FLOAT4 src3 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 3)); + const COMPUTE_FLOAT4 src4 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 4)); + const COMPUTE_FLOAT4 src5 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 5)); + const COMPUTE_FLOAT4 src6 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 6)); + const COMPUTE_FLOAT4 src7 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 7)); + const COMPUTE_FLOAT4 src8 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 8)); + const COMPUTE_FLOAT4 src9 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 9)); + const COMPUTE_FLOAT4 src10 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 10)); + const COMPUTE_FLOAT4 src11 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 11)); + const COMPUTE_FLOAT4 src12 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 12)); + const COMPUTE_FLOAT4 src13 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 13)); + const COMPUTE_FLOAT4 src14 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 14)); + const COMPUTE_FLOAT4 src15 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 15)); dst = mad(weight0.s0, src0, dst); dst = mad(weight0.s1, src1, dst); @@ -450,11 +450,11 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( #endif #ifdef RELU - dst = fmax(dst, (FLOAT4)0); + dst = fmax(dst, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT4)0, (FLOAT4)6); + dst = clamp(dst, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const uint lid_x = sglid % 4; @@ -463,13 +463,13 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b4( if ((feature_block+1)*16 >= output_channel) { for (int i = 0; i < 4 && (x + i) < output_width; i++) { if ((feature_block*16 + lid_y * 4 + lid_x < output_channel)) - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } else { for (int i = 0; i < 4 && (x + i) < output_width; i++) { - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } #if SLM_DIV_FACTOR > 1 @@ -540,19 +540,19 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( const uint filter_offset = feature_block * filter_os_pitch; #if SLM_DIV_FACTOR == 1 - FLOAT8 dst = (FLOAT8)(GROUP_READ(biases, feature_block * 16)); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(GROUP_READ(biases, feature_block * 16)); #else - FLOAT8 dst; + COMPUTE_FLOAT8 dst; if (feature_sub_block == 0) { - dst = (FLOAT8)(GROUP_READ(biases, feature_block * 16)); + dst = (COMPUTE_FLOAT8)(GROUP_READ(biases, feature_block * 16)); } else { - dst = (FLOAT8)0; + dst = (COMPUTE_FLOAT8)0; } #endif #if SLM_DIV_FACTOR > 1 - __local FLOAT8 sum[WORK_GROUP_SIZE]; + __local COMPUTE_FLOAT8 sum[WORK_GROUP_SIZE]; #endif @@ -571,10 +571,10 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( { int xb = 0; for (; xb + 8 <= INPUT_LINE_SIZE; xb += 8) { - FLOAT8 tmp = GROUP_READ8(input, input_offset + + COMPUTE_FLOAT8 tmp = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -586,10 +586,10 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( line_cache[xb + 7] = tmp[7]; } for (; xb + 4 <= INPUT_LINE_SIZE; xb += 4) { - FLOAT4 tmp = GROUP_READ4(input, input_offset + + COMPUTE_FLOAT4 tmp = CONVERT_COMPUTE_FLOAT4(GROUP_READ4(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -597,7 +597,7 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( line_cache[xb + 3] = tmp[3]; } for (; xb < INPUT_LINE_SIZE; xb++) { - line_cache[xb] = GROUP_READ(input, input_offset + + line_cache[xb] = (COMPUTE_FLOAT)GROUP_READ(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + xb * input_x_pitch); @@ -615,31 +615,31 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( src[i] = line_cache[kw * DILATION_WIDTH + STRIDE_WIDTH * i]; #endif } - FLOAT8 weight0 = GROUP_READ8(weights, filter_offset + + COMPUTE_FLOAT8 weight0 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + - kw * filter_x_pitch); - FLOAT8 weight1 = GROUP_READ8(weights, filter_offset + + kw * filter_x_pitch)); + COMPUTE_FLOAT8 weight1 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + kw * filter_x_pitch + - 8 * filter_isv_pitch); - const FLOAT8 src0 = GROUP_SHUFFLE8(src, 0); - const FLOAT8 src1 = GROUP_SHUFFLE8(src, 1); - const FLOAT8 src2 = GROUP_SHUFFLE8(src, 2); - const FLOAT8 src3 = GROUP_SHUFFLE8(src, 3); - const FLOAT8 src4 = GROUP_SHUFFLE8(src, 4); - const FLOAT8 src5 = GROUP_SHUFFLE8(src, 5); - const FLOAT8 src6 = GROUP_SHUFFLE8(src, 6); - const FLOAT8 src7 = GROUP_SHUFFLE8(src, 7); - const FLOAT8 src8 = GROUP_SHUFFLE8(src, 8); - const FLOAT8 src9 = GROUP_SHUFFLE8(src, 9); - const FLOAT8 src10 = GROUP_SHUFFLE8(src, 10); - const FLOAT8 src11 = GROUP_SHUFFLE8(src, 11); - const FLOAT8 src12 = GROUP_SHUFFLE8(src, 12); - const FLOAT8 src13 = GROUP_SHUFFLE8(src, 13); - const FLOAT8 src14 = GROUP_SHUFFLE8(src, 14); - const FLOAT8 src15 = GROUP_SHUFFLE8(src, 15); + 8 * filter_isv_pitch)); + const COMPUTE_FLOAT8 src0 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 0)); + const COMPUTE_FLOAT8 src1 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 1)); + const COMPUTE_FLOAT8 src2 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 2)); + const COMPUTE_FLOAT8 src3 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 3)); + const COMPUTE_FLOAT8 src4 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 4)); + const COMPUTE_FLOAT8 src5 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 5)); + const COMPUTE_FLOAT8 src6 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 6)); + const COMPUTE_FLOAT8 src7 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 7)); + const COMPUTE_FLOAT8 src8 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 8)); + const COMPUTE_FLOAT8 src9 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 9)); + const COMPUTE_FLOAT8 src10 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 10)); + const COMPUTE_FLOAT8 src11 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 11)); + const COMPUTE_FLOAT8 src12 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 12)); + const COMPUTE_FLOAT8 src13 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 13)); + const COMPUTE_FLOAT8 src14 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 14)); + const COMPUTE_FLOAT8 src15 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 15)); dst = mad(weight0.s0, src0, dst); dst = mad(weight0.s1, src1, dst); @@ -671,11 +671,11 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( #endif #ifdef RELU - dst = fmax(dst, (FLOAT8)0); + dst = fmax(dst, (COMPUTE_FLOAT8)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT8)0, (FLOAT8)6); + dst = clamp(dst, (COMPUTE_FLOAT8)0, (COMPUTE_FLOAT8)6); #endif const uint lid_x = sglid % 4; @@ -684,13 +684,13 @@ __kernel void conv_2d_buf_subgroup_c16_c4_b8( if ((feature_block+1)*16 >= output_channel) { for (int i = 0; i < 8 && (x + i) < output_width; i++) { if ((feature_block*16 + lid_y * 4 + lid_x < output_channel)) - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } else { for (int i = 0; i < 8 && (x + i) < output_width; i++) { - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } #if SLM_DIV_FACTOR > 1 @@ -761,19 +761,19 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b2( const uint filter_offset = feature_block * filter_os_pitch; #if SLM_DIV_FACTOR == 1 - FLOAT2 dst = (FLOAT2)(GROUP_READ(biases, feature_block * 16)); + COMPUTE_FLOAT2 dst = (COMPUTE_FLOAT2)(GROUP_READ(biases, feature_block * 16)); #else - FLOAT2 dst; + COMPUTE_FLOAT2 dst; if (feature_sub_block == 0) { - dst = (FLOAT2)(GROUP_READ(biases, feature_block * 16)); + dst = (COMPUTE_FLOAT2)(GROUP_READ(biases, feature_block * 16)); } else { - dst = (FLOAT2)0; + dst = (COMPUTE_FLOAT2)0; } #endif #if SLM_DIV_FACTOR > 1 - __local FLOAT2 sum[WORK_GROUP_SIZE]; + __local COMPUTE_FLOAT2 sum[WORK_GROUP_SIZE]; #endif @@ -792,10 +792,10 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b2( { int xb = 0; for (; xb + 8 <= INPUT_LINE_SIZE; xb += 8) { - FLOAT8 tmp = GROUP_READ8(input, input_offset + + COMPUTE_FLOAT8 tmp = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -807,10 +807,10 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b2( line_cache[xb + 7] = tmp[7]; } for (; xb + 4 <= INPUT_LINE_SIZE; xb += 4) { - FLOAT4 tmp = GROUP_READ4(input, input_offset + + COMPUTE_FLOAT4 tmp = CONVERT_COMPUTE_FLOAT4(GROUP_READ4(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -818,7 +818,7 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b2( line_cache[xb + 3] = tmp[3]; } for (; xb < INPUT_LINE_SIZE; xb++) { - line_cache[xb] = GROUP_READ(input, input_offset + + line_cache[xb] = (COMPUTE_FLOAT)GROUP_READ(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + xb * input_x_pitch); @@ -836,31 +836,31 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b2( src[i] = line_cache[kw * DILATION_WIDTH + STRIDE_WIDTH * i]; #endif } - FLOAT8 weight0 = GROUP_READ8(weights, filter_offset + + COMPUTE_FLOAT8 weight0 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + - kw * filter_x_pitch); - FLOAT8 weight1 = GROUP_READ8(weights, filter_offset + + kw * filter_x_pitch)); + COMPUTE_FLOAT8 weight1 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + kw * filter_x_pitch + - 8 * filter_isv_pitch); - const FLOAT2 src0 = GROUP_SHUFFLE2(src, 0); - const FLOAT2 src1 = GROUP_SHUFFLE2(src, 1); - const FLOAT2 src2 = GROUP_SHUFFLE2(src, 2); - const FLOAT2 src3 = GROUP_SHUFFLE2(src, 3); - const FLOAT2 src4 = GROUP_SHUFFLE2(src, 4); - const FLOAT2 src5 = GROUP_SHUFFLE2(src, 5); - const FLOAT2 src6 = GROUP_SHUFFLE2(src, 6); - const FLOAT2 src7 = GROUP_SHUFFLE2(src, 7); - const FLOAT2 src8 = GROUP_SHUFFLE2(src, 8); - const FLOAT2 src9 = GROUP_SHUFFLE2(src, 9); - const FLOAT2 src10 = GROUP_SHUFFLE2(src, 10); - const FLOAT2 src11 = GROUP_SHUFFLE2(src, 11); - const FLOAT2 src12 = GROUP_SHUFFLE2(src, 12); - const FLOAT2 src13 = GROUP_SHUFFLE2(src, 13); - const FLOAT2 src14 = GROUP_SHUFFLE2(src, 14); - const FLOAT2 src15 = GROUP_SHUFFLE2(src, 15); + 8 * filter_isv_pitch)); + const COMPUTE_FLOAT2 src0 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 0)); + const COMPUTE_FLOAT2 src1 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 1)); + const COMPUTE_FLOAT2 src2 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 2)); + const COMPUTE_FLOAT2 src3 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 3)); + const COMPUTE_FLOAT2 src4 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 4)); + const COMPUTE_FLOAT2 src5 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 5)); + const COMPUTE_FLOAT2 src6 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 6)); + const COMPUTE_FLOAT2 src7 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 7)); + const COMPUTE_FLOAT2 src8 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 8)); + const COMPUTE_FLOAT2 src9 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 9)); + const COMPUTE_FLOAT2 src10 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 10)); + const COMPUTE_FLOAT2 src11 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 11)); + const COMPUTE_FLOAT2 src12 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 12)); + const COMPUTE_FLOAT2 src13 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 13)); + const COMPUTE_FLOAT2 src14 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 14)); + const COMPUTE_FLOAT2 src15 = CONVERT_COMPUTE_FLOAT2(GROUP_SHUFFLE2(src, 15)); dst = mad(weight0.s0, src0, dst); dst = mad(weight0.s1, src1, dst); @@ -903,26 +903,26 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b2( #endif #ifdef RELU - dst = fmax(dst, (FLOAT2)0); + dst = fmax(dst, (COMPUTE_FLOAT2)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT2)0, (FLOAT2)6); + dst = clamp(dst, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); #endif if ((feature_block+1)*16 >= output_channel) { for (int i = 0; i < 2; i++) { if ((feature_block*16 + sglid < output_channel) && (x + i) < output_width) - output[output_offset + i * output_x_pitch + sglid] = dst[i]; + output[output_offset + i * output_x_pitch + sglid] = (FLOAT)dst[i]; } } else { if (x + 2 <= output_width || output_width % 2 == 0) { - GROUP_WRITE2(output, output_offset, dst); + GROUP_WRITE2(output, output_offset, CONVERT_FLOAT2(dst)); }else{ for (int i = 0; i < output_width % 2; i++) { - output[output_offset + i * output_x_pitch + sglid] = dst[i]; + output[output_offset + i * output_x_pitch + sglid] = (FLOAT)dst[i]; } } } @@ -994,19 +994,19 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b4( const uint filter_offset = feature_block * filter_os_pitch; #if SLM_DIV_FACTOR == 1 - FLOAT4 dst = (FLOAT4)(GROUP_READ(biases, feature_block * 16)); + COMPUTE_FLOAT4 dst = (COMPUTE_FLOAT4)(GROUP_READ(biases, feature_block * 16)); #else - FLOAT4 dst; + COMPUTE_FLOAT4 dst; if (feature_sub_block == 0) { - dst = (FLOAT4)(GROUP_READ(biases, feature_block * 16)); + dst = (COMPUTE_FLOAT4)(GROUP_READ(biases, feature_block * 16)); } else { - dst = (FLOAT4)0; + dst = (COMPUTE_FLOAT4)0; } #endif #if SLM_DIV_FACTOR > 1 - __local FLOAT4 sum[WORK_GROUP_SIZE]; + __local COMPUTE_FLOAT4 sum[WORK_GROUP_SIZE]; #endif @@ -1025,10 +1025,10 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b4( { int xb = 0; for (; xb + 8 <= INPUT_LINE_SIZE; xb += 8) { - FLOAT8 tmp = GROUP_READ8(input, input_offset + + COMPUTE_FLOAT8 tmp = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -1040,10 +1040,10 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b4( line_cache[xb + 7] = tmp[7]; } for (; xb + 4 <= INPUT_LINE_SIZE; xb += 4) { - FLOAT4 tmp = GROUP_READ4(input, input_offset + + COMPUTE_FLOAT4 tmp = CONVERT_COMPUTE_FLOAT4(GROUP_READ4(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -1051,7 +1051,7 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b4( line_cache[xb + 3] = tmp[3]; } for (; xb < INPUT_LINE_SIZE; xb++) { - line_cache[xb] = GROUP_READ(input, input_offset + + line_cache[xb] = (COMPUTE_FLOAT)GROUP_READ(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + xb * input_x_pitch); @@ -1069,31 +1069,31 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b4( src[i] = line_cache[kw * DILATION_WIDTH + STRIDE_WIDTH * i]; #endif } - FLOAT8 weight0 = GROUP_READ8(weights, filter_offset + + COMPUTE_FLOAT8 weight0 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + - kw * filter_x_pitch); - FLOAT8 weight1 = GROUP_READ8(weights, filter_offset + + kw * filter_x_pitch)); + COMPUTE_FLOAT8 weight1 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + kw * filter_x_pitch + - 8 * filter_isv_pitch); - const FLOAT4 src0 = GROUP_SHUFFLE4(src, 0); - const FLOAT4 src1 = GROUP_SHUFFLE4(src, 1); - const FLOAT4 src2 = GROUP_SHUFFLE4(src, 2); - const FLOAT4 src3 = GROUP_SHUFFLE4(src, 3); - const FLOAT4 src4 = GROUP_SHUFFLE4(src, 4); - const FLOAT4 src5 = GROUP_SHUFFLE4(src, 5); - const FLOAT4 src6 = GROUP_SHUFFLE4(src, 6); - const FLOAT4 src7 = GROUP_SHUFFLE4(src, 7); - const FLOAT4 src8 = GROUP_SHUFFLE4(src, 8); - const FLOAT4 src9 = GROUP_SHUFFLE4(src, 9); - const FLOAT4 src10 = GROUP_SHUFFLE4(src, 10); - const FLOAT4 src11 = GROUP_SHUFFLE4(src, 11); - const FLOAT4 src12 = GROUP_SHUFFLE4(src, 12); - const FLOAT4 src13 = GROUP_SHUFFLE4(src, 13); - const FLOAT4 src14 = GROUP_SHUFFLE4(src, 14); - const FLOAT4 src15 = GROUP_SHUFFLE4(src, 15); + 8 * filter_isv_pitch)); + const COMPUTE_FLOAT4 src0 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 0)); + const COMPUTE_FLOAT4 src1 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 1)); + const COMPUTE_FLOAT4 src2 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 2)); + const COMPUTE_FLOAT4 src3 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 3)); + const COMPUTE_FLOAT4 src4 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 4)); + const COMPUTE_FLOAT4 src5 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 5)); + const COMPUTE_FLOAT4 src6 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 6)); + const COMPUTE_FLOAT4 src7 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 7)); + const COMPUTE_FLOAT4 src8 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 8)); + const COMPUTE_FLOAT4 src9 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 9)); + const COMPUTE_FLOAT4 src10 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 10)); + const COMPUTE_FLOAT4 src11 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 11)); + const COMPUTE_FLOAT4 src12 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 12)); + const COMPUTE_FLOAT4 src13 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 13)); + const COMPUTE_FLOAT4 src14 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 14)); + const COMPUTE_FLOAT4 src15 = CONVERT_COMPUTE_FLOAT4(GROUP_SHUFFLE4(src, 15)); dst = mad(weight0.s0, src0, dst); dst = mad(weight0.s1, src1, dst); @@ -1136,26 +1136,26 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b4( #endif #ifdef RELU - dst = fmax(dst, (FLOAT4)0); + dst = fmax(dst, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT4)0, (FLOAT4)6); + dst = clamp(dst, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif if ((feature_block+1)*16 >= output_channel) { for (int i = 0; i < 4; i++) { if ((feature_block*16 + sglid < output_channel) && (x + i) < output_width) - output[output_offset + i * output_x_pitch + sglid] = dst[i]; + output[output_offset + i * output_x_pitch + sglid] = (FLOAT)dst[i]; } } else { if (x + 4 <= output_width || output_width % 4 == 0) { - GROUP_WRITE4(output, output_offset, dst); + GROUP_WRITE4(output, output_offset, CONVERT_FLOAT4(dst)); }else{ for (int i = 0; i < output_width % 4; i++) { - output[output_offset + i * output_x_pitch + sglid] = dst[i]; + output[output_offset + i * output_x_pitch + sglid] = (FLOAT)dst[i]; } } } @@ -1227,19 +1227,19 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( const uint filter_offset = feature_block * filter_os_pitch; #if SLM_DIV_FACTOR == 1 - FLOAT8 dst = (FLOAT8)(GROUP_READ(biases, feature_block * 16)); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(GROUP_READ(biases, feature_block * 16)); #else - FLOAT8 dst; + COMPUTE_FLOAT8 dst; if (feature_sub_block == 0) { - dst = (FLOAT8)(GROUP_READ(biases, feature_block * 16)); + dst = (COMPUTE_FLOAT8)(GROUP_READ(biases, feature_block * 16)); } else { - dst = (FLOAT8)0; + dst = (COMPUTE_FLOAT8)0; } #endif #if SLM_DIV_FACTOR > 1 - __local FLOAT8 sum[WORK_GROUP_SIZE]; + __local COMPUTE_FLOAT8 sum[WORK_GROUP_SIZE]; #endif @@ -1258,10 +1258,10 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( { int xb = 0; for (; xb + 8 <= INPUT_LINE_SIZE; xb += 8) { - FLOAT8 tmp = GROUP_READ8(input, input_offset + + COMPUTE_FLOAT8 tmp = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -1273,10 +1273,10 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( line_cache[xb + 7] = tmp[7]; } for (; xb + 4 <= INPUT_LINE_SIZE; xb += 4) { - FLOAT4 tmp = GROUP_READ4(input, input_offset + + COMPUTE_FLOAT4 tmp = CONVERT_COMPUTE_FLOAT4(GROUP_READ4(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + - xb * input_x_pitch); + xb * input_x_pitch)); line_cache[xb + 0] = tmp[0]; line_cache[xb + 1] = tmp[1]; @@ -1284,7 +1284,7 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( line_cache[xb + 3] = tmp[3]; } for (; xb < INPUT_LINE_SIZE; xb++) { - line_cache[xb] = GROUP_READ(input, input_offset + + line_cache[xb] = (COMPUTE_FLOAT)GROUP_READ(input, input_offset + icb * input_fs_pitch + kh * DILATION_HEIGHT * input_y_pitch + xb * input_x_pitch); @@ -1302,31 +1302,31 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( src[i] = line_cache[kw * DILATION_WIDTH + STRIDE_WIDTH * i]; #endif } - FLOAT8 weight0 = GROUP_READ8(weights, filter_offset + + COMPUTE_FLOAT8 weight0 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + - kw * filter_x_pitch); - FLOAT8 weight1 = GROUP_READ8(weights, filter_offset + + kw * filter_x_pitch)); + COMPUTE_FLOAT8 weight1 = CONVERT_COMPUTE_FLOAT8(GROUP_READ8(weights, filter_offset + icb * filter_is_pitch + kh * filter_y_pitch + kw * filter_x_pitch + - 8 * filter_isv_pitch); - const FLOAT8 src0 = GROUP_SHUFFLE8(src, 0); - const FLOAT8 src1 = GROUP_SHUFFLE8(src, 1); - const FLOAT8 src2 = GROUP_SHUFFLE8(src, 2); - const FLOAT8 src3 = GROUP_SHUFFLE8(src, 3); - const FLOAT8 src4 = GROUP_SHUFFLE8(src, 4); - const FLOAT8 src5 = GROUP_SHUFFLE8(src, 5); - const FLOAT8 src6 = GROUP_SHUFFLE8(src, 6); - const FLOAT8 src7 = GROUP_SHUFFLE8(src, 7); - const FLOAT8 src8 = GROUP_SHUFFLE8(src, 8); - const FLOAT8 src9 = GROUP_SHUFFLE8(src, 9); - const FLOAT8 src10 = GROUP_SHUFFLE8(src, 10); - const FLOAT8 src11 = GROUP_SHUFFLE8(src, 11); - const FLOAT8 src12 = GROUP_SHUFFLE8(src, 12); - const FLOAT8 src13 = GROUP_SHUFFLE8(src, 13); - const FLOAT8 src14 = GROUP_SHUFFLE8(src, 14); - const FLOAT8 src15 = GROUP_SHUFFLE8(src, 15); + 8 * filter_isv_pitch)); + const COMPUTE_FLOAT8 src0 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 0)); + const COMPUTE_FLOAT8 src1 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 1)); + const COMPUTE_FLOAT8 src2 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 2)); + const COMPUTE_FLOAT8 src3 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 3)); + const COMPUTE_FLOAT8 src4 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 4)); + const COMPUTE_FLOAT8 src5 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 5)); + const COMPUTE_FLOAT8 src6 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 6)); + const COMPUTE_FLOAT8 src7 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 7)); + const COMPUTE_FLOAT8 src8 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 8)); + const COMPUTE_FLOAT8 src9 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 9)); + const COMPUTE_FLOAT8 src10 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 10)); + const COMPUTE_FLOAT8 src11 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 11)); + const COMPUTE_FLOAT8 src12 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 12)); + const COMPUTE_FLOAT8 src13 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 13)); + const COMPUTE_FLOAT8 src14 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 14)); + const COMPUTE_FLOAT8 src15 = CONVERT_COMPUTE_FLOAT8(GROUP_SHUFFLE8(src, 15)); dst = mad(weight0.s0, src0, dst); dst = mad(weight0.s1, src1, dst); @@ -1369,11 +1369,11 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( #endif #ifdef RELU - dst = fmax(dst, (FLOAT8)0); + dst = fmax(dst, (COMPUTE_FLOAT8)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT8)0, (FLOAT8)6); + dst = clamp(dst, (COMPUTE_FLOAT8)0, (COMPUTE_FLOAT8)6); #endif @@ -1381,16 +1381,16 @@ __kernel void conv_2d_buf_subgroup_c16_c16_b8( if ((feature_block+1)*16 >= output_channel) { for (int i = 0; i < 8; i++) { if ((feature_block*16 + sglid < output_channel) && (x + i) < output_width) - output[output_offset + i * output_x_pitch + sglid] = dst[i]; + output[output_offset + i * output_x_pitch + sglid] = (FLOAT)dst[i]; } } else { if (x + 8 <= output_width || output_width % 8 == 0) { - GROUP_WRITE8(output, output_offset, dst); + GROUP_WRITE8(output, output_offset, CONVERT_FLOAT8(dst)); }else{ for (int i = 0; i < output_width % 8; i++) { - output[output_offset + i * output_x_pitch + sglid] = dst[i]; + output[output_offset + i * output_x_pitch + sglid] = (FLOAT)dst[i]; } } } diff --git a/source/backend/opencl/execution/cl/conv_2d_c1_subgroup_buf.cl b/source/backend/opencl/execution/cl/conv_2d_c1_subgroup_buf.cl index c32f04b46..6e4f81324 100644 --- a/source/backend/opencl/execution/cl/conv_2d_c1_subgroup_buf.cl +++ b/source/backend/opencl/execution/cl/conv_2d_c1_subgroup_buf.cl @@ -97,7 +97,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b2( const uint filter_offset = f_block * filter_os_pitch; uint bias_offset = f_block * 16; - FLOAT2 dst = (FLOAT2)(GROUP_READ(biases, bias_offset)); + COMPUTE_FLOAT2 dst = (COMPUTE_FLOAT2)(GROUP_READ(biases, bias_offset)); FLOAT line_cache[INPUT_CHANNEL * INPUT_BLOCK_SIZE]; for (int ic = 0; ic < INPUT_CHANNEL; ic++) @@ -127,7 +127,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b2( { uint offset = filter_offset + kh * filter_y_pitch + kw * filter_x_pitch; - FLOAT wei[INPUT_CHANNEL]; + COMPUTE_FLOAT wei[INPUT_CHANNEL]; __attribute__((opencl_unroll_hint(INPUT_CHANNEL))) for (int ic = 0; ic < INPUT_CHANNEL; ic++) wei[ic] = GROUP_READ(weights, offset + ic * filter_isv_pitch); @@ -139,7 +139,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b2( const uint buf_group = (kw*DILATION_WIDTH + STRIDE_WIDTH * i + (kh*DILATION_HEIGHT) * INPUT_LINE_SIZE) % 16; for (int ic = 0; ic < INPUT_CHANNEL; ic++) { - FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); + COMPUTE_FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); dst[i] = mad(wei[ic], src, dst[i]); } } @@ -147,11 +147,11 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b2( } #ifdef RELU - dst = fmax(dst, (FLOAT2)0); + dst = fmax(dst, (COMPUTE_FLOAT2)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT2)0, (FLOAT2)6); + dst = clamp(dst, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); #endif const uint lid_x = lid % 4; @@ -160,13 +160,13 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b2( if ((f_block+1)*16 >= output_channel) { for (int i = 0; i < 2 && (x + i) < output_width; i++) { if ((f_block*16 + lid_y * 4 < output_pack * 4)) - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } else { for (int i = 0; i < 2 && (x + i) < output_width; i++) { - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } } @@ -234,7 +234,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b4( const uint filter_offset = f_block * filter_os_pitch; uint bias_offset = f_block * 16; - FLOAT4 dst = (FLOAT4)(GROUP_READ(biases, bias_offset)); + COMPUTE_FLOAT4 dst = (COMPUTE_FLOAT4)(GROUP_READ(biases, bias_offset)); FLOAT line_cache[INPUT_CHANNEL * INPUT_BLOCK_SIZE]; for (int ic = 0; ic < INPUT_CHANNEL; ic++) @@ -264,7 +264,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b4( { uint offset = filter_offset + kh * filter_y_pitch + kw * filter_x_pitch; - FLOAT wei[INPUT_CHANNEL]; + COMPUTE_FLOAT wei[INPUT_CHANNEL]; __attribute__((opencl_unroll_hint(INPUT_CHANNEL))) for (int ic = 0; ic < INPUT_CHANNEL; ic++) wei[ic] = GROUP_READ(weights, offset + ic * filter_isv_pitch); @@ -276,7 +276,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b4( const uint buf_group = (kw*DILATION_WIDTH + STRIDE_WIDTH * i + (kh*DILATION_HEIGHT) * INPUT_LINE_SIZE) % 16; for (int ic = 0; ic < INPUT_CHANNEL; ic++) { - FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); + COMPUTE_FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); dst[i] = mad(wei[ic], src, dst[i]); } } @@ -284,11 +284,11 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b4( } #ifdef RELU - dst = fmax(dst, (FLOAT4)0); + dst = fmax(dst, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT4)0, (FLOAT4)6); + dst = clamp(dst, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const uint lid_x = lid % 4; @@ -297,13 +297,13 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b4( if ((f_block+1)*16 >= output_channel) { for (int i = 0; i < 4 && (x + i) < output_width; i++) { if ((f_block*16 + lid_y * 4 < output_pack * 4)) - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } else { for (int i = 0; i < 4 && (x + i) < output_width; i++) { - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } } @@ -371,7 +371,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b8( const uint filter_offset = f_block * filter_os_pitch; uint bias_offset = f_block * 16; - FLOAT8 dst = (FLOAT8)(GROUP_READ(biases, bias_offset)); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(GROUP_READ(biases, bias_offset)); FLOAT line_cache[INPUT_CHANNEL * INPUT_BLOCK_SIZE]; for (int ic = 0; ic < INPUT_CHANNEL; ic++) @@ -401,7 +401,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b8( { uint offset = filter_offset + kh * filter_y_pitch + kw * filter_x_pitch; - FLOAT wei[INPUT_CHANNEL]; + COMPUTE_FLOAT wei[INPUT_CHANNEL]; __attribute__((opencl_unroll_hint(INPUT_CHANNEL))) for (int ic = 0; ic < INPUT_CHANNEL; ic++) wei[ic] = GROUP_READ(weights, offset + ic * filter_isv_pitch); @@ -413,7 +413,7 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b8( const uint buf_group = (kw*DILATION_WIDTH + STRIDE_WIDTH * i + (kh*DILATION_HEIGHT) * INPUT_LINE_SIZE) % 16; for (int ic = 0; ic < INPUT_CHANNEL; ic++) { - FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); + COMPUTE_FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); dst[i] = mad(wei[ic], src, dst[i]); } } @@ -421,11 +421,11 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b8( } #ifdef RELU - dst = fmax(dst, (FLOAT8)0); + dst = fmax(dst, (COMPUTE_FLOAT8)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT8)0, (FLOAT8)6); + dst = clamp(dst, (COMPUTE_FLOAT8)0, (COMPUTE_FLOAT8)6); #endif const uint lid_x = lid % 4; @@ -434,13 +434,13 @@ __kernel void conv_2d_buf_subgroup_c1_c4_b8( if ((f_block+1)*16 >= output_channel) { for (int i = 0; i < 8 && (x + i) < output_width; i++) { if ((f_block*16 + lid_y * 4 < output_pack * 4)) - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } else { for (int i = 0; i < 8 && (x + i) < output_width; i++) { - output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = dst[i]; + output[output_offset + lid_y * output_fs_pitch + i * output_x_pitch + lid_x] = (FLOAT)dst[i]; } } } @@ -507,7 +507,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b2( const uint filter_offset = f_block * filter_os_pitch; uint bias_offset = f_block * 16; - FLOAT2 dst = (FLOAT2)(GROUP_READ(biases, bias_offset)); + COMPUTE_FLOAT2 dst = (COMPUTE_FLOAT2)(GROUP_READ(biases, bias_offset)); FLOAT line_cache[INPUT_CHANNEL * INPUT_BLOCK_SIZE]; for (int ic = 0; ic < INPUT_CHANNEL; ic++) @@ -537,7 +537,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b2( { uint offset = filter_offset + kh * filter_y_pitch + kw * filter_x_pitch; - FLOAT wei[INPUT_CHANNEL]; + COMPUTE_FLOAT wei[INPUT_CHANNEL]; __attribute__((opencl_unroll_hint(INPUT_CHANNEL))) for (int ic = 0; ic < INPUT_CHANNEL; ic++) wei[ic] = GROUP_READ(weights, offset + ic * filter_isv_pitch); @@ -549,7 +549,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b2( const uint buf_group = (kw*DILATION_WIDTH + STRIDE_WIDTH * i + (kh*DILATION_HEIGHT) * INPUT_LINE_SIZE) % 16; for (int ic = 0; ic < INPUT_CHANNEL; ic++) { - FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); + COMPUTE_FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); dst[i] = mad(wei[ic], src, dst[i]); } } @@ -557,11 +557,11 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b2( } #ifdef RELU - dst = fmax(dst, (FLOAT2)0); + dst = fmax(dst, (COMPUTE_FLOAT2)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT2)0, (FLOAT2)6); + dst = clamp(dst, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); #endif if(x == 0){ @@ -579,16 +579,16 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b2( if ((f_block+1)*16 >= output_channel) { for (int i = 0; i < 2; i++) { if ((f_block*16 + lid < output_channel) && (x + i) < output_width) - output[output_offset + i * output_x_pitch + lid] = dst[i]; + output[output_offset + i * output_x_pitch + lid] = (FLOAT)dst[i]; } } else { if (x + 2 <= output_width || output_width % 2 == 0) { - GROUP_WRITE2(output, output_offset, dst); + GROUP_WRITE2(output, output_offset, CONVERT_FLOAT2(dst)); }else{ for (int i = 0; i < output_width % 2; i++) { - output[output_offset + i * output_x_pitch + lid] = dst[i]; + output[output_offset + i * output_x_pitch + lid] = (FLOAT)dst[i]; } } } @@ -656,7 +656,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b4( const uint filter_offset = f_block * filter_os_pitch; uint bias_offset = f_block * 16; - FLOAT4 dst = (FLOAT4)(GROUP_READ(biases, bias_offset)); + COMPUTE_FLOAT4 dst = (COMPUTE_FLOAT4)(GROUP_READ(biases, bias_offset)); FLOAT line_cache[INPUT_CHANNEL * INPUT_BLOCK_SIZE]; for (int ic = 0; ic < INPUT_CHANNEL; ic++) @@ -686,7 +686,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b4( { uint offset = filter_offset + kh * filter_y_pitch + kw * filter_x_pitch; - FLOAT wei[INPUT_CHANNEL]; + COMPUTE_FLOAT wei[INPUT_CHANNEL]; __attribute__((opencl_unroll_hint(INPUT_CHANNEL))) for (int ic = 0; ic < INPUT_CHANNEL; ic++) wei[ic] = GROUP_READ(weights, offset + ic * filter_isv_pitch); @@ -698,7 +698,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b4( const uint buf_group = (kw*DILATION_WIDTH + STRIDE_WIDTH * i + (kh*DILATION_HEIGHT) * INPUT_LINE_SIZE) % 16; for (int ic = 0; ic < INPUT_CHANNEL; ic++) { - FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); + COMPUTE_FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); dst[i] = mad(wei[ic], src, dst[i]); } } @@ -706,11 +706,11 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b4( } #ifdef RELU - dst = fmax(dst, (FLOAT4)0); + dst = fmax(dst, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT4)0, (FLOAT4)6); + dst = clamp(dst, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif if(x == 0){ @@ -728,16 +728,16 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b4( if ((f_block+1)*16 >= output_channel) { for (int i = 0; i < 4; i++) { if ((f_block*16 + lid < output_channel) && (x + i) < output_width) - output[output_offset + i * output_x_pitch + lid] = dst[i]; + output[output_offset + i * output_x_pitch + lid] = (FLOAT)dst[i]; } } else { if (x + 4 <= output_width || output_width % 4 == 0) { - GROUP_WRITE4(output, output_offset, dst); + GROUP_WRITE4(output, output_offset, CONVERT_FLOAT4(dst)); }else{ for (int i = 0; i < output_width % 4; i++) { - output[output_offset + i * output_x_pitch + lid] = dst[i]; + output[output_offset + i * output_x_pitch + lid] = (FLOAT)dst[i]; } } } @@ -805,7 +805,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b8( const uint filter_offset = f_block * filter_os_pitch; uint bias_offset = f_block * 16; - FLOAT8 dst = (FLOAT8)(GROUP_READ(biases, bias_offset)); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(GROUP_READ(biases, bias_offset)); FLOAT line_cache[INPUT_CHANNEL * INPUT_BLOCK_SIZE]; for (int ic = 0; ic < INPUT_CHANNEL; ic++) @@ -835,7 +835,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b8( { uint offset = filter_offset + kh * filter_y_pitch + kw * filter_x_pitch; - FLOAT wei[INPUT_CHANNEL]; + COMPUTE_FLOAT wei[INPUT_CHANNEL]; __attribute__((opencl_unroll_hint(INPUT_CHANNEL))) for (int ic = 0; ic < INPUT_CHANNEL; ic++) wei[ic] = GROUP_READ(weights, offset + ic * filter_isv_pitch); @@ -847,7 +847,7 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b8( const uint buf_group = (kw*DILATION_WIDTH + STRIDE_WIDTH * i + (kh*DILATION_HEIGHT) * INPUT_LINE_SIZE) % 16; for (int ic = 0; ic < INPUT_CHANNEL; ic++) { - FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); + COMPUTE_FLOAT src = GROUP_SHUFFLE(line_cache[ic * INPUT_BLOCK_SIZE + buf_offset], buf_group); dst[i] = mad(wei[ic], src, dst[i]); } } @@ -855,11 +855,11 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b8( } #ifdef RELU - dst = fmax(dst, (FLOAT8)0); + dst = fmax(dst, (COMPUTE_FLOAT8)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT8)0, (FLOAT8)6); + dst = clamp(dst, (COMPUTE_FLOAT8)0, (COMPUTE_FLOAT8)6); #endif if(x == 0){ @@ -877,16 +877,16 @@ __kernel void conv_2d_buf_subgroup_c1_c16_b8( if ((f_block+1)*16 >= output_channel) { for (int i = 0; i < 8; i++) { if ((f_block*16 + lid < output_channel) && (x + i) < output_width) - output[output_offset + i * output_x_pitch + lid] = dst[i]; + output[output_offset + i * output_x_pitch + lid] = (FLOAT)dst[i]; } } else { if (x + 8 <= output_width || output_width % 8 == 0) { - GROUP_WRITE8(output, output_offset, dst); + GROUP_WRITE8(output, output_offset, CONVERT_FLOAT8(dst)); }else{ for (int i = 0; i < output_width % 8; i++) { - output[output_offset + i * output_x_pitch + lid] = dst[i]; + output[output_offset + i * output_x_pitch + lid] = (FLOAT)dst[i]; } } } diff --git a/source/backend/opencl/execution/cl/conv_2d_int_buf.cl b/source/backend/opencl/execution/cl/conv_2d_int_buf.cl index 1f5e7d0a6..c2342b6d4 100644 --- a/source/backend/opencl/execution/cl/conv_2d_int_buf.cl +++ b/source/backend/opencl/execution/cl/conv_2d_int_buf.cl @@ -1,19 +1,6 @@ #ifdef MNN_SUPPORT_FP16 #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif -#define READ_INPUT_IMAGE(i, base) \ - int in_width_value##i = in_width##i + base; \ - in_width_value##i = \ - select(in_idx + in_width_value##i, -1, (in_width_value##i < 0 || in_width_value##i >= input_shape.y)); \ - in_w_idx = in_width_value##i % input_shape.y; \ - inp_offset = (((in_b_idx*in_channel_block_length + in_channel_block_idx)*input_shape.x + in_h_idx)* input_shape.y + in_w_idx)*4; \ - in##i = (in_width_value##i)==-1 ? (FLOAT4)0 : vload4(0, input+inp_offset); - -#define CALCULATE_OUTPUT(i) \ - out##i = mad(in##i.x, weights0, out##i); \ - out##i = mad(in##i.y, weights1, out##i); \ - out##i = mad(in##i.z, weights2, out##i); \ - out##i = mad(in##i.w, weights3, out##i); #define GLOBAL_SIZE_2_DIMS __private const int global_size_dim0, __private const int global_size_dim1, @@ -33,8 +20,8 @@ void conv_2d_int_c4h1w1(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -58,11 +45,12 @@ void conv_2d_int_c4h1w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); - - FLOAT4 out0 = vload4(out_c_idx, bias); + const float4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); + COMPUTE_FLOAT4 vbias = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT)0; + COMPUTE_FLOAT sum = (COMPUTE_FLOAT)0; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_h_idx_base = mad24(out_h_idx, stride_hw.x, -pad_hw.x); @@ -83,7 +71,7 @@ void conv_2d_int_c4h1w1(GLOBAL_SIZE_2_DIMS for(int iy = in_h_idx_start; iy < in_h_idx_end; iy += dilate_hw.x) { for(int ix = in_w_idx_start; ix < in_w_idx_end; ix += dilate_hw.y) { int inp_offset = (((out_b_idx * in_c_blocks + in_c_idx) * in_hw.x + iy) * in_hw.y + ix) * 4; - FLOAT4 in0 = vload4(0, input+inp_offset); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); const int filter_w_inc = (ix-in_w_idx_start)/dilate_hw.y; @@ -92,10 +80,10 @@ void conv_2d_int_c4h1w1(GLOBAL_SIZE_2_DIMS char4 charWeight1 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset); char4 charWeight2 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*2); char4 charWeight3 = vload4(filter_w_inc, weight+weight_offset+weight_oc_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(filter_w_inc, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(filter_w_inc, weight+weight_offset/2+weight_oc_offset/2); @@ -121,12 +109,12 @@ void conv_2d_int_c4h1w1(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif - + sum += (in0.x + in0.y + in0.z + in0.w); out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -136,16 +124,19 @@ void conv_2d_int_c4h1w1(GLOBAL_SIZE_2_DIMS weight_offset += 4*filter_hw.y; } } + + out0 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum) * dequantOffsetC4); + #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } @@ -157,8 +148,8 @@ void conv_2d_int_c4h1w2(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -182,11 +173,14 @@ void conv_2d_int_c4h1w2(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); + const float4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; + COMPUTE_FLOAT4 vbias = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT sum0 = 0; + COMPUTE_FLOAT sum1 = 0; const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; @@ -210,18 +204,18 @@ void conv_2d_int_c4h1w2(GLOBAL_SIZE_2_DIMS const int in_w0_idx = fw * dilate_hw.y + in_w0_idx_base; const int in_w1_idx = fw * dilate_hw.y + in_w1_idx_base; - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4((in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4((in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base)); #if (defined USE_LOW_BIT_WEIGHT_INT8) char4 charWeight0 = vload4(0, weight+weight_offset); char4 charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset); char4 charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); char4 charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); @@ -247,12 +241,15 @@ void conv_2d_int_c4h1w2(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif + sum0 += (in0.x + in0.y + in0.z + in0.w); + sum1 += (in1.x + in1.y + in1.z + in1.w); + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -267,23 +264,27 @@ void conv_2d_int_c4h1w2(GLOBAL_SIZE_2_DIMS } } } + + out0 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC4); + out1 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out1) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC4); + #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); if(out_w_idx + 1 >= out_hw.y) return; - vstore4(out1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), 1, output+out_offset); #else - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); #endif } @@ -295,8 +296,8 @@ void conv_2d_int_c4h1w4(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -320,13 +321,18 @@ void conv_2d_int_c4h1w4(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); - - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + const float4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); + + COMPUTE_FLOAT4 vbias = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; + COMPUTE_FLOAT sum0 = 0; + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT sum2 = 0; + COMPUTE_FLOAT sum3 = 0; const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; @@ -354,20 +360,20 @@ void conv_2d_int_c4h1w4(GLOBAL_SIZE_2_DIMS const int in_w2_idx = fw * dilate_hw.y + in_w2_idx_base; const int in_w3_idx = fw * dilate_hw.y + in_w3_idx_base; - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); - FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); - FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4((in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4((in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = CONVERT_COMPUTE_FLOAT4((in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = CONVERT_COMPUTE_FLOAT4((in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base)); #if (defined USE_LOW_BIT_WEIGHT_INT8) char4 charWeight0 = vload4(0, weight+weight_offset); char4 charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset); char4 charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); char4 charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); @@ -393,12 +399,17 @@ void conv_2d_int_c4h1w4(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif + sum0 += (in0.x + in0.y + in0.z + in0.w); + sum1 += (in1.x + in1.y + in1.z + in1.w); + sum2 += (in2.x + in2.y + in2.z + in2.w); + sum3 += (in3.x + in3.y + in3.z + in3.w); + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -423,18 +434,22 @@ void conv_2d_int_c4h1w4(GLOBAL_SIZE_2_DIMS } } } + out0 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC4); + out1 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out1) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC4); + out2 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out2) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum2) * dequantOffsetC4); + out3 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out3) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum3) * dequantOffsetC4); #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; @@ -442,17 +457,17 @@ void conv_2d_int_c4h1w4(GLOBAL_SIZE_2_DIMS const int remain = out_hw.y - out_w_idx; if (remain >= 4) { - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); }else if(remain == 3){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - vstore4(out2, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2, output+out_offset); }else if(remain == 2){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); #endif } @@ -464,8 +479,8 @@ void conv_2d_int_c4h4w1(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -489,13 +504,18 @@ void conv_2d_int_c4h4w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 2; - const FLOAT4 dequantScaleC4 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); + const float4 dequantScaleC4 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC4 = vload4(out_c_idx, dequantOffset); - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + COMPUTE_FLOAT4 vbias = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; + COMPUTE_FLOAT sum0 = 0; + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT sum2 = 0; + COMPUTE_FLOAT sum3 = 0; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); @@ -523,20 +543,20 @@ void conv_2d_int_c4h4w1(GLOBAL_SIZE_2_DIMS const int in_h3_idx = (iy * dilate_hw.x + in_h3_idx_base) * in_hw.y; for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { - FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); - FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); - FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base); - FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4((in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4((in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = CONVERT_COMPUTE_FLOAT4((in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = CONVERT_COMPUTE_FLOAT4((in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base)); #if (defined USE_LOW_BIT_WEIGHT_INT8) char4 charWeight0 = vload4(0, weight+weight_offset); char4 charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset); char4 charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset*2); char4 charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); @@ -562,11 +582,17 @@ void conv_2d_int_c4h4w1(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC4, dequantOffsetC4); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC4, dequantOffsetC4); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif + + sum0 += (in0.x + in0.y + in0.z + in0.w); + sum1 += (in1.x + in1.y + in1.z + in1.w); + sum2 += (in2.x + in2.y + in2.z + in2.w); + sum3 += (in3.x + in3.y + in3.z + in3.w); + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -591,43 +617,49 @@ void conv_2d_int_c4h4w1(GLOBAL_SIZE_2_DIMS } } } + + out0 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC4); + out1 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out1) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC4); + out2 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out2) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum2) * dequantOffsetC4); + out3 = vbias + CONVERT_COMPUTE_FLOAT4(convert_float4(out3) * dequantScaleC4 + convert_float4((COMPUTE_FLOAT4)sum3) * dequantOffsetC4); + #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.x - out_h_idx; if(remain >= 4){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); }else if(remain == 3){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); }else if(remain == 2){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #else - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); #endif } @@ -639,8 +671,8 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -664,19 +696,25 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 2; - const FLOAT4 dequantScaleC03 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); - const FLOAT4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); - const FLOAT4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); + const float4 dequantScaleC03 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); + const float4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); + const float4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; - FLOAT4 out4 = vload4(out_c_idx + 1, bias); - FLOAT4 out5 = out4; - FLOAT4 out6 = out4; - FLOAT4 out7 = out4; + COMPUTE_FLOAT4 vbias0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; + COMPUTE_FLOAT4 vbias1 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx + 1, bias)); + COMPUTE_FLOAT4 out4 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out5 = out0; + COMPUTE_FLOAT4 out6 = out0; + COMPUTE_FLOAT4 out7 = out0; + COMPUTE_FLOAT sum0 = 0; + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT sum2 = 0; + COMPUTE_FLOAT sum3 = 0; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); @@ -705,20 +743,20 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS const int in_h3_idx = (iy * dilate_hw.x + in_h3_idx_base) * in_hw.y; for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { - FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); - FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); - FLOAT4 in2 = (in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base); - FLOAT4 in3 = (in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4((in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4((in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = CONVERT_COMPUTE_FLOAT4((in_h2_idx < 0 || in_h2_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h2_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = CONVERT_COMPUTE_FLOAT4((in_h3_idx < 0 || in_h3_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h3_idx + fw, input+inp_offset_base)); #if (defined USE_LOW_BIT_WEIGHT_INT8) char4 charWeight0 = vload4(0, weight+weight_offset); char4 charWeight1 = vload4(0, weight+weight_offset+weight_ic_offset); char4 charWeight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); char4 charWeight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_ic_offset/2); @@ -744,12 +782,17 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif + sum0 += (in0.x + in0.y + in0.z + in0.w); + sum1 += (in1.x + in1.y + in1.z + in1.w); + sum2 += (in2.x + in2.y + in2.z + in2.w); + sum3 += (in3.x + in3.y + in3.z + in3.w); + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -775,10 +818,10 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); - weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); - weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); - weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); - weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else charWeightInt40 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); @@ -804,10 +847,10 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); - weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); - weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); - weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif out4 = mad(in0.x, weight0, out4); @@ -834,45 +877,55 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS } } } + + out0 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC03); + out1 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out1) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC03); + out2 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out2) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum2) * dequantOffsetC03); + out3 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out3) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum3) * dequantOffsetC03); + out4 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out4) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC47); + out5 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out5) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC47); + out6 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out6) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum2) * dequantOffsetC47); + out7 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out7) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum3) * dequantOffsetC47); + #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); - out4 = fmax(out4, (FLOAT4)0); - out5 = fmax(out5, (FLOAT4)0); - out6 = fmax(out6, (FLOAT4)0); - out7 = fmax(out7, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); + out4 = fmax(out4, (COMPUTE_FLOAT4)0); + out5 = fmax(out5, (COMPUTE_FLOAT4)0); + out6 = fmax(out6, (COMPUTE_FLOAT4)0); + out7 = fmax(out7, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); - out4 = clamp(out4, (FLOAT4)0, (FLOAT4)6); - out5 = clamp(out5, (FLOAT4)0, (FLOAT4)6); - out6 = clamp(out6, (FLOAT4)0, (FLOAT4)6); - out7 = clamp(out7, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out4 = clamp(out4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out5 = clamp(out5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out6 = clamp(out6, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out7 = clamp(out7, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.x - out_h_idx; if(remain >= 4){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); }else if(remain == 3){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); }else if(remain == 2){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ @@ -881,35 +934,35 @@ void conv_2d_int_c8h4w1(GLOBAL_SIZE_2_DIMS #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; if(remain >= 4){ - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); - vstore4(out6, 2 * out_hw.y, output+out_offset); - vstore4(out7, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out7), 3 * out_hw.y, output+out_offset); }else if(remain == 3){ - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); - vstore4(out6, 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2 * out_hw.y, output+out_offset); }else if(remain == 2){ - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out4, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); } #else - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); - vstore4(out2, 2 * out_hw.y, output+out_offset); - vstore4(out3, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), 3 * out_hw.y, output+out_offset); #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ return; } #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out4, 0, output+out_offset); - vstore4(out5, out_hw.y, output+out_offset); - vstore4(out6, 2 * out_hw.y, output+out_offset); - vstore4(out7, 3 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out5), out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2 * out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out7), 3 * out_hw.y, output+out_offset); #endif } @@ -921,8 +974,8 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -946,15 +999,19 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_h_blocks;//equal to in_b_idx const int out_h_idx = (out_b_h_idx % out_h_blocks) << 1; - const FLOAT4 dequantScaleC03 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); - const FLOAT4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); - const FLOAT4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); - - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = vload4(out_c_idx + 1, bias); - FLOAT4 out3 = out2; + const float4 dequantScaleC03 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); + const float4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); + const float4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); + + COMPUTE_FLOAT4 vbias0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 vbias1 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx + 1, bias)); + COMPUTE_FLOAT4 out2 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out3 = out0; + COMPUTE_FLOAT sum0 = 0; + COMPUTE_FLOAT sum1 = 0; const int in_w_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); @@ -980,17 +1037,17 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS const int in_h1_idx = (iy * dilate_hw.x + in_h1_idx_base) * in_hw.y; for(int fw = in_w_idx_start; fw < in_w_idx_end; fw += dilate_hw.y) { - FLOAT4 in0 = (in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base); - FLOAT4 in1 = (in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4((in_h0_idx < 0 || in_h0_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h0_idx + fw, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4((in_h1_idx < 0 || in_h1_idx >= in_hw_size) ? (FLOAT4)0 : vload4(in_h1_idx + fw, input+inp_offset_base)); #if (defined USE_LOW_BIT_WEIGHT_INT8) char4 charWeight0 = vload4(0, weight+weight_offset); char4 charWeight1 = vload4(0, weight+weight_offset+weight_ic_offset); char4 charWeight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); char4 charWeight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_ic_offset/2); @@ -1016,11 +1073,15 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif + + sum0 += (in0.x + in0.y + in0.z + in0.w); + sum1 += (in1.x + in1.y + in1.z + in1.w); + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -1036,10 +1097,10 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); - weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); - weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); - weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); - weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else charWeightInt40 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); @@ -1065,10 +1126,10 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0& MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1& MOD_NUM) - 8; - weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); - weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); - weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); - weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif out2 = mad(in0.x, weight0, out2); out2 = mad(in0.y, weight1, out2); @@ -1084,28 +1145,34 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS } } } + + out0 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC03); + out1 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out1) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC03); + out2 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out2) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC47); + out3 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out3) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC47); + #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.x - out_h_idx; if(remain >= 2){ - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ @@ -1114,22 +1181,22 @@ void conv_2d_int_c8h2w1(GLOBAL_SIZE_2_DIMS #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; if(remain >= 2){ - vstore4(out2, 0, output+out_offset); - vstore4(out3, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), out_hw.y, output+out_offset); }else if(remain == 1){ - vstore4(out2, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 0, output+out_offset); } #else - vstore4(out0, 0, output+out_offset); - vstore4(out1, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out1), out_hw.y, output+out_offset); #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks){ return; } #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(out2, 0, output+out_offset); - vstore4(out3, out_hw.y, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out3), out_hw.y, output+out_offset); #endif } @@ -1141,8 +1208,8 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS #else __global const uchar *weight, #endif - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, + __global const float *dequantScale, + __global const float *dequantOffset, __global const FLOAT *bias, __global FLOAT *output, __private const int2 in_hw, @@ -1166,20 +1233,25 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS const int out_b_idx = out_b_h_idx / out_hw.x;//equal to in_b_idx const int out_h_idx = out_b_h_idx % out_hw.x; - const FLOAT4 dequantScaleC03 = vload4(out_c_idx, dequantScale); - const FLOAT4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); - const FLOAT4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); - const FLOAT4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); - - FLOAT4 out0 = vload4(out_c_idx, bias); - FLOAT4 out1 = out0; - FLOAT4 out2 = out0; - FLOAT4 out3 = out0; + const float4 dequantScaleC03 = vload4(out_c_idx, dequantScale); + const float4 dequantOffsetC03 = vload4(out_c_idx, dequantOffset); + const float4 dequantScaleC47 = vload4(out_c_idx + 1, dequantScale); + const float4 dequantOffsetC47 = vload4(out_c_idx + 1, dequantOffset); - FLOAT4 out4 = vload4(out_c_idx + 1, bias); - FLOAT4 out5 = out4; - FLOAT4 out6 = out4; - FLOAT4 out7 = out4; + COMPUTE_FLOAT4 vbias0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT4 out0 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out1 = out0; + COMPUTE_FLOAT4 out2 = out0; + COMPUTE_FLOAT4 out3 = out0; + COMPUTE_FLOAT4 vbias1 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx + 1, bias)); + COMPUTE_FLOAT4 out4 = (COMPUTE_FLOAT4)0; + COMPUTE_FLOAT4 out5 = out0; + COMPUTE_FLOAT4 out6 = out0; + COMPUTE_FLOAT4 out7 = out0; + COMPUTE_FLOAT sum0 = 0; + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT sum2 = 0; + COMPUTE_FLOAT sum3 = 0; const int in_w0_idx_base = mad24(out_w_idx, stride_hw.y, -pad_hw.y); const int in_w1_idx_base = in_w0_idx_base + stride_hw.y; @@ -1208,20 +1280,20 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS const int in_w2_idx = fw * dilate_hw.y + in_w2_idx_base; const int in_w3_idx = fw * dilate_hw.y + in_w3_idx_base; - FLOAT4 in0 = (in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base); - FLOAT4 in1 = (in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base); - FLOAT4 in2 = (in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base); - FLOAT4 in3 = (in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base); + COMPUTE_FLOAT4 in0 = CONVERT_COMPUTE_FLOAT4((in_w0_idx < 0 || in_w0_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w0_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in1 = CONVERT_COMPUTE_FLOAT4((in_w1_idx < 0 || in_w1_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w1_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in2 = CONVERT_COMPUTE_FLOAT4((in_w2_idx < 0 || in_w2_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w2_idx, input+inp_offset_base)); + COMPUTE_FLOAT4 in3 = CONVERT_COMPUTE_FLOAT4((in_w3_idx < 0 || in_w3_idx >= in_hw.y) ? (FLOAT4)0 : vload4(in_w3_idx, input+inp_offset_base)); #if (defined USE_LOW_BIT_WEIGHT_INT8) char4 charWeight0 = vload4(0, weight+weight_offset); char4 charWeight1 = vload4(0, weight+weight_offset+weight_ic_offset); char4 charWeight2 = vload4(0, weight+weight_offset+weight_ic_offset*2); char4 charWeight3 = vload4(0, weight+weight_offset+weight_ic_offset*3); - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else uchar2 charWeightInt40 = vload2(0, weight+weight_offset/2); uchar2 charWeightInt41 = vload2(0, weight+weight_offset/2+weight_ic_offset/2); @@ -1247,12 +1319,17 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - FLOAT4 weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC03, dequantOffsetC03); - FLOAT4 weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC03, dequantOffsetC03); + COMPUTE_FLOAT4 weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + COMPUTE_FLOAT4 weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + COMPUTE_FLOAT4 weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + COMPUTE_FLOAT4 weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif + sum0 += (in0.x + in0.y + in0.z + in0.w); + sum1 += (in1.x + in1.y + in1.z + in1.w); + sum2 += (in2.x + in2.y + in2.z + in2.w); + sum3 += (in3.x + in3.y + in3.z + in3.w); + out0 = mad(in0.x, weight0, out0); out0 = mad(in0.y, weight1, out0); out0 = mad(in0.z, weight2, out0); @@ -1278,10 +1355,10 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS charWeight1 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset); charWeight2 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*2); charWeight3 = vload4(0, weight+weight_offset+weight_oc_offset+weight_ic_offset*3); - weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); - weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); - weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); - weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #else charWeightInt40 = vload2(0, weight+weight_offset/2+weight_oc_offset/2); charWeightInt41 = vload2(0, weight+weight_offset/2+weight_oc_offset/2+weight_ic_offset/2); @@ -1307,10 +1384,10 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS charWeight3.y = (charWeightInt43.s0 & MOD_NUM) - 8; charWeight3.z = (charWeightInt43.s1 >> 4) - 8; charWeight3.w = (charWeightInt43.s1 & MOD_NUM) - 8; - weight0 = mad(CONVERT_FLOAT4(charWeight0), dequantScaleC47, dequantOffsetC47); - weight1 = mad(CONVERT_FLOAT4(charWeight1), dequantScaleC47, dequantOffsetC47); - weight2 = mad(CONVERT_FLOAT4(charWeight2), dequantScaleC47, dequantOffsetC47); - weight3 = mad(CONVERT_FLOAT4(charWeight3), dequantScaleC47, dequantOffsetC47); + weight0 = CONVERT_COMPUTE_FLOAT4(charWeight0); + weight1 = CONVERT_COMPUTE_FLOAT4(charWeight1); + weight2 = CONVERT_COMPUTE_FLOAT4(charWeight2); + weight3 = CONVERT_COMPUTE_FLOAT4(charWeight3); #endif out4 = mad(in0.x, weight0, out4); @@ -1337,61 +1414,71 @@ void conv_2d_int_c8h1w4(GLOBAL_SIZE_2_DIMS } } } + + out0 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out0) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC03); + out1 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out1) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC03); + out2 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out2) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum2) * dequantOffsetC03); + out3 = vbias0 + CONVERT_COMPUTE_FLOAT4(convert_float4(out3) * dequantScaleC03 + convert_float4((COMPUTE_FLOAT4)sum3) * dequantOffsetC03); + out4 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out4) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum0) * dequantOffsetC47); + out5 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out5) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum1) * dequantOffsetC47); + out6 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out6) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum2) * dequantOffsetC47); + out7 = vbias1 + CONVERT_COMPUTE_FLOAT4(convert_float4(out7) * dequantScaleC47 + convert_float4((COMPUTE_FLOAT4)sum3) * dequantOffsetC47); + #ifdef RELU - out0 = fmax(out0, (FLOAT4)0); - out1 = fmax(out1, (FLOAT4)0); - out2 = fmax(out2, (FLOAT4)0); - out3 = fmax(out3, (FLOAT4)0); - out4 = fmax(out4, (FLOAT4)0); - out5 = fmax(out5, (FLOAT4)0); - out6 = fmax(out6, (FLOAT4)0); - out7 = fmax(out7, (FLOAT4)0); + out0 = fmax(out0, (COMPUTE_FLOAT4)0); + out1 = fmax(out1, (COMPUTE_FLOAT4)0); + out2 = fmax(out2, (COMPUTE_FLOAT4)0); + out3 = fmax(out3, (COMPUTE_FLOAT4)0); + out4 = fmax(out4, (COMPUTE_FLOAT4)0); + out5 = fmax(out5, (COMPUTE_FLOAT4)0); + out6 = fmax(out6, (COMPUTE_FLOAT4)0); + out7 = fmax(out7, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - out0 = clamp(out0, (FLOAT4)0, (FLOAT4)6); - out1 = clamp(out1, (FLOAT4)0, (FLOAT4)6); - out2 = clamp(out2, (FLOAT4)0, (FLOAT4)6); - out3 = clamp(out3, (FLOAT4)0, (FLOAT4)6); - out4 = clamp(out4, (FLOAT4)0, (FLOAT4)6); - out5 = clamp(out5, (FLOAT4)0, (FLOAT4)6); - out6 = clamp(out6, (FLOAT4)0, (FLOAT4)6); - out7 = clamp(out7, (FLOAT4)0, (FLOAT4)6); + out0 = clamp(out0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out2 = clamp(out2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out3 = clamp(out3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out4 = clamp(out4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out5 = clamp(out5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out6 = clamp(out6, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + out7 = clamp(out7, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((out_b_idx*out_c_blocks + out_c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; #ifdef BLOCK_LEAVE const int remain = out_hw.y - out_w_idx; if(remain >= 4){ - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); }else if(remain == 3){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); - vstore4(out2, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out2), 2, output+out_offset); }else if(remain == 2){ - vstore8((FLOAT8)(out0, out1), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out0, out1)), 0, output+out_offset); }else if(remain == 1){ - vstore4(out0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out0), 0, output+out_offset); } #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks)return; #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; if(remain >= 4){ - vstore16((FLOAT16)(out4, out5, out6, out7), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out4, out5, out6, out7)), 0, output+out_offset); }else if(remain == 3){ - vstore8((FLOAT8)(out4, out5), 0, output+out_offset); - vstore4(out6, 2, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out6), 2, output+out_offset); }else if(remain == 2){ - vstore8((FLOAT8)(out4, out5), 0, output+out_offset); + vstore8(CONVERT_FLOAT8((COMPUTE_FLOAT8)(out4, out5)), 0, output+out_offset); }else if(remain == 1){ - vstore4(out4, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(out4), 0, output+out_offset); } #else - vstore16((FLOAT16)(out0, out1, out2, out3), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out0, out1, out2, out3)), 0, output+out_offset); #ifdef CHANNEL_LEAVE if(out_c_idx + 1 >= out_c_blocks)return; #endif out_offset = (((out_b_idx*out_c_blocks + out_c_idx + 1)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore16((FLOAT16)(out4, out5, out6, out7), 0, output+out_offset); + vstore16(CONVERT_FLOAT16((COMPUTE_FLOAT16)(out4, out5, out6, out7)), 0, output+out_offset); #endif } diff --git a/source/backend/opencl/execution/cl/depthwise_conv2d_buf.cl b/source/backend/opencl/execution/cl/depthwise_conv2d_buf.cl index 73426c441..586315962 100644 --- a/source/backend/opencl/execution/cl/depthwise_conv2d_buf.cl +++ b/source/backend/opencl/execution/cl/depthwise_conv2d_buf.cl @@ -1,21 +1,6 @@ #ifdef MNN_SUPPORT_FP16 #pragma OPENCL EXTENSION cl_khr_fp16 : enable #endif -#define READ_INPUT_IMAGE(i, base) \ - int inOffset##i = inWidthOffset##i + base; \ - inOffset##i = \ - select(inCurIdx + inOffset##i, -1, (inOffset##i < 0 || inOffset##i >= inputShape.y)); \ - in_c_block_idx = inOffset##i / inputShape.y; \ - in_w_idx = inOffset##i % inputShape.y; \ - inpOffset = (((in_b_idx*channelBlocks + in_c_block_idx)*inputShape.x + in_h_idx)* inputShape.y + in_w_idx)*4; \ - inValue##i = ((inOffset##i)==-1 || inHeightIdx == -1) ? (FLOAT4)0 : vload4(0, input+inpOffset); - - -#define CALCULATE_OUTPUT(i) \ - outValue##i = mad(inValue##i.x, weights0, outValue##i); \ - outValue##i = mad(inValue##i.y, weights1, outValue##i); \ - outValue##i = mad(inValue##i.z, weights2, outValue##i); \ - outValue##i = mad(inValue##i.w, weights3, outValue##i); #define GLOBAL_SIZE_2_DIMS __private const int global_size_dim0, __private const int global_size_dim1, @@ -56,10 +41,10 @@ void depthwise_conv2d_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx, bias); - FLOAT4 outValue1 = outValue0; - FLOAT4 outValue2 = outValue0; - FLOAT4 outValue3 = outValue0; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue2 = outValue0; + COMPUTE_FLOAT4 outValue3 = outValue0; const int out_w4_idx = out_w_idx << 2; const int in_w_start_0 = out_w4_idx * stride_hw.y - pad_hw.y; @@ -77,14 +62,14 @@ void depthwise_conv2d_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, for (int kw = 0; kw < filter_hw.y; kw++) { const int filter_idx = mad24(kh, filter_hw.y, kw); const int kw_dilate = kw * dilate_hw.y; - FLOAT4 inValue0 = (in_w_start_0+kw_dilate < 0 || in_w_start_0+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+0, input+inp_offset); - FLOAT4 inValue1 = (in_w_start_1+kw_dilate < 0 || in_w_start_1+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+1*stride_hw.y, input+inp_offset); - FLOAT4 inValue2 = (in_w_start_2+kw_dilate < 0 || in_w_start_2+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+2*stride_hw.y, input+inp_offset); - FLOAT4 inValue3 = (in_w_start_3+kw_dilate < 0 || in_w_start_3+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+3*stride_hw.y, input+inp_offset); + COMPUTE_FLOAT4 inValue0 = (in_w_start_0+kw_dilate < 0 || in_w_start_0+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+0, input+inp_offset)); + COMPUTE_FLOAT4 inValue1 = (in_w_start_1+kw_dilate < 0 || in_w_start_1+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+1*stride_hw.y, input+inp_offset)); + COMPUTE_FLOAT4 inValue2 = (in_w_start_2+kw_dilate < 0 || in_w_start_2+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+2*stride_hw.y, input+inp_offset)); + COMPUTE_FLOAT4 inValue3 = (in_w_start_3+kw_dilate < 0 || in_w_start_3+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+3*stride_hw.y, input+inp_offset)); //NC4HW4 [1, filterShape.x*filterShape.y, 1, channelBlocks] x oc4 //index: [0, filterIdx, 0, inChannelBlockIdx] - FLOAT4 weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); outValue1 = mad(inValue1, weights, outValue1); @@ -94,36 +79,36 @@ void depthwise_conv2d_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, } #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); - outValue2 = fmax(outValue2, (FLOAT4)0); - outValue3 = fmax(outValue3, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); + outValue2 = fmax(outValue2, (COMPUTE_FLOAT4)0); + outValue3 = fmax(outValue3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); - outValue2 = clamp(outValue2, (FLOAT4)0, (FLOAT4)6); - outValue3 = clamp(outValue3, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue2 = clamp(outValue2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue3 = clamp(outValue3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w4_idx)*4; const int remain = out_hw.y - out_w4_idx; if (remain >= 4) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, 2, output+out_offset); - vstore4(outValue3, 3, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue3), 3, output+out_offset); } else if (remain == 3) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), 2, output+out_offset); } else if (remain == 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } } @@ -152,8 +137,8 @@ void depthwise_conv2d_c4h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx, bias); - FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; const int out_w2_idx = out_w_idx << 1; const int in_w_start_0 = out_w2_idx * stride_hw.y - pad_hw.y; @@ -169,12 +154,12 @@ void depthwise_conv2d_c4h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, for (int kw = 0; kw < filter_hw.y; kw++) { const int filter_idx = mad24(kh, filter_hw.y, kw); const int kw_dilate = kw * dilate_hw.y; - FLOAT4 inValue0 = (in_w_start_0+kw_dilate < 0 || in_w_start_0+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+0, input+inp_offset); - FLOAT4 inValue1 = (in_w_start_1+kw_dilate < 0 || in_w_start_1+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+1*stride_hw.y, input+inp_offset); + COMPUTE_FLOAT4 inValue0 = (in_w_start_0+kw_dilate < 0 || in_w_start_0+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+0, input+inp_offset)); + COMPUTE_FLOAT4 inValue1 = (in_w_start_1+kw_dilate < 0 || in_w_start_1+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+1*stride_hw.y, input+inp_offset)); //NC4HW4 [1, filterShape.x*filterShape.y, 1, channelBlocks] x oc4 //index: [0, filterIdx, 0, inChannelBlockIdx] - FLOAT4 weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); outValue1 = mad(inValue1, weights, outValue1); @@ -182,23 +167,23 @@ void depthwise_conv2d_c4h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, } #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w2_idx)*4; const int remain = out_hw.y - out_w2_idx; if (remain >= 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } } @@ -227,8 +212,8 @@ void depthwise_conv2d_c4h1w1(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx, bias); - FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; const int in_w_start_0 = out_w_idx * stride_hw.y - pad_hw.y; const int in_h_start = out_h_idx * stride_hw.x - pad_hw.x; @@ -241,27 +226,27 @@ void depthwise_conv2d_c4h1w1(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, for (int kw = 0; kw < filter_hw.y; kw++) { const int filter_idx = mad24(kh, filter_hw.y, kw); const int kw_dilate = kw * dilate_hw.y; - FLOAT4 inValue0 = (in_w_start_0+kw_dilate < 0 || in_w_start_0+kw_dilate >= in_hw.y) ? (FLOAT4)0 : vload4(kw_dilate+0, input+inp_offset); + COMPUTE_FLOAT4 inValue0 = (in_w_start_0+kw_dilate < 0 || in_w_start_0+kw_dilate >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw_dilate+0, input+inp_offset)); //NC4HW4 [1, filterShape.x*filterShape.y, 1, channelBlocks] x oc4 //index: [0, filterIdx, 0, inChannelBlockIdx] - FLOAT4 weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); } } #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w_idx)*4; - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } __kernel @@ -288,14 +273,14 @@ void depthwise_conv2d_s1_c8h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx+0, bias); - FLOAT4 outValue1 = outValue0; - FLOAT4 outValue2 = outValue0; - FLOAT4 outValue3 = outValue0; - FLOAT4 outValue4 = vload4(c_idx+1, bias); - FLOAT4 outValue5 = outValue4; - FLOAT4 outValue6 = outValue4; - FLOAT4 outValue7 = outValue4; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx+0, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue2 = outValue0; + COMPUTE_FLOAT4 outValue3 = outValue0; + COMPUTE_FLOAT4 outValue4 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx+1, bias)); + COMPUTE_FLOAT4 outValue5 = outValue4; + COMPUTE_FLOAT4 outValue6 = outValue4; + COMPUTE_FLOAT4 outValue7 = outValue4; const int out_w4_idx = out_w_idx << 2; const int in_w_start_0 = out_w4_idx - pad_hw.y; @@ -313,20 +298,20 @@ void depthwise_conv2d_s1_c8h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, int inp_offset_c1 = (((b_idx*c_blocks + c_idx+1)*in_hw.x + in_h_cur)* in_hw.y + in_w_start_0)*4; for (int kw = 0; kw < filter_hw.y; kw++) { const int filter_idx = mad24(kh, filter_hw.y, kw); - FLOAT4 inValue0 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+0, input+inp_offset_c0); - FLOAT4 inValue1 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+1, input+inp_offset_c0); - FLOAT4 inValue2 = (in_w_start_2+kw < 0 || in_w_start_2+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+2, input+inp_offset_c0); - FLOAT4 inValue3 = (in_w_start_3+kw < 0 || in_w_start_3+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+3, input+inp_offset_c0); - - FLOAT4 inValue4 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+0, input+inp_offset_c1); - FLOAT4 inValue5 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+1, input+inp_offset_c1); - FLOAT4 inValue6 = (in_w_start_2+kw < 0 || in_w_start_2+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+2, input+inp_offset_c1); - FLOAT4 inValue7 = (in_w_start_3+kw < 0 || in_w_start_3+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+3, input+inp_offset_c1); + COMPUTE_FLOAT4 inValue0 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+0, input+inp_offset_c0)); + COMPUTE_FLOAT4 inValue1 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+1, input+inp_offset_c0)); + COMPUTE_FLOAT4 inValue2 = (in_w_start_2+kw < 0 || in_w_start_2+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+2, input+inp_offset_c0)); + COMPUTE_FLOAT4 inValue3 = (in_w_start_3+kw < 0 || in_w_start_3+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+3, input+inp_offset_c0)); + + COMPUTE_FLOAT4 inValue4 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+0, input+inp_offset_c1)); + COMPUTE_FLOAT4 inValue5 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+1, input+inp_offset_c1)); + COMPUTE_FLOAT4 inValue6 = (in_w_start_2+kw < 0 || in_w_start_2+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+2, input+inp_offset_c1)); + COMPUTE_FLOAT4 inValue7 = (in_w_start_3+kw < 0 || in_w_start_3+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+3, input+inp_offset_c1)); //NC4HW4 [1, filterShape.x*filterShape.y, 1, channelBlocks] x oc4 //index: [0, filterIdx, 0, inChannelBlockIdx] - FLOAT4 weights_0 = vload4(0, filter+(filter_idx*c_blocks+c_idx+0)*4); - FLOAT4 weights_1 = vload4(0, filter+(filter_idx*c_blocks+c_idx+1)*4); + COMPUTE_FLOAT4 weights_0 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx+0)*4)); + COMPUTE_FLOAT4 weights_1 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx+1)*4)); outValue0 = mad(inValue0, weights_0, outValue0); outValue1 = mad(inValue1, weights_0, outValue1); @@ -341,65 +326,65 @@ void depthwise_conv2d_s1_c8h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, } #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); - outValue2 = fmax(outValue2, (FLOAT4)0); - outValue3 = fmax(outValue3, (FLOAT4)0); - - outValue4 = fmax(outValue4, (FLOAT4)0); - outValue5 = fmax(outValue5, (FLOAT4)0); - outValue6 = fmax(outValue6, (FLOAT4)0); - outValue7 = fmax(outValue7, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); + outValue2 = fmax(outValue2, (COMPUTE_FLOAT4)0); + outValue3 = fmax(outValue3, (COMPUTE_FLOAT4)0); + + outValue4 = fmax(outValue4, (COMPUTE_FLOAT4)0); + outValue5 = fmax(outValue5, (COMPUTE_FLOAT4)0); + outValue6 = fmax(outValue6, (COMPUTE_FLOAT4)0); + outValue7 = fmax(outValue7, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); - outValue2 = clamp(outValue2, (FLOAT4)0, (FLOAT4)6); - outValue3 = clamp(outValue3, (FLOAT4)0, (FLOAT4)6); - - outValue4 = clamp(outValue4, (FLOAT4)0, (FLOAT4)6); - outValue5 = clamp(outValue5, (FLOAT4)0, (FLOAT4)6); - outValue6 = clamp(outValue6, (FLOAT4)0, (FLOAT4)6); - outValue7 = clamp(outValue7, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue2 = clamp(outValue2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue3 = clamp(outValue3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + + outValue4 = clamp(outValue4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue5 = clamp(outValue5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue6 = clamp(outValue6, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue7 = clamp(outValue7, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w4_idx)*4; const int remain = out_hw.y - out_w4_idx; if (remain >= 4) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, 2, output+out_offset); - vstore4(outValue3, 3, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue3), 3, output+out_offset); } else if (remain == 3) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), 2, output+out_offset); } else if (remain == 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } if(c_idx + 1 >= c_blocks) return; out_offset += out_hw.x * out_hw.y * 4; if (remain >= 4) { - vstore4(outValue4, 0, output+out_offset); - vstore4(outValue5, 1, output+out_offset); - vstore4(outValue6, 2, output+out_offset); - vstore4(outValue7, 3, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue5), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue6), 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue7), 3, output+out_offset); } else if (remain == 3) { - vstore4(outValue4, 0, output+out_offset); - vstore4(outValue5, 1, output+out_offset); - vstore4(outValue6, 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue5), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue6), 2, output+out_offset); } else if (remain == 2) { - vstore4(outValue4, 0, output+out_offset); - vstore4(outValue5, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue5), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue4, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue4), 0, output+out_offset); } } @@ -428,10 +413,10 @@ void depthwise_conv2d_s1_c8h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx+0, bias); - FLOAT4 outValue1 = outValue0; - FLOAT4 outValue4 = vload4(c_idx+1, bias); - FLOAT4 outValue5 = outValue4; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx+0, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue4 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx+1, bias)); + COMPUTE_FLOAT4 outValue5 = outValue4; const int out_w2_idx = out_w_idx << 1; const int in_w_start_0 = out_w2_idx - pad_hw.y; @@ -447,16 +432,16 @@ void depthwise_conv2d_s1_c8h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, int inp_offset_c1 = (((b_idx*c_blocks + c_idx+1)*in_hw.x + in_h_cur)* in_hw.y + in_w_start_0)*4; for (int kw = 0; kw < filter_hw.y; kw++) { const int filter_idx = mad24(kh, filter_hw.y, kw); - FLOAT4 inValue0 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+0, input+inp_offset_c0); - FLOAT4 inValue1 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+1, input+inp_offset_c0); + COMPUTE_FLOAT4 inValue0 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+0, input+inp_offset_c0)); + COMPUTE_FLOAT4 inValue1 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+1, input+inp_offset_c0)); - FLOAT4 inValue4 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+0, input+inp_offset_c1); - FLOAT4 inValue5 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+1, input+inp_offset_c1); + COMPUTE_FLOAT4 inValue4 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+0, input+inp_offset_c1)); + COMPUTE_FLOAT4 inValue5 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+1, input+inp_offset_c1)); //NC4HW4 [1, filterShape.x*filterShape.y, 1, channelBlocks] x oc4 //index: [0, filterIdx, 0, inChannelBlockIdx] - FLOAT4 weights_0 = vload4(0, filter+(filter_idx*c_blocks+c_idx+0)*4); - FLOAT4 weights_1 = vload4(0, filter+(filter_idx*c_blocks+c_idx+1)*4); + COMPUTE_FLOAT4 weights_0 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx+0)*4)); + COMPUTE_FLOAT4 weights_1 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx+1)*4)); outValue0 = mad(inValue0, weights_0, outValue0); outValue1 = mad(inValue1, weights_0, outValue1); @@ -467,39 +452,39 @@ void depthwise_conv2d_s1_c8h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, } #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); - outValue4 = fmax(outValue4, (FLOAT4)0); - outValue5 = fmax(outValue5, (FLOAT4)0); + outValue4 = fmax(outValue4, (COMPUTE_FLOAT4)0); + outValue5 = fmax(outValue5, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); - outValue4 = clamp(outValue4, (FLOAT4)0, (FLOAT4)6); - outValue5 = clamp(outValue5, (FLOAT4)0, (FLOAT4)6); + outValue4 = clamp(outValue4, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue5 = clamp(outValue5, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w2_idx)*4; const int remain = out_hw.y - out_w2_idx; if (remain >= 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } if(c_idx + 1 >= c_blocks) return; out_offset += out_hw.x * out_hw.y * 4; if (remain >= 2) { - vstore4(outValue4, 0, output+out_offset); - vstore4(outValue5, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue4), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue5), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue4, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue4), 0, output+out_offset); } } @@ -527,10 +512,10 @@ void depthwise_conv2d_s1_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx, bias); - FLOAT4 outValue1 = outValue0; - FLOAT4 outValue2 = outValue0; - FLOAT4 outValue3 = outValue0; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue2 = outValue0; + COMPUTE_FLOAT4 outValue3 = outValue0; const int out_w4_idx = out_w_idx << 2; const int in_w_start_0 = out_w4_idx - pad_hw.y; @@ -540,7 +525,7 @@ void depthwise_conv2d_s1_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, const int in_h_start = out_h_idx - pad_hw.x; - FLOAT4 inValue0, inValue1, inValue2, inValue3; + COMPUTE_FLOAT4 inValue0, inValue1, inValue2, inValue3; for (int kh = 0; kh < filter_hw.x; kh++) { const int in_h_cur = in_h_start + kh; if(in_h_cur < 0 || in_h_cur >= in_hw.x) continue; @@ -548,14 +533,14 @@ void depthwise_conv2d_s1_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, int inp_offset = (((b_idx*c_blocks + c_idx)*in_hw.x + in_h_cur)* in_hw.y + in_w_start_0)*4; for (int kw = 0; kw < filter_hw.y; kw++) { const int filter_idx = mad24(kh, filter_hw.y, kw); - inValue0 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+0, input+inp_offset); - inValue1 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+1, input+inp_offset); - inValue2 = (in_w_start_2+kw < 0 || in_w_start_2+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+2, input+inp_offset); - inValue3 = (in_w_start_3+kw < 0 || in_w_start_3+kw >= in_hw.y) ? (FLOAT4)0 : vload4(kw+3, input+inp_offset); + inValue0 = (in_w_start_0+kw < 0 || in_w_start_0+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+0, input+inp_offset)); + inValue1 = (in_w_start_1+kw < 0 || in_w_start_1+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+1, input+inp_offset)); + inValue2 = (in_w_start_2+kw < 0 || in_w_start_2+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+2, input+inp_offset)); + inValue3 = (in_w_start_3+kw < 0 || in_w_start_3+kw >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(kw+3, input+inp_offset)); //NC4HW4 [1, filterShape.x*filterShape.y, 1, channelBlocks] x oc4 //index: [0, filterIdx, 0, inChannelBlockIdx] - FLOAT4 weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); outValue1 = mad(inValue1, weights, outValue1); @@ -565,36 +550,36 @@ void depthwise_conv2d_s1_c4h1w4(GLOBAL_SIZE_2_DIMS __global const FLOAT *input, } #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); - outValue2 = fmax(outValue2, (FLOAT4)0); - outValue3 = fmax(outValue3, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); + outValue2 = fmax(outValue2, (COMPUTE_FLOAT4)0); + outValue3 = fmax(outValue3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); - outValue2 = clamp(outValue2, (FLOAT4)0, (FLOAT4)6); - outValue3 = clamp(outValue3, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue2 = clamp(outValue2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue3 = clamp(outValue3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w4_idx)*4; const int remain = out_hw.y - out_w4_idx; if (remain >= 4) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, 2, output+out_offset); - vstore4(outValue3, 3, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue3), 3, output+out_offset); } else if (remain == 3) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, 2, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), 2, output+out_offset); } else if (remain == 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } } @@ -623,96 +608,96 @@ void depthwise_conv2d_k3s1p1_c4h1w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *inp const int b_idx = out_b_h_idx / out_hw.x; const int out_h_idx = out_b_h_idx % out_hw.x; - FLOAT4 outValue0 = vload4(c_idx, bias); - FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; const int out_w2_idx = out_w_idx << 1; const int in_w_start_0 = out_w2_idx - pad_hw.y; const int in_h_start = out_h_idx - pad_hw.x; - FLOAT4 inValue0, inValue1, inValue2, inValue3; + COMPUTE_FLOAT4 inValue0, inValue1, inValue2, inValue3; //first line const int inp_offset = (((b_idx*c_blocks + c_idx)*in_hw.x + in_h_start)* in_hw.y + in_w_start_0)*4; - inValue0 = (in_h_start < 0 || in_w_start_0 < 0 ) ? (FLOAT4)0 : vload4(0, input+inp_offset); - inValue1 = (in_h_start < 0 || in_w_start_0+1 >= in_hw.y) ? (FLOAT4)0 : vload4(1, input+inp_offset); - inValue2 = (in_h_start < 0 || in_w_start_0+2 >= in_hw.y) ? (FLOAT4)0 : vload4(2, input+inp_offset); - inValue3 = (in_h_start < 0 || in_w_start_0+3 >= in_hw.y) ? (FLOAT4)0 : vload4(3, input+inp_offset); + inValue0 = (in_h_start < 0 || in_w_start_0 < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); + inValue1 = (in_h_start < 0 || in_w_start_0+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(1, input+inp_offset)); + inValue2 = (in_h_start < 0 || in_w_start_0+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2, input+inp_offset)); + inValue3 = (in_h_start < 0 || in_w_start_0+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(3, input+inp_offset)); int filter_idx = mad24(0, filter_hw.y, 0); - FLOAT4 weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); outValue1 = mad(inValue1, weights, outValue1); filter_idx = mad24(0, filter_hw.y, 1); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue1, weights, outValue0); outValue1 = mad(inValue2, weights, outValue1); filter_idx = mad24(0, filter_hw.y, 2); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue2, weights, outValue0); outValue1 = mad(inValue3, weights, outValue1); //second line - inValue0 = (in_h_start+1 >= in_hw.x || in_w_start_0 < 0 ) ? (FLOAT4)0 : vload4(in_hw.y+0, input+inp_offset); - inValue1 = (in_h_start+1 >= in_hw.x || in_w_start_0+1 >= in_hw.y) ? (FLOAT4)0 : vload4(in_hw.y+1, input+inp_offset); - inValue2 = (in_h_start+1 >= in_hw.x || in_w_start_0+2 >= in_hw.y) ? (FLOAT4)0 : vload4(in_hw.y+2, input+inp_offset); - inValue3 = (in_h_start+1 >= in_hw.x || in_w_start_0+3 >= in_hw.y) ? (FLOAT4)0 : vload4(in_hw.y+3, input+inp_offset); + inValue0 = (in_h_start+1 >= in_hw.x || in_w_start_0 < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+0, input+inp_offset)); + inValue1 = (in_h_start+1 >= in_hw.x || in_w_start_0+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+1, input+inp_offset)); + inValue2 = (in_h_start+1 >= in_hw.x || in_w_start_0+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+2, input+inp_offset)); + inValue3 = (in_h_start+1 >= in_hw.x || in_w_start_0+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+3, input+inp_offset)); filter_idx = mad24(1, filter_hw.y, 0); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); outValue1 = mad(inValue1, weights, outValue1); filter_idx = mad24(1, filter_hw.y, 1); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue1, weights, outValue0); outValue1 = mad(inValue2, weights, outValue1); filter_idx = mad24(1, filter_hw.y, 2); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue2, weights, outValue0); outValue1 = mad(inValue3, weights, outValue1); //third line - inValue0 = (in_h_start+2 >= in_hw.x || in_w_start_0 < 0 ) ? (FLOAT4)0 : vload4(2*in_hw.y+0, input+inp_offset); - inValue1 = (in_h_start+2 >= in_hw.x || in_w_start_0+1 >= in_hw.y) ? (FLOAT4)0 : vload4(2*in_hw.y+1, input+inp_offset); - inValue2 = (in_h_start+2 >= in_hw.x || in_w_start_0+2 >= in_hw.y) ? (FLOAT4)0 : vload4(2*in_hw.y+2, input+inp_offset); - inValue3 = (in_h_start+2 >= in_hw.x || in_w_start_0+3 >= in_hw.y) ? (FLOAT4)0 : vload4(2*in_hw.y+3, input+inp_offset); + inValue0 = (in_h_start+2 >= in_hw.x || in_w_start_0 < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+0, input+inp_offset)); + inValue1 = (in_h_start+2 >= in_hw.x || in_w_start_0+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+1, input+inp_offset)); + inValue2 = (in_h_start+2 >= in_hw.x || in_w_start_0+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+2, input+inp_offset)); + inValue3 = (in_h_start+2 >= in_hw.x || in_w_start_0+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+3, input+inp_offset)); filter_idx = mad24(2, filter_hw.y, 0); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights, outValue0); outValue1 = mad(inValue1, weights, outValue1); filter_idx = mad24(2, filter_hw.y, 1); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue1, weights, outValue0); outValue1 = mad(inValue2, weights, outValue1); filter_idx = mad24(2, filter_hw.y, 2); - weights = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue2, weights, outValue0); outValue1 = mad(inValue3, weights, outValue1); #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h_idx)*out_hw.y + out_w2_idx)*4; const int remain = out_hw.y - out_w2_idx; if (remain >= 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else if (remain == 1) { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } } @@ -742,107 +727,107 @@ void depthwise_conv2d_k3s1p1_c4h2w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *inp const int b_idx = out_b_h_idx / out_h_blocks; const int out_h_idx = out_b_h_idx % out_h_blocks; - FLOAT4 outValue0 = vload4(c_idx, bias); - FLOAT4 outValue1 = outValue0; - FLOAT4 outValue2 = outValue0; - FLOAT4 outValue3 = outValue0; + COMPUTE_FLOAT4 outValue0 = CONVERT_COMPUTE_FLOAT4(vload4(c_idx, bias)); + COMPUTE_FLOAT4 outValue1 = outValue0; + COMPUTE_FLOAT4 outValue2 = outValue0; + COMPUTE_FLOAT4 outValue3 = outValue0; const int out_w2_idx = out_w_idx << 1; const int in_w_start = out_w2_idx - pad_hw.y; const int out_h2_idx = out_h_idx << 1; const int in_h_start = out_h2_idx - pad_hw.x; - FLOAT4 inValue0, inValue1, inValue2, inValue3; + COMPUTE_FLOAT4 inValue0, inValue1, inValue2, inValue3; //first line const int inp_offset = (((b_idx*c_blocks + c_idx)*in_hw.x + in_h_start)* in_hw.y + in_w_start)*4; - inValue0 = (in_h_start < 0 || in_w_start < 0 ) ? (FLOAT4)0 : vload4(0, input+inp_offset); - inValue1 = (in_h_start < 0 || in_w_start+1 >= in_hw.y) ? (FLOAT4)0 : vload4(1, input+inp_offset); - inValue2 = (in_h_start < 0 || in_w_start+2 >= in_hw.y) ? (FLOAT4)0 : vload4(2, input+inp_offset); - inValue3 = (in_h_start < 0 || in_w_start+3 >= in_hw.y) ? (FLOAT4)0 : vload4(3, input+inp_offset); + inValue0 = (in_h_start < 0 || in_w_start < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset)); + inValue1 = (in_h_start < 0 || in_w_start+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(1, input+inp_offset)); + inValue2 = (in_h_start < 0 || in_w_start+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2, input+inp_offset)); + inValue3 = (in_h_start < 0 || in_w_start+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(3, input+inp_offset)); int filter_idx = mad24(0, filter_hw.y, 0); - FLOAT4 weights0 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights0 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights0, outValue0); outValue1 = mad(inValue1, weights0, outValue1); filter_idx = mad24(0, filter_hw.y, 1); - FLOAT4 weights1 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights1 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue1, weights1, outValue0); outValue1 = mad(inValue2, weights1, outValue1); filter_idx = mad24(0, filter_hw.y, 2); - FLOAT4 weights2 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + COMPUTE_FLOAT4 weights2 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue2, weights2, outValue0); outValue1 = mad(inValue3, weights2, outValue1); //second line - inValue0 = (in_h_start+1 >= in_hw.x || in_w_start < 0 ) ? (FLOAT4)0 : vload4(in_hw.y+0, input+inp_offset); - inValue1 = (in_h_start+1 >= in_hw.x || in_w_start+1 >= in_hw.y) ? (FLOAT4)0 : vload4(in_hw.y+1, input+inp_offset); - inValue2 = (in_h_start+1 >= in_hw.x || in_w_start+2 >= in_hw.y) ? (FLOAT4)0 : vload4(in_hw.y+2, input+inp_offset); - inValue3 = (in_h_start+1 >= in_hw.x || in_w_start+3 >= in_hw.y) ? (FLOAT4)0 : vload4(in_hw.y+3, input+inp_offset); + inValue0 = (in_h_start+1 >= in_hw.x || in_w_start < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+0, input+inp_offset)); + inValue1 = (in_h_start+1 >= in_hw.x || in_w_start+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+1, input+inp_offset)); + inValue2 = (in_h_start+1 >= in_hw.x || in_w_start+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+2, input+inp_offset)); + inValue3 = (in_h_start+1 >= in_hw.x || in_w_start+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(in_hw.y+3, input+inp_offset)); DW_CONV_NEXT_LINE_CAL(outValue2, outValue3) filter_idx = mad24(1, filter_hw.y, 0); - weights0 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights0 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights0, outValue0); outValue1 = mad(inValue1, weights0, outValue1); filter_idx = mad24(1, filter_hw.y, 1); - weights1 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights1 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue1, weights1, outValue0); outValue1 = mad(inValue2, weights1, outValue1); filter_idx = mad24(1, filter_hw.y, 2); - weights2 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights2 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue2, weights2, outValue0); outValue1 = mad(inValue3, weights2, outValue1); //third line - inValue0 = (in_h_start+2 >= in_hw.x || in_w_start < 0 ) ? (FLOAT4)0 : vload4(2*in_hw.y+0, input+inp_offset); - inValue1 = (in_h_start+2 >= in_hw.x || in_w_start+1 >= in_hw.y) ? (FLOAT4)0 : vload4(2*in_hw.y+1, input+inp_offset); - inValue2 = (in_h_start+2 >= in_hw.x || in_w_start+2 >= in_hw.y) ? (FLOAT4)0 : vload4(2*in_hw.y+2, input+inp_offset); - inValue3 = (in_h_start+2 >= in_hw.x || in_w_start+3 >= in_hw.y) ? (FLOAT4)0 : vload4(2*in_hw.y+3, input+inp_offset); + inValue0 = (in_h_start+2 >= in_hw.x || in_w_start < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+0, input+inp_offset)); + inValue1 = (in_h_start+2 >= in_hw.x || in_w_start+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+1, input+inp_offset)); + inValue2 = (in_h_start+2 >= in_hw.x || in_w_start+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+2, input+inp_offset)); + inValue3 = (in_h_start+2 >= in_hw.x || in_w_start+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(2*in_hw.y+3, input+inp_offset)); DW_CONV_NEXT_LINE_CAL(outValue2, outValue3) filter_idx = mad24(2, filter_hw.y, 0); - weights0 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights0 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue0, weights0, outValue0); outValue1 = mad(inValue1, weights0, outValue1); filter_idx = mad24(2, filter_hw.y, 1); - weights1 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights1 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue1, weights1, outValue0); outValue1 = mad(inValue2, weights1, outValue1); filter_idx = mad24(2, filter_hw.y, 2); - weights2 = vload4(0, filter+(filter_idx*c_blocks+c_idx)*4); + weights2 = CONVERT_COMPUTE_FLOAT4(vload4(0, filter+(filter_idx*c_blocks+c_idx)*4)); outValue0 = mad(inValue2, weights2, outValue0); outValue1 = mad(inValue3, weights2, outValue1); //forth line - inValue0 = (in_h_start+3 >= in_hw.x || in_w_start < 0 ) ? (FLOAT4)0 : vload4(3*in_hw.y+0, input+inp_offset); - inValue1 = (in_h_start+3 >= in_hw.x || in_w_start+1 >= in_hw.y) ? (FLOAT4)0 : vload4(3*in_hw.y+1, input+inp_offset); - inValue2 = (in_h_start+3 >= in_hw.x || in_w_start+2 >= in_hw.y) ? (FLOAT4)0 : vload4(3*in_hw.y+2, input+inp_offset); - inValue3 = (in_h_start+3 >= in_hw.x || in_w_start+3 >= in_hw.y) ? (FLOAT4)0 : vload4(3*in_hw.y+3, input+inp_offset); + inValue0 = (in_h_start+3 >= in_hw.x || in_w_start < 0 ) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(3*in_hw.y+0, input+inp_offset)); + inValue1 = (in_h_start+3 >= in_hw.x || in_w_start+1 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(3*in_hw.y+1, input+inp_offset)); + inValue2 = (in_h_start+3 >= in_hw.x || in_w_start+2 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(3*in_hw.y+2, input+inp_offset)); + inValue3 = (in_h_start+3 >= in_hw.x || in_w_start+3 >= in_hw.y) ? (COMPUTE_FLOAT4)0 : CONVERT_COMPUTE_FLOAT4(vload4(3*in_hw.y+3, input+inp_offset)); DW_CONV_NEXT_LINE_CAL(outValue2, outValue3) #ifdef RELU - outValue0 = fmax(outValue0, (FLOAT4)0); - outValue1 = fmax(outValue1, (FLOAT4)0); - outValue2 = fmax(outValue2, (FLOAT4)0); - outValue3 = fmax(outValue3, (FLOAT4)0); + outValue0 = fmax(outValue0, (COMPUTE_FLOAT4)0); + outValue1 = fmax(outValue1, (COMPUTE_FLOAT4)0); + outValue2 = fmax(outValue2, (COMPUTE_FLOAT4)0); + outValue3 = fmax(outValue3, (COMPUTE_FLOAT4)0); #endif #ifdef RELU6 - outValue0 = clamp(outValue0, (FLOAT4)0, (FLOAT4)6); - outValue1 = clamp(outValue1, (FLOAT4)0, (FLOAT4)6); - outValue2 = clamp(outValue2, (FLOAT4)0, (FLOAT4)6); - outValue3 = clamp(outValue3, (FLOAT4)0, (FLOAT4)6); + outValue0 = clamp(outValue0, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue1 = clamp(outValue1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue2 = clamp(outValue2, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); + outValue3 = clamp(outValue3, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); #endif const int out_offset = (((b_idx*c_blocks + c_idx)*out_hw.x + out_h2_idx)*out_hw.y + out_w2_idx)*4; @@ -851,17 +836,17 @@ void depthwise_conv2d_k3s1p1_c4h2w2(GLOBAL_SIZE_2_DIMS __global const FLOAT *inp const int remain_h = out_hw.x - out_h2_idx; if(remain_w >= 2 && remain_h >= 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); - vstore4(outValue2, out_hw.y+0, output+out_offset); - vstore4(outValue3, out_hw.y+1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), out_hw.y+0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue3), out_hw.y+1, output+out_offset); } else if(remain_w == 1 && remain_h >= 2) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue2, out_hw.y+0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue2), out_hw.y+0, output+out_offset); } else if(remain_w >= 2 && remain_h == 1) { - vstore4(outValue0, 0, output+out_offset); - vstore4(outValue1, 1, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue1), 1, output+out_offset); } else { - vstore4(outValue0, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(outValue0), 0, output+out_offset); } } diff --git a/source/backend/opencl/execution/cl/depthwise_conv2d_subgroup_buf.cl b/source/backend/opencl/execution/cl/depthwise_conv2d_subgroup_buf.cl index caca4db1b..7d7698059 100644 --- a/source/backend/opencl/execution/cl/depthwise_conv2d_subgroup_buf.cl +++ b/source/backend/opencl/execution/cl/depthwise_conv2d_subgroup_buf.cl @@ -63,30 +63,30 @@ __kernel void depthwise_conv_2d_buf_c16_c16( const uint filter_offset = c * filter_is_pitch; #ifdef MNN_SUPPORT_FP16 - FLOAT8 dst = (FLOAT8)(as_half(intel_sub_group_block_read_us((__global ushort*)(biases + c * 16)))); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(as_half(intel_sub_group_block_read_us((__global ushort*)(biases + c * 16)))); for(int i = 0; i < FILTER_HEIGHT; ++i){ if ((input_y + i * DILATION_HEIGHT) < 0 || (input_y + i * DILATION_HEIGHT) >= inputHeight) continue; for(int j = 0; j < FILTER_WIDTH; ++j){ - FLOAT wei = as_half(intel_sub_group_block_read_us((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); + COMPUTE_FLOAT wei = as_half(intel_sub_group_block_read_us((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); for(int k = 0; k < 8; ++k){ - FLOAT src = as_half(intel_sub_group_block_read_us((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); + COMPUTE_FLOAT src = as_half(intel_sub_group_block_read_us((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); dst[k] = mad(src, wei, dst[k]); } } } #else - FLOAT8 dst = (FLOAT8)(as_float(intel_sub_group_block_read((__global uint*)(biases + c * 16)))); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(as_float(intel_sub_group_block_read((__global uint*)(biases + c * 16)))); for(int i = 0; i < FILTER_HEIGHT; ++i){ if ((input_y + i * DILATION_HEIGHT) < 0 || (input_y + i * DILATION_HEIGHT) >= inputHeight) continue; for(int j = 0; j < FILTER_WIDTH; ++j){ - FLOAT wei = as_float(intel_sub_group_block_read((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); + COMPUTE_FLOAT wei = as_float(intel_sub_group_block_read((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); for(int k = 0; k < 8; ++k){ - FLOAT src = as_float(intel_sub_group_block_read((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); + COMPUTE_FLOAT src = as_float(intel_sub_group_block_read((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); dst[k] = mad(src, wei, dst[k]); } } @@ -95,18 +95,18 @@ __kernel void depthwise_conv_2d_buf_c16_c16( #ifdef RELU - dst = fmax(dst, (FLOAT8)0); + dst = fmax(dst, (COMPUTE_FLOAT8)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT8)0, (FLOAT8)6); + dst = clamp(dst, (COMPUTE_FLOAT8)0, (COMPUTE_FLOAT8)6); #endif for (int i = 0; i < 8 && (x + i) < outputWidth; i++) { #ifdef MNN_SUPPORT_FP16 - intel_sub_group_block_write_us((__global ushort*)(output + output_offset + i * output_x_pitch), as_ushort(dst[i])); + intel_sub_group_block_write_us((__global ushort*)(output + output_offset + i * output_x_pitch), as_ushort((FLOAT)dst[i])); #else - intel_sub_group_block_write((__global uint*)(output + output_offset + i * output_x_pitch), as_uint(dst[i])); + intel_sub_group_block_write((__global uint*)(output + output_offset + i * output_x_pitch), as_uint((FLOAT)dst[i])); #endif } if(x == 0){ @@ -181,30 +181,30 @@ __kernel void depthwise_conv_2d_buf_c16_c4( const uint filter_offset = c * filter_is_pitch; #ifdef MNN_SUPPORT_FP16 - FLOAT8 dst = (FLOAT8)(as_half(intel_sub_group_block_read_us((__global ushort*)(biases + c * 16)))); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(as_half(intel_sub_group_block_read_us((__global ushort*)(biases + c * 16)))); for(int i = 0; i < FILTER_HEIGHT; ++i){ if ((input_y + i * DILATION_HEIGHT) < 0 || (input_y + i * DILATION_HEIGHT) >= inputHeight) continue; for(int j = 0; j < FILTER_WIDTH; ++j){ - FLOAT wei = as_half(intel_sub_group_block_read_us((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); + COMPUTE_FLOAT wei = as_half(intel_sub_group_block_read_us((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); for(int k = 0; k < 8; ++k){ - FLOAT src = as_half(intel_sub_group_block_read_us((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); + COMPUTE_FLOAT src = as_half(intel_sub_group_block_read_us((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); dst[k] = mad(src, wei, dst[k]); } } } #else - FLOAT8 dst = (FLOAT8)(as_float(intel_sub_group_block_read((__global uint*)(biases + c * 16)))); + COMPUTE_FLOAT8 dst = (COMPUTE_FLOAT8)(as_float(intel_sub_group_block_read((__global uint*)(biases + c * 16)))); for(int i = 0; i < FILTER_HEIGHT; ++i){ if ((input_y + i * DILATION_HEIGHT) < 0 || (input_y + i * DILATION_HEIGHT) >= inputHeight) continue; for(int j = 0; j < FILTER_WIDTH; ++j){ - FLOAT wei = as_float(intel_sub_group_block_read((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); + COMPUTE_FLOAT wei = as_float(intel_sub_group_block_read((__global ushort*)(weights + filter_offset + i * filter_y_pitch + j * filter_x_pitch))); for(int k = 0; k < 8; ++k){ - FLOAT src = as_float(intel_sub_group_block_read((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); + COMPUTE_FLOAT src = as_float(intel_sub_group_block_read((__global ushort*)(input + input_offset + i * DILATION_HEIGHT * input_y_pitch + (j * DILATION_WIDTH + k * STRIDE_WIDTH) * input_x_pitch))); dst[k] = mad(src, wei, dst[k]); } } @@ -213,11 +213,11 @@ __kernel void depthwise_conv_2d_buf_c16_c4( #ifdef RELU - dst = fmax(dst, (FLOAT8)0); + dst = fmax(dst, (COMPUTE_FLOAT8)0); #endif #ifdef RELU6 - dst = clamp(dst, (FLOAT8)0, (FLOAT8)6); + dst = clamp(dst, (COMPUTE_FLOAT8)0, (COMPUTE_FLOAT8)6); #endif const uint lid_x = sglid % 4; diff --git a/source/backend/opencl/execution/cl/gemm_buf.cl b/source/backend/opencl/execution/cl/gemm_buf.cl index e6c307c9f..2022fd9e3 100644 --- a/source/backend/opencl/execution/cl/gemm_buf.cl +++ b/source/backend/opencl/execution/cl/gemm_buf.cl @@ -25,7 +25,7 @@ __kernel void gemm_buf(GLOBAL_SIZE_DIM2 const int pos_y = pos.x / width; const int pos_z = pos.y; - FLOAT16 o = (FLOAT16)0; + COMPUTE_FLOAT16 o = (COMPUTE_FLOAT16)0; int kenerlY = mad24(pos_z, height, pos_y); int srcY = mad24(pos_z, width, pos_x); @@ -37,17 +37,17 @@ __kernel void gemm_buf(GLOBAL_SIZE_DIM2 //index:[0, 0, pos_z*width+pos_y, index+0] //int inp1_offset = (((k * (alpha2*height) + kenerlY) * (srcChannelC4*4) + index)*4 + 0)*4; - FLOAT16 k_v16 = vload16(kenerlY*(srcChannelC4) + k, input1); + COMPUTE_FLOAT16 k_v16 = CONVERT_COMPUTE_FLOAT16(vload16(kenerlY*(srcChannelC4) + k, input1)); //NC4HW4 [alpha*alpha, srcChannelC4, width, 4] x 4 //index: [pos_z, k, pos_x, 0] - FLOAT16 s = vload16(((pos_z*srcChannelC4 + k) * width + pos_x), input0); + COMPUTE_FLOAT16 s = CONVERT_COMPUTE_FLOAT16(vload16(((pos_z*srcChannelC4 + k) * width + pos_x), input0)); - o = mad((FLOAT16)((FLOAT4)s.s0, (FLOAT4)s.s4, (FLOAT4)s.s8, (FLOAT4)s.sc), (FLOAT16)(k_v16.s0123, k_v16.s0123, k_v16.s0123, k_v16.s0123), o); - o = mad((FLOAT16)((FLOAT4)s.s1, (FLOAT4)s.s5, (FLOAT4)s.s9, (FLOAT4)s.sd), (FLOAT16)(k_v16.s4567, k_v16.s4567, k_v16.s4567, k_v16.s4567), o); - o = mad((FLOAT16)((FLOAT4)s.s2, (FLOAT4)s.s6, (FLOAT4)s.sa, (FLOAT4)s.se), (FLOAT16)(k_v16.s89ab, k_v16.s89ab, k_v16.s89ab, k_v16.s89ab), o); - o = mad((FLOAT16)((FLOAT4)s.s3, (FLOAT4)s.s7, (FLOAT4)s.sb, (FLOAT4)s.sf), (FLOAT16)(k_v16.scdef, k_v16.scdef, k_v16.scdef, k_v16.scdef), o); + o = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s0, (COMPUTE_FLOAT4)s.s4, (COMPUTE_FLOAT4)s.s8, (COMPUTE_FLOAT4)s.sc), (COMPUTE_FLOAT16)(k_v16.s0123, k_v16.s0123, k_v16.s0123, k_v16.s0123), o); + o = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s1, (COMPUTE_FLOAT4)s.s5, (COMPUTE_FLOAT4)s.s9, (COMPUTE_FLOAT4)s.sd), (COMPUTE_FLOAT16)(k_v16.s4567, k_v16.s4567, k_v16.s4567, k_v16.s4567), o); + o = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s2, (COMPUTE_FLOAT4)s.s6, (COMPUTE_FLOAT4)s.sa, (COMPUTE_FLOAT4)s.se), (COMPUTE_FLOAT16)(k_v16.s89ab, k_v16.s89ab, k_v16.s89ab, k_v16.s89ab), o); + o = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s3, (COMPUTE_FLOAT4)s.s7, (COMPUTE_FLOAT4)s.sb, (COMPUTE_FLOAT4)s.sf), (COMPUTE_FLOAT16)(k_v16.scdef, k_v16.scdef, k_v16.scdef, k_v16.scdef), o); } __private int out_y_idx = mul24(pos_y, 4); @@ -56,10 +56,10 @@ __kernel void gemm_buf(GLOBAL_SIZE_DIM2 //index: [pos_y, pos_z, 0, pos_x] int out_offset = (((pos_y * alpha2 + pos_z) * 4 + 0) * width + pos_x) * 4; - vstore4(o.s0123, 0, output+out_offset); - vstore4(o.s4567, 0, output+out_offset+4*width); - vstore4(o.s89ab, 0, output+out_offset+8*width); - vstore4(o.scdef, 0, output+out_offset+12*width); + vstore4(CONVERT_FLOAT4(o.s0123), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(o.s4567), 0, output+out_offset+4*width); + vstore4(CONVERT_FLOAT4(o.s89ab), 0, output+out_offset+8*width); + vstore4(CONVERT_FLOAT4(o.scdef), 0, output+out_offset+12*width); } @@ -80,8 +80,8 @@ __kernel void gemm_buf2(GLOBAL_SIZE_DIM2 const int pos_y = pos.x / width_block; const int pos_z = pos.y; - FLOAT16 o0 = (FLOAT16)0; - FLOAT16 o1 = (FLOAT16)0; + COMPUTE_FLOAT16 o0 = (COMPUTE_FLOAT16)0; + COMPUTE_FLOAT16 o1 = (COMPUTE_FLOAT16)0; const int kenerlY = mad24(pos_z, height, pos_y); const int kernel_base = mul24(kenerlY, srcChannelC4); @@ -92,24 +92,24 @@ __kernel void gemm_buf2(GLOBAL_SIZE_DIM2 //index:[0, 0, pos_z*width+pos_y, index+0] //int inp1_offset = (((k * (alpha2*height) + kenerlY) * (srcChannelC4*4) + index)*4 + 0)*4; - FLOAT16 k_v16 = vload16(kernel_base + k, input1); + COMPUTE_FLOAT16 k_v16 = CONVERT_COMPUTE_FLOAT16(vload16(kernel_base + k, input1)); //NC4HW4 [alpha*alpha, srcChannelC4, width, 4] x 4 //index: [pos_z, k, pos_x, 0] const int inp_offset = mad24(k, width, inp_base); - FLOAT16 s = vload16(inp_offset, input0); - - o0 = mad((FLOAT16)((FLOAT4)s.s0, (FLOAT4)s.s4, (FLOAT4)s.s8, (FLOAT4)s.sc), (FLOAT16)(k_v16.s0123, k_v16.s0123, k_v16.s0123, k_v16.s0123), o0); - o0 = mad((FLOAT16)((FLOAT4)s.s1, (FLOAT4)s.s5, (FLOAT4)s.s9, (FLOAT4)s.sd), (FLOAT16)(k_v16.s4567, k_v16.s4567, k_v16.s4567, k_v16.s4567), o0); - o0 = mad((FLOAT16)((FLOAT4)s.s2, (FLOAT4)s.s6, (FLOAT4)s.sa, (FLOAT4)s.se), (FLOAT16)(k_v16.s89ab, k_v16.s89ab, k_v16.s89ab, k_v16.s89ab), o0); - o0 = mad((FLOAT16)((FLOAT4)s.s3, (FLOAT4)s.s7, (FLOAT4)s.sb, (FLOAT4)s.sf), (FLOAT16)(k_v16.scdef, k_v16.scdef, k_v16.scdef, k_v16.scdef), o0); - - s = vload16(inp_offset + 1, input0); - o1 = mad((FLOAT16)((FLOAT4)s.s0, (FLOAT4)s.s4, (FLOAT4)s.s8, (FLOAT4)s.sc), (FLOAT16)(k_v16.s0123, k_v16.s0123, k_v16.s0123, k_v16.s0123), o1); - o1 = mad((FLOAT16)((FLOAT4)s.s1, (FLOAT4)s.s5, (FLOAT4)s.s9, (FLOAT4)s.sd), (FLOAT16)(k_v16.s4567, k_v16.s4567, k_v16.s4567, k_v16.s4567), o1); - o1 = mad((FLOAT16)((FLOAT4)s.s2, (FLOAT4)s.s6, (FLOAT4)s.sa, (FLOAT4)s.se), (FLOAT16)(k_v16.s89ab, k_v16.s89ab, k_v16.s89ab, k_v16.s89ab), o1); - o1 = mad((FLOAT16)((FLOAT4)s.s3, (FLOAT4)s.s7, (FLOAT4)s.sb, (FLOAT4)s.sf), (FLOAT16)(k_v16.scdef, k_v16.scdef, k_v16.scdef, k_v16.scdef), o1); + COMPUTE_FLOAT16 s = CONVERT_COMPUTE_FLOAT16(vload16(inp_offset, input0)); + + o0 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s0, (COMPUTE_FLOAT4)s.s4, (COMPUTE_FLOAT4)s.s8, (COMPUTE_FLOAT4)s.sc), (COMPUTE_FLOAT16)(k_v16.s0123, k_v16.s0123, k_v16.s0123, k_v16.s0123), o0); + o0 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s1, (COMPUTE_FLOAT4)s.s5, (COMPUTE_FLOAT4)s.s9, (COMPUTE_FLOAT4)s.sd), (COMPUTE_FLOAT16)(k_v16.s4567, k_v16.s4567, k_v16.s4567, k_v16.s4567), o0); + o0 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s2, (COMPUTE_FLOAT4)s.s6, (COMPUTE_FLOAT4)s.sa, (COMPUTE_FLOAT4)s.se), (COMPUTE_FLOAT16)(k_v16.s89ab, k_v16.s89ab, k_v16.s89ab, k_v16.s89ab), o0); + o0 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s3, (COMPUTE_FLOAT4)s.s7, (COMPUTE_FLOAT4)s.sb, (COMPUTE_FLOAT4)s.sf), (COMPUTE_FLOAT16)(k_v16.scdef, k_v16.scdef, k_v16.scdef, k_v16.scdef), o0); + + s = CONVERT_COMPUTE_FLOAT16(vload16(inp_offset + 1, input0)); + o1 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s0, (COMPUTE_FLOAT4)s.s4, (COMPUTE_FLOAT4)s.s8, (COMPUTE_FLOAT4)s.sc), (COMPUTE_FLOAT16)(k_v16.s0123, k_v16.s0123, k_v16.s0123, k_v16.s0123), o1); + o1 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s1, (COMPUTE_FLOAT4)s.s5, (COMPUTE_FLOAT4)s.s9, (COMPUTE_FLOAT4)s.sd), (COMPUTE_FLOAT16)(k_v16.s4567, k_v16.s4567, k_v16.s4567, k_v16.s4567), o1); + o1 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s2, (COMPUTE_FLOAT4)s.s6, (COMPUTE_FLOAT4)s.sa, (COMPUTE_FLOAT4)s.se), (COMPUTE_FLOAT16)(k_v16.s89ab, k_v16.s89ab, k_v16.s89ab, k_v16.s89ab), o1); + o1 = mad((COMPUTE_FLOAT16)((COMPUTE_FLOAT4)s.s3, (COMPUTE_FLOAT4)s.s7, (COMPUTE_FLOAT4)s.sb, (COMPUTE_FLOAT4)s.sf), (COMPUTE_FLOAT16)(k_v16.scdef, k_v16.scdef, k_v16.scdef, k_v16.scdef), o1); } __private int out_y_idx = mul24(pos_y, 4); @@ -118,696 +118,14 @@ __kernel void gemm_buf2(GLOBAL_SIZE_DIM2 //index: [pos_y, pos_z, 0, pos_x] int out_offset = (((pos_y * alpha2 + pos_z) * 4 + 0) * width + pos_x) * 4; - vstore4(o0.s0123, 0, output+out_offset); - vstore4(o0.s4567, 0, output+out_offset+4*width); - vstore4(o0.s89ab, 0, output+out_offset+8*width); - vstore4(o0.scdef, 0, output+out_offset+12*width); + vstore4(CONVERT_FLOAT4(o0.s0123), 0, output+out_offset); + vstore4(CONVERT_FLOAT4(o0.s4567), 0, output+out_offset+4*width); + vstore4(CONVERT_FLOAT4(o0.s89ab), 0, output+out_offset+8*width); + vstore4(CONVERT_FLOAT4(o0.scdef), 0, output+out_offset+12*width); if(pos_x + 1 >= width) return; - vstore4(o1.s0123, 1, output+out_offset); - vstore4(o1.s4567, 1, output+out_offset+4*width); - vstore4(o1.s89ab, 1, output+out_offset+8*width); - vstore4(o1.scdef, 1, output+out_offset+12*width); -} - -__kernel void gemm_conv_c4_buf(GLOBAL_SIZE_DIM2 - __global const FLOAT* input, -#if (defined USE_LOW_BIT_WEIGHT_INT8) - __global const char *weight, - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - __global const uchar *weight, - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, -#else - __global const FLOAT *weight, -#endif - __global const FLOAT *bias, - __global FLOAT* output, - __private const int dstChannelC4, - __private const int srcChannelC4, - __private const int batch, - __private const int height, - __private const int width) { - const int out_c_w_idx = get_global_id(0); //c/4 w - const int out_b_h_idx = get_global_id(1); //b h - - UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); - - const int out_c_idx = out_c_w_idx / width; - const int out_w_idx = out_c_w_idx % width; - const int out_b_idx = out_b_h_idx / height; - const int out_h_idx = out_b_h_idx % height; - - FLOAT4 bias0 = vload4(out_c_idx, bias); - FLOAT sum = 0; - FLOAT4 out = 0; - - int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; - int out_offset = ((out_b_idx * dstChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; - int wh = width * height * 4; -#if (defined USE_LOW_BIT_WEIGHT_INT4) - int weight_offset = out_c_idx * 4 * 8; - int weight_oc_offset = dstChannelC4 * 32; -#else - int weight_offset = out_c_idx * 4 * 16; - int weight_oc_offset = dstChannelC4 * 64; -#endif - -#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) - const FLOAT4 Scale = vload4(out_c_idx, dequantScale); - const FLOAT4 Offset = vload4(out_c_idx, dequantOffset); -#endif -#ifdef INPUT_CHANNEL_LEAVE - for (int k = 0; k < srcChannelC4/4 - 1; ++k) { -#else - for (int k = 0; k < srcChannelC4/4; ++k) { -#endif -#ifdef WIDTH_HEIGHT_1 - FLOAT16 in = vload16(k, input + input_offset); -#else - int k4 = k << 2; - FLOAT16 in; - in.s0123 = vload4(0, input + input_offset + k4 * wh); - in.s4567 = vload4(0, input + input_offset + (k4 + 1) * wh); - in.s89ab = vload4(0, input + input_offset + (k4 + 2) * wh); - in.scdef = vload4(0, input + input_offset + (k4 + 3) * wh); -#endif -#if (defined USE_LOW_BIT_WEIGHT_INT8) - FLOAT16 weights0 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); - FLOAT16 weights1 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); - FLOAT16 weights2 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 32)); - FLOAT16 weights3 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 48)); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - uchar16 charWeightsInt40 = vload16(0, weight + weight_offset + k * weight_oc_offset); - uchar16 charWeightsInt41 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); - FLOAT16 weights0, weights1, weights2, weights3; - { - char16 charWeights0 = 0; - char16 charWeights1 = 0; - charWeights0.s0 = (charWeightsInt40.s0 >> 4) - 8; - charWeights0.s1 = (charWeightsInt40.s0 & 15) - 8; - charWeights0.s2 = (charWeightsInt40.s1 >> 4) - 8; - charWeights0.s3 = (charWeightsInt40.s1 & 15) - 8; - charWeights0.s4 = (charWeightsInt40.s2 >> 4) - 8; - charWeights0.s5 = (charWeightsInt40.s2 & 15) - 8; - charWeights0.s6 = (charWeightsInt40.s3 >> 4) - 8; - charWeights0.s7 = (charWeightsInt40.s3 & 15) - 8; - charWeights0.s8 = (charWeightsInt40.s4 >> 4) - 8; - charWeights0.s9 = (charWeightsInt40.s4 & 15) - 8; - charWeights0.sa = (charWeightsInt40.s5 >> 4) - 8; - charWeights0.sb = (charWeightsInt40.s5 & 15) - 8; - charWeights0.sc = (charWeightsInt40.s6 >> 4) - 8; - charWeights0.sd = (charWeightsInt40.s6 & 15) - 8; - charWeights0.se = (charWeightsInt40.s7 >> 4) - 8; - charWeights0.sf = (charWeightsInt40.s7 & 15) - 8; - charWeights1.s0 = (charWeightsInt40.s8 >> 4) - 8; - charWeights1.s1 = (charWeightsInt40.s8 & 15) - 8; - charWeights1.s2 = (charWeightsInt40.s9 >> 4) - 8; - charWeights1.s3 = (charWeightsInt40.s9 & 15) - 8; - charWeights1.s4 = (charWeightsInt40.sa >> 4) - 8; - charWeights1.s5 = (charWeightsInt40.sa & 15) - 8; - charWeights1.s6 = (charWeightsInt40.sb >> 4) - 8; - charWeights1.s7 = (charWeightsInt40.sb & 15) - 8; - charWeights1.s8 = (charWeightsInt40.sc >> 4) - 8; - charWeights1.s9 = (charWeightsInt40.sc & 15) - 8; - charWeights1.sa = (charWeightsInt40.sd >> 4) - 8; - charWeights1.sb = (charWeightsInt40.sd & 15) - 8; - charWeights1.sc = (charWeightsInt40.se >> 4) - 8; - charWeights1.sd = (charWeightsInt40.se & 15) - 8; - charWeights1.se = (charWeightsInt40.sf >> 4) - 8; - charWeights1.sf = (charWeightsInt40.sf & 15) - 8; - weights0 = CONVERT_FLOAT16(charWeights0); - weights1 = CONVERT_FLOAT16(charWeights1); - } - - { - char16 charWeights0 = 0; - char16 charWeights1 = 0; - charWeights0.s0 = (charWeightsInt41.s0 >> 4) - 8; - charWeights0.s1 = (charWeightsInt41.s0 & 15) - 8; - charWeights0.s2 = (charWeightsInt41.s1 >> 4) - 8; - charWeights0.s3 = (charWeightsInt41.s1 & 15) - 8; - charWeights0.s4 = (charWeightsInt41.s2 >> 4) - 8; - charWeights0.s5 = (charWeightsInt41.s2 & 15) - 8; - charWeights0.s6 = (charWeightsInt41.s3 >> 4) - 8; - charWeights0.s7 = (charWeightsInt41.s3 & 15) - 8; - charWeights0.s8 = (charWeightsInt41.s4 >> 4) - 8; - charWeights0.s9 = (charWeightsInt41.s4 & 15) - 8; - charWeights0.sa = (charWeightsInt41.s5 >> 4) - 8; - charWeights0.sb = (charWeightsInt41.s5 & 15) - 8; - charWeights0.sc = (charWeightsInt41.s6 >> 4) - 8; - charWeights0.sd = (charWeightsInt41.s6 & 15) - 8; - charWeights0.se = (charWeightsInt41.s7 >> 4) - 8; - charWeights0.sf = (charWeightsInt41.s7 & 15) - 8; - charWeights1.s0 = (charWeightsInt41.s8 >> 4) - 8; - charWeights1.s1 = (charWeightsInt41.s8 & 15) - 8; - charWeights1.s2 = (charWeightsInt41.s9 >> 4) - 8; - charWeights1.s3 = (charWeightsInt41.s9 & 15) - 8; - charWeights1.s4 = (charWeightsInt41.sa >> 4) - 8; - charWeights1.s5 = (charWeightsInt41.sa & 15) - 8; - charWeights1.s6 = (charWeightsInt41.sb >> 4) - 8; - charWeights1.s7 = (charWeightsInt41.sb & 15) - 8; - charWeights1.s8 = (charWeightsInt41.sc >> 4) - 8; - charWeights1.s9 = (charWeightsInt41.sc & 15) - 8; - charWeights1.sa = (charWeightsInt41.sd >> 4) - 8; - charWeights1.sb = (charWeightsInt41.sd & 15) - 8; - charWeights1.sc = (charWeightsInt41.se >> 4) - 8; - charWeights1.sd = (charWeightsInt41.se & 15) - 8; - charWeights1.se = (charWeightsInt41.sf >> 4) - 8; - charWeights1.sf = (charWeightsInt41.sf & 15) - 8; - weights2 = CONVERT_FLOAT16(charWeights0); - weights3 = CONVERT_FLOAT16(charWeights1); - } - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; - -#else - FLOAT16 weights0 = vload16(0, weight + weight_offset + k * weight_oc_offset); - FLOAT16 weights1 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); - FLOAT16 weights2 = vload16(0, weight + weight_offset + k * weight_oc_offset + 32); - FLOAT16 weights3 = vload16(0, weight + weight_offset + k * weight_oc_offset + 48); -#endif - - out.s0 += dot(in.s0123, weights0.s0123); - out.s0 += dot(in.s4567, weights0.s4567); - out.s0 += dot(in.s89ab, weights0.s89ab); - out.s0 += dot(in.scdef, weights0.scdef); - - out.s1 += dot(in.s0123, weights1.s0123); - out.s1 += dot(in.s4567, weights1.s4567); - out.s1 += dot(in.s89ab, weights1.s89ab); - out.s1 += dot(in.scdef, weights1.scdef); - - out.s2 += dot(in.s0123, weights2.s0123); - out.s2 += dot(in.s4567, weights2.s4567); - out.s2 += dot(in.s89ab, weights2.s89ab); - out.s2 += dot(in.scdef, weights2.scdef); - - out.s3 += dot(in.s0123, weights3.s0123); - out.s3 += dot(in.s4567, weights3.s4567); - out.s3 += dot(in.s89ab, weights3.s89ab); - out.s3 += dot(in.scdef, weights3.scdef); - } -#ifdef INPUT_CHANNEL_LEAVE - { - int k = srcChannelC4/4 - 1; - int k4 = k * 4; - FLOAT16 in; - in.s0123 = vload4(0, input + input_offset + k4 * wh); - in.s4567 = k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0; - in.s89ab = k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0; - in.scdef = k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0; -#if (defined USE_LOW_BIT_WEIGHT_INT8) - FLOAT16 weights0 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); - FLOAT16 weights1 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); - FLOAT16 weights2 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 32)); - FLOAT16 weights3 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 48)); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - uchar16 charWeightsInt40 = vload16(0, weight + weight_offset + k * weight_oc_offset); - uchar16 charWeightsInt41 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); - FLOAT16 weights0, weights1, weights2, weights3; - { - char16 charWeights0 = 0; - char16 charWeights1 = 0; - charWeights0.s0 = (charWeightsInt40.s0 >> 4) - 8; - charWeights0.s1 = (charWeightsInt40.s0 & 15) - 8; - charWeights0.s2 = (charWeightsInt40.s1 >> 4) - 8; - charWeights0.s3 = (charWeightsInt40.s1 & 15) - 8; - charWeights0.s4 = (charWeightsInt40.s2 >> 4) - 8; - charWeights0.s5 = (charWeightsInt40.s2 & 15) - 8; - charWeights0.s6 = (charWeightsInt40.s3 >> 4) - 8; - charWeights0.s7 = (charWeightsInt40.s3 & 15) - 8; - charWeights0.s8 = (charWeightsInt40.s4 >> 4) - 8; - charWeights0.s9 = (charWeightsInt40.s4 & 15) - 8; - charWeights0.sa = (charWeightsInt40.s5 >> 4) - 8; - charWeights0.sb = (charWeightsInt40.s5 & 15) - 8; - charWeights0.sc = (charWeightsInt40.s6 >> 4) - 8; - charWeights0.sd = (charWeightsInt40.s6 & 15) - 8; - charWeights0.se = (charWeightsInt40.s7 >> 4) - 8; - charWeights0.sf = (charWeightsInt40.s7 & 15) - 8; - charWeights1.s0 = (charWeightsInt40.s8 >> 4) - 8; - charWeights1.s1 = (charWeightsInt40.s8 & 15) - 8; - charWeights1.s2 = (charWeightsInt40.s9 >> 4) - 8; - charWeights1.s3 = (charWeightsInt40.s9 & 15) - 8; - charWeights1.s4 = (charWeightsInt40.sa >> 4) - 8; - charWeights1.s5 = (charWeightsInt40.sa & 15) - 8; - charWeights1.s6 = (charWeightsInt40.sb >> 4) - 8; - charWeights1.s7 = (charWeightsInt40.sb & 15) - 8; - charWeights1.s8 = (charWeightsInt40.sc >> 4) - 8; - charWeights1.s9 = (charWeightsInt40.sc & 15) - 8; - charWeights1.sa = (charWeightsInt40.sd >> 4) - 8; - charWeights1.sb = (charWeightsInt40.sd & 15) - 8; - charWeights1.sc = (charWeightsInt40.se >> 4) - 8; - charWeights1.sd = (charWeightsInt40.se & 15) - 8; - charWeights1.se = (charWeightsInt40.sf >> 4) - 8; - charWeights1.sf = (charWeightsInt40.sf & 15) - 8; - weights0 = CONVERT_FLOAT16(charWeights0); - weights1 = CONVERT_FLOAT16(charWeights1); - } - - { - char16 charWeights0 = 0; - char16 charWeights1 = 0; - charWeights0.s0 = (charWeightsInt41.s0 >> 4) - 8; - charWeights0.s1 = (charWeightsInt41.s0 & 15) - 8; - charWeights0.s2 = (charWeightsInt41.s1 >> 4) - 8; - charWeights0.s3 = (charWeightsInt41.s1 & 15) - 8; - charWeights0.s4 = (charWeightsInt41.s2 >> 4) - 8; - charWeights0.s5 = (charWeightsInt41.s2 & 15) - 8; - charWeights0.s6 = (charWeightsInt41.s3 >> 4) - 8; - charWeights0.s7 = (charWeightsInt41.s3 & 15) - 8; - charWeights0.s8 = (charWeightsInt41.s4 >> 4) - 8; - charWeights0.s9 = (charWeightsInt41.s4 & 15) - 8; - charWeights0.sa = (charWeightsInt41.s5 >> 4) - 8; - charWeights0.sb = (charWeightsInt41.s5 & 15) - 8; - charWeights0.sc = (charWeightsInt41.s6 >> 4) - 8; - charWeights0.sd = (charWeightsInt41.s6 & 15) - 8; - charWeights0.se = (charWeightsInt41.s7 >> 4) - 8; - charWeights0.sf = (charWeightsInt41.s7 & 15) - 8; - charWeights1.s0 = (charWeightsInt41.s8 >> 4) - 8; - charWeights1.s1 = (charWeightsInt41.s8 & 15) - 8; - charWeights1.s2 = (charWeightsInt41.s9 >> 4) - 8; - charWeights1.s3 = (charWeightsInt41.s9 & 15) - 8; - charWeights1.s4 = (charWeightsInt41.sa >> 4) - 8; - charWeights1.s5 = (charWeightsInt41.sa & 15) - 8; - charWeights1.s6 = (charWeightsInt41.sb >> 4) - 8; - charWeights1.s7 = (charWeightsInt41.sb & 15) - 8; - charWeights1.s8 = (charWeightsInt41.sc >> 4) - 8; - charWeights1.s9 = (charWeightsInt41.sc & 15) - 8; - charWeights1.sa = (charWeightsInt41.sd >> 4) - 8; - charWeights1.sb = (charWeightsInt41.sd & 15) - 8; - charWeights1.sc = (charWeightsInt41.se >> 4) - 8; - charWeights1.sd = (charWeightsInt41.se & 15) - 8; - charWeights1.se = (charWeightsInt41.sf >> 4) - 8; - charWeights1.sf = (charWeightsInt41.sf & 15) - 8; - weights2 = CONVERT_FLOAT16(charWeights0); - weights3 = CONVERT_FLOAT16(charWeights1); - } - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; - -#else - FLOAT16 weights0 = vload16(0, weight + weight_offset + k * weight_oc_offset); - FLOAT16 weights1 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); - FLOAT16 weights2 = vload16(0, weight + weight_offset + k * weight_oc_offset + 32); - FLOAT16 weights3 = vload16(0, weight + weight_offset + k * weight_oc_offset + 48); -#endif - - out.s0 += dot(in.s0123, weights0.s0123); - out.s0 += dot(in.s4567, weights0.s4567); - out.s0 += dot(in.s89ab, weights0.s89ab); - out.s0 += dot(in.scdef, weights0.scdef); - - out.s1 += dot(in.s0123, weights1.s0123); - out.s1 += dot(in.s4567, weights1.s4567); - out.s1 += dot(in.s89ab, weights1.s89ab); - out.s1 += dot(in.scdef, weights1.scdef); - - out.s2 += dot(in.s0123, weights2.s0123); - out.s2 += dot(in.s4567, weights2.s4567); - out.s2 += dot(in.s89ab, weights2.s89ab); - out.s2 += dot(in.scdef, weights2.scdef); - - out.s3 += dot(in.s0123, weights3.s0123); - out.s3 += dot(in.s4567, weights3.s4567); - out.s3 += dot(in.s89ab, weights3.s89ab); - out.s3 += dot(in.scdef, weights3.scdef); - } -#endif - -#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) - out = bias0 + mad(out, Scale, sum * Offset); -#endif -#ifdef RELU - out = fmax(out, (FLOAT4)0); -#endif - -#ifdef RELU6 - out = clamp(out, (FLOAT4)0, (FLOAT4)6); -#endif - - vstore4(out, out_c_idx, output+out_offset); -} - -__kernel void gemm_conv_c2_buf(GLOBAL_SIZE_DIM2 - __global const FLOAT* input, -#if (defined USE_LOW_BIT_WEIGHT_INT8) - __global const char *weight, - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - __global const uchar *weight, - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, -#else - __global const FLOAT *weight, -#endif - __global const FLOAT *bias, - __global FLOAT* output, - __private const int dstChannelC4, - __private const int srcChannelC4, - __private const int batch, - __private const int height, - __private const int width) { - const int out_c_w_idx = get_global_id(0); //c/4 w - const int out_b_h_idx = get_global_id(1); //b h - - UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); - - const int out_c_idx = out_c_w_idx / width; - const int out_w_idx = out_c_w_idx % width; - const int out_b_idx = out_b_h_idx / height; - const int out_h_idx = out_b_h_idx % height; - - FLOAT2 bias0 = vload2(out_c_idx, bias); - FLOAT sum = 0; - FLOAT2 out = 0; - - int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; - int out_offset = ((out_b_idx * dstChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; - int wh = width * height * 4; -#if (defined USE_LOW_BIT_WEIGHT_INT4) - int weight_offset = out_c_idx * 2 * 8; - int weight_oc_offset = dstChannelC4 * 32; -#else - int weight_offset = out_c_idx * 2 * 16; - int weight_oc_offset = dstChannelC4 * 64; -#endif - -#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) - const FLOAT2 Scale = vload2(out_c_idx, dequantScale); - const FLOAT2 Offset = vload2(out_c_idx, dequantOffset); -#endif - -#ifdef INPUT_CHANNEL_LEAVE - for (int k = 0; k < srcChannelC4/4 - 1; ++k) { -#else - for (int k = 0; k < srcChannelC4/4; ++k) { -#endif -#ifdef WIDTH_HEIGHT_1 - FLOAT16 in = vload16(k, input + input_offset); -#else - FLOAT16 in; - int k4 = k << 2; - in.s0123 = vload4(0, input + input_offset + k4 * wh); - in.s4567 = vload4(0, input + input_offset + (k4 + 1) * wh); - in.s89ab = vload4(0, input + input_offset + (k4 + 2) * wh); - in.scdef = vload4(0, input + input_offset + (k4 + 3) * wh); -#endif -#if (defined USE_LOW_BIT_WEIGHT_INT8) - FLOAT16 weights0 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); - FLOAT16 weights1 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - uchar16 charWeightsInt4 = vload16(0, weight + weight_offset + k * weight_oc_offset); - char16 charWeights0 = 0; - char16 charWeights1 = 0; - charWeights0.s0 = (charWeightsInt4.s0 >> 4) - 8; - charWeights0.s1 = (charWeightsInt4.s0 & 15) - 8; - charWeights0.s2 = (charWeightsInt4.s1 >> 4) - 8; - charWeights0.s3 = (charWeightsInt4.s1 & 15) - 8; - charWeights0.s4 = (charWeightsInt4.s2 >> 4) - 8; - charWeights0.s5 = (charWeightsInt4.s2 & 15) - 8; - charWeights0.s6 = (charWeightsInt4.s3 >> 4) - 8; - charWeights0.s7 = (charWeightsInt4.s3 & 15) - 8; - charWeights0.s8 = (charWeightsInt4.s4 >> 4) - 8; - charWeights0.s9 = (charWeightsInt4.s4 & 15) - 8; - charWeights0.sa = (charWeightsInt4.s5 >> 4) - 8; - charWeights0.sb = (charWeightsInt4.s5 & 15) - 8; - charWeights0.sc = (charWeightsInt4.s6 >> 4) - 8; - charWeights0.sd = (charWeightsInt4.s6 & 15) - 8; - charWeights0.se = (charWeightsInt4.s7 >> 4) - 8; - charWeights0.sf = (charWeightsInt4.s7 & 15) - 8; - - charWeights1.s0 = (charWeightsInt4.s8 >> 4) - 8; - charWeights1.s1 = (charWeightsInt4.s8 & 15) - 8; - charWeights1.s2 = (charWeightsInt4.s9 >> 4) - 8; - charWeights1.s3 = (charWeightsInt4.s9 & 15) - 8; - charWeights1.s4 = (charWeightsInt4.sa >> 4) - 8; - charWeights1.s5 = (charWeightsInt4.sa & 15) - 8; - charWeights1.s6 = (charWeightsInt4.sb >> 4) - 8; - charWeights1.s7 = (charWeightsInt4.sb & 15) - 8; - charWeights1.s8 = (charWeightsInt4.sc >> 4) - 8; - charWeights1.s9 = (charWeightsInt4.sc & 15) - 8; - charWeights1.sa = (charWeightsInt4.sd >> 4) - 8; - charWeights1.sb = (charWeightsInt4.sd & 15) - 8; - charWeights1.sc = (charWeightsInt4.se >> 4) - 8; - charWeights1.sd = (charWeightsInt4.se & 15) - 8; - charWeights1.se = (charWeightsInt4.sf >> 4) - 8; - charWeights1.sf = (charWeightsInt4.sf & 15) - 8; - FLOAT16 weights0 = CONVERT_FLOAT16(charWeights0); - FLOAT16 weights1 = CONVERT_FLOAT16(charWeights1); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; - -#else - FLOAT16 weights0 = vload16(0, weight + weight_offset + k * weight_oc_offset); - FLOAT16 weights1 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); -#endif - out.s0 += dot(in.s0123, weights0.s0123); - out.s0 += dot(in.s4567, weights0.s4567); - out.s0 += dot(in.s89ab, weights0.s89ab); - out.s0 += dot(in.scdef, weights0.scdef); - out.s1 += dot(in.s0123, weights1.s0123); - out.s1 += dot(in.s4567, weights1.s4567); - out.s1 += dot(in.s89ab, weights1.s89ab); - out.s1 += dot(in.scdef, weights1.scdef); - } - -#ifdef INPUT_CHANNEL_LEAVE - { - int k = srcChannelC4/4 - 1; - FLOAT16 in = 0; - int k4 = k * 4; - in.s0123 = vload4(0, input + input_offset + k4 * wh); - in.s4567 = k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0; - in.s89ab = k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0; - in.scdef = k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0; -#if (defined USE_LOW_BIT_WEIGHT_INT8) - FLOAT16 weights0 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); - FLOAT16 weights1 = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - uchar16 charWeightsInt4 = vload16(0, weight + weight_offset + k * weight_oc_offset); - char16 charWeights0 = 0; - char16 charWeights1 = 0; - charWeights0.s0 = (charWeightsInt4.s0 >> 4) - 8; - charWeights0.s1 = (charWeightsInt4.s0 & 15) - 8; - charWeights0.s2 = (charWeightsInt4.s1 >> 4) - 8; - charWeights0.s3 = (charWeightsInt4.s1 & 15) - 8; - charWeights0.s4 = (charWeightsInt4.s2 >> 4) - 8; - charWeights0.s5 = (charWeightsInt4.s2 & 15) - 8; - charWeights0.s6 = (charWeightsInt4.s3 >> 4) - 8; - charWeights0.s7 = (charWeightsInt4.s3 & 15) - 8; - charWeights0.s8 = (charWeightsInt4.s4 >> 4) - 8; - charWeights0.s9 = (charWeightsInt4.s4 & 15) - 8; - charWeights0.sa = (charWeightsInt4.s5 >> 4) - 8; - charWeights0.sb = (charWeightsInt4.s5 & 15) - 8; - charWeights0.sc = (charWeightsInt4.s6 >> 4) - 8; - charWeights0.sd = (charWeightsInt4.s6 & 15) - 8; - charWeights0.se = (charWeightsInt4.s7 >> 4) - 8; - charWeights0.sf = (charWeightsInt4.s7 & 15) - 8; - - charWeights1.s0 = (charWeightsInt4.s8 >> 4) - 8; - charWeights1.s1 = (charWeightsInt4.s8 & 15) - 8; - charWeights1.s2 = (charWeightsInt4.s9 >> 4) - 8; - charWeights1.s3 = (charWeightsInt4.s9 & 15) - 8; - charWeights1.s4 = (charWeightsInt4.sa >> 4) - 8; - charWeights1.s5 = (charWeightsInt4.sa & 15) - 8; - charWeights1.s6 = (charWeightsInt4.sb >> 4) - 8; - charWeights1.s7 = (charWeightsInt4.sb & 15) - 8; - charWeights1.s8 = (charWeightsInt4.sc >> 4) - 8; - charWeights1.s9 = (charWeightsInt4.sc & 15) - 8; - charWeights1.sa = (charWeightsInt4.sd >> 4) - 8; - charWeights1.sb = (charWeightsInt4.sd & 15) - 8; - charWeights1.sc = (charWeightsInt4.se >> 4) - 8; - charWeights1.sd = (charWeightsInt4.se & 15) - 8; - charWeights1.se = (charWeightsInt4.sf >> 4) - 8; - charWeights1.sf = (charWeightsInt4.sf & 15) - 8; - FLOAT16 weights0 = CONVERT_FLOAT16(charWeights0); - FLOAT16 weights1 = CONVERT_FLOAT16(charWeights1); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; - -#else - FLOAT16 weights0 = vload16(0, weight + weight_offset + k * weight_oc_offset); - FLOAT16 weights1 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); -#endif - out.s0 += dot(in.s0123, weights0.s0123); - out.s0 += dot(in.s4567, weights0.s4567); - out.s0 += dot(in.s89ab, weights0.s89ab); - out.s0 += dot(in.scdef, weights0.scdef); - out.s1 += dot(in.s0123, weights1.s0123); - out.s1 += dot(in.s4567, weights1.s4567); - out.s1 += dot(in.s89ab, weights1.s89ab); - out.s1 += dot(in.scdef, weights1.scdef); - } -#endif - -#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) - out = bias0 + mad(out, Scale, sum * Offset); -#endif -#ifdef RELU - out = fmax(out, (FLOAT2)0); -#endif - -#ifdef RELU6 - out = clamp(out, (FLOAT2)0, (FLOAT2)6); -#endif - - vstore2(out, out_c_idx, output+out_offset); -} - -__kernel void gemm_conv_c1_buf(GLOBAL_SIZE_DIM2 - __global const FLOAT* input, -#if (defined USE_LOW_BIT_WEIGHT_INT8) - __global const char *weight, - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - __global const uchar *weight, - __global const FLOAT *dequantScale, - __global const FLOAT *dequantOffset, -#else - __global const FLOAT *weight, -#endif - __global const FLOAT *bias, - __global FLOAT* output, - __private const int dstChannelC4, - __private const int srcChannelC4, - __private const int batch, - __private const int height, - __private const int width) { - const int out_c_w_idx = get_global_id(0); //c/4 w - const int out_b_h_idx = get_global_id(1); //b h - - UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); - - const int out_c_idx = out_c_w_idx / width; - const int out_w_idx = out_c_w_idx % width; - const int out_b_idx = out_b_h_idx / height; - const int out_h_idx = out_b_h_idx % height; - - FLOAT bias0 = bias[out_c_idx]; - FLOAT sum = 0; - FLOAT out = 0; - - int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; - int out_offset = ((out_b_idx * dstChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; - int wh = width * height * 4; -#if (defined USE_LOW_BIT_WEIGHT_INT4) - int weight_offset = out_c_idx * 8; - int weight_oc_offset = dstChannelC4 * 32; -#else - int weight_offset = out_c_idx * 16; - int weight_oc_offset = dstChannelC4 * 64; -#endif - -#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) - const FLOAT Scale = dequantScale[out_c_idx]; - const FLOAT Offset = dequantOffset[out_c_idx]; -#endif -#ifdef INPUT_CHANNEL_LEAVE - for (int k = 0; k < srcChannelC4/4 - 1; ++k) { -#else - for (int k = 0; k < srcChannelC4/4; ++k) { -#endif -#ifdef WIDTH_HEIGHT_1 - FLOAT16 in = vload16(k, input + input_offset); -#else - FLOAT16 in; - int k4 = k << 2; - in.s0123 = vload4(0, input + input_offset + k4 * wh); - in.s4567 = vload4(0, input + input_offset + (k4 + 1) * wh); - in.s89ab = vload4(0, input + input_offset + (k4 + 2) * wh); - in.scdef = vload4(0, input + input_offset + (k4 + 3) * wh); -#endif -#if (defined USE_LOW_BIT_WEIGHT_INT8) - FLOAT16 weights = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); - char16 charWeights = 0; - charWeights.s0 = (charWeightsInt4.s0 >> 4) - 8; - charWeights.s1 = (charWeightsInt4.s0 & 15) - 8; - charWeights.s2 = (charWeightsInt4.s1 >> 4) - 8; - charWeights.s3 = (charWeightsInt4.s1 & 15) - 8; - charWeights.s4 = (charWeightsInt4.s2 >> 4) - 8; - charWeights.s5 = (charWeightsInt4.s2 & 15) - 8; - charWeights.s6 = (charWeightsInt4.s3 >> 4) - 8; - charWeights.s7 = (charWeightsInt4.s3 & 15) - 8; - charWeights.s8 = (charWeightsInt4.s4 >> 4) - 8; - charWeights.s9 = (charWeightsInt4.s4 & 15) - 8; - charWeights.sa = (charWeightsInt4.s5 >> 4) - 8; - charWeights.sb = (charWeightsInt4.s5 & 15) - 8; - charWeights.sc = (charWeightsInt4.s6 >> 4) - 8; - charWeights.sd = (charWeightsInt4.s6 & 15) - 8; - charWeights.se = (charWeightsInt4.s7 >> 4) - 8; - charWeights.sf = (charWeightsInt4.s7 & 15) - 8; - FLOAT16 weights = CONVERT_FLOAT16(charWeights); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#else - FLOAT16 weights = vload16(0, weight + weight_offset + k * weight_oc_offset); -#endif - out += dot(in.s0123, weights.s0123); - out += dot(in.s4567, weights.s4567); - out += dot(in.s89ab, weights.s89ab); - out += dot(in.scdef, weights.scdef); - } -#ifdef INPUT_CHANNEL_LEAVE - { - int k = srcChannelC4/4 - 1; - FLOAT16 in = 0; - int k4 = k * 4; - in.s0123 = vload4(0, input + input_offset + k4 * wh); - in.s4567 = k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0; - in.s89ab = k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0; - in.scdef = k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0; -#if (defined USE_LOW_BIT_WEIGHT_INT8) - FLOAT16 weights = CONVERT_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#elif (defined USE_LOW_BIT_WEIGHT_INT4) - uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); - char16 charWeights = 0; - charWeights.s0 = (charWeightsInt4.s0 >> 4) - 8; - charWeights.s1 = (charWeightsInt4.s0 & 15) - 8; - charWeights.s2 = (charWeightsInt4.s1 >> 4) - 8; - charWeights.s3 = (charWeightsInt4.s1 & 15) - 8; - charWeights.s4 = (charWeightsInt4.s2 >> 4) - 8; - charWeights.s5 = (charWeightsInt4.s2 & 15) - 8; - charWeights.s6 = (charWeightsInt4.s3 >> 4) - 8; - charWeights.s7 = (charWeightsInt4.s3 & 15) - 8; - charWeights.s8 = (charWeightsInt4.s4 >> 4) - 8; - charWeights.s9 = (charWeightsInt4.s4 & 15) - 8; - charWeights.sa = (charWeightsInt4.s5 >> 4) - 8; - charWeights.sb = (charWeightsInt4.s5 & 15) - 8; - charWeights.sc = (charWeightsInt4.s6 >> 4) - 8; - charWeights.sd = (charWeightsInt4.s6 & 15) - 8; - charWeights.se = (charWeightsInt4.s7 >> 4) - 8; - charWeights.sf = (charWeightsInt4.s7 & 15) - 8; - FLOAT16 weights = CONVERT_FLOAT16(charWeights); - sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; -#else - FLOAT16 weights = vload16(0, weight + weight_offset + k * weight_oc_offset); -#endif - out += dot(in.s0123, weights.s0123); - out += dot(in.s4567, weights.s4567); - out += dot(in.s89ab, weights.s89ab); - out += dot(in.scdef, weights.scdef); - } -#endif - -#if (defined USE_LOW_BIT_WEIGHT_INT8) || (defined USE_LOW_BIT_WEIGHT_INT4) - out = bias0 + mad(out, Scale, sum * Offset); -#endif -#ifdef RELU - out = fmax(out, )0); -#endif - -#ifdef RELU6 - out = clamp(out, 0, 6); -#endif - - //vstore4(out, pos.x, output+out_offset); - output[out_offset + out_c_idx] = out; + vstore4(CONVERT_FLOAT4(o1.s0123), 1, output+out_offset); + vstore4(CONVERT_FLOAT4(o1.s4567), 1, output+out_offset+4*width); + vstore4(CONVERT_FLOAT4(o1.s89ab), 1, output+out_offset+8*width); + vstore4(CONVERT_FLOAT4(o1.scdef), 1, output+out_offset+12*width); } diff --git a/source/backend/opencl/execution/cl/gemv_conv1x1_buf.cl b/source/backend/opencl/execution/cl/gemv_conv1x1_buf.cl new file mode 100644 index 000000000..ffe697e66 --- /dev/null +++ b/source/backend/opencl/execution/cl/gemv_conv1x1_buf.cl @@ -0,0 +1,1127 @@ +#ifdef MNN_SUPPORT_FP16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +#define GLOBAL_SIZE_DIM2 \ + __private int global_size_dim0, __private int global_size_dim1, + +#define UNIFORM_BOUNDRY_CHECK(index0, index1) \ + if(index0 >= global_size_dim0 || index1 >= global_size_dim1) { \ + return; \ + } + +#define UCHAR16_TO_2CHAR16(a, b, c) \ + a.s0 = (c.s0 >> 4) - 8; a.s1 = (c.s0 & 15) - 8; a.s2 = (c.s1 >> 4) - 8; a.s3 = (c.s1 & 15) - 8; a.s4 = (c.s2 >> 4) - 8; a.s5 = (c.s2 & 15) - 8; a.s6 = (c.s3 >> 4) - 8; a.s7 = (c.s3 & 15) - 8; \ + a.s8 = (c.s4 >> 4) - 8; a.s9 = (c.s4 & 15) - 8; a.sa = (c.s5 >> 4) - 8; a.sb = (c.s5 & 15) - 8; a.sc = (c.s6 >> 4) - 8; a.sd = (c.s6 & 15) - 8; a.se = (c.s7 >> 4) - 8; a.sf = (c.s7 & 15) - 8; \ + b.s0 = (c.s8 >> 4) - 8; b.s1 = (c.s8 & 15) - 8; b.s2 = (c.s9 >> 4) - 8; b.s3 = (c.s9 & 15) - 8; b.s4 = (c.sa >> 4) - 8; b.s5 = (c.sa & 15) - 8; b.s6 = (c.sb >> 4) - 8; b.s7 = (c.sb & 15) - 8; \ + b.s8 = (c.sc >> 4) - 8; b.s9 = (c.sc & 15) - 8; b.sa = (c.sd >> 4) - 8; b.sb = (c.sd & 15) - 8; b.sc = (c.se >> 4) - 8; b.sd = (c.se & 15) - 8; b.se = (c.sf >> 4) - 8; b.sf = (c.sf & 15) - 8; + +#define UCHAR8_TO_CHAR16(a, c) \ + a.s0 = (c.s0 >> 4) - 8; a.s1 = (c.s0 & 15) - 8; a.s2 = (c.s1 >> 4) - 8; a.s3 = (c.s1 & 15) - 8; a.s4 = (c.s2 >> 4) - 8; a.s5 = (c.s2 & 15) - 8; a.s6 = (c.s3 >> 4) - 8; a.s7 = (c.s3 & 15) - 8; \ + a.s8 = (c.s4 >> 4) - 8; a.s9 = (c.s4 & 15) - 8; a.sa = (c.s5 >> 4) - 8; a.sb = (c.s5 & 15) - 8; a.sc = (c.s6 >> 4) - 8; a.sd = (c.s6 & 15) - 8; a.se = (c.s7 >> 4) - 8; a.sf = (c.s7 & 15) - 8; + +#define DOT16X16(a, b, c) \ + c += dot(a.s0123, b.s0123); \ + c += dot(a.s4567, b.s4567); \ + c += dot(a.s89ab, b.s89ab); \ + c += dot(a.scdef, b.scdef); + +__constant sampler_t SAMPLER = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; + +__kernel void gemm_conv_c4_buf(GLOBAL_SIZE_DIM2 + __global const FLOAT* input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, +#endif + __global const float *dequantScale, + __global const float *dequantOffset, + __global const FLOAT *bias, + __global FLOAT* output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch, + __private const int height, + __private const int width) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + + UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / width; + const int out_w_idx = out_c_w_idx % width; +#ifdef BACTH_BLOCK2 + const int out_b_idx = (out_b_h_idx / height) << 1; +#else + const int out_b_idx = out_b_h_idx / height; +#endif + const int out_h_idx = out_b_h_idx % height; + + COMPUTE_FLOAT4 bias0 = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, bias)); + COMPUTE_FLOAT sum = 0; + COMPUTE_FLOAT4 out = 0; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT4 out1 = 0; + int input_offset1 = (((out_b_idx + 1) * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + bool isValidBatch = out_b_idx + 1 < batch; +#endif + + int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + int out_offset = (((out_b_idx * dstChannelC4 + out_c_idx) * height + out_h_idx) * width + out_w_idx) * 4; +#ifndef WIDTH_HEIGHT_1 + int wh = width * height * 4; +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = out_c_idx * 4 * 8; + int weight_oc_offset = dstChannelC4 * 32; +#else + int weight_offset = out_c_idx * 4 * 16; + int weight_oc_offset = dstChannelC4 * 64; +#endif + + const COMPUTE_FLOAT4 Scale = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, dequantScale)); + const COMPUTE_FLOAT4 Offset = CONVERT_COMPUTE_FLOAT4(vload4(out_c_idx, dequantOffset)); + +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC16 = (srcChannelC4 + 3) >> 2; + for (int k = 0; k < srcChannelC16 - 1; ++k) { +#else + for (int k = 0; k < srcChannelC4/4; ++k) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in = CONVERT_COMPUTE_FLOAT16(vload16(k, input + input_offset)); +#else + int k4 = k << 2; + COMPUTE_FLOAT16 in; + in.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 1) * wh)); + in.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 2) * wh)); + in.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 3) * wh)); +#endif + sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in1 = CONVERT_COMPUTE_FLOAT16(vload16(k, input + input_offset1)); +#else + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 1) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 2) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 3) * wh)); +#endif + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); + COMPUTE_FLOAT16 weights2 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 32)); + COMPUTE_FLOAT16 weights3 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 48)); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar16 charWeightsInt40 = vload16(0, weight + weight_offset + k * weight_oc_offset); + uchar16 charWeightsInt41 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); + COMPUTE_FLOAT16 weights0, weights1, weights2, weights3; + { + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt40); + weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + } + + { + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt41); + weights2 = CONVERT_COMPUTE_FLOAT16(charWeights0); + weights3 = CONVERT_COMPUTE_FLOAT16(charWeights1); + } +#endif + DOT16X16(in, weights0, out.s0); + DOT16X16(in, weights1, out.s1); + DOT16X16(in, weights2, out.s2); + DOT16X16(in, weights3, out.s3); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1.s0); + DOT16X16(in1, weights1, out1.s1); + DOT16X16(in1, weights2, out1.s2); + DOT16X16(in1, weights3, out1.s3); +#endif + } +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC16 - 1; + int k4 = k * 4; + COMPUTE_FLOAT16 in; + in.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0); + in.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0); + in.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0); + sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; + +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 1) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 2) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 3) * wh) : (FLOAT4)0); + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); + COMPUTE_FLOAT16 weights2 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 32)); + COMPUTE_FLOAT16 weights3 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 48)); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar16 charWeightsInt40 = vload16(0, weight + weight_offset + k * weight_oc_offset); + uchar16 charWeightsInt41 = vload16(0, weight + weight_offset + k * weight_oc_offset + 16); + COMPUTE_FLOAT16 weights0, weights1, weights2, weights3; + { + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt40); + weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + } + + { + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt41); + weights2 = CONVERT_COMPUTE_FLOAT16(charWeights0); + weights3 = CONVERT_COMPUTE_FLOAT16(charWeights1); + } +#endif + DOT16X16(in, weights0, out.s0); + DOT16X16(in, weights1, out.s1); + DOT16X16(in, weights2, out.s2); + DOT16X16(in, weights3, out.s3); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1.s0); + DOT16X16(in1, weights1, out1.s1); + DOT16X16(in1, weights2, out1.s2); + DOT16X16(in1, weights3, out1.s3); +#endif + } +#endif + + out = bias0 + mad(out, Scale, sum * Offset); +#ifdef RELU + out = fmax(out, (COMPUTE_FLOAT4)0); +#endif + +#ifdef RELU6 + out = clamp(out, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); +#endif + + vstore4(CONVERT_FLOAT4(out), 0, output+out_offset); +#ifdef BACTH_BLOCK2 + if(isValidBatch){ + out_offset += dstChannelC4 * height * width * 4; + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#ifdef RELU + out1 = fmax(out1, (COMPUTE_FLOAT4)0); +#endif + +#ifdef RELU6 + out1 = clamp(out1, (COMPUTE_FLOAT4)0, (COMPUTE_FLOAT4)6); +#endif + + vstore4(CONVERT_FLOAT4(out1), 0, output+out_offset); + } +#endif +} + +__kernel void gemm_conv_c2_buf(GLOBAL_SIZE_DIM2 + __global const FLOAT* input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, +#endif + __global const float *dequantScale, + __global const float *dequantOffset, + __global const FLOAT *bias, + __global FLOAT* output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch, + __private const int height, + __private const int width) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + + UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / width; + const int out_w_idx = out_c_w_idx % width; +#ifdef BACTH_BLOCK2 + const int out_b_idx = (out_b_h_idx / height) << 1; +#else + const int out_b_idx = out_b_h_idx / height; +#endif + const int out_h_idx = out_b_h_idx % height; + + COMPUTE_FLOAT2 bias0 = CONVERT_COMPUTE_FLOAT2(vload2(out_c_idx, bias)); + COMPUTE_FLOAT sum = 0; + COMPUTE_FLOAT2 out = 0; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT2 out1 = 0; + int input_offset1 = (((out_b_idx + 1) * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + bool isValidBatch = out_b_idx + 1 < batch; +#endif + int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + int out_offset = (((out_b_idx * dstChannelC4 + (out_c_idx * 2) / 4) * height + out_h_idx) * width + out_w_idx) * 4 + ((out_c_idx * 2)%4); +#ifndef WIDTH_HEIGHT_1 + int wh = width * height * 4; +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = out_c_idx * 2 * 8; + int weight_oc_offset = dstChannelC4 * 32; +#else + int weight_offset = out_c_idx * 2 * 16; + int weight_oc_offset = dstChannelC4 * 64; +#endif + + const COMPUTE_FLOAT2 Scale = CONVERT_COMPUTE_FLOAT2(vload2(out_c_idx, dequantScale)); + const COMPUTE_FLOAT2 Offset = CONVERT_COMPUTE_FLOAT2(vload2(out_c_idx, dequantOffset)); + +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC16 = (srcChannelC4 + 3) >> 2; + for (int k = 0; k < srcChannelC16 - 1; ++k) { +#else + for (int k = 0; k < srcChannelC4/4; ++k) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in = CONVERT_COMPUTE_FLOAT16(vload16(k, input + input_offset)); +#else + COMPUTE_FLOAT16 in; + int k4 = k << 2; + in.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 1) * wh)); + in.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 2) * wh)); + in.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 3) * wh)); +#endif + sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in1 = CONVERT_COMPUTE_FLOAT16(vload16(k, input + input_offset1)); +#else + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 1) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 2) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 3) * wh)); +#endif + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar16 charWeightsInt4 = vload16(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); +#endif + DOT16X16(in, weights0, out.s0); + DOT16X16(in, weights1, out.s1); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1.s0); + DOT16X16(in1, weights1, out1.s1); +#endif + } + +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC16 - 1; + COMPUTE_FLOAT16 in = 0; + int k4 = k * 4; + in.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0); + in.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0); + in.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0); + sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 1) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 2) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 3) * wh) : (FLOAT4)0); + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset + 16)); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar16 charWeightsInt4 = vload16(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); +#endif + DOT16X16(in, weights0, out.s0); + DOT16X16(in, weights1, out.s1); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1.s0); + DOT16X16(in1, weights1, out1.s1); +#endif + } +#endif + + out = bias0 + mad(out, Scale, sum * Offset); +#ifdef RELU + out = fmax(out, (COMPUTE_FLOAT2)0); +#endif + +#ifdef RELU6 + out = clamp(out, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); +#endif + + vstore2(CONVERT_FLOAT2(out), 0, output+out_offset); +#ifdef BACTH_BLOCK2 + if(isValidBatch){ + out_offset += dstChannelC4 * height * width * 4; + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#ifdef RELU + out1 = fmax(out1, (COMPUTE_FLOAT2)0); +#endif + +#ifdef RELU6 + out1 = clamp(out1, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); +#endif + + vstore2(CONVERT_FLOAT2(out1), 0, output+out_offset); + } +#endif +} + +__kernel void gemm_conv_c1_buf(GLOBAL_SIZE_DIM2 + __global const FLOAT* input, +#if (defined USE_LOW_BIT_WEIGHT_INT8) + __global const char *weight, +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + __global const uchar *weight, +#endif + __global const float *dequantScale, + __global const float *dequantOffset, + __global const FLOAT *bias, + __global FLOAT* output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch, + __private const int height, + __private const int width) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + + UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / width; + const int out_w_idx = out_c_w_idx % width; +#ifdef BACTH_BLOCK2 + const int out_b_idx = (out_b_h_idx / height) << 1; +#else + const int out_b_idx = out_b_h_idx / height; +#endif + const int out_h_idx = out_b_h_idx % height; + + COMPUTE_FLOAT bias0 = bias[out_c_idx]; + COMPUTE_FLOAT sum = 0; + COMPUTE_FLOAT out = 0; + +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT out1 = 0; + int input_offset1 = (((out_b_idx + 1) * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + bool isValidBatch = out_b_idx + 1 < batch; +#endif + + int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + int out_offset = (((out_b_idx * dstChannelC4 + out_c_idx/4) * height + out_h_idx) * width + out_w_idx) * 4 + (out_c_idx%4); +#ifndef WIDTH_HEIGHT_1 + int wh = width * height * 4; +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT4) + int weight_offset = out_c_idx * 8; + int weight_oc_offset = dstChannelC4 * 32; +#else + int weight_offset = out_c_idx * 16; + int weight_oc_offset = dstChannelC4 * 64; +#endif + + const COMPUTE_FLOAT Scale = dequantScale[out_c_idx]; + const COMPUTE_FLOAT Offset = dequantOffset[out_c_idx]; +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC16 = (srcChannelC4 + 3) >> 2; + for (int k = 0; k < srcChannelC16 - 1; ++k) { +#else + for (int k = 0; k < srcChannelC4/4; ++k) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in = CONVERT_COMPUTE_FLOAT16(vload16(k, input + input_offset)); +#else + COMPUTE_FLOAT16 in; + int k4 = k << 2; + in.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 1) * wh)); + in.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 2) * wh)); + in.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 3) * wh)); +#endif + sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in1 = CONVERT_COMPUTE_FLOAT16(vload16(k, input + input_offset1)); +#else + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 1) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 2) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 3) * wh)); +#endif + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) + COMPUTE_FLOAT16 weights = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights = 0; + UCHAR8_TO_CHAR16(charWeights, charWeightsInt4); + COMPUTE_FLOAT16 weights = CONVERT_COMPUTE_FLOAT16(charWeights); +#endif + DOT16X16(in, weights, out); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights, out1); +#endif + } +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC16 - 1; + COMPUTE_FLOAT16 in = 0; + int k4 = k * 4; + in.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0); + in.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0); + in.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0); + sum += in.s0 + in.s1 + in.s2 + in.s3 + in.s4 + in.s5 + in.s6 + in.s7 + in.s8 + in.s9 + in.sa + in.sb + in.sc + in.sd + in.se + in.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 1) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 2) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset1 + (k4 + 3) * wh) : (FLOAT4)0); + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif +#if (defined USE_LOW_BIT_WEIGHT_INT8) + COMPUTE_FLOAT16 weights = CONVERT_COMPUTE_FLOAT16(vload16(0, weight + weight_offset + k * weight_oc_offset)); +#elif (defined USE_LOW_BIT_WEIGHT_INT4) + uchar8 charWeightsInt4 = vload8(0, weight + weight_offset + k * weight_oc_offset); + char16 charWeights = 0; + UCHAR8_TO_CHAR16(charWeights, charWeightsInt4); + COMPUTE_FLOAT16 weights = CONVERT_COMPUTE_FLOAT16(charWeights); +#endif + DOT16X16(in, weights, out); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights, out1); +#endif + } +#endif + + out = bias0 + mad(out, Scale, sum * Offset); +#ifdef RELU + out = fmax(out, 0); +#endif + +#ifdef RELU6 + out = clamp(out, 0, 6); +#endif + output[out_offset] = out; +#ifdef BACTH_BLOCK2 + if(isValidBatch){ + out_offset += dstChannelC4 * height * width * 4; + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#ifdef RELU + out1 = fmax(out1, 0); +#endif + +#ifdef RELU6 + out1 = clamp(out1, 0, 6); +#endif + + output[out_offset] = out1; + } +#endif +} + +__kernel void gemm_conv_c2_image(GLOBAL_SIZE_DIM2 + __global const FLOAT* input, + __read_only image2d_t weight, + __global const float *dequantScale, + __global const float *dequantOffset, + __global const FLOAT *bias, + __global FLOAT* output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch, + __private const int height, + __private const int width) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = (out_c_w_idx / width) << 1; + const int out_w_idx = out_c_w_idx % width; +#ifdef BACTH_BLOCK2 + const int out_b_idx = (out_b_h_idx / height) << 1; +#else + const int out_b_idx = out_b_h_idx / height; +#endif + const int out_h_idx = out_b_h_idx % height; + + COMPUTE_FLOAT2 bias0 = CONVERT_COMPUTE_FLOAT2(vload2(0, bias + out_c_idx)); + COMPUTE_FLOAT2 out = 0; + COMPUTE_FLOAT sum = 0; + +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT2 out1 = 0; + int input_offset1 = (((out_b_idx + 1) * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + bool isValidBatch = out_b_idx + 1 < batch; +#endif + + int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + int out_offset = (((out_b_idx * dstChannelC4 + out_c_idx/4) * height + out_h_idx) * width + out_w_idx) * 4 + (out_c_idx % 4); +#ifndef WIDTH_HEIGHT_1 + int wh = width * height * 4; +#endif + + const COMPUTE_FLOAT2 Scale = CONVERT_COMPUTE_FLOAT2(vload2(0, dequantScale + out_c_idx)); + const COMPUTE_FLOAT2 Offset = CONVERT_COMPUTE_FLOAT2(vload2(0, dequantOffset + out_c_idx)); + +#if (defined USE_LOW_BIT_WEIGHT_INT8) +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC16 = (srcChannelC4 + 3) >> 2; + for (int k = 0; k < srcChannelC16-1; k++) { +#else + for (int k = 0; k < srcChannelC4/4; k++) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in0 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset + k * 16)); +#else + COMPUTE_FLOAT16 in0 = 0; + int k4 = k * 4; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 1) * wh)); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 2) * wh)); + in0.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 3) * wh)); + +#endif + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in1 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset1 + k * 16)); +#else + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 1) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 2) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 3) * wh)); +#endif + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif + + { + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(as_char16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k)))); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(as_char16(read_imagef(weight, SAMPLER, (int2)(out_c_idx + 1, k)))); + DOT16X16(in0, weights0, out.s0); + DOT16X16(in0, weights1, out.s1); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1.s0); + DOT16X16(in1, weights1, out1.s1); +#endif + } + } +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC16 - 1; + COMPUTE_FLOAT16 in0 = 0; + int k4 = k * 4; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0); + in0.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0); + + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < vload4(0, input + input_offset1 + (k4 + 1) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < vload4(0, input + input_offset1 + (k4 + 2) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < vload4(0, input + input_offset1 + (k4 + 3) * wh) : (FLOAT4)0); + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif + + { + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(as_char16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k)))); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(as_char16(read_imagef(weight, SAMPLER, (int2)(out_c_idx + 1, k)))); + DOT16X16(in0, weights0, out.s0); + DOT16X16(in0, weights1, out.s1); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1.s0); + DOT16X16(in1, weights1, out1.s1); +#endif + } + } +#endif +#elif (defined USE_LOW_BIT_WEIGHT_INT4) +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC32 = (srcChannelC4 + 7) >> 3; + for (int k = 0; k < srcChannelC32-1; k++) { +#else + for (int k = 0; k < srcChannelC4/8; k++) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in0 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset + k * 32)); + COMPUTE_FLOAT16 in1 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset + k * 32 + 16)); +#else + COMPUTE_FLOAT16 in0 = 0; + COMPUTE_FLOAT16 in1 = 0; + int k8 = k * 8; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k8 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 1) * wh)); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 2) * wh)); + in0.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 3) * wh)); + + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 4) * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 5) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 6) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 7) * wh)); + +#endif + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; + sum += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in2 = 0; + COMPUTE_FLOAT16 in3 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in2 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset1 + k * 32)); + in3 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset1 + k * 32 + 16)); +#else + in2.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k8 * wh)); + in2.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 1) * wh)); + in2.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 2) * wh)); + in2.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 3) * wh)); + + in3.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 4) * wh)); + in3.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 5) * wh)); + in3.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 6) * wh)); + in3.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 7) * wh)); +#endif + sum1 += in2.s0 + in2.s1 + in2.s2 + in2.s3 + in2.s4 + in2.s5 + in2.s6 + in2.s7 + in2.s8 + in2.s9 + in2.sa + in2.sb + in2.sc + in2.sd + in2.se + in2.sf; + sum1 += in3.s0 + in3.s1 + in3.s2 + in3.s3 + in3.s4 + in3.s5 + in3.s6 + in3.s7 + in3.s8 + in3.s9 + in3.sa + in3.sb + in3.sc + in3.sd + in3.se + in3.sf; + } +#endif + + { + uchar16 charWeightsInt4 = as_uchar16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k))); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + DOT16X16(in0, weights0, out.s0); + DOT16X16(in1, weights1, out.s0); +#ifdef BACTH_BLOCK2 + DOT16X16(in2, weights0, out1.s0); + DOT16X16(in3, weights1, out1.s0); +#endif + } + + { + uchar16 charWeightsInt4 = as_uchar16(read_imagef(weight, SAMPLER, (int2)(out_c_idx + 1, k))); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + DOT16X16(in0, weights0, out.s1); + DOT16X16(in1, weights1, out.s1); +#ifdef BACTH_BLOCK2 + DOT16X16(in2, weights0, out1.s1); + DOT16X16(in3, weights1, out1.s1); +#endif + } + } +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC32 - 1; + COMPUTE_FLOAT16 in0 = 0; + COMPUTE_FLOAT16 in1 = 0; + int k8 = k * 8; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k8 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 1) * wh) : (FLOAT4)0); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 2) * wh) : (FLOAT4)0); + in0.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 3) * wh) : (FLOAT4)0); + + in1.s0123 = CONVERT_COMPUTE_FLOAT4(k8 + 4 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 4) * wh) : (FLOAT4)0); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 5 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 5) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 6 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 6) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 7 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 7) * wh) : (FLOAT4)0); + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; + sum += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in2 = 0; + COMPUTE_FLOAT16 in3 = 0; + if(isValidBatch){ + in2.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k8 * wh)); + in2.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 1 < vload4(0, input + input_offset1 + (k8 + 1) * wh) : (FLOAT4)0); + in2.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 2 < vload4(0, input + input_offset1 + (k8 + 2) * wh) : (FLOAT4)0); + in2.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 3 < vload4(0, input + input_offset1 + (k8 + 3) * wh) : (FLOAT4)0); + + in3.s0123 = CONVERT_COMPUTE_FLOAT4(k8 + 4 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 4) * wh) : (FLOAT4)0); + in3.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 5 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 5) * wh) : (FLOAT4)0); + in3.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 6 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 6) * wh) : (FLOAT4)0); + in3.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 7 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 7) * wh) : (FLOAT4)0); + sum1 += in2.s0 + in2.s1 + in2.s2 + in2.s3 + in2.s4 + in2.s5 + in2.s6 + in2.s7 + in2.s8 + in2.s9 + in2.sa + in2.sb + in2.sc + in2.sd + in2.se + in2.sf; + sum1 += in3.s0 + in3.s1 + in3.s2 + in3.s3 + in3.s4 + in3.s5 + in3.s6 + in3.s7 + in3.s8 + in3.s9 + in3.sa + in3.sb + in3.sc + in3.sd + in3.se + in3.sf; + } +#endif + + { + uchar16 charWeightsInt4 = as_uchar16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k))); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + DOT16X16(in0, weights0, out.s0); + DOT16X16(in1, weights1, out.s0); +#ifdef BACTH_BLOCK2 + DOT16X16(in2, weights0, out1.s0); + DOT16X16(in3, weights1, out1.s0); +#endif + } + + { + uchar16 charWeightsInt4 = as_uchar16(read_imagef(weight, SAMPLER, (int2)(out_c_idx + 1, k))); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + DOT16X16(in0, weights0, out.s1); + DOT16X16(in1, weights1, out.s1); +#ifdef BACTH_BLOCK2 + DOT16X16(in2, weights0, out1.s1); + DOT16X16(in3, weights1, out1.s1); +#endif + } + } +#endif +#endif //USE_LOW_BIT_WEIGHT_INT4 + + out = bias0 + mad(out, Scale, sum * Offset); +#ifdef RELU + out = fmax(out, (COMPUTE_FLOAT2)0); +#endif +#ifdef RELU6 + out = clamp(out, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); +#endif + vstore2(CONVERT_FLOAT2(out), 0, output + out_offset); +#ifdef BACTH_BLOCK2 + if(isValidBatch){ + out_offset += dstChannelC4 * height * width * 4; + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#ifdef RELU + out1 = fmax(out1, (COMPUTE_FLOAT2)0); +#endif + +#ifdef RELU6 + out1 = clamp(out1, (COMPUTE_FLOAT2)0, (COMPUTE_FLOAT2)6); +#endif + + vstore2(CONVERT_FLOAT2(out1), 0, output+out_offset); + } +#endif +} +__kernel void gemm_conv_c1_image(GLOBAL_SIZE_DIM2 + __global const FLOAT* input, + __read_only image2d_t weight, + __global const float *dequantScale, + __global const float *dequantOffset, + __global const FLOAT *bias, + __global FLOAT* output, + __private const int dstChannelC4, + __private const int srcChannelC4, + __private const int batch, + __private const int height, + __private const int width) { + const int out_c_w_idx = get_global_id(0); //c/4 w + const int out_b_h_idx = get_global_id(1); //b h + UNIFORM_BOUNDRY_CHECK(out_c_w_idx, out_b_h_idx); + + const int out_c_idx = out_c_w_idx / width; + const int out_w_idx = out_c_w_idx % width; +#ifdef BACTH_BLOCK2 + const int out_b_idx = (out_b_h_idx / height) << 1; +#else + const int out_b_idx = out_b_h_idx / height; +#endif + const int out_h_idx = out_b_h_idx % height; + + COMPUTE_FLOAT bias0 = bias[out_c_idx]; + COMPUTE_FLOAT out = 0; + COMPUTE_FLOAT sum = 0; + + int input_offset = ((out_b_idx * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + int out_offset = (((out_b_idx * dstChannelC4 + out_c_idx/4)* height + out_h_idx) * width + out_w_idx) * 4 + (out_c_idx%4); +#ifndef WIDTH_HEIGHT_1 + int wh = width * height * 4; +#endif +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT sum1 = 0; + COMPUTE_FLOAT out1 = 0; + int input_offset1 = (((out_b_idx + 1) * srcChannelC4 * height + out_h_idx) * width + out_w_idx) * 4; + bool isValidBatch = out_b_idx + 1 < batch; +#endif + const COMPUTE_FLOAT Scale = dequantScale[out_c_idx]; + const COMPUTE_FLOAT Offset = dequantOffset[out_c_idx]; + +#if (defined USE_LOW_BIT_WEIGHT_INT8) +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC16 = (srcChannelC4 + 3) >> 2; + for (int k = 0; k < srcChannelC16-1; k++) { +#else + for (int k = 0; k < srcChannelC4/4; k++) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in0 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset + k * 16)); +#else + COMPUTE_FLOAT16 in0 = 0; + int k4 = k * 4; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 1) * wh)); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 2) * wh)); + in0.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k4 + 3) * wh)); + +#endif + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in1 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset1 + k * 16)); +#else + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 1) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 2) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k4 + 3) * wh)); +#endif + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif + + { + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(as_char16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k)))); + DOT16X16(in0, weights0, out); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1); +#endif + } + } +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC16 - 1; + COMPUTE_FLOAT16 in0 = 0; + int k4 = k * 4; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k4 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 1) * wh) : (FLOAT4)0); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 2) * wh) : (FLOAT4)0); + in0.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k4 + 3) * wh) : (FLOAT4)0); + + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in1 = 0; + if(isValidBatch){ + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k4 * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k4 + 1 < vload4(0, input + input_offset1 + (k4 + 1) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k4 + 2 < vload4(0, input + input_offset1 + (k4 + 2) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k4 + 3 < vload4(0, input + input_offset1 + (k4 + 3) * wh) : (FLOAT4)0); + sum1 += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; + } +#endif + + { + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(as_char16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k)))); + DOT16X16(in0, weights0, out); +#ifdef BACTH_BLOCK2 + DOT16X16(in1, weights0, out1); +#endif + } + } +#endif +#elif (defined USE_LOW_BIT_WEIGHT_INT4) +#ifdef INPUT_CHANNEL_LEAVE + const int srcChannelC32 = (srcChannelC4 + 7) >> 3; + for (int k = 0; k < srcChannelC32-1; k++) { +#else + for (int k = 0; k < srcChannelC4/8; k++) { +#endif +#ifdef WIDTH_HEIGHT_1 + COMPUTE_FLOAT16 in0 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset + k * 32)); + COMPUTE_FLOAT16 in1 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset + k * 32 + 16)); +#else + COMPUTE_FLOAT16 in0 = 0; + COMPUTE_FLOAT16 in1 = 0; + int k8 = k * 8; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k8 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 1) * wh)); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 2) * wh)); + in0.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 3) * wh)); + + in1.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 4) * wh)); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 5) * wh)); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 6) * wh)); + in1.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + (k8 + 7) * wh)); + +#endif + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; + sum += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in2 = 0; + COMPUTE_FLOAT16 in3 = 0; + if(isValidBatch){ +#ifdef WIDTH_HEIGHT_1 + in2 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset1 + k * 32)); + in3 = CONVERT_COMPUTE_FLOAT16(vload16(0, input + input_offset1 + k * 32 + 16)); +#else + in2.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k8 * wh)); + in2.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 1) * wh)); + in2.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 2) * wh)); + in2.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 3) * wh)); + + in3.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 4) * wh)); + in3.s4567 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 5) * wh)); + in3.s89ab = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 6) * wh)); + in3.scdef = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + (k8 + 7) * wh)); +#endif + sum1 += in2.s0 + in2.s1 + in2.s2 + in2.s3 + in2.s4 + in2.s5 + in2.s6 + in2.s7 + in2.s8 + in2.s9 + in2.sa + in2.sb + in2.sc + in2.sd + in2.se + in2.sf; + sum1 += in3.s0 + in3.s1 + in3.s2 + in3.s3 + in3.s4 + in3.s5 + in3.s6 + in3.s7 + in3.s8 + in3.s9 + in3.sa + in3.sb + in3.sc + in3.sd + in3.se + in3.sf; + } +#endif + { + uchar16 charWeightsInt4 = as_uchar16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k))); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + DOT16X16(in0, weights0, out); + DOT16X16(in1, weights1, out); +#ifdef BACTH_BLOCK2 + DOT16X16(in2, weights0, out1); + DOT16X16(in3, weights1, out1); +#endif + } + } + +#ifdef INPUT_CHANNEL_LEAVE + { + int k = srcChannelC32 - 1; + COMPUTE_FLOAT16 in0 = 0; + COMPUTE_FLOAT16 in1 = 0; + int k8 = k * 8; + in0.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset + k8 * wh)); + in0.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 1 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 1) * wh) : (FLOAT4)0); + in0.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 2 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 2) * wh) : (FLOAT4)0); + in0.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 3 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 3) * wh) : (FLOAT4)0); + + in1.s0123 = CONVERT_COMPUTE_FLOAT4(k8 + 4 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 4) * wh) : (FLOAT4)0); + in1.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 5 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 5) * wh) : (FLOAT4)0); + in1.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 6 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 6) * wh) : (FLOAT4)0); + in1.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 7 < srcChannelC4 ? vload4(0, input + input_offset + (k8 + 7) * wh) : (FLOAT4)0); + sum += in0.s0 + in0.s1 + in0.s2 + in0.s3 + in0.s4 + in0.s5 + in0.s6 + in0.s7 + in0.s8 + in0.s9 + in0.sa + in0.sb + in0.sc + in0.sd + in0.se + in0.sf; + sum += in1.s0 + in1.s1 + in1.s2 + in1.s3 + in1.s4 + in1.s5 + in1.s6 + in1.s7 + in1.s8 + in1.s9 + in1.sa + in1.sb + in1.sc + in1.sd + in1.se + in1.sf; +#ifdef BACTH_BLOCK2 + COMPUTE_FLOAT16 in2 = 0; + COMPUTE_FLOAT16 in3 = 0; + if(isValidBatch){ + in2.s0123 = CONVERT_COMPUTE_FLOAT4(vload4(0, input + input_offset1 + k8 * wh)); + in2.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 1 < vload4(0, input + input_offset1 + (k8 + 1) * wh) : (FLOAT4)0); + in2.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 2 < vload4(0, input + input_offset1 + (k8 + 2) * wh) : (FLOAT4)0); + in2.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 3 < vload4(0, input + input_offset1 + (k8 + 3) * wh) : (FLOAT4)0); + + in3.s0123 = CONVERT_COMPUTE_FLOAT4(k8 + 4 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 4) * wh) : (FLOAT4)0); + in3.s4567 = CONVERT_COMPUTE_FLOAT4(k8 + 5 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 5) * wh) : (FLOAT4)0); + in3.s89ab = CONVERT_COMPUTE_FLOAT4(k8 + 6 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 6) * wh) : (FLOAT4)0); + in3.scdef = CONVERT_COMPUTE_FLOAT4(k8 + 7 < srcChannelC4 ? vload4(0, input + input_offset1 + (k8 + 7) * wh) : (FLOAT4)0); + sum1 += in2.s0 + in2.s1 + in2.s2 + in2.s3 + in2.s4 + in2.s5 + in2.s6 + in2.s7 + in2.s8 + in2.s9 + in2.sa + in2.sb + in2.sc + in2.sd + in2.se + in2.sf; + sum1 += in3.s0 + in3.s1 + in3.s2 + in3.s3 + in3.s4 + in3.s5 + in3.s6 + in3.s7 + in3.s8 + in3.s9 + in3.sa + in3.sb + in3.sc + in3.sd + in3.se + in3.sf; + } +#endif + + { + uchar16 charWeightsInt4 = as_uchar16(read_imagef(weight, SAMPLER, (int2)(out_c_idx, k))); + char16 charWeights0 = 0; + char16 charWeights1 = 0; + UCHAR16_TO_2CHAR16(charWeights0, charWeights1, charWeightsInt4); + COMPUTE_FLOAT16 weights0 = CONVERT_COMPUTE_FLOAT16(charWeights0); + COMPUTE_FLOAT16 weights1 = CONVERT_COMPUTE_FLOAT16(charWeights1); + DOT16X16(in0, weights0, out); + DOT16X16(in1, weights1, out); +#ifdef BACTH_BLOCK2 + DOT16X16(in2, weights0, out1); + DOT16X16(in3, weights1, out1); +#endif + } + } +#endif +#endif //USE_LOW_BIT_WEIGHT_INT4 + + out = bias0 + mad(out, Scale, sum * Offset); +#ifdef RELU + out = fmax(out, 0); +#endif +#ifdef RELU6 + out = clamp(out, 0, 6); +#endif + output[out_offset] = out; +#ifdef BACTH_BLOCK2 + if(isValidBatch){ + out_offset += dstChannelC4 * height * width * 4; + out1 = bias0 + mad(out1, Scale, sum1 * Offset); +#ifdef RELU + out1 = fmax(out1, 0); +#endif + +#ifdef RELU6 + out1 = clamp(out1, 0, 6); +#endif + + output[out_offset] = out1; + } +#endif +} + diff --git a/source/backend/opencl/execution/cl/grid_sample_buf.cl b/source/backend/opencl/execution/cl/grid_sample_buf.cl index 9d78bad19..391a88163 100644 --- a/source/backend/opencl/execution/cl/grid_sample_buf.cl +++ b/source/backend/opencl/execution/cl/grid_sample_buf.cl @@ -33,7 +33,7 @@ static int CLAMP(int v, int min, int max) { return v; } -FLOAT4 sample(int h, int w, +COMPUTE_FLOAT4 sample(int h, int w, const int offset_base, __global const FLOAT *buffer, int height, int width, @@ -51,7 +51,7 @@ FLOAT4 sample(int h, int w, w = CLAMP(w, 0, width - 1); } int offset = (offset_base + h) * width + w; - return vload4(offset, buffer); + return CONVERT_COMPUTE_FLOAT4(vload4(offset, buffer)); } __kernel void nearest_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, @@ -92,8 +92,8 @@ __kernel void nearest_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, const int slice_blocks = (output_height + 3) / 4; // output_width_block_idx means gird y offset, 2 means grid width const int grid_offset = ((output_batch_idx * slice_blocks + slice) * output_width + output_width_block_idx) * 2; - FLOAT4 grid_x = vload4(grid_offset, grid); - FLOAT4 grid_y = vload4(grid_offset + 1, grid); + COMPUTE_FLOAT4 grid_x = CONVERT_COMPUTE_FLOAT4(vload4(grid_offset, grid)); + COMPUTE_FLOAT4 grid_y = CONVERT_COMPUTE_FLOAT4(vload4(grid_offset + 1, grid)); const float arr[8] = {grid_x.x, grid_y.x, grid_x.y, grid_y.y, grid_x.z, grid_y.z, grid_x.w, grid_y.w}; @@ -111,10 +111,10 @@ __kernel void nearest_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, int nh = floor(in_grid_y + 0.5f); const int inp_offset_base = (output_batch_idx * channelBlocks + output_channel_block_idx) * input_height; - FLOAT4 value = sample(nh, nw, inp_offset_base, input, input_height, input_width, paddingMode); + COMPUTE_FLOAT4 value = sample(nh, nw, inp_offset_base, input, input_height, input_width, paddingMode); const int output_offset = ((output_batch_idx * channelBlocks + output_channel_block_idx ) * output_height + output_height_idx) * output_width + output_width_block_idx; - vstore4(value, output_offset, output); + vstore4(CONVERT_FLOAT4(value), output_offset, output); } __kernel void bilinear_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, @@ -141,8 +141,8 @@ __kernel void bilinear_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, const int slice_blocks = (output_height + 3) / 4; // output_width_block_idx means gird y offset, 2 means grid width const int grid_offset = ((output_batch_idx * slice_blocks + slice) * output_width + output_width_block_idx) * 2; - FLOAT4 grid_x = vload4(grid_offset, grid); - FLOAT4 grid_y = vload4(grid_offset + 1, grid); + COMPUTE_FLOAT4 grid_x = CONVERT_COMPUTE_FLOAT4(vload4(grid_offset, grid)); + COMPUTE_FLOAT4 grid_y = CONVERT_COMPUTE_FLOAT4(vload4(grid_offset + 1, grid)); const float arr[8] = {grid_x.x, grid_y.x, grid_x.y, grid_y.y, grid_x.z, grid_y.z, grid_x.w, grid_y.w}; @@ -165,14 +165,14 @@ __kernel void bilinear_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT* input, // bilinear interpolation const int inp_offset_base = (output_batch_idx * channelBlocks + output_channel_block_idx) * input_height; - FLOAT4 i00 = sample(in_h0, in_w0, inp_offset_base, input, input_height, input_width, paddingMode); - FLOAT4 i01 = sample(in_h0, in_w1, inp_offset_base, input, input_height, input_width, paddingMode); - FLOAT4 i10 = sample(in_h1, in_w0, inp_offset_base, input, input_height, input_width, paddingMode); - FLOAT4 i11 = sample(in_h1, in_w1, inp_offset_base, input, input_height, input_width, paddingMode); + COMPUTE_FLOAT4 i00 = sample(in_h0, in_w0, inp_offset_base, input, input_height, input_width, paddingMode); + COMPUTE_FLOAT4 i01 = sample(in_h0, in_w1, inp_offset_base, input, input_height, input_width, paddingMode); + COMPUTE_FLOAT4 i10 = sample(in_h1, in_w0, inp_offset_base, input, input_height, input_width, paddingMode); + COMPUTE_FLOAT4 i11 = sample(in_h1, in_w1, inp_offset_base, input, input_height, input_width, paddingMode); - FLOAT4 value = CONVERT_FLOAT4(((FLOAT4)x_weight * CONVERT_FLOAT4(i00) + (FLOAT4)(1.0f - x_weight) * CONVERT_FLOAT4(i01)) * (FLOAT4)y_weight + - ((FLOAT4)x_weight * CONVERT_FLOAT4(i10) + (FLOAT4)(1.0f - x_weight) * CONVERT_FLOAT4(i11)) * (FLOAT4)(1.0f- y_weight)); + COMPUTE_FLOAT4 value = CONVERT_COMPUTE_FLOAT4(((COMPUTE_FLOAT4)x_weight * CONVERT_COMPUTE_FLOAT4(i00) + (COMPUTE_FLOAT4)(1.0f - x_weight) * CONVERT_COMPUTE_FLOAT4(i01)) * (COMPUTE_FLOAT4)y_weight + + ((COMPUTE_FLOAT4)x_weight * CONVERT_COMPUTE_FLOAT4(i10) + (COMPUTE_FLOAT4)(1.0f - x_weight) * CONVERT_COMPUTE_FLOAT4(i11)) * (COMPUTE_FLOAT4)(1.0f- y_weight)); const int output_offset = ((output_batch_idx * channelBlocks + output_channel_block_idx ) * output_height + output_height_idx) * output_width + output_width_block_idx; - vstore4(value, output_offset, output); + vstore4(CONVERT_FLOAT4(value), output_offset, output); } diff --git a/source/backend/opencl/execution/cl/layernorm_buf.cl b/source/backend/opencl/execution/cl/layernorm_buf.cl index 90457d629..3608a7af5 100644 --- a/source/backend/opencl/execution/cl/layernorm_buf.cl +++ b/source/backend/opencl/execution/cl/layernorm_buf.cl @@ -227,3 +227,100 @@ __kernel void layernorm_chw_buf(__private int global_dim0, __private int global_ } } } + + +__kernel void layernorm_plain_buf(__private int global_dim0, __private int global_dim1, __private int global_dim2, + __global const FLOAT * input, + __global FLOAT * output, + __private const int inside, + __private const int outside, +#ifdef GAMMA_BETA + __global const FLOAT *gamma, + __global const FLOAT *beta, +#endif + __private float epsilon){ + int3 pos = (int3)(get_global_id(0), get_global_id(1), get_global_id(2)); + COMPUTE_FLOAT local sum[LOCAL_SIZE]; + if (pos.x < global_dim0 && pos.y < global_dim1 && pos.z < global_dim2) { + const int idx_out = pos.z; + const int lid = get_local_id(0); + const int offset = idx_out * inside; + const int inside_v4 = (inside + 3) >> 2; + const int inside_remain = inside - ((inside_v4-1) << 2); + + COMPUTE_FLOAT4 in_sum = 0; + for(int i = lid; i < inside_v4 - 1; i+=LOCAL_SIZE){ + COMPUTE_FLOAT4 in = CONVERT_COMPUTE_FLOAT4(vload4(i, input + offset)); + in_sum += in; + } + sum[lid] = in_sum.x + in_sum.y + in_sum.z+ in_sum.w; + + COMPUTE_FLOAT4 in_left = 0; + if(lid == inside_v4 - 1) { + in_left = CONVERT_COMPUTE_FLOAT4(vload4(inside_v4 - 1, input + offset)); + sum[lid] = sum[lid] + in_left.x; + if(inside_remain > 1) { + sum[lid] = sum[lid] + in_left.y; + } + if(inside_remain > 2) { + sum[lid] = sum[lid] + in_left.z; + } + if(inside_remain > 3) { + sum[lid] = sum[lid] + in_left.w; + } + } + + barrier(CLK_LOCAL_MEM_FENCE); + for(int i = LOCAL_SIZE/2; i > 0; i /= 2){ + if (lid < i) + sum[lid] = sum[lid] + sum[lid + i]; + barrier(CLK_LOCAL_MEM_FENCE); + } + + COMPUTE_FLOAT4 mean = sum[0] / (COMPUTE_FLOAT4)inside; + + in_sum = 0; + for(int i = lid; i < inside_v4 - 1; i+=LOCAL_SIZE){ + COMPUTE_FLOAT4 in = CONVERT_COMPUTE_FLOAT4(vload4(i, input + offset)); + in_sum += (in - mean) * (in - mean); + } + sum[lid] = in_sum.x + in_sum.y + in_sum.z + in_sum.w; + + if(lid == inside_v4 - 1) { + COMPUTE_FLOAT4 in_left = CONVERT_COMPUTE_FLOAT4(vload4(inside_v4 - 1, input + offset)); + in_sum = (in_left - mean) * (in_left - mean); + sum[lid] = sum[lid] + in_sum.x; + if(inside_remain > 1) { + sum[lid] = sum[lid] + in_sum.y; + } + if(inside_remain > 2) { + sum[lid] = sum[lid] + in_sum.z; + } + if(inside_remain > 3) { + sum[lid] = sum[lid] + in_sum.w; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + for(int i = LOCAL_SIZE/2; i > 0; i /= 2){ + if (lid < i) + sum[lid] = sum[lid] + sum[lid + i]; + barrier(CLK_LOCAL_MEM_FENCE); + } + COMPUTE_FLOAT4 square_sum = sum[0] / (COMPUTE_FLOAT4)inside; + COMPUTE_FLOAT4 value = (COMPUTE_FLOAT4)1.0f / (COMPUTE_FLOAT4)sqrt(square_sum + (COMPUTE_FLOAT4)epsilon); + /* + if(pos.x == 0) { + printf("ln: %d, mean:%f square:%f, value:%f\n", pos.z, (float)mean.x, (float)sum[0], (float)value.x); + } + */ + for(int i = lid; i < inside_v4; i+=LOCAL_SIZE){ + COMPUTE_FLOAT4 in = CONVERT_COMPUTE_FLOAT4(vload4(i, input + offset)); +#ifdef GAMMA_BETA + COMPUTE_FLOAT4 out = (in - mean) * value * CONVERT_COMPUTE_FLOAT4(vload4(i, gamma)) + CONVERT_COMPUTE_FLOAT4(vload4(i, beta)); +#else + COMPUTE_FLOAT4 out = (in - mean) * value; +#endif + vstore4(CONVERT_FLOAT4(out), i, output + offset); + } + } +} diff --git a/source/backend/opencl/execution/cl/matmul_buf.cl b/source/backend/opencl/execution/cl/matmul_buf.cl index a0e9413fd..4d2b65756 100644 --- a/source/backend/opencl/execution/cl/matmul_buf.cl +++ b/source/backend/opencl/execution/cl/matmul_buf.cl @@ -24,40 +24,40 @@ __kernel void matmul_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a, const int height_idx = get_global_id(1);// output H DEAL_NON_UNIFORM_DIM2(width_blocks_idx, height_idx); - FLOAT4 a; - FLOAT4 b0 = 0, b1 = 0, b2 = 0, b3 = 0; - FLOAT4 v_zero = (FLOAT4)((FLOAT)0.0); + COMPUTE_FLOAT4 a; + COMPUTE_FLOAT4 b0 = 0, b1 = 0, b2 = 0, b3 = 0; + COMPUTE_FLOAT4 v_zero = (COMPUTE_FLOAT4)((COMPUTE_FLOAT)0.0); #ifdef BIAS - FLOAT4 temp = vload4(width_blocks_idx, input_c); + COMPUTE_FLOAT4 temp = CONVERT_COMPUTE_FLOAT4(vload4(width_blocks_idx, input_c)); - FLOAT result0 = temp.x; - FLOAT result1 = temp.y; - FLOAT result2 = temp.z; - FLOAT result3 = temp.w; + COMPUTE_FLOAT result0 = temp.x; + COMPUTE_FLOAT result1 = temp.y; + COMPUTE_FLOAT result2 = temp.z; + COMPUTE_FLOAT result3 = temp.w; #else - FLOAT result0 = 0; - FLOAT result1 = 0; - FLOAT result2 = 0; - FLOAT result3 = 0; + COMPUTE_FLOAT result0 = 0; + COMPUTE_FLOAT result1 = 0; + COMPUTE_FLOAT result2 = 0; + COMPUTE_FLOAT result3 = 0; #endif const int remain = channel_blocks*4 - channels; for (short pos = 0; pos < channel_blocks - 1; pos += 1) { const int inpa_offset = height_idx * channel_blocks + pos; - a = vload4(inpa_offset, input_a); + a = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); const int inpb_offset = (pos*4) * width_blocks + width_blocks_idx; - b0 = vload4(inpb_offset, input_b); - b1 = vload4(inpb_offset + width_blocks, input_b); - b2 = vload4(inpb_offset + width_blocks*2, input_b); - b3 = vload4(inpb_offset + width_blocks*3, input_b); + b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + b1 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks, input_b)); + b2 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*2, input_b)); + b3 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*3, input_b)); - FLOAT4 btmp0 = (FLOAT4)(b0.s0, b1.s0, b2.s0, b3.s0); - FLOAT4 btmp1 = (FLOAT4)(b0.s1, b1.s1, b2.s1, b3.s1); - FLOAT4 btmp2 = (FLOAT4)(b0.s2, b1.s2, b2.s2, b3.s2); - FLOAT4 btmp3 = (FLOAT4)(b0.s3, b1.s3, b2.s3, b3.s3); + COMPUTE_FLOAT4 btmp0 = (COMPUTE_FLOAT4)(b0.s0, b1.s0, b2.s0, b3.s0); + COMPUTE_FLOAT4 btmp1 = (COMPUTE_FLOAT4)(b0.s1, b1.s1, b2.s1, b3.s1); + COMPUTE_FLOAT4 btmp2 = (COMPUTE_FLOAT4)(b0.s2, b1.s2, b2.s2, b3.s2); + COMPUTE_FLOAT4 btmp3 = (COMPUTE_FLOAT4)(b0.s3, b1.s3, b2.s3, b3.s3); result0 += dot(a, btmp0); result1 += dot(a, btmp1); @@ -67,14 +67,14 @@ __kernel void matmul_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a, { const int inpa_offset = height_idx * channel_blocks + channel_blocks - 1; - a = vload4(inpa_offset, input_a); + a = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); const int inpb_offset = ((channel_blocks - 1)*4) * width_blocks + width_blocks_idx; - b0 = vload4(inpb_offset, input_b); - b1 = ((remain >= 3) ? v_zero : vload4(inpb_offset + width_blocks, input_b)); - b2 = ((remain >= 2) ? v_zero : vload4(inpb_offset + width_blocks*2, input_b)); - b3 = ((remain >= 1) ? v_zero : vload4(inpb_offset + width_blocks*3, input_b)); + b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + b1 = (remain >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks, input_b)); + b2 = (remain >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*2, input_b)); + b3 = (remain >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*3, input_b)); if (remain == 3) { a.y = 0; a.z = 0; @@ -86,10 +86,10 @@ __kernel void matmul_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a, a.w = 0;; } - FLOAT4 btmp0 = (FLOAT4)(b0.s0, b1.s0, b2.s0, b3.s0); - FLOAT4 btmp1 = (FLOAT4)(b0.s1, b1.s1, b2.s1, b3.s1); - FLOAT4 btmp2 = (FLOAT4)(b0.s2, b1.s2, b2.s2, b3.s2); - FLOAT4 btmp3 = (FLOAT4)(b0.s3, b1.s3, b2.s3, b3.s3); + COMPUTE_FLOAT4 btmp0 = (COMPUTE_FLOAT4)(b0.s0, b1.s0, b2.s0, b3.s0); + COMPUTE_FLOAT4 btmp1 = (COMPUTE_FLOAT4)(b0.s1, b1.s1, b2.s1, b3.s1); + COMPUTE_FLOAT4 btmp2 = (COMPUTE_FLOAT4)(b0.s2, b1.s2, b2.s2, b3.s2); + COMPUTE_FLOAT4 btmp3 = (COMPUTE_FLOAT4)(b0.s3, b1.s3, b2.s3, b3.s3); result0 += dot(a, btmp0); result1 += dot(a, btmp1); @@ -98,7 +98,7 @@ __kernel void matmul_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a, } const int out_offset = height_idx * width_blocks + width_blocks_idx; - vstore4((FLOAT4)(result0, result1, result2, result3), out_offset, output_c); + vstore4(CONVERT_FLOAT4((COMPUTE_FLOAT4)(result0, result1, result2, result3)), out_offset, output_c); } __kernel void matmul_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a, @@ -115,35 +115,35 @@ __kernel void matmul_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a const int height_idx = get_global_id(1); DEAL_NON_UNIFORM_DIM2(width_blocks_idx, height_idx); - FLOAT4 a; - FLOAT4 b0 = 0, b1 = 0, b2 = 0, b3 = 0; - FLOAT4 v_zero = (FLOAT4)((FLOAT)0.0); + COMPUTE_FLOAT4 a; + COMPUTE_FLOAT4 b0 = 0, b1 = 0, b2 = 0, b3 = 0; + COMPUTE_FLOAT4 v_zero = (COMPUTE_FLOAT4)((COMPUTE_FLOAT)0.0); #ifdef BIAS - FLOAT4 temp = vload4(width_blocks_idx, input_c); - FLOAT result0 = temp.x; - FLOAT result1 = temp.y; - FLOAT result2 = temp.z; - FLOAT result3 = temp.w; + COMPUTE_FLOAT4 temp = CONVERT_COMPUTE_FLOAT4(vload4(width_blocks_idx, input_c)); + COMPUTE_FLOAT result0 = temp.x; + COMPUTE_FLOAT result1 = temp.y; + COMPUTE_FLOAT result2 = temp.z; + COMPUTE_FLOAT result3 = temp.w; #else - FLOAT result0 = 0; - FLOAT result1 = 0; - FLOAT result2 = 0; - FLOAT result3 = 0; + COMPUTE_FLOAT result0 = 0; + COMPUTE_FLOAT result1 = 0; + COMPUTE_FLOAT result2 = 0; + COMPUTE_FLOAT result3 = 0; #endif const int remaina = channel_blocks*4 - channels; const int remainb = (width_blocks_idx+1)*4 - width; for (short pos = 0; pos < channel_blocks - 1; pos += 1) { const int inpa_offset = height_idx * channel_blocks + pos; - a = vload4(inpa_offset, input_a); + a = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); const int inpb_offset = (width_blocks_idx*4) * channel_blocks + pos; - b0 = vload4(inpb_offset, input_b); - b1 = ((remainb >= 3) ? v_zero : vload4(inpb_offset + channel_blocks, input_b)); - b2 = ((remainb >= 2) ? v_zero : vload4(inpb_offset + channel_blocks*2, input_b)); - b3 = ((remainb >= 1) ? v_zero : vload4(inpb_offset + channel_blocks*3, input_b)); + b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + b1 = (remainb >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks, input_b)); + b2 = (remainb >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*2, input_b)); + b3 = (remainb >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*3, input_b)); result0 += dot(a, b0); result1 += dot(a, b1); @@ -153,14 +153,14 @@ __kernel void matmul_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a { const int inpa_offset = height_idx * channel_blocks + channel_blocks - 1; - a = vload4(inpa_offset, input_a); + a = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); const int inpb_offset = (width_blocks_idx*4) * channel_blocks + channel_blocks - 1; - b0 = vload4(inpb_offset, input_b); - b1 = ((remainb >= 3) ? v_zero : vload4(inpb_offset + channel_blocks, input_b)); - b2 = ((remainb >= 2) ? v_zero : vload4(inpb_offset + channel_blocks*2, input_b)); - b3 = ((remainb >= 1) ? v_zero : vload4(inpb_offset + channel_blocks*3, input_b)); + b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + b1 = (remainb >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks, input_b)); + b2 = (remainb >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*2, input_b)); + b3 = (remainb >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*3, input_b)); if (remaina == 3) { a.y = 0; @@ -179,7 +179,7 @@ __kernel void matmul_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a result3 += dot(a, b3); } const int out_offset = height_idx * width_blocks + width_blocks_idx; - vstore4((FLOAT4)(result0, result1, result2, result3), out_offset, output_c); + vstore4(CONVERT_FLOAT4((COMPUTE_FLOAT4)(result0, result1, result2, result3)), out_offset, output_c); } @@ -200,43 +200,43 @@ __kernel void matmul_transA_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a DEAL_NON_UNIFORM_DIM2(width_blocks_idx, height_blocks_idx); - FLOAT4 v_zero = (FLOAT4)((FLOAT)0.0); + COMPUTE_FLOAT4 v_zero = (COMPUTE_FLOAT4)((COMPUTE_FLOAT)0.0); #ifdef BIAS - FLOAT4 result0 = vload4(width_blocks_idx, input_c); - FLOAT4 result1 = result0; - FLOAT4 result2 = result0; - FLOAT4 result3 = result0; + COMPUTE_FLOAT4 result0 = CONVERT_COMPUTE_FLOAT4(vload4(width_blocks_idx, input_c)); + COMPUTE_FLOAT4 result1 = result0; + COMPUTE_FLOAT4 result2 = result0; + COMPUTE_FLOAT4 result3 = result0; #else - FLOAT4 result0 = 0; - FLOAT4 result1 = 0; - FLOAT4 result2 = 0; - FLOAT4 result3 = 0; + COMPUTE_FLOAT4 result0 = 0; + COMPUTE_FLOAT4 result1 = 0; + COMPUTE_FLOAT4 result2 = 0; + COMPUTE_FLOAT4 result3 = 0; #endif const int remain = channel_blocks*4 - channels; for (short pos = 0; pos < channel_blocks - 1; pos += 1) { const int inpa_offset = (4*pos) * height_blocks + height_blocks_idx; - FLOAT4 a0 = vload4(inpa_offset, input_a); - FLOAT4 a1 = vload4(inpa_offset + height_blocks, input_a); - FLOAT4 a2 = vload4(inpa_offset + height_blocks*2, input_a); - FLOAT4 a3 = vload4(inpa_offset + height_blocks*3, input_a); + COMPUTE_FLOAT4 a0 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); + COMPUTE_FLOAT4 a1 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks, input_a)); + COMPUTE_FLOAT4 a2 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*2, input_a)); + COMPUTE_FLOAT4 a3 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*3, input_a)); const int inpb_offset = (4*pos) * width_blocks + width_blocks_idx; - FLOAT4 b0 = vload4(inpb_offset, input_b); - FLOAT4 b1 = vload4(inpb_offset + width_blocks, input_b); - FLOAT4 b2 = vload4(inpb_offset + width_blocks*2, input_b); - FLOAT4 b3 = vload4(inpb_offset + width_blocks*3, input_b); - - FLOAT4 a0_trans = (FLOAT4)(a0.x, a1.x, a2.x, a3.x); - FLOAT4 a1_trans = (FLOAT4)(a0.y, a1.y, a2.y, a3.y); - FLOAT4 a2_trans = (FLOAT4)(a0.z, a1.z, a2.z, a3.z); - FLOAT4 a3_trans = (FLOAT4)(a0.w, a1.w, a2.w, a3.w); + COMPUTE_FLOAT4 b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + COMPUTE_FLOAT4 b1 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks, input_b)); + COMPUTE_FLOAT4 b2 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*2, input_b)); + COMPUTE_FLOAT4 b3 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*3, input_b)); + + COMPUTE_FLOAT4 a0_trans = (COMPUTE_FLOAT4)(a0.x, a1.x, a2.x, a3.x); + COMPUTE_FLOAT4 a1_trans = (COMPUTE_FLOAT4)(a0.y, a1.y, a2.y, a3.y); + COMPUTE_FLOAT4 a2_trans = (COMPUTE_FLOAT4)(a0.z, a1.z, a2.z, a3.z); + COMPUTE_FLOAT4 a3_trans = (COMPUTE_FLOAT4)(a0.w, a1.w, a2.w, a3.w); - FLOAT4 b0_trans = (FLOAT4)(b0.x, b1.x, b2.x, b3.x); - FLOAT4 b1_trans = (FLOAT4)(b0.y, b1.y, b2.y, b3.y); - FLOAT4 b2_trans = (FLOAT4)(b0.z, b1.z, b2.z, b3.z); - FLOAT4 b3_trans = (FLOAT4)(b0.w, b1.w, b2.w, b3.w); + COMPUTE_FLOAT4 b0_trans = (COMPUTE_FLOAT4)(b0.x, b1.x, b2.x, b3.x); + COMPUTE_FLOAT4 b1_trans = (COMPUTE_FLOAT4)(b0.y, b1.y, b2.y, b3.y); + COMPUTE_FLOAT4 b2_trans = (COMPUTE_FLOAT4)(b0.z, b1.z, b2.z, b3.z); + COMPUTE_FLOAT4 b3_trans = (COMPUTE_FLOAT4)(b0.w, b1.w, b2.w, b3.w); //matmul result0.x += dot(a0_trans, b0_trans); @@ -262,26 +262,26 @@ __kernel void matmul_transA_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a { const int inpa_offset = (4*(channel_blocks - 1)) * height_blocks + height_blocks_idx; - FLOAT4 a0 = vload4(inpa_offset, input_a); - FLOAT4 a1 = ((remain >= 3) ? v_zero : vload4(inpa_offset + height_blocks, input_a)); - FLOAT4 a2 = ((remain >= 2) ? v_zero : vload4(inpa_offset + height_blocks*2, input_a)); - FLOAT4 a3 = ((remain >= 1) ? v_zero : vload4(inpa_offset + height_blocks*3, input_a)); + COMPUTE_FLOAT4 a0 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); + COMPUTE_FLOAT4 a1 = ((remain >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks, input_a))); + COMPUTE_FLOAT4 a2 = ((remain >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*2, input_a))); + COMPUTE_FLOAT4 a3 = ((remain >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*3, input_a))); const int inpb_offset = (4*(channel_blocks - 1)) * width_blocks + width_blocks_idx; - FLOAT4 b0 = vload4(inpb_offset, input_b); - FLOAT4 b1 = ((remain >= 3) ? v_zero : vload4(inpb_offset + width_blocks, input_b)); - FLOAT4 b2 = ((remain >= 3) ? v_zero : vload4(inpb_offset + width_blocks*2, input_b)); - FLOAT4 b3 = ((remain >= 3) ? v_zero : vload4(inpb_offset + width_blocks*3, input_b)); - - FLOAT4 a0_trans = (FLOAT4)(a0.x, a1.x, a2.x, a3.x); - FLOAT4 a1_trans = (FLOAT4)(a0.y, a1.y, a2.y, a3.y); - FLOAT4 a2_trans = (FLOAT4)(a0.z, a1.z, a2.z, a3.z); - FLOAT4 a3_trans = (FLOAT4)(a0.w, a1.w, a2.w, a3.w); + COMPUTE_FLOAT4 b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + COMPUTE_FLOAT4 b1 = ((remain >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks, input_b))); + COMPUTE_FLOAT4 b2 = ((remain >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*2, input_b))); + COMPUTE_FLOAT4 b3 = ((remain >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + width_blocks*3, input_b))); + + COMPUTE_FLOAT4 a0_trans = (COMPUTE_FLOAT4)(a0.x, a1.x, a2.x, a3.x); + COMPUTE_FLOAT4 a1_trans = (COMPUTE_FLOAT4)(a0.y, a1.y, a2.y, a3.y); + COMPUTE_FLOAT4 a2_trans = (COMPUTE_FLOAT4)(a0.z, a1.z, a2.z, a3.z); + COMPUTE_FLOAT4 a3_trans = (COMPUTE_FLOAT4)(a0.w, a1.w, a2.w, a3.w); - FLOAT4 b0_trans = (FLOAT4)(b0.x, b1.x, b2.x, b3.x); - FLOAT4 b1_trans = (FLOAT4)(b0.y, b1.y, b2.y, b3.y); - FLOAT4 b2_trans = (FLOAT4)(b0.z, b1.z, b2.z, b3.z); - FLOAT4 b3_trans = (FLOAT4)(b0.w, b1.w, b2.w, b3.w); + COMPUTE_FLOAT4 b0_trans = (COMPUTE_FLOAT4)(b0.x, b1.x, b2.x, b3.x); + COMPUTE_FLOAT4 b1_trans = (COMPUTE_FLOAT4)(b0.y, b1.y, b2.y, b3.y); + COMPUTE_FLOAT4 b2_trans = (COMPUTE_FLOAT4)(b0.z, b1.z, b2.z, b3.z); + COMPUTE_FLOAT4 b3_trans = (COMPUTE_FLOAT4)(b0.w, b1.w, b2.w, b3.w); //matmul result0.x += dot(a0_trans, b0_trans); @@ -307,13 +307,13 @@ __kernel void matmul_transA_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a const int out_offset = (4*height_blocks_idx) * width_blocks + width_blocks_idx; - vstore4(result0, out_offset, output_c); + vstore4(CONVERT_FLOAT4(result0), out_offset, output_c); if(4*height_blocks_idx+1 >= height) return; - vstore4(result1, out_offset + width_blocks, output_c); + vstore4(CONVERT_FLOAT4(result1), out_offset + width_blocks, output_c); if(4*height_blocks_idx+2 >= height) return; - vstore4(result2, out_offset + width_blocks*2, output_c); + vstore4(CONVERT_FLOAT4(result2), out_offset + width_blocks*2, output_c); if(4*height_blocks_idx+3 >= height) return; - vstore4(result3, out_offset + width_blocks*3, output_c); + vstore4(CONVERT_FLOAT4(result3), out_offset + width_blocks*3, output_c); } __kernel void matmul_transA_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* input_a, @@ -333,39 +333,39 @@ __kernel void matmul_transA_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* DEAL_NON_UNIFORM_DIM2(width_blocks_idx, height_blocks_idx); - FLOAT4 v_zero = (FLOAT4)((FLOAT)0.0); + COMPUTE_FLOAT4 v_zero = (COMPUTE_FLOAT4)((COMPUTE_FLOAT)0.0); #ifdef BIAS - FLOAT4 result0 = vload4(width_blocks_idx, input_c); + COMPUTE_FLOAT4 result0 = CONVERT_COMPUTE_FLOAT4(vload4(width_blocks_idx, input_c)); - FLOAT4 result1 = result0; - FLOAT4 result2 = result0; - FLOAT4 result3 = result0; + COMPUTE_FLOAT4 result1 = result0; + COMPUTE_FLOAT4 result2 = result0; + COMPUTE_FLOAT4 result3 = result0; #else - FLOAT4 result0 = 0; - FLOAT4 result1 = 0; - FLOAT4 result2 = 0; - FLOAT4 result3 = 0; + COMPUTE_FLOAT4 result0 = 0; + COMPUTE_FLOAT4 result1 = 0; + COMPUTE_FLOAT4 result2 = 0; + COMPUTE_FLOAT4 result3 = 0; #endif const int remaina = channel_blocks * 4 - channels; const int remainb = (width_blocks_idx + 1) * 4 - width; for (short pos = 0; pos < channel_blocks - 1; pos += 1) { const int inpa_offset = (4*pos) * height_blocks + height_blocks_idx; - FLOAT4 a0 = vload4(inpa_offset, input_a); - FLOAT4 a1 = vload4(inpa_offset + height_blocks, input_a); - FLOAT4 a2 = vload4(inpa_offset + height_blocks*2, input_a); - FLOAT4 a3 = vload4(inpa_offset + height_blocks*3, input_a); + COMPUTE_FLOAT4 a0 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); + COMPUTE_FLOAT4 a1 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks, input_a)); + COMPUTE_FLOAT4 a2 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*2, input_a)); + COMPUTE_FLOAT4 a3 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*3, input_a)); const int inpb_offset = (4*width_blocks_idx) * channel_blocks + pos; - FLOAT4 b0 = vload4(inpb_offset, input_b); - FLOAT4 b1 = ((remainb >= 3) ? v_zero : vload4(inpb_offset + channel_blocks, input_b)); - FLOAT4 b2 = ((remainb >= 2) ? v_zero : vload4(inpb_offset + channel_blocks*2, input_b)); - FLOAT4 b3 = ((remainb >= 1) ? v_zero : vload4(inpb_offset + channel_blocks*3, input_b)); + COMPUTE_FLOAT4 b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + COMPUTE_FLOAT4 b1 = ((remainb >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks, input_b))); + COMPUTE_FLOAT4 b2 = ((remainb >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*2, input_b))); + COMPUTE_FLOAT4 b3 = ((remainb >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*3, input_b))); - FLOAT4 a0_trans = (FLOAT4)(a0.x, a1.x, a2.x, a3.x); - FLOAT4 a1_trans = (FLOAT4)(a0.y, a1.y, a2.y, a3.y); - FLOAT4 a2_trans = (FLOAT4)(a0.z, a1.z, a2.z, a3.z); - FLOAT4 a3_trans = (FLOAT4)(a0.w, a1.w, a2.w, a3.w); + COMPUTE_FLOAT4 a0_trans = (COMPUTE_FLOAT4)(a0.x, a1.x, a2.x, a3.x); + COMPUTE_FLOAT4 a1_trans = (COMPUTE_FLOAT4)(a0.y, a1.y, a2.y, a3.y); + COMPUTE_FLOAT4 a2_trans = (COMPUTE_FLOAT4)(a0.z, a1.z, a2.z, a3.z); + COMPUTE_FLOAT4 a3_trans = (COMPUTE_FLOAT4)(a0.w, a1.w, a2.w, a3.w); //matmul result0.x += dot(a0_trans, b0); @@ -391,21 +391,21 @@ __kernel void matmul_transA_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* { const int inpa_offset = (4*(channel_blocks-1)) * height_blocks + height_blocks_idx; - FLOAT4 a0 = vload4(inpa_offset, input_a); - FLOAT4 a1 = ((remaina >= 3) ? v_zero : vload4(inpa_offset + height_blocks, input_a)); - FLOAT4 a2 = ((remaina >= 2) ? v_zero : vload4(inpa_offset + height_blocks*2, input_a)); - FLOAT4 a3 = ((remaina >= 1) ? v_zero : vload4(inpa_offset + height_blocks*3, input_a)); + COMPUTE_FLOAT4 a0 = CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset, input_a)); + COMPUTE_FLOAT4 a1 = ((remaina >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks, input_a))); + COMPUTE_FLOAT4 a2 = ((remaina >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*2, input_a))); + COMPUTE_FLOAT4 a3 = ((remaina >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpa_offset + height_blocks*3, input_a))); const int inpb_offset = (4*width_blocks_idx) * channel_blocks + channel_blocks-1; - FLOAT4 b0 = vload4(inpb_offset, input_b); - FLOAT4 b1 = ((remainb >= 3) ? v_zero : vload4(inpb_offset + channel_blocks, input_b)); - FLOAT4 b2 = ((remainb >= 2) ? v_zero : vload4(inpb_offset + channel_blocks*2, input_b)); - FLOAT4 b3 = ((remainb >= 1) ? v_zero : vload4(inpb_offset + channel_blocks*3, input_b)); + COMPUTE_FLOAT4 b0 = CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset, input_b)); + COMPUTE_FLOAT4 b1 = ((remainb >= 3) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks, input_b))); + COMPUTE_FLOAT4 b2 = ((remainb >= 2) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*2, input_b))); + COMPUTE_FLOAT4 b3 = ((remainb >= 1) ? v_zero : CONVERT_COMPUTE_FLOAT4(vload4(inpb_offset + channel_blocks*3, input_b))); - FLOAT4 a0_trans = (FLOAT4)(a0.x, a1.x, a2.x, a3.x); - FLOAT4 a1_trans = (FLOAT4)(a0.y, a1.y, a2.y, a3.y); - FLOAT4 a2_trans = (FLOAT4)(a0.z, a1.z, a2.z, a3.z); - FLOAT4 a3_trans = (FLOAT4)(a0.w, a1.w, a2.w, a3.w); + COMPUTE_FLOAT4 a0_trans = (COMPUTE_FLOAT4)(a0.x, a1.x, a2.x, a3.x); + COMPUTE_FLOAT4 a1_trans = (COMPUTE_FLOAT4)(a0.y, a1.y, a2.y, a3.y); + COMPUTE_FLOAT4 a2_trans = (COMPUTE_FLOAT4)(a0.z, a1.z, a2.z, a3.z); + COMPUTE_FLOAT4 a3_trans = (COMPUTE_FLOAT4)(a0.w, a1.w, a2.w, a3.w); //matmul result0.x += dot(a0_trans, b0); @@ -431,11 +431,11 @@ __kernel void matmul_transA_transB_buf(GLOBAL_SIZE_2_DIMS __global const FLOAT* const int out_offset = (4*height_blocks_idx) * width_blocks + width_blocks_idx; - vstore4(result0, out_offset, output_c); + vstore4(CONVERT_FLOAT4(result0), out_offset, output_c); if(4*height_blocks_idx+1 >= height) return; - vstore4(result1, out_offset + width_blocks, output_c); + vstore4(CONVERT_FLOAT4(result1), out_offset + width_blocks, output_c); if(4*height_blocks_idx+2 >= height) return; - vstore4(result2, out_offset + width_blocks*2, output_c); + vstore4(CONVERT_FLOAT4(result2), out_offset + width_blocks*2, output_c); if(4*height_blocks_idx+3 >= height) return; - vstore4(result3, out_offset + width_blocks*3, output_c); + vstore4(CONVERT_FLOAT4(result3), out_offset + width_blocks*3, output_c); } diff --git a/source/backend/opencl/execution/cl/opencl_program.cc b/source/backend/opencl/execution/cl/opencl_program.cc index b18253f2c..ae5bd9565 100644 --- a/source/backend/opencl/execution/cl/opencl_program.cc +++ b/source/backend/opencl/execution/cl/opencl_program.cc @@ -21,7 +21,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "grid_sample_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x7b,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x20,0x3d,0x20,0x30,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x3d,0x20,0x31,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x20,0x3d,0x20,0x32,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x49,0x4e,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x41,0x58,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0xa,0x7d,0x3b,0xa,0xa,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x2c,0x20,0x69,0x6e,0x74,0x20,0x72,0x61,0x6e,0x67,0x65,0x2c,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x62,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x30,0x2e,0x30,0x66,0x20,0x3a,0x20,0x31,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x28,0x31,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x28,0x72,0x61,0x6e,0x67,0x65,0x20,0x2d,0x20,0x61,0x29,0x20,0x2d,0x20,0x62,0x29,0x20,0x2f,0x20,0x32,0x2e,0x30,0x66,0x3b,0xa,0x7d,0xa,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x74,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x69,0x6e,0x74,0x20,0x76,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x69,0x6e,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3c,0x20,0x6d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3e,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x61,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x3b,0xa,0x7d,0xa,0xa,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x74,0x20,0x68,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x75,0x66,0x66,0x65,0x72,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x68,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x20,0x3d,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x43,0x6c,0x65,0x61,0x72,0x6c,0x79,0x2c,0x20,0x43,0x4c,0x41,0x4d,0x50,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x77,0x61,0x79,0x20,0x74,0x6f,0x20,0x67,0x6f,0x20,0x66,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x46,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x2c,0x20,0x73,0x69,0x6e,0x63,0x65,0x20,0x77,0x65,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x69,0x6e,0x74,0x6f,0x20,0x28,0x2d,0x31,0x2c,0x20,0x31,0x29,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x20,0x6c,0x65,0x66,0x74,0x6f,0x76,0x65,0x72,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x64,0x65,0x67,0x72,0x61,0x64,0x65,0x20,0x74,0x6f,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x2c,0x20,0x30,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x2c,0x20,0x30,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x68,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x72,0x69,0x64,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x6f,0x72,0x6d,0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x6e,0x63,0x68,0x77,0x20,0x74,0x6f,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x31,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x31,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x3c,0x2d,0x3e,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x6d,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x6d,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x70,0x6f,0x69,0x6e,0x74,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x77,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x68,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6e,0x68,0x2c,0x20,0x6e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x6f,0x6c,0x61,0x74,0x69,0x6f,0x6e,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x2d,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x7b,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x20,0x3d,0x20,0x30,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x3d,0x20,0x31,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x20,0x3d,0x20,0x32,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x49,0x4e,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x2c,0xa,0x20,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x4d,0x41,0x58,0x20,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0xa,0x7d,0x3b,0xa,0xa,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x2c,0x20,0x69,0x6e,0x74,0x20,0x72,0x61,0x6e,0x67,0x65,0x2c,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x31,0x2e,0x30,0x66,0x20,0x3a,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x62,0x20,0x3d,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3f,0x20,0x30,0x2e,0x30,0x66,0x20,0x3a,0x20,0x31,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x28,0x31,0x2e,0x30,0x66,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x28,0x72,0x61,0x6e,0x67,0x65,0x20,0x2d,0x20,0x61,0x29,0x20,0x2d,0x20,0x62,0x29,0x20,0x2f,0x20,0x32,0x2e,0x30,0x66,0x3b,0xa,0x7d,0xa,0xa,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x74,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x69,0x6e,0x74,0x20,0x76,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x69,0x6e,0x2c,0x20,0x69,0x6e,0x74,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3c,0x20,0x6d,0x69,0x6e,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x28,0x76,0x29,0x20,0x3e,0x20,0x6d,0x61,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x76,0x29,0x20,0x3d,0x20,0x6d,0x61,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x3b,0xa,0x7d,0xa,0xa,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x74,0x20,0x68,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x75,0x66,0x66,0x65,0x72,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x68,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x68,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x77,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x20,0x3d,0x3d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x5f,0x5a,0x45,0x52,0x4f,0x53,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x30,0x2e,0x30,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x43,0x6c,0x65,0x61,0x72,0x6c,0x79,0x2c,0x20,0x43,0x4c,0x41,0x4d,0x50,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x77,0x61,0x79,0x20,0x74,0x6f,0x20,0x67,0x6f,0x20,0x66,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x46,0x6f,0x72,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x52,0x45,0x46,0x4c,0x45,0x43,0x54,0x49,0x4f,0x4e,0x2c,0x20,0x73,0x69,0x6e,0x63,0x65,0x20,0x77,0x65,0x20,0x68,0x61,0x76,0x65,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x68,0x65,0x20,0x76,0x61,0x6c,0x75,0x65,0x73,0x20,0x69,0x6e,0x74,0x6f,0x20,0x28,0x2d,0x31,0x2c,0x20,0x31,0x29,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x20,0x6c,0x65,0x66,0x74,0x6f,0x76,0x65,0x72,0x20,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x64,0x65,0x67,0x72,0x61,0x64,0x65,0x20,0x74,0x6f,0x20,0x47,0x72,0x69,0x64,0x53,0x61,0x6d,0x70,0x6c,0x65,0x50,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x5f,0x42,0x4f,0x52,0x44,0x45,0x52,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x68,0x2c,0x20,0x30,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x20,0x3d,0x20,0x43,0x4c,0x41,0x4d,0x50,0x28,0x77,0x2c,0x20,0x30,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x68,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x29,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x72,0x69,0x64,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x6f,0x72,0x6d,0x61,0x74,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x20,0x66,0x72,0x6f,0x6d,0x20,0x6e,0x63,0x68,0x77,0x20,0x74,0x6f,0x20,0x6e,0x63,0x34,0x68,0x77,0x34,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x31,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x31,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x31,0x2c,0x79,0x32,0x2c,0x79,0x33,0x2c,0x79,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x3c,0x2d,0x3e,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x2c,0x78,0x31,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x31,0x2c,0x79,0x6d,0x29,0x2e,0x2e,0x2e,0x28,0x78,0x6e,0x2c,0x79,0x6d,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x73,0x6c,0x69,0x63,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2e,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x2c,0x78,0x6e,0x29,0x20,0x28,0x79,0x35,0x2c,0x79,0x36,0x2c,0x79,0x37,0x2c,0x79,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0xa,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x6e,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x70,0x6f,0x69,0x6e,0x74,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x77,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6e,0x68,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x2b,0x20,0x30,0x2e,0x35,0x66,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x6e,0x68,0x2c,0x20,0x6e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x67,0x72,0x69,0x64,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x65,0x6e,0x75,0x6d,0x20,0x42,0x6f,0x72,0x64,0x65,0x72,0x4d,0x6f,0x64,0x65,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x69,0x72,0x64,0x20,0x79,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x32,0x20,0x6d,0x65,0x61,0x6e,0x73,0x20,0x67,0x72,0x69,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x6c,0x69,0x63,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x73,0x6c,0x69,0x63,0x65,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x67,0x72,0x69,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x67,0x72,0x69,0x64,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x61,0x72,0x72,0x5b,0x38,0x5d,0x20,0x3d,0x20,0x7b,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x78,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x79,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x7a,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x78,0x2e,0x77,0x2c,0x20,0x67,0x72,0x69,0x64,0x5f,0x79,0x2e,0x77,0x7d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x67,0x65,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x20,0x3d,0x20,0x61,0x72,0x72,0x5b,0x32,0x20,0x2a,0x20,0x61,0x72,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x67,0x72,0x69,0x64,0x20,0x78,0x2c,0x79,0x20,0x74,0x6f,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x78,0x2c,0x79,0x20,0x63,0x6f,0x6f,0x72,0x64,0x69,0x6e,0x61,0x74,0x65,0x20,0x72,0x61,0x6e,0x67,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x28,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x61,0x6c,0x69,0x67,0x6e,0x43,0x6f,0x72,0x6e,0x65,0x72,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x3d,0x20,0x63,0x65,0x69,0x6c,0x28,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x20,0x2d,0x20,0x69,0x6e,0x5f,0x67,0x72,0x69,0x64,0x5f,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x62,0x69,0x6c,0x69,0x6e,0x65,0x61,0x72,0x20,0x69,0x6e,0x74,0x65,0x72,0x70,0x6f,0x6c,0x61,0x74,0x69,0x6f,0x6e,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x30,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x30,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x30,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x31,0x31,0x20,0x3d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x69,0x6e,0x5f,0x68,0x31,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x61,0x64,0x64,0x69,0x6e,0x67,0x4d,0x6f,0x64,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x30,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x30,0x29,0x20,0x20,0x2b,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x20,0x2d,0x20,0x78,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x69,0x31,0x31,0x29,0x29,0x20,0x2a,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x66,0x2d,0x20,0x79,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x7d,0xa, } }, #endif { @@ -46,6 +46,12 @@ extern const std::map> OpenCLProgramMap "winogradTransformSource2_3_1", { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x77,0x69,0x6e,0x6f,0x67,0x72,0x61,0x64,0x54,0x72,0x61,0x6e,0x73,0x66,0x6f,0x72,0x6d,0x53,0x6f,0x75,0x72,0x63,0x65,0x28,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x2f,0x2f,0x20,0x30,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x2f,0x2f,0x20,0x33,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x58,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x59,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2f,0x2f,0x20,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2a,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x58,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x2e,0x79,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x75,0x6e,0x69,0x74,0x57,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x20,0x2d,0x20,0x70,0x61,0x64,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x20,0x2d,0x20,0x70,0x61,0x64,0x59,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x30,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x31,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x32,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x33,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x30,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x31,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x32,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x33,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x30,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x31,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x32,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x33,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x30,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x31,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x32,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x33,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x30,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x31,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x32,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x33,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x30,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x31,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x32,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x33,0x31,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x30,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x31,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x32,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x33,0x32,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x30,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x30,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x31,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x31,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x32,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x32,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x78,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x79,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x33,0x20,0x2b,0x20,0x73,0x79,0x53,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x73,0x78,0x20,0x2b,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2a,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x78,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x57,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x62,0x61,0x74,0x63,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2a,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x73,0x79,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x73,0x79,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x73,0x79,0x20,0x3e,0x3d,0x20,0x73,0x72,0x63,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x53,0x33,0x33,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x52,0x49,0x5f,0x46,0x28,0x75,0x49,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6d,0x61,0x67,0x65,0x53,0x78,0x2c,0x20,0x69,0x6d,0x61,0x67,0x65,0x53,0x79,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x30,0x30,0x20,0x3d,0x20,0x2b,0x53,0x30,0x30,0x20,0x2d,0x20,0x53,0x30,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x31,0x30,0x20,0x3d,0x20,0x2b,0x53,0x31,0x30,0x20,0x2d,0x20,0x53,0x31,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x32,0x30,0x20,0x3d,0x20,0x2b,0x53,0x32,0x30,0x20,0x2d,0x20,0x53,0x32,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x33,0x30,0x20,0x3d,0x20,0x2b,0x53,0x33,0x30,0x20,0x2d,0x20,0x53,0x33,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x30,0x31,0x20,0x3d,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x30,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x30,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x31,0x31,0x20,0x3d,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x31,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x31,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x32,0x31,0x20,0x3d,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x32,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x32,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x33,0x31,0x20,0x3d,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x33,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x33,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x30,0x32,0x20,0x3d,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x30,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x30,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x31,0x32,0x20,0x3d,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x31,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x31,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x32,0x32,0x20,0x3d,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x32,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x32,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x33,0x32,0x20,0x3d,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x33,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x53,0x33,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x30,0x33,0x20,0x3d,0x20,0x2d,0x53,0x30,0x31,0x20,0x2b,0x20,0x53,0x30,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x31,0x33,0x20,0x3d,0x20,0x2d,0x53,0x31,0x31,0x20,0x2b,0x20,0x53,0x31,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x32,0x33,0x20,0x3d,0x20,0x2d,0x53,0x32,0x31,0x20,0x2b,0x20,0x53,0x32,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x33,0x33,0x20,0x3d,0x20,0x2d,0x53,0x33,0x31,0x20,0x2b,0x20,0x53,0x33,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x30,0x29,0x2c,0x20,0x2b,0x6d,0x30,0x30,0x20,0x2d,0x20,0x6d,0x32,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x29,0x2c,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x30,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x32,0x29,0x2c,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x30,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x33,0x29,0x2c,0x20,0x2d,0x6d,0x31,0x30,0x20,0x2b,0x20,0x6d,0x33,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x29,0x2c,0x20,0x2b,0x6d,0x30,0x31,0x20,0x2d,0x20,0x6d,0x32,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x35,0x29,0x2c,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x36,0x29,0x2c,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x31,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x37,0x29,0x2c,0x20,0x2d,0x6d,0x31,0x31,0x20,0x2b,0x20,0x6d,0x33,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x38,0x29,0x2c,0x20,0x2b,0x6d,0x30,0x32,0x20,0x2d,0x20,0x6d,0x32,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x39,0x29,0x2c,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x32,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x30,0x29,0x2c,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x32,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x31,0x29,0x2c,0x20,0x2d,0x6d,0x31,0x32,0x20,0x2b,0x20,0x6d,0x33,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x32,0x29,0x2c,0x20,0x2b,0x6d,0x30,0x33,0x20,0x2d,0x20,0x6d,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x33,0x29,0x2c,0x20,0x2b,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x33,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x34,0x29,0x2c,0x20,0x2d,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x31,0x33,0x20,0x2b,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x35,0x66,0x20,0x2a,0x20,0x6d,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x75,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x64,0x73,0x74,0x58,0x2c,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x75,0x6e,0x69,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x31,0x35,0x29,0x2c,0x20,0x2d,0x6d,0x31,0x33,0x20,0x2b,0x20,0x6d,0x33,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, +#ifndef MNN_OPENCL_BUFFER_CLOSED +{ + "gemv_conv1x1_buf", + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x61,0x2c,0x20,0x62,0x2c,0x20,0x63,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x61,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x61,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x62,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x62,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x62,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x43,0x48,0x41,0x52,0x38,0x5f,0x54,0x4f,0x5f,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x61,0x2c,0x20,0x63,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x61,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x61,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0x20,0x61,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x61,0x2c,0x20,0x62,0x2c,0x20,0x63,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x63,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x62,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x63,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x62,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x63,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x62,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x63,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x62,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x34,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x33,0x32,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x36,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x38,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x38,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x32,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x29,0x20,0x2f,0x20,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x29,0x25,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x33,0x32,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x36,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x31,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x25,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x33,0x32,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x36,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x38,0x5f,0x54,0x4f,0x5f,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x38,0x5f,0x54,0x4f,0x5f,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x30,0x2c,0x20,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x32,0x5f,0x69,0x6d,0x61,0x67,0x65,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x2d,0x31,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x61,0x73,0x5f,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x61,0x73,0x5f,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x61,0x73,0x5f,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x61,0x73,0x5f,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x33,0x32,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x37,0x29,0x20,0x3e,0x3e,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x33,0x32,0x2d,0x31,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x38,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x38,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x33,0x32,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x38,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x2f,0x2f,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x31,0x5f,0x69,0x6d,0x61,0x67,0x65,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x25,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x62,0x61,0x74,0x63,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x2d,0x31,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x61,0x73,0x5f,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x31,0x36,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x61,0x73,0x5f,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x33,0x32,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x37,0x29,0x20,0x3e,0x3e,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x33,0x32,0x2d,0x31,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x38,0x3b,0x20,0x6b,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x38,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x33,0x32,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x33,0x32,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x38,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x30,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x31,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x73,0x66,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x6b,0x38,0x20,0x2a,0x20,0x77,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x34,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x35,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x36,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x31,0x20,0x2b,0x20,0x28,0x6b,0x38,0x20,0x2b,0x20,0x37,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x32,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x33,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x61,0x73,0x5f,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x28,0x72,0x65,0x61,0x64,0x5f,0x69,0x6d,0x61,0x67,0x65,0x66,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6b,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x55,0x43,0x48,0x41,0x52,0x31,0x36,0x5f,0x54,0x4f,0x5f,0x32,0x43,0x48,0x41,0x52,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x44,0x4f,0x54,0x31,0x36,0x58,0x31,0x36,0x28,0x69,0x6e,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x2f,0x2f,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x41,0x43,0x54,0x48,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x32,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x73,0x56,0x61,0x6c,0x69,0x64,0x42,0x61,0x74,0x63,0x68,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x31,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x30,0x2c,0x20,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa, } + }, +#endif { "raster", { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x73,0x65,0x74,0x5f,0x7a,0x65,0x72,0x6f,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x78,0x2c,0x20,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x79,0x2a,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x2b,0x20,0x78,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x28,0x30,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x73,0x65,0x74,0x5f,0x7a,0x65,0x72,0x6f,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x78,0x2c,0x20,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x44,0x41,0x54,0x41,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x78,0x2c,0x20,0x79,0x29,0x2c,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x5f,0x49,0x34,0x29,0x28,0x30,0x29,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x53,0x72,0x63,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x44,0x73,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x30,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x64,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x25,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x2f,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x64,0x20,0x2a,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x53,0x72,0x63,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x64,0x20,0x2a,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x44,0x73,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x44,0x41,0x54,0x41,0x5f,0x46,0x4f,0x52,0x4d,0x41,0x54,0x5f,0x4e,0x48,0x57,0x43,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x62,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x62,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x63,0x6f,0x6f,0x72,0x64,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x28,0x69,0x6e,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x2c,0x20,0x69,0x6e,0x5f,0x62,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x5f,0x49,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x52,0x49,0x5f,0x44,0x41,0x54,0x41,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x63,0x6f,0x6f,0x72,0x64,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x5f,0x49,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x5f,0x49,0x2a,0x29,0x26,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x76,0x61,0x6c,0x75,0x65,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x5f,0x63,0x20,0x25,0x20,0x34,0x5d,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x69,0x6d,0x61,0x67,0x65,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x72,0x65,0x61,0x64,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x6e,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x63,0x34,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2f,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x25,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2f,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x25,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2b,0x33,0x29,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x63,0x34,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2f,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x25,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2f,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x25,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x77,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x63,0x34,0x2a,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x6e,0x2a,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x5f,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x63,0x34,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x6e,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x5f,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x5f,0x49,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x52,0x49,0x5f,0x44,0x41,0x54,0x41,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x69,0x64,0x78,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x44,0x41,0x54,0x41,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x30,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x69,0x64,0x78,0x31,0x29,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x49,0x34,0x28,0x6f,0x75,0x74,0x29,0x29,0x3b,0xa,0x7d,0xa, } @@ -54,14 +60,14 @@ extern const std::map> OpenCLProgramMap #ifdef MNN_SUPPORT_INTEL_SUBGROUP { "conv_2d_c1_subgroup_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x34,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x2a,0x20,0x34,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x34,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x2a,0x20,0x34,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x34,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x2a,0x20,0x34,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x31,0x36,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x32,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x31,0x36,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x31,0x36,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x34,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x2a,0x20,0x34,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x34,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x2a,0x20,0x34,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x34,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x63,0x6b,0x20,0x2a,0x20,0x34,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x31,0x36,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x32,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x64,0x73,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x31,0x36,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x64,0x73,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x5f,0x63,0x31,0x36,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0xa,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x32,0x35,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x3d,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x25,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x62,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x65,0x6c,0x65,0x6d,0x20,0x2f,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x79,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x26,0x26,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x78,0x62,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x2f,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x20,0x20,0x3d,0x20,0x28,0x6b,0x77,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x20,0x2b,0x20,0x28,0x6b,0x68,0x2a,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x25,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x3b,0x20,0x69,0x63,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x63,0x20,0x2a,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x53,0x49,0x5a,0x45,0x20,0x2b,0x20,0x62,0x75,0x66,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5d,0x2c,0x20,0x62,0x75,0x66,0x5f,0x67,0x72,0x6f,0x75,0x70,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x5b,0x69,0x63,0x5d,0x2c,0x20,0x73,0x72,0x63,0x2c,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x64,0x73,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d, } }, #endif #endif #ifndef MNN_OPENCL_BUFFER_CLOSED { "conv_2d_int_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3d,0x3d,0x2d,0x31,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x20,0x31,0x35,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x20,0x3d,0x20,0x28,0x69,0x78,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2f,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x2f,0x2f,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x27,0x73,0x20,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x38,0x68,0x32,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x5b,0x69,0x63,0x2f,0x34,0x2c,0x20,0x6f,0x63,0x2c,0x20,0x34,0x5d,0x2c,0x20,0x6c,0x6f,0x6f,0x70,0x3a,0x20,0x69,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x20,0x31,0x35,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x20,0x3d,0x20,0x28,0x69,0x78,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2f,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x2f,0x2f,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x27,0x73,0x20,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x32,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x32,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x33,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x33,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x32,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x32,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x33,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x33,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x32,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x32,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x33,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x33,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x37,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x38,0x68,0x32,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x5b,0x69,0x63,0x2f,0x34,0x2c,0x20,0x6f,0x63,0x2c,0x20,0x34,0x5d,0x2c,0x20,0x6c,0x6f,0x6f,0x70,0x3a,0x20,0x69,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x69,0x6e,0x74,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x32,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x34,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x30,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x30,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x30,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x31,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x31,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x31,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x32,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x32,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x32,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x33,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x33,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2f,0x32,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x2f,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x34,0x29,0x28,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x32,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x78,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x79,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x30,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x7a,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x2e,0x77,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x49,0x6e,0x74,0x34,0x33,0x2e,0x73,0x31,0x20,0x26,0x20,0x4d,0x4f,0x44,0x5f,0x4e,0x55,0x4d,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x33,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x30,0x33,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x30,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x30,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x31,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x32,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x20,0x76,0x62,0x69,0x61,0x73,0x31,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x6f,0x75,0x74,0x37,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x43,0x34,0x37,0x20,0x2b,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x75,0x6d,0x33,0x29,0x20,0x2a,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x43,0x34,0x37,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif #ifndef MNN_OPENCL_BUFFER_CLOSED @@ -87,7 +93,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "raster_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x73,0x65,0x74,0x5f,0x7a,0x65,0x72,0x6f,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x78,0x2c,0x20,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x79,0x2a,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x2b,0x20,0x78,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x28,0x30,0x2e,0x30,0x66,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x69,0x6d,0x61,0x67,0x65,0x5f,0x73,0x65,0x74,0x5f,0x7a,0x65,0x72,0x6f,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x6f,0x6e,0x6c,0x79,0x20,0x69,0x6d,0x61,0x67,0x65,0x32,0x64,0x5f,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x78,0x2c,0x20,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x57,0x49,0x5f,0x46,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x78,0x2c,0x20,0x79,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x2e,0x30,0x66,0x29,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5d,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x69,0x7a,0x65,0x5f,0x78,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x53,0x72,0x63,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x44,0x73,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x64,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x25,0x20,0x73,0x69,0x7a,0x65,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x2f,0x20,0x73,0x69,0x7a,0x65,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x64,0x20,0x2a,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x53,0x72,0x63,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x64,0x20,0x2a,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x44,0x73,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x44,0x41,0x54,0x41,0x5f,0x46,0x4f,0x52,0x4d,0x41,0x54,0x5f,0x4e,0x48,0x57,0x43,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x62,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x62,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x44,0x41,0x54,0x41,0x5f,0x46,0x4f,0x52,0x4d,0x41,0x54,0x5f,0x4e,0x48,0x57,0x43,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x5d,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x5f,0x74,0x20,0x53,0x41,0x4d,0x50,0x4c,0x45,0x52,0x20,0x3d,0x20,0x43,0x4c,0x4b,0x5f,0x4e,0x4f,0x52,0x4d,0x41,0x4c,0x49,0x5a,0x45,0x44,0x5f,0x43,0x4f,0x4f,0x52,0x44,0x53,0x5f,0x46,0x41,0x4c,0x53,0x45,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x41,0x44,0x44,0x52,0x45,0x53,0x53,0x5f,0x43,0x4c,0x41,0x4d,0x50,0x20,0x7c,0x20,0x43,0x4c,0x4b,0x5f,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x4e,0x45,0x41,0x52,0x45,0x53,0x54,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x5f,0x73,0x65,0x74,0x5f,0x7a,0x65,0x72,0x6f,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x78,0x2c,0x20,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x79,0x2a,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x2b,0x20,0x78,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x28,0x30,0x2e,0x30,0x66,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x5d,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x6e,0x63,0x34,0x68,0x77,0x34,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x72,0x61,0x73,0x74,0x65,0x72,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x5f,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x69,0x7a,0x65,0x5f,0x78,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x53,0x72,0x63,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x44,0x73,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x64,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x25,0x20,0x73,0x69,0x7a,0x65,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x2f,0x20,0x73,0x69,0x7a,0x65,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x64,0x20,0x2a,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x53,0x72,0x63,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x64,0x20,0x2a,0x20,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0x44,0x73,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x31,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x53,0x74,0x72,0x69,0x64,0x65,0x32,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x44,0x41,0x54,0x41,0x5f,0x46,0x4f,0x52,0x4d,0x41,0x54,0x5f,0x4e,0x48,0x57,0x43,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x62,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x62,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x29,0x20,0x2a,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x69,0x6e,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x44,0x41,0x54,0x41,0x5f,0x46,0x4f,0x52,0x4d,0x41,0x54,0x5f,0x4e,0x48,0x57,0x43,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x3d,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x25,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x20,0x2f,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x2f,0x20,0x34,0x29,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x29,0x20,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x5d,0x20,0x3d,0x20,0x28,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x54,0x59,0x50,0x45,0x29,0x69,0x6e,0x70,0x75,0x74,0x5b,0x69,0x6e,0x70,0x75,0x74,0x49,0x6e,0x64,0x65,0x78,0x43,0x34,0x5d,0x3b,0xa,0x7d,0xa, } }, #endif #ifndef MNN_OPENCL_BUFFER_CLOSED @@ -102,7 +108,7 @@ extern const std::map> OpenCLProgramMap #ifdef MNN_SUPPORT_INTEL_SUBGROUP { "depthwise_conv2d_subgroup_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x37,0x29,0x20,0x2f,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x28,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x37,0x29,0x20,0x2f,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x28,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x63,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x37,0x29,0x20,0x2f,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x28,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x37,0x29,0x20,0x2f,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x20,0x3d,0x20,0x28,0x28,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x70,0x61,0x63,0x6b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x63,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x63,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x48,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6a,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x77,0x65,0x69,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x2b,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6a,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x38,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x72,0x63,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x28,0x6a,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x73,0x72,0x63,0x2c,0x20,0x77,0x65,0x69,0x2c,0x20,0x64,0x73,0x74,0x5b,0x6b,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x57,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d, } }, #endif #endif @@ -114,14 +120,14 @@ extern const std::map> OpenCLProgramMap #ifdef MNN_SUPPORT_INTEL_SUBGROUP { "pooling_subgroup_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x2b,0x2b,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x2a,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x2b,0x2b,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x2a,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x28,0x63,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x31,0x36,0x20,0x2b,0x20,0x63,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x30,0x29,0x2a,0x31,0x36,0x20,0x2b,0x20,0x63,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x32,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x33,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x34,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x35,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x36,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x37,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x77,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x68,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x38,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x62,0x5f,0x69,0x64,0x78,0x2c,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x63,0x5f,0x69,0x64,0x78,0x29,0x2c,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2c,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2a,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x73,0x72,0x63,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x73,0x72,0x63,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x73,0x72,0x63,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x30,0x29,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x69,0x2a,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x69,0x2a,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x31,0x36,0x3b,0xa,0x23,0x69,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4c,0x45,0x46,0x54,0x4f,0x56,0x45,0x52,0x53,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x38,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x38,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x38,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x25,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4c,0x45,0x46,0x54,0x4f,0x56,0x45,0x52,0x53,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x32,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x33,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x34,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x35,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x36,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x37,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x77,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x68,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x38,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x62,0x5f,0x69,0x64,0x78,0x2c,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x63,0x5f,0x69,0x64,0x78,0x29,0x2c,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2c,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2a,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x73,0x72,0x63,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x73,0x72,0x63,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x73,0x72,0x63,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4c,0x45,0x46,0x54,0x4f,0x56,0x45,0x52,0x53,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x34,0x5f,0x63,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x2b,0x2b,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x2a,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x34,0x5f,0x63,0x31,0x36,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x3b,0xa,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x2b,0x2b,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x2a,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x28,0x63,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x34,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x31,0x36,0x20,0x2b,0x20,0x63,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2f,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x30,0x29,0x2a,0x31,0x36,0x20,0x2b,0x20,0x63,0x5f,0x6c,0x65,0x66,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x32,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x33,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x34,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x35,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x36,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x37,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x77,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x68,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x38,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x62,0x5f,0x69,0x64,0x78,0x2c,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x63,0x5f,0x69,0x64,0x78,0x29,0x2c,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2c,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2a,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x73,0x72,0x63,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x73,0x72,0x63,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x73,0x72,0x63,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x30,0x29,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x69,0x2a,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x69,0x2a,0x31,0x36,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x64,0x73,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x31,0x36,0x3b,0xa,0x23,0x69,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4c,0x45,0x46,0x54,0x4f,0x56,0x45,0x52,0x53,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x38,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x38,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x25,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4c,0x45,0x46,0x54,0x4f,0x56,0x45,0x52,0x53,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x59,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x32,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x33,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x34,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x35,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x36,0x2c,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x20,0x2a,0x20,0x37,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x77,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x66,0x6d,0x69,0x6e,0x28,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x77,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x68,0x5f,0x65,0x6e,0x64,0x20,0x2d,0x20,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x38,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x30,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x62,0x5f,0x69,0x64,0x78,0x2c,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x63,0x5f,0x69,0x64,0x78,0x29,0x2c,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2c,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x59,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3e,0x3d,0x20,0x30,0x20,0x26,0x26,0x20,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x73,0x72,0x63,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0x69,0x29,0x2c,0x31,0x36,0x29,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x7b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x4b,0x45,0x52,0x4e,0x45,0x4c,0x5f,0x58,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x58,0x2a,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x73,0x72,0x63,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x73,0x72,0x63,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x38,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x73,0x72,0x63,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x4f,0x55,0x54,0x50,0x55,0x54,0x5f,0x4c,0x45,0x46,0x54,0x4f,0x56,0x45,0x52,0x53,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x63,0x5f,0x69,0x64,0x78,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x5b,0x72,0x65,0x64,0x69,0x63,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, #endif #endif #ifndef MNN_OPENCL_BUFFER_CLOSED { "pooling_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x2a,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x69,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x77,0x29,0x2a,0x34,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x20,0x3e,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x69,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3e,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3f,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x3d,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x5f,0x6f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x2d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e,0x28,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x2d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x6e,0x64,0x65,0x66,0x20,0x43,0x4f,0x55,0x4e,0x54,0x5f,0x49,0x4e,0x43,0x4c,0x55,0x44,0x45,0x5f,0x50,0x41,0x44,0x44,0x49,0x4e,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x2b,0x2b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x31,0x2e,0x30,0x2a,0x74,0x6f,0x74,0x61,0x6c,0x5f,0x63,0x6f,0x75,0x6e,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x2b,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x3d,0x30,0x3b,0x20,0x6b,0x68,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x3d,0x30,0x3b,0x20,0x6b,0x77,0x3c,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x77,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x6b,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x6b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x20,0x3e,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x28,0x69,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x77,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x64,0x61,0x74,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x70,0x6f,0x6f,0x6c,0x69,0x6e,0x67,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x73,0x68,0x61,0x70,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x69,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x28,0x68,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x77,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x2c,0x20,0x69,0x6e,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x69,0x6e,0x20,0x3e,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3f,0x20,0x28,0x69,0x6e,0x74,0x34,0x29,0x28,0x69,0x29,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3e,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x20,0x3f,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x5d,0x20,0x3a,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x50,0x4f,0x4f,0x4c,0x5f,0x41,0x56,0x47,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x20,0x2f,0x3d,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x20,0x52,0x45,0x54,0x55,0x52,0x4e,0x5f,0x52,0x45,0x44,0x49,0x43,0x45,0xa,0x20,0x20,0x20,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x20,0x3d,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x49,0x64,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x64,0x69,0x63,0x65,0x29,0x2c,0x20,0x20,0x30,0x2c,0x20,0x72,0x65,0x64,0x69,0x63,0x65,0x4f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa, } }, #endif { @@ -137,7 +143,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "depthwise_conv2d_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x57,0x69,0x64,0x74,0x68,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x43,0x75,0x72,0x49,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x2f,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x28,0x28,0x69,0x6e,0x4f,0x66,0x66,0x73,0x65,0x74,0x23,0x23,0x69,0x29,0x3d,0x3d,0x2d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x48,0x65,0x69,0x67,0x68,0x74,0x49,0x64,0x78,0x20,0x3d,0x3d,0x20,0x2d,0x31,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x78,0x2c,0x79,0x29,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x78,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x78,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x78,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x79,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x79,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x79,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x79,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x79,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x79,0x29,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3d,0x20,0x6b,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x31,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x32,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x33,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3d,0x20,0x6b,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x31,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3d,0x20,0x6b,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x73,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x73,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x73,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x6b,0x33,0x73,0x31,0x70,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x66,0x69,0x72,0x73,0x74,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x73,0x65,0x63,0x6f,0x6e,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x74,0x68,0x69,0x72,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x6b,0x33,0x73,0x31,0x70,0x31,0x5f,0x63,0x34,0x68,0x32,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0x2f,0x32,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2f,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x66,0x69,0x72,0x73,0x74,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x73,0x65,0x63,0x6f,0x6e,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x74,0x68,0x69,0x72,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x66,0x6f,0x72,0x74,0x68,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x3e,0x3d,0x20,0x32,0x20,0x26,0x26,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x3d,0x20,0x31,0x20,0x20,0x26,0x26,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x3e,0x3d,0x20,0x32,0x20,0x20,0x26,0x26,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x78,0x2c,0x79,0x29,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x78,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x78,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x78,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x79,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x79,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x79,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x79,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x79,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x79,0x29,0x3b,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3d,0x20,0x6b,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x31,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x32,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x33,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3d,0x20,0x6b,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x31,0x2a,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3d,0x20,0x6b,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x5f,0x64,0x69,0x6c,0x61,0x74,0x65,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x73,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x37,0x29,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x36,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x73,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x30,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x63,0x31,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x5f,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x35,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x73,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x2b,0x20,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x2b,0x20,0x6b,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x63,0x75,0x72,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6b,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x31,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x32,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x33,0x2b,0x6b,0x77,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6b,0x77,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x78,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x53,0x68,0x61,0x70,0x65,0x2e,0x79,0x2c,0x20,0x31,0x2c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x73,0x5d,0x20,0x78,0x20,0x6f,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x49,0x64,0x78,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x2c,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x42,0x6c,0x6f,0x63,0x6b,0x49,0x64,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x2c,0x20,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x6b,0x33,0x73,0x31,0x70,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x66,0x69,0x72,0x73,0x74,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x73,0x65,0x63,0x6f,0x6e,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x74,0x68,0x69,0x72,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x5f,0x30,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x63,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x6b,0x33,0x73,0x31,0x70,0x31,0x5f,0x63,0x34,0x68,0x32,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x63,0x2f,0x34,0x20,0x2a,0x20,0x6f,0x77,0x2f,0x32,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x62,0x20,0x2a,0x20,0x68,0x2f,0x32,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2f,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x66,0x69,0x72,0x73,0x74,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x73,0x65,0x63,0x6f,0x6e,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x31,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x74,0x68,0x69,0x72,0x64,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x32,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x2b,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2b,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x66,0x6f,0x72,0x74,0x68,0x20,0x6c,0x69,0x6e,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3c,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2a,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x57,0x5f,0x43,0x4f,0x4e,0x56,0x5f,0x4e,0x45,0x58,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x43,0x41,0x4c,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x5f,0x69,0x64,0x78,0x2a,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x3e,0x3d,0x20,0x32,0x20,0x26,0x26,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x3d,0x3d,0x20,0x31,0x20,0x20,0x26,0x26,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2b,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x77,0x20,0x3e,0x3d,0x20,0x32,0x20,0x20,0x26,0x26,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x68,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x56,0x61,0x6c,0x75,0x65,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, #endif #ifndef MNN_OPENCL_BUFFER_CLOSED @@ -167,7 +173,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "gemm_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2a,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6b,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x2b,0x31,0x29,0x20,0x3e,0x3e,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x5f,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x34,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x33,0x32,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x34,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x36,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x38,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x30,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x31,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x38,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x32,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x33,0x32,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x32,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x36,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x38,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x38,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x39,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x39,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x61,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x61,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x62,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x62,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x63,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x63,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x64,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x64,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x65,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x65,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x66,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x66,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x32,0x28,0x6f,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x63,0x6f,0x6e,0x76,0x5f,0x63,0x31,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x63,0x68,0x61,0x72,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x2c,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x33,0x32,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2a,0x20,0x36,0x34,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x53,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x53,0x63,0x61,0x6c,0x65,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x64,0x65,0x71,0x75,0x61,0x6e,0x74,0x4f,0x66,0x66,0x73,0x65,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x57,0x49,0x44,0x54,0x48,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x5f,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2f,0x34,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x69,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x34,0x20,0x3d,0x20,0x6b,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x34,0x20,0x2a,0x20,0x77,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x31,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x32,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x20,0x3d,0x20,0x6b,0x34,0x20,0x2b,0x20,0x33,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x3f,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x6b,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x77,0x68,0x29,0x20,0x3a,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x63,0x68,0x61,0x72,0x38,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x38,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x31,0x36,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x31,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x30,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x32,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x33,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x31,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x35,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x32,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x36,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x37,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x33,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x39,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x34,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x61,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x62,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x35,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x64,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x36,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x65,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x3e,0x3e,0x20,0x34,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x66,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x49,0x6e,0x74,0x34,0x2e,0x73,0x37,0x20,0x26,0x20,0x31,0x35,0x29,0x20,0x2d,0x20,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x63,0x68,0x61,0x72,0x57,0x65,0x69,0x67,0x68,0x74,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x2e,0x73,0x30,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x31,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x32,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x33,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x34,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x35,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x36,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x37,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x38,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x39,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x61,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x62,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x63,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x64,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x65,0x20,0x2b,0x20,0x69,0x6e,0x2e,0x73,0x66,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6b,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x69,0x6e,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x38,0x29,0x20,0x7c,0x7c,0x20,0x28,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x20,0x55,0x53,0x45,0x5f,0x4c,0x4f,0x57,0x5f,0x42,0x49,0x54,0x5f,0x57,0x45,0x49,0x47,0x48,0x54,0x5f,0x49,0x4e,0x54,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x62,0x69,0x61,0x73,0x30,0x20,0x2b,0x20,0x6d,0x61,0x64,0x28,0x6f,0x75,0x74,0x2c,0x20,0x53,0x63,0x61,0x6c,0x65,0x2c,0x20,0x73,0x75,0x6d,0x20,0x2a,0x20,0x4f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x2c,0x20,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x2c,0x20,0x30,0x2c,0x20,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x2c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x29,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x64,0x65,0x78,0x30,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x64,0x65,0x78,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x59,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2a,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x6b,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x67,0x65,0x6d,0x6d,0x5f,0x62,0x75,0x66,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x44,0x49,0x4d,0x32,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x2f,0x2f,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x38,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x2f,0x2f,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x32,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x42,0x4f,0x55,0x4e,0x44,0x52,0x59,0x5f,0x43,0x48,0x45,0x43,0x4b,0x28,0x70,0x6f,0x73,0x2e,0x78,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x2b,0x31,0x29,0x20,0x3e,0x3e,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x78,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x25,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x79,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2f,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6f,0x31,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x20,0x20,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x20,0x3c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x3b,0x20,0x2b,0x2b,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x48,0x57,0x43,0x20,0x20,0x5b,0x31,0x2c,0x20,0x31,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x5b,0x30,0x2c,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2a,0x77,0x69,0x64,0x74,0x68,0x2b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x20,0x20,0x69,0x6e,0x64,0x65,0x78,0x2b,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x31,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6b,0x20,0x2a,0x20,0x28,0x61,0x6c,0x70,0x68,0x61,0x32,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2b,0x20,0x6b,0x65,0x6e,0x65,0x72,0x6c,0x59,0x29,0x20,0x2a,0x20,0x28,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2a,0x34,0x29,0x20,0x2b,0x20,0x69,0x6e,0x64,0x65,0x78,0x29,0x2a,0x34,0x20,0x2b,0x20,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x6b,0x5f,0x76,0x31,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x6b,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x61,0x6c,0x70,0x68,0x61,0x2a,0x61,0x6c,0x70,0x68,0x61,0x2c,0x20,0x73,0x72,0x63,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x34,0x5d,0x20,0x78,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x5f,0x78,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x2c,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0x20,0x69,0x6e,0x70,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x38,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x63,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x39,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x64,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x61,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x65,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x2e,0x73,0x66,0x29,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6b,0x5f,0x76,0x31,0x36,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x6f,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x79,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x5b,0x64,0x73,0x74,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x43,0x34,0x2c,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x2c,0x20,0x34,0x2c,0x20,0x55,0x50,0x5f,0x44,0x49,0x56,0x28,0x77,0x55,0x6e,0x69,0x74,0x2a,0x68,0x55,0x6e,0x69,0x74,0x2c,0x34,0x29,0x5d,0x20,0x78,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x5b,0x70,0x6f,0x73,0x5f,0x79,0x2c,0x20,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x2c,0x20,0x20,0x30,0x2c,0x20,0x70,0x6f,0x73,0x5f,0x78,0x5d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x70,0x6f,0x73,0x5f,0x79,0x20,0x2a,0x20,0x61,0x6c,0x70,0x68,0x61,0x32,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x7a,0x29,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x70,0x6f,0x73,0x5f,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x30,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x30,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x30,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x30,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x5f,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x31,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x31,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x31,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x38,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x31,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x31,0x32,0x2a,0x77,0x69,0x64,0x74,0x68,0x29,0x3b,0xa,0x7d,0xa, } }, #endif { @@ -193,6 +199,12 @@ extern const std::map> OpenCLProgramMap #endif #endif #ifndef MNN_OPENCL_BUFFER_CLOSED +{ + "attention_buf", + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x71,0x6b,0x5f,0x64,0x69,0x76,0x5f,0x6d,0x61,0x73,0x6b,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x2f,0x2f,0x20,0x71,0x75,0x65,0x72,0x79,0x20,0x5b,0x31,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x2f,0x2f,0x20,0x6b,0x65,0x79,0x20,0x5b,0x31,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x2f,0x2f,0x20,0x70,0x72,0x65,0x66,0x69,0x6c,0x6c,0x20,0x5b,0x31,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x34,0x5d,0x20,0x20,0x20,0x64,0x65,0x63,0x6f,0x64,0x65,0x5b,0x31,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x70,0x61,0x73,0x74,0x5f,0x6b,0x65,0x79,0x2c,0x20,0x2f,0x2f,0x20,0x5b,0x31,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x2a,0x20,0x6d,0x61,0x73,0x6b,0x2c,0x20,0x2f,0x2f,0x20,0x5b,0x31,0x20,0x31,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x63,0x61,0x6c,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2f,0x20,0x34,0x20,0x66,0x6f,0x72,0x20,0x70,0x72,0x65,0x66,0x69,0x6c,0x6c,0x20,0x20,0x20,0x31,0x20,0x66,0x6f,0x72,0x20,0x64,0x65,0x63,0x6f,0x64,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2f,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x61,0x73,0x74,0x5f,0x6b,0x65,0x79,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x34,0x20,0x3d,0x20,0x7a,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x56,0x73,0x63,0x61,0x6c,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x63,0x61,0x6c,0x65,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x50,0x52,0x45,0x46,0x49,0x4c,0x4c,0x5f,0x41,0x54,0x54,0x45,0x4e,0x54,0x49,0x4f,0x4e,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x34,0x20,0x3d,0x20,0x78,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x3d,0x20,0x28,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x71,0x75,0x65,0x72,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x20,0x3d,0x20,0x28,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x48,0x45,0x41,0x44,0x44,0x49,0x4d,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x34,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x35,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x36,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x37,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x38,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x39,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x61,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x62,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x63,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x64,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x65,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x66,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x42,0x29,0x2c,0x20,0x69,0x2c,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x28,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x42,0x29,0x2c,0x20,0x69,0x2c,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x34,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x35,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x36,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x37,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x38,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x39,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x61,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x62,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x63,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x64,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x65,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x66,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x42,0x29,0x2c,0x20,0x69,0x2c,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x2a,0x3d,0x20,0x56,0x73,0x63,0x61,0x6c,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x2a,0x3d,0x20,0x56,0x73,0x63,0x61,0x6c,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x2a,0x3d,0x20,0x56,0x73,0x63,0x61,0x6c,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x2a,0x3d,0x20,0x56,0x73,0x63,0x61,0x6c,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x30,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x30,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x30,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x31,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x30,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x32,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x30,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x30,0x2e,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x31,0x2e,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x32,0x2e,0x73,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x33,0x20,0x3d,0x20,0x6d,0x61,0x73,0x6b,0x5b,0x28,0x28,0x78,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x3d,0x20,0x30,0x20,0x3f,0x20,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x20,0x3a,0x20,0x6f,0x75,0x74,0x33,0x2e,0x73,0x33,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x20,0x3e,0x3d,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x20,0x3e,0x3d,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x3d,0x20,0x28,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x20,0x3d,0x20,0x28,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x48,0x45,0x41,0x44,0x44,0x49,0x4d,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x30,0x2c,0x20,0x42,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x34,0x2c,0x20,0x42,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x38,0x2c,0x20,0x42,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x63,0x2c,0x20,0x42,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x28,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x30,0x2c,0x20,0x42,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x34,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x69,0x2c,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x30,0x2c,0x20,0x42,0x2e,0x73,0x30,0x31,0x32,0x33,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x34,0x2c,0x20,0x42,0x2e,0x73,0x34,0x35,0x36,0x37,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x38,0x2c,0x20,0x42,0x2e,0x73,0x38,0x39,0x61,0x62,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x41,0x2e,0x73,0x63,0x2c,0x20,0x42,0x2e,0x73,0x63,0x64,0x65,0x66,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x20,0x3d,0x3d,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2d,0x20,0x7a,0x20,0x2a,0x20,0x34,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x41,0x20,0x3d,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x2a,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x42,0x20,0x3d,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x2a,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x6b,0x65,0x79,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x42,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x74,0x6d,0x70,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x29,0x26,0x6f,0x75,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x70,0x74,0x72,0x5b,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x2a,0x3d,0x20,0x56,0x73,0x63,0x61,0x6c,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6b,0x65,0x79,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x7a,0x34,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x71,0x6b,0x76,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x30,0x2c,0x20,0x2f,0x2f,0x20,0x71,0x6b,0x20,0x70,0x72,0x65,0x66,0x69,0x6c,0x6c,0x20,0x5b,0x31,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x34,0x5d,0x20,0x20,0x20,0x64,0x65,0x63,0x6f,0x64,0x65,0x5b,0x31,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x2f,0x2f,0x20,0x5b,0x31,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x2f,0x2f,0x20,0x5b,0x31,0x20,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x2a,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x31,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x70,0x61,0x73,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x2f,0x2f,0x20,0x5b,0x31,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2f,0x34,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x34,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x70,0x72,0x65,0x66,0x69,0x6c,0x6c,0x20,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2f,0x20,0x34,0x20,0x20,0x20,0x64,0x65,0x63,0x6f,0x64,0x65,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0x20,0x2f,0x2f,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x79,0x2c,0x20,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x5f,0x50,0x52,0x45,0x46,0x49,0x4c,0x4c,0x5f,0x41,0x54,0x54,0x45,0x4e,0x54,0x49,0x4f,0x4e,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x7a,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x3d,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x3d,0x20,0x28,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x28,0x79,0x20,0x2a,0x20,0x71,0x6b,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2b,0x20,0x78,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x61,0x73,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x64,0x65,0x78,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x32,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x33,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x2e,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x42,0x29,0x2c,0x20,0x30,0x2c,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x42,0x29,0x2c,0x20,0x30,0x2c,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x42,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x29,0x26,0x42,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x2c,0x20,0x6a,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x3b,0x20,0x2b,0x2b,0x69,0x2c,0x20,0x2b,0x2b,0x6a,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x41,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x42,0x5f,0x70,0x74,0x72,0x5b,0x6a,0x5d,0x2c,0x20,0x6f,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x78,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x29,0x20,0x2a,0x20,0x34,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x7a,0x34,0x20,0x3d,0x20,0x7a,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x3d,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x61,0x64,0x5f,0x6e,0x75,0x6d,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x6f,0x6f,0x70,0x20,0x3d,0x20,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2b,0x20,0x32,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x30,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x34,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x70,0x61,0x73,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x68,0x65,0x61,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6c,0x6f,0x6f,0x70,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x41,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x42,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x41,0x2c,0x20,0x42,0x2e,0x73,0x30,0x31,0x32,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x41,0x2c,0x20,0x42,0x2e,0x73,0x34,0x35,0x36,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x41,0x2c,0x20,0x42,0x2e,0x73,0x38,0x39,0x61,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x41,0x2c,0x20,0x42,0x2e,0x73,0x63,0x64,0x65,0x66,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x28,0x6c,0x6f,0x6f,0x70,0x20,0x2d,0x20,0x31,0x29,0x20,0x3c,0x20,0x30,0x20,0x3f,0x20,0x30,0x20,0x3a,0x20,0x28,0x6c,0x6f,0x6f,0x70,0x20,0x2d,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x20,0x42,0x5f,0x56,0x65,0x63,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x76,0x6c,0x6f,0x61,0x64,0x31,0x36,0x28,0x30,0x2c,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x73,0x74,0x61,0x72,0x74,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x42,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x26,0x42,0x5f,0x56,0x65,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x73,0x74,0x61,0x72,0x74,0x20,0x2a,0x20,0x34,0x3b,0x20,0x69,0x20,0x3c,0x20,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x41,0x20,0x3d,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x69,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x64,0x65,0x78,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x64,0x65,0x78,0x2b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x64,0x65,0x78,0x2b,0x38,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x5f,0x70,0x74,0x72,0x5b,0x69,0x6e,0x64,0x65,0x78,0x2b,0x31,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x41,0x20,0x3d,0x20,0x41,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2d,0x20,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x42,0x30,0x20,0x3d,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x42,0x31,0x20,0x3d,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x42,0x32,0x20,0x3d,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x38,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x42,0x33,0x20,0x3d,0x20,0x42,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x31,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x20,0x2b,0x3d,0x20,0x41,0x20,0x2a,0x20,0x42,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x64,0x65,0x78,0x20,0x3d,0x20,0x28,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2d,0x20,0x31,0x29,0x20,0x3e,0x3e,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x28,0x76,0x61,0x6c,0x75,0x65,0x5f,0x73,0x65,0x71,0x5f,0x6c,0x65,0x6e,0x20,0x2d,0x20,0x31,0x29,0x20,0x25,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x48,0x45,0x41,0x44,0x44,0x49,0x4d,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x42,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x34,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x42,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x34,0x20,0x2b,0x20,0x32,0x20,0x3e,0x3d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x38,0x5d,0x20,0x3d,0x20,0x42,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x7a,0x34,0x20,0x2b,0x20,0x33,0x20,0x3e,0x3d,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x32,0x5d,0x20,0x3d,0x20,0x42,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x5d,0x20,0x3d,0x20,0x42,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x42,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x38,0x5d,0x20,0x3d,0x20,0x42,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x50,0x61,0x73,0x74,0x76,0x61,0x6c,0x75,0x65,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5b,0x69,0x6e,0x64,0x65,0x78,0x20,0x2b,0x20,0x31,0x32,0x5d,0x20,0x3d,0x20,0x42,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2b,0x20,0x32,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x28,0x79,0x20,0x2a,0x20,0x68,0x65,0x61,0x64,0x5f,0x64,0x69,0x6d,0x20,0x2b,0x20,0x7a,0x34,0x20,0x2b,0x20,0x33,0x29,0x20,0x2a,0x20,0x34,0x5d,0x20,0x3d,0x20,0x6f,0x75,0x74,0x2e,0x73,0x33,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa, } + }, +#endif +#ifndef MNN_OPENCL_BUFFER_CLOSED #ifdef MNN_SUPPORT_INTEL_SUBGROUP { "unary_subgroup_buf", @@ -215,13 +227,13 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "scale_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x29,0x20,0x7b,0x2f,0x2f,0x4e,0x2c,0x20,0x48,0x2c,0x20,0x57,0x2c,0x20,0x43,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x20,0x20,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x63,0x61,0x6c,0x65,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2b,0x20,0x62,0x69,0x61,0x73,0x5f,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x29,0x20,0x7b,0x2f,0x2f,0x4e,0x2c,0x20,0x48,0x2c,0x20,0x57,0x2c,0x20,0x43,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x20,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x63,0x61,0x6c,0x65,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x69,0x61,0x73,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2b,0x20,0x62,0x69,0x61,0x73,0x5f,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x73,0x63,0x61,0x6c,0x65,0x5f,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa, } }, #endif #ifndef MNN_OPENCL_BUFFER_CLOSED { "matmul_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x57,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x48,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x31,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x32,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x65,0x6d,0x70,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x2a,0x34,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x30,0x2c,0x20,0x62,0x31,0x2e,0x73,0x30,0x2c,0x20,0x62,0x32,0x2e,0x73,0x30,0x2c,0x20,0x62,0x33,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x31,0x2c,0x20,0x62,0x31,0x2e,0x73,0x31,0x2c,0x20,0x62,0x32,0x2e,0x73,0x31,0x2c,0x20,0x62,0x33,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x32,0x2c,0x20,0x62,0x31,0x2e,0x73,0x32,0x2c,0x20,0x62,0x32,0x2e,0x73,0x32,0x2c,0x20,0x62,0x33,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x33,0x2c,0x20,0x62,0x31,0x2e,0x73,0x33,0x2c,0x20,0x62,0x32,0x2e,0x73,0x33,0x2c,0x20,0x62,0x33,0x2e,0x73,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x29,0x2a,0x34,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x30,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x30,0x2c,0x20,0x62,0x31,0x2e,0x73,0x30,0x2c,0x20,0x62,0x32,0x2e,0x73,0x30,0x2c,0x20,0x62,0x33,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x31,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x31,0x2c,0x20,0x62,0x31,0x2e,0x73,0x31,0x2c,0x20,0x62,0x32,0x2e,0x73,0x31,0x2c,0x20,0x62,0x33,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x32,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x32,0x2c,0x20,0x62,0x31,0x2e,0x73,0x32,0x2c,0x20,0x62,0x32,0x2e,0x73,0x32,0x2c,0x20,0x62,0x33,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x33,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x33,0x2c,0x20,0x62,0x31,0x2e,0x73,0x33,0x2c,0x20,0x62,0x32,0x2e,0x73,0x33,0x2c,0x20,0x62,0x33,0x2e,0x73,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x74,0x72,0x61,0x6e,0x73,0x42,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x31,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x32,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x65,0x6d,0x70,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x34,0x20,0x2d,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2a,0x34,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2a,0x34,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x74,0x72,0x61,0x6e,0x73,0x41,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x70,0x6f,0x73,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x70,0x6f,0x73,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x78,0x2c,0x20,0x62,0x31,0x2e,0x78,0x2c,0x20,0x62,0x32,0x2e,0x78,0x2c,0x20,0x62,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x79,0x2c,0x20,0x62,0x31,0x2e,0x79,0x2c,0x20,0x62,0x32,0x2e,0x79,0x2c,0x20,0x62,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x7a,0x2c,0x20,0x62,0x31,0x2e,0x7a,0x2c,0x20,0x62,0x32,0x2e,0x7a,0x2c,0x20,0x62,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x77,0x2c,0x20,0x62,0x31,0x2e,0x77,0x2c,0x20,0x62,0x32,0x2e,0x77,0x2c,0x20,0x62,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x78,0x2c,0x20,0x62,0x31,0x2e,0x78,0x2c,0x20,0x62,0x32,0x2e,0x78,0x2c,0x20,0x62,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x79,0x2c,0x20,0x62,0x31,0x2e,0x79,0x2c,0x20,0x62,0x32,0x2e,0x79,0x2c,0x20,0x62,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x7a,0x2c,0x20,0x62,0x31,0x2e,0x7a,0x2c,0x20,0x62,0x32,0x2e,0x7a,0x2c,0x20,0x62,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x77,0x2c,0x20,0x62,0x31,0x2e,0x77,0x2c,0x20,0x62,0x32,0x2e,0x77,0x2c,0x20,0x62,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x74,0x72,0x61,0x6e,0x73,0x41,0x5f,0x74,0x72,0x61,0x6e,0x73,0x42,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x20,0x2d,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x70,0x6f,0x73,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2d,0x31,0x29,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2d,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x57,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x2f,0x2f,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x48,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x31,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x32,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x65,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x70,0x6f,0x73,0x2a,0x34,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x30,0x2c,0x20,0x62,0x31,0x2e,0x73,0x30,0x2c,0x20,0x62,0x32,0x2e,0x73,0x30,0x2c,0x20,0x62,0x33,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x31,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x31,0x2c,0x20,0x62,0x31,0x2e,0x73,0x31,0x2c,0x20,0x62,0x32,0x2e,0x73,0x31,0x2c,0x20,0x62,0x33,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x32,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x32,0x2c,0x20,0x62,0x31,0x2e,0x73,0x32,0x2c,0x20,0x62,0x32,0x2e,0x73,0x32,0x2c,0x20,0x62,0x33,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x33,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x33,0x2c,0x20,0x62,0x31,0x2e,0x73,0x33,0x2c,0x20,0x62,0x32,0x2e,0x73,0x33,0x2c,0x20,0x62,0x33,0x2e,0x73,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x29,0x2a,0x34,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x30,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x30,0x2c,0x20,0x62,0x31,0x2e,0x73,0x30,0x2c,0x20,0x62,0x32,0x2e,0x73,0x30,0x2c,0x20,0x62,0x33,0x2e,0x73,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x31,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x31,0x2c,0x20,0x62,0x31,0x2e,0x73,0x31,0x2c,0x20,0x62,0x32,0x2e,0x73,0x31,0x2c,0x20,0x62,0x33,0x2e,0x73,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x32,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x32,0x2c,0x20,0x62,0x31,0x2e,0x73,0x32,0x2c,0x20,0x62,0x32,0x2e,0x73,0x32,0x2c,0x20,0x62,0x33,0x2e,0x73,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x74,0x6d,0x70,0x33,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x73,0x33,0x2c,0x20,0x62,0x31,0x2e,0x73,0x33,0x2c,0x20,0x62,0x32,0x2e,0x73,0x33,0x2c,0x20,0x62,0x33,0x2e,0x73,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x74,0x6d,0x70,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x29,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x74,0x72,0x61,0x6e,0x73,0x42,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x31,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x32,0x20,0x3d,0x20,0x30,0x2c,0x20,0x62,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x65,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x74,0x65,0x6d,0x70,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x31,0x29,0x2a,0x34,0x20,0x2d,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2a,0x34,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2a,0x34,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x79,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x7a,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x2e,0x77,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2c,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x29,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x74,0x72,0x61,0x6e,0x73,0x41,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x70,0x6f,0x73,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x70,0x6f,0x73,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x78,0x2c,0x20,0x62,0x31,0x2e,0x78,0x2c,0x20,0x62,0x32,0x2e,0x78,0x2c,0x20,0x62,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x79,0x2c,0x20,0x62,0x31,0x2e,0x79,0x2c,0x20,0x62,0x32,0x2e,0x79,0x2c,0x20,0x62,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x7a,0x2c,0x20,0x62,0x31,0x2e,0x7a,0x2c,0x20,0x62,0x32,0x2e,0x7a,0x2c,0x20,0x62,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x77,0x2c,0x20,0x62,0x31,0x2e,0x77,0x2c,0x20,0x62,0x32,0x2e,0x77,0x2c,0x20,0x62,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x29,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x78,0x2c,0x20,0x62,0x31,0x2e,0x78,0x2c,0x20,0x62,0x32,0x2e,0x78,0x2c,0x20,0x62,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x79,0x2c,0x20,0x62,0x31,0x2e,0x79,0x2c,0x20,0x62,0x32,0x2e,0x79,0x2c,0x20,0x62,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x7a,0x2c,0x20,0x62,0x31,0x2e,0x7a,0x2c,0x20,0x62,0x32,0x2e,0x7a,0x2c,0x20,0x62,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x62,0x30,0x2e,0x77,0x2c,0x20,0x62,0x31,0x2e,0x77,0x2c,0x20,0x62,0x32,0x2e,0x77,0x2c,0x20,0x62,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x74,0x6d,0x75,0x6c,0x5f,0x74,0x72,0x61,0x6e,0x73,0x41,0x5f,0x74,0x72,0x61,0x6e,0x73,0x42,0x5f,0x62,0x75,0x66,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x30,0x2e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x49,0x41,0x53,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x63,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x34,0x20,0x2d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3d,0x20,0x28,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x20,0x2d,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x73,0x68,0x6f,0x72,0x74,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x30,0x3b,0x20,0x70,0x6f,0x73,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2d,0x20,0x31,0x3b,0x20,0x70,0x6f,0x73,0x20,0x2b,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x70,0x6f,0x73,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x70,0x6f,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2d,0x31,0x29,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x61,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x61,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x61,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2d,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x31,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x33,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x32,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x62,0x33,0x20,0x3d,0x20,0x28,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x62,0x20,0x3e,0x3d,0x20,0x31,0x29,0x20,0x3f,0x20,0x76,0x5f,0x7a,0x65,0x72,0x6f,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x70,0x62,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x29,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x78,0x2c,0x20,0x61,0x31,0x2e,0x78,0x2c,0x20,0x61,0x32,0x2e,0x78,0x2c,0x20,0x61,0x33,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x79,0x2c,0x20,0x61,0x31,0x2e,0x79,0x2c,0x20,0x61,0x32,0x2e,0x79,0x2c,0x20,0x61,0x33,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x7a,0x2c,0x20,0x61,0x31,0x2e,0x7a,0x2c,0x20,0x61,0x32,0x2e,0x7a,0x2c,0x20,0x61,0x33,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x61,0x30,0x2e,0x77,0x2c,0x20,0x61,0x31,0x2e,0x77,0x2c,0x20,0x61,0x32,0x2e,0x77,0x2c,0x20,0x61,0x33,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x6d,0x61,0x74,0x6d,0x75,0x6c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x30,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x31,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x32,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x61,0x33,0x5f,0x74,0x72,0x61,0x6e,0x73,0x2c,0x20,0x62,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x30,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x32,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x32,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x34,0x2a,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x5f,0x69,0x64,0x78,0x2b,0x33,0x20,0x3e,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x72,0x65,0x73,0x75,0x6c,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2a,0x33,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x29,0x3b,0xa,0x7d,0xa, } }, #endif { @@ -231,7 +243,7 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "conv_2d_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x52,0x45,0x41,0x44,0x5f,0x49,0x4e,0x50,0x55,0x54,0x5f,0x49,0x4d,0x41,0x47,0x45,0x28,0x69,0x2c,0x20,0x62,0x61,0x73,0x65,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x23,0x23,0x69,0x20,0x2b,0x20,0x62,0x61,0x73,0x65,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x69,0x6e,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x2c,0x20,0x2d,0x31,0x2c,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x29,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x20,0x25,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x23,0x23,0x69,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x23,0x23,0x69,0x29,0x3d,0x3d,0x2d,0x31,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x43,0x41,0x4c,0x43,0x55,0x4c,0x41,0x54,0x45,0x5f,0x4f,0x55,0x54,0x50,0x55,0x54,0x28,0x69,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x23,0x23,0x69,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x6f,0x75,0x74,0x23,0x23,0x69,0x29,0x3b,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x20,0x2f,0x2f,0x20,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x20,0x2f,0x2f,0x20,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x20,0x2f,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x28,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x29,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x20,0x3d,0x20,0x28,0x69,0x78,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2f,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x2f,0x2f,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x27,0x73,0x20,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x32,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x5b,0x69,0x63,0x2f,0x34,0x2c,0x20,0x6f,0x63,0x2c,0x20,0x34,0x5d,0x2c,0x20,0x6c,0x6f,0x6f,0x70,0x3a,0x20,0x69,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x28,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x20,0x2f,0x2f,0x20,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x20,0x2f,0x2f,0x20,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x70,0x5f,0x61,0x64,0x64,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x33,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x34,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x38,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0x20,0x2f,0x2f,0x20,0x6f,0x63,0x20,0x2f,0x20,0x34,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x38,0x20,0x77,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x3c,0x3c,0x31,0x29,0x2b,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x38,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x34,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x35,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x36,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x37,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x34,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x35,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x36,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x37,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x20,0x3d,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x34,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x2a,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x32,0x2b,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x5f,0x74,0x65,0x6d,0x70,0x6f,0x75,0x74,0x70,0x75,0x74,0x31,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x31,0x78,0x31,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x29,0x20,0x7b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x3b,0x20,0x2b,0x2b,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x62,0x61,0x73,0x65,0x20,0x20,0x3d,0x20,0x6d,0x75,0x6c,0x32,0x34,0x28,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2c,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x69,0x6e,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x5f,0x69,0x64,0x78,0x30,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x31,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x32,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x33,0x2c,0x20,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x5f,0x70,0x74,0x72,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x30,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x79,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x31,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x7a,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x32,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x2e,0x77,0x20,0x2b,0x3d,0x20,0x64,0x6f,0x74,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x33,0x2c,0x20,0x69,0x6e,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x78,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x78,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x20,0x3d,0x20,0x28,0x69,0x78,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2f,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x77,0x5f,0x69,0x6e,0x63,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x32,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0x2f,0x2f,0x67,0x65,0x6e,0x65,0x72,0x61,0x74,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x27,0x73,0x20,0x6e,0x75,0x6d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x31,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x34,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x34,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x32,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x33,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x35,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x37,0x29,0x2c,0x20,0x33,0x20,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x32,0x77,0x31,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x32,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x2f,0x2f,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x3a,0x20,0x5b,0x69,0x63,0x2f,0x34,0x2c,0x20,0x6f,0x63,0x2c,0x20,0x34,0x5d,0x2c,0x20,0x6c,0x6f,0x6f,0x70,0x3a,0x20,0x69,0x63,0x2f,0x34,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x20,0x69,0x79,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x69,0x79,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x77,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x66,0x77,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x30,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x5f,0x73,0x69,0x7a,0x65,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x68,0x31,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x66,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x31,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x33,0x29,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0xa,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x63,0x38,0x68,0x31,0x77,0x34,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x32,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x77,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x69,0x61,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x43,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x64,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x32,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0x20,0x2f,0x2f,0x63,0x2f,0x34,0x20,0x77,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0x20,0x2f,0x2f,0x62,0x20,0x68,0xa,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x32,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x77,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x2f,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0x2f,0x2f,0x65,0x71,0x75,0x61,0x6c,0x20,0x74,0x6f,0x20,0x69,0x6e,0x5f,0x62,0x5f,0x69,0x64,0x78,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x68,0x5f,0x69,0x64,0x78,0x20,0x25,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6f,0x75,0x74,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x2c,0x20,0x62,0x69,0x61,0x73,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6f,0x75,0x74,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x79,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x2c,0x20,0x73,0x74,0x72,0x69,0x64,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x2d,0x70,0x61,0x64,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x73,0x65,0x6c,0x65,0x63,0x74,0x28,0x30,0x2c,0x20,0x28,0x2d,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x2b,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2d,0x20,0x31,0x29,0x20,0x2f,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x20,0x3c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x32,0x34,0x28,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x20,0x3d,0x20,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x64,0x32,0x34,0x28,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x29,0x2c,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x75,0x73,0x68,0x6f,0x72,0x74,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x3b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x20,0x20,0x4e,0x43,0x34,0x48,0x57,0x34,0x20,0x20,0x5b,0x31,0x2c,0x20,0x20,0x34,0x2a,0x69,0x63,0x43,0x34,0x2c,0x20,0x20,0x6f,0x63,0x43,0x34,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x2c,0x20,0x20,0x31,0x5d,0x20,0x78,0x69,0x63,0x34,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2f,0x69,0x6e,0x64,0x65,0x78,0x3a,0x20,0x20,0x20,0x5b,0x30,0x2c,0x20,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2c,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2a,0x6b,0x68,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x2a,0x6b,0x77,0x20,0x2b,0x20,0x6b,0x77,0x5f,0x73,0x74,0x61,0x72,0x74,0x2c,0x20,0x30,0x5d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x28,0x34,0x2a,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x2b,0x30,0x29,0x2a,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6b,0x68,0x5f,0x73,0x74,0x61,0x72,0x74,0x29,0x2a,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x79,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x73,0x74,0x61,0x72,0x74,0x3b,0x20,0x69,0x79,0x20,0x3c,0x20,0x69,0x6e,0x5f,0x68,0x5f,0x69,0x64,0x78,0x5f,0x65,0x6e,0x64,0x3b,0x20,0x69,0x79,0x20,0x2b,0x3d,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x78,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x69,0x79,0x29,0x20,0x2a,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x30,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x66,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x66,0x77,0x20,0x3c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x68,0x77,0x2e,0x79,0x3b,0x20,0x66,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x66,0x77,0x20,0x2a,0x20,0x64,0x69,0x6c,0x61,0x74,0x65,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x5f,0x62,0x61,0x73,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x30,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x30,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x31,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x32,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x32,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x33,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x5f,0x68,0x77,0x2e,0x79,0x29,0x20,0x3f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x20,0x3a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x5f,0x77,0x33,0x5f,0x69,0x64,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x69,0x6e,0x70,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x5f,0x62,0x61,0x73,0x65,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x30,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2b,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x63,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2a,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x30,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x31,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x32,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x78,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x79,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x7a,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x69,0x6e,0x33,0x2e,0x77,0x2c,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x33,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x30,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x31,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x31,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x32,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x32,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x33,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x33,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x34,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x35,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x35,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x36,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x36,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x37,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x6f,0x75,0x74,0x37,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x42,0x4c,0x4f,0x43,0x4b,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2d,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x32,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x30,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x3d,0x20,0x34,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x33,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x36,0x29,0x2c,0x20,0x32,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x38,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x3d,0x20,0x31,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x34,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x30,0x2c,0x20,0x6f,0x75,0x74,0x31,0x2c,0x20,0x6f,0x75,0x74,0x32,0x2c,0x20,0x6f,0x75,0x74,0x33,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x5f,0x4c,0x45,0x41,0x56,0x45,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x6f,0x75,0x74,0x5f,0x62,0x5f,0x69,0x64,0x78,0x2a,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x63,0x5f,0x69,0x64,0x78,0x20,0x2b,0x20,0x31,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x68,0x5f,0x69,0x64,0x78,0x29,0x2a,0x6f,0x75,0x74,0x5f,0x68,0x77,0x2e,0x79,0x20,0x2b,0x20,0x6f,0x75,0x74,0x5f,0x77,0x5f,0x69,0x64,0x78,0x29,0x2a,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x31,0x36,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x28,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x31,0x36,0x29,0x28,0x6f,0x75,0x74,0x34,0x2c,0x20,0x6f,0x75,0x74,0x35,0x2c,0x20,0x6f,0x75,0x74,0x36,0x2c,0x20,0x6f,0x75,0x74,0x37,0x29,0x29,0x2c,0x20,0x30,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif { @@ -245,13 +257,13 @@ extern const std::map> OpenCLProgramMap #ifndef MNN_OPENCL_BUFFER_CLOSED { "layernorm_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x77,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x63,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x4d,0x53,0x4e,0x4f,0x52,0x4d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x67,0x61,0x6d,0x6d,0x61,0x5b,0x69,0x5d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x62,0x65,0x74,0x61,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x68,0x77,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x63,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x4d,0x53,0x4e,0x4f,0x52,0x4d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x67,0x61,0x6d,0x6d,0x61,0x5b,0x69,0x5d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x62,0x65,0x74,0x61,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x75,0x6d,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x28,0x26,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x4d,0x53,0x4e,0x4f,0x52,0x4d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x63,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x30,0x5d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x75,0x6d,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x63,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x30,0x5d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x75,0x6d,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x63,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x67,0x61,0x6d,0x6d,0x61,0x5b,0x63,0x20,0x2a,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x5d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x62,0x65,0x74,0x61,0x5b,0x63,0x20,0x2a,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x77,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x25,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x2f,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x63,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2b,0x20,0x68,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x4d,0x53,0x4e,0x4f,0x52,0x4d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x67,0x61,0x6d,0x6d,0x61,0x5b,0x69,0x5d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x62,0x65,0x74,0x61,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x68,0x77,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2b,0x20,0x63,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x4d,0x53,0x4e,0x4f,0x52,0x4d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x67,0x61,0x6d,0x6d,0x61,0x5b,0x69,0x5d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x62,0x65,0x74,0x61,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x63,0x68,0x77,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x75,0x6d,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x20,0x3d,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x3d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2d,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x62,0x20,0x2a,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x29,0x20,0x2a,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x20,0x2a,0x20,0x77,0x69,0x64,0x74,0x68,0x20,0x2a,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x2a,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x2a,0x29,0x28,0x26,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x4d,0x53,0x4e,0x4f,0x52,0x4d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x30,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x63,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x30,0x5d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x75,0x6d,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x63,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x28,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x30,0x5d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x5f,0x70,0x74,0x72,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x75,0x6d,0x5f,0x73,0x69,0x7a,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x30,0x3b,0x20,0x63,0x20,0x3c,0x20,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x34,0x3b,0x20,0x2b,0x2b,0x63,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x67,0x61,0x6d,0x6d,0x61,0x5b,0x63,0x20,0x2a,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x5d,0x20,0x2b,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x29,0x62,0x65,0x74,0x61,0x5b,0x63,0x20,0x2a,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x5f,0x73,0x69,0x7a,0x65,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x63,0x20,0x2a,0x20,0x77,0x68,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x6c,0x61,0x79,0x65,0x72,0x6e,0x6f,0x72,0x6d,0x5f,0x70,0x6c,0x61,0x69,0x6e,0x5f,0x62,0x75,0x66,0x28,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x73,0x69,0x64,0x65,0x2c,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x67,0x61,0x6d,0x6d,0x61,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x62,0x65,0x74,0x61,0x2c,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x33,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x33,0x29,0x28,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x30,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x79,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x31,0x20,0x26,0x26,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x3c,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x5f,0x6f,0x75,0x74,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x69,0x64,0x78,0x5f,0x6f,0x75,0x74,0x20,0x2a,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x3d,0x20,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x20,0x2b,0x20,0x33,0x29,0x20,0x3e,0x3e,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3d,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x20,0x2d,0x20,0x28,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x2d,0x31,0x29,0x20,0x3c,0x3c,0x20,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x69,0x6e,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6c,0x69,0x64,0x20,0x3d,0x3d,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x2d,0x20,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x65,0x61,0x6e,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x73,0x69,0x64,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x6c,0x69,0x64,0x20,0x3d,0x3d,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x2d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x20,0x2d,0x20,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x28,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x28,0x69,0x6e,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x79,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x72,0x65,0x6d,0x61,0x69,0x6e,0x20,0x3e,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x69,0x6e,0x5f,0x73,0x75,0x6d,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x20,0x2f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x69,0x6e,0x73,0x69,0x64,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x31,0x2e,0x30,0x66,0x20,0x2f,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x73,0x71,0x72,0x74,0x28,0x73,0x71,0x75,0x61,0x72,0x65,0x5f,0x73,0x75,0x6d,0x20,0x2b,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2f,0x2a,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x72,0x69,0x6e,0x74,0x66,0x28,0x22,0x6c,0x6e,0x3a,0x20,0x25,0x64,0x2c,0x20,0x6d,0x65,0x61,0x6e,0x3a,0x25,0x66,0x20,0x20,0x73,0x71,0x75,0x61,0x72,0x65,0x3a,0x25,0x66,0x2c,0x20,0x20,0x76,0x61,0x6c,0x75,0x65,0x3a,0x25,0x66,0x5c,0x6e,0x22,0x2c,0x20,0x70,0x6f,0x73,0x2e,0x7a,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x6d,0x65,0x61,0x6e,0x2e,0x78,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x2c,0x20,0x28,0x66,0x6c,0x6f,0x61,0x74,0x29,0x76,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x69,0x6e,0x73,0x69,0x64,0x65,0x5f,0x76,0x34,0x3b,0x20,0x69,0x2b,0x3d,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x47,0x41,0x4d,0x4d,0x41,0x5f,0x42,0x45,0x54,0x41,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x2a,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x67,0x61,0x6d,0x6d,0x61,0x29,0x29,0x20,0x2b,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x62,0x65,0x74,0x61,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x28,0x69,0x6e,0x20,0x2d,0x20,0x6d,0x65,0x61,0x6e,0x29,0x20,0x2a,0x20,0x76,0x61,0x6c,0x75,0x65,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x6f,0x75,0x74,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x20,0x2b,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x7d,0xa, } }, #endif #ifndef MNN_OPENCL_BUFFER_CLOSED { "softmax_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x45,0x58,0x50,0x20,0x65,0x78,0x70,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x29,0x20,0x7b,0x2f,0x2f,0x4e,0x43,0x48,0x57,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x63,0x2c,0x20,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x77,0x63,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x77,0x63,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x63,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x30,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x45,0x58,0x50,0x20,0x65,0x78,0x70,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x2c,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x2c,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x31,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x32,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x31,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x33,0x20,0x3e,0x3d,0x20,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x5f,0x64,0x69,0x6d,0x32,0x29,0x20,0x7b,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x3b,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5c,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x29,0x20,0x7b,0x2f,0x2f,0x4e,0x43,0x48,0x57,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x61,0x74,0x63,0x68,0x5f,0x69,0x64,0x78,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x65,0x69,0x67,0x68,0x74,0x5f,0x69,0x64,0x78,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x6c,0x69,0x64,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x28,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x29,0x20,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x20,0x2d,0x20,0x31,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x79,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x7a,0x20,0x2b,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x20,0x2d,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x77,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x31,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x7a,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x32,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x79,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x69,0x66,0x20,0x28,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x20,0x3d,0x3d,0x20,0x33,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x64,0x61,0x74,0x61,0x2e,0x78,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x2e,0x78,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x77,0x63,0x2c,0x20,0x62,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x77,0x63,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x77,0x20,0x3d,0x20,0x77,0x63,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x30,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x77,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x69,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x73,0x6f,0x66,0x74,0x6d,0x61,0x78,0x5f,0x77,0x69,0x64,0x74,0x68,0x28,0x47,0x4c,0x4f,0x42,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5f,0x33,0x5f,0x44,0x49,0x4d,0x53,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x2a,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x72,0x65,0x6d,0x61,0x69,0x6e,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x34,0x20,0x73,0x68,0x61,0x70,0x65,0x20,0x2f,0x2f,0x20,0x4e,0x43,0x48,0x57,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x63,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x68,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x44,0x45,0x41,0x4c,0x5f,0x4e,0x4f,0x4e,0x5f,0x55,0x4e,0x49,0x46,0x4f,0x52,0x4d,0x5f,0x44,0x49,0x4d,0x33,0x28,0x78,0x2c,0x20,0x63,0x2c,0x20,0x62,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x62,0x68,0x20,0x2f,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x68,0x20,0x3d,0x20,0x62,0x68,0x20,0x25,0x20,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x28,0x28,0x28,0x62,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x79,0x2b,0x63,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x7a,0x2b,0x68,0x29,0x2a,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x2b,0x30,0x29,0x2a,0x34,0x3b,0xa,0x23,0x69,0x66,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x20,0x3e,0x3d,0x20,0x34,0xa,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x73,0x75,0x6d,0x5b,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x2c,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x2f,0x32,0x3b,0x20,0x69,0x20,0x3e,0x20,0x30,0x3b,0x20,0x69,0x20,0x2f,0x3d,0x20,0x32,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x6c,0x69,0x64,0x20,0x3c,0x20,0x69,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x5d,0x20,0x2b,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x20,0x2b,0x20,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x6c,0x69,0x64,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x3d,0x53,0x4f,0x46,0x54,0x4d,0x41,0x58,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x53,0x49,0x5a,0x45,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x4d,0x61,0x78,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x2d,0x46,0x4c,0x54,0x5f,0x4d,0x41,0x58,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x45,0x78,0x70,0x20,0x53,0x75,0x6d,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x20,0x2b,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x2f,0x2a,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x20,0x52,0x65,0x73,0x75,0x6c,0x74,0x20,0x2a,0x2f,0xa,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x3d,0x30,0x3b,0x20,0x69,0x3c,0x73,0x68,0x61,0x70,0x65,0x2e,0x77,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x3d,0x20,0x65,0x78,0x70,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x6c,0x6f,0x61,0x64,0x34,0x28,0x69,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x20,0x2d,0x20,0x6d,0x61,0x78,0x56,0x61,0x6c,0x75,0x65,0x29,0x20,0x2f,0x20,0x73,0x75,0x6d,0x56,0x61,0x6c,0x75,0x65,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x73,0x74,0x6f,0x72,0x65,0x34,0x28,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x76,0x61,0x6c,0x75,0x65,0x29,0x2c,0x20,0x69,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2b,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif #ifndef MNN_OPENCL_BUFFER_CLOSED @@ -264,7 +276,7 @@ extern const std::map> OpenCLProgramMap #ifdef MNN_SUPPORT_INTEL_SUBGROUP { "conv_2d_c16_subgroup_buf", - { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x32,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } + { 0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x6b,0x68,0x72,0x5f,0x66,0x70,0x31,0x36,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x23,0x70,0x72,0x61,0x67,0x6d,0x61,0x20,0x4f,0x50,0x45,0x4e,0x43,0x4c,0x20,0x45,0x58,0x54,0x45,0x4e,0x53,0x49,0x4f,0x4e,0x20,0x63,0x6c,0x5f,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x73,0x20,0x3a,0x20,0x65,0x6e,0x61,0x62,0x6c,0x65,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x4d,0x4e,0x4e,0x5f,0x53,0x55,0x50,0x50,0x4f,0x52,0x54,0x5f,0x46,0x50,0x31,0x36,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x5f,0x75,0x73,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x73,0x68,0x6f,0x72,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x32,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x34,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x68,0x61,0x6c,0x66,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x61,0x73,0x5f,0x75,0x73,0x68,0x6f,0x72,0x74,0x38,0x28,0x64,0x61,0x74,0x61,0x29,0x2c,0x20,0x69,0x64,0x29,0x29,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x61,0x73,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x38,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x72,0x65,0x61,0x64,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x32,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x32,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x34,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x34,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x70,0x74,0x72,0x2c,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x76,0x61,0x6c,0x29,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x77,0x72,0x69,0x74,0x65,0x38,0x28,0x28,0x63,0x6f,0x6e,0x73,0x74,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x75,0x69,0x6e,0x74,0x2a,0x29,0x28,0x70,0x74,0x72,0x29,0x20,0x2b,0x20,0x28,0x6f,0x66,0x66,0x73,0x65,0x74,0x29,0x2c,0x20,0x61,0x73,0x5f,0x75,0x69,0x6e,0x74,0x38,0x28,0x76,0x61,0x6c,0x29,0x29,0xa,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0x28,0x64,0x61,0x74,0x61,0x2c,0x20,0x69,0x64,0x29,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x34,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x33,0x29,0x20,0x2f,0x20,0x34,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3c,0x3c,0x20,0x32,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x25,0x20,0x34,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x3d,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x2f,0x20,0x34,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x34,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x6c,0x69,0x64,0x5f,0x78,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x62,0x32,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x31,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x32,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x32,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x32,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x32,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x32,0x28,0x64,0x73,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x32,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x62,0x34,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x32,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x34,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x34,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x34,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x64,0x73,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x34,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa,0xa,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x69,0x6e,0x74,0x65,0x6c,0x5f,0x72,0x65,0x71,0x64,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x36,0x29,0x29,0x29,0xa,0x5f,0x5f,0x6b,0x65,0x72,0x6e,0x65,0x6c,0x20,0x76,0x6f,0x69,0x64,0x20,0x63,0x6f,0x6e,0x76,0x5f,0x32,0x64,0x5f,0x62,0x75,0x66,0x5f,0x73,0x75,0x62,0x67,0x72,0x6f,0x75,0x70,0x5f,0x63,0x31,0x36,0x5f,0x63,0x31,0x36,0x5f,0x62,0x38,0x28,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x20,0x46,0x4c,0x4f,0x41,0x54,0x2a,0x20,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x2c,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x2c,0x20,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0xa,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x73,0x75,0x62,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x62,0x20,0x3d,0x20,0x28,0x75,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x32,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x79,0x20,0x3d,0x20,0x67,0x65,0x74,0x5f,0x67,0x6c,0x6f,0x62,0x61,0x6c,0x5f,0x69,0x64,0x28,0x30,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x78,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x25,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x20,0x3c,0x3c,0x20,0x33,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x79,0x20,0x3d,0x20,0x28,0x78,0x79,0x20,0x2f,0x20,0x78,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x73,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x6c,0x69,0x64,0x31,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x5f,0x73,0x69,0x7a,0x65,0x28,0x31,0x29,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x6c,0x69,0x64,0x31,0x20,0x2f,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x20,0x28,0x69,0x6e,0x74,0x29,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x70,0x5f,0x69,0x64,0x28,0x31,0x29,0x3b,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x3d,0x20,0x78,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x77,0x69,0x64,0x74,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x3d,0x20,0x79,0x20,0x2a,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2d,0x20,0x70,0x61,0x64,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x20,0x2b,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x20,0x28,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x78,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x31,0x36,0x20,0x2a,0x20,0x31,0x36,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x3d,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2a,0x20,0x28,0x28,0x49,0x4e,0x50,0x55,0x54,0x5f,0x43,0x48,0x41,0x4e,0x4e,0x45,0x4c,0x20,0x2b,0x20,0x31,0x35,0x29,0x20,0x2f,0x20,0x31,0x36,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x75,0x69,0x6e,0x74,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x64,0x73,0x74,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x62,0x69,0x61,0x73,0x65,0x73,0x2c,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x31,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0x20,0x65,0x6c,0x73,0x65,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x5f,0x5f,0x6c,0x6f,0x63,0x61,0x6c,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x75,0x6d,0x5b,0x57,0x4f,0x52,0x4b,0x5f,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2b,0x20,0x31,0x29,0x20,0x2a,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x20,0x2f,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x63,0x62,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x63,0x62,0x20,0x3c,0x20,0x49,0x43,0x5f,0x42,0x4c,0x4f,0x43,0x4b,0x53,0x3b,0x20,0x69,0x63,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x68,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x68,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x3b,0x20,0x6b,0x68,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3c,0x20,0x30,0x20,0x7c,0x7c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x20,0x2b,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x3e,0x3d,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x68,0x65,0x69,0x67,0x68,0x74,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x5d,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x78,0x62,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x38,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x34,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x34,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x35,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x35,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x36,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x36,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x37,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x37,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x2b,0x20,0x34,0x20,0x3c,0x3d,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x20,0x2b,0x3d,0x20,0x34,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x20,0x74,0x6d,0x70,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x34,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x34,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x30,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x30,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x31,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x31,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x32,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x32,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x20,0x2b,0x20,0x33,0x5d,0x20,0x3d,0x20,0x74,0x6d,0x70,0x5b,0x33,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x3b,0x20,0x78,0x62,0x20,0x3c,0x20,0x49,0x4e,0x50,0x55,0x54,0x5f,0x4c,0x49,0x4e,0x45,0x5f,0x53,0x49,0x5a,0x45,0x3b,0x20,0x78,0x62,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x78,0x62,0x5d,0x20,0x3d,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x29,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x28,0x69,0x6e,0x70,0x75,0x74,0x2c,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x48,0x45,0x49,0x47,0x48,0x54,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x78,0x62,0x20,0x2a,0x20,0x69,0x6e,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x6b,0x77,0x20,0x3d,0x20,0x30,0x3b,0x20,0x6b,0x77,0x20,0x3c,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x3b,0x20,0x6b,0x77,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x28,0x38,0x29,0x29,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x23,0x69,0x66,0x20,0x46,0x49,0x4c,0x54,0x45,0x52,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0x20,0x26,0x26,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x3d,0x3d,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x5b,0x69,0x5d,0x20,0x3d,0x20,0x6c,0x69,0x6e,0x65,0x5f,0x63,0x61,0x63,0x68,0x65,0x5b,0x6b,0x77,0x20,0x2a,0x20,0x44,0x49,0x4c,0x41,0x54,0x49,0x4f,0x4e,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2b,0x20,0x53,0x54,0x52,0x49,0x44,0x45,0x5f,0x57,0x49,0x44,0x54,0x48,0x20,0x2a,0x20,0x69,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x52,0x45,0x41,0x44,0x38,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2c,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x63,0x62,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x68,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6b,0x77,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x20,0x2a,0x20,0x66,0x69,0x6c,0x74,0x65,0x72,0x5f,0x69,0x73,0x76,0x5f,0x70,0x69,0x74,0x63,0x68,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x30,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x32,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x33,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x34,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x35,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x35,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x36,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x36,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x37,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x37,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x38,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x38,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x39,0x20,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x39,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x30,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x30,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x31,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x31,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x32,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x32,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x33,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x33,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x34,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x34,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x20,0x73,0x72,0x63,0x31,0x35,0x20,0x3d,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x47,0x52,0x4f,0x55,0x50,0x5f,0x53,0x48,0x55,0x46,0x46,0x4c,0x45,0x38,0x28,0x73,0x72,0x63,0x2c,0x20,0x31,0x35,0x29,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x30,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x31,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x32,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x33,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x34,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x35,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x36,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x30,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x37,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x30,0x2c,0x20,0x73,0x72,0x63,0x38,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x31,0x2c,0x20,0x73,0x72,0x63,0x39,0x2c,0x20,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x32,0x2c,0x20,0x73,0x72,0x63,0x31,0x30,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x33,0x2c,0x20,0x73,0x72,0x63,0x31,0x31,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x34,0x2c,0x20,0x73,0x72,0x63,0x31,0x32,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x35,0x2c,0x20,0x73,0x72,0x63,0x31,0x33,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x36,0x2c,0x20,0x73,0x72,0x63,0x31,0x34,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x6d,0x61,0x64,0x28,0x77,0x65,0x69,0x67,0x68,0x74,0x31,0x2e,0x73,0x37,0x2c,0x20,0x73,0x72,0x63,0x31,0x35,0x2c,0x20,0x64,0x73,0x74,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x28,0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x3d,0x20,0x62,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x62,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x66,0x73,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x79,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x79,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x3d,0x20,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x2b,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x6c,0x65,0x66,0x74,0x29,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x70,0x61,0x64,0x5f,0x72,0x69,0x67,0x68,0x74,0x3b,0x20,0x2b,0x2b,0x69,0x29,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x70,0x61,0x64,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x30,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x5d,0x20,0x3d,0x20,0x64,0x73,0x74,0x3b,0xa,0x20,0x20,0x20,0x20,0x62,0x61,0x72,0x72,0x69,0x65,0x72,0x28,0x43,0x4c,0x4b,0x5f,0x4c,0x4f,0x43,0x41,0x4c,0x5f,0x4d,0x45,0x4d,0x5f,0x46,0x45,0x4e,0x43,0x45,0x29,0x3b,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x73,0x75,0x62,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x6f,0x70,0x65,0x6e,0x63,0x6c,0x5f,0x75,0x6e,0x72,0x6f,0x6c,0x6c,0x5f,0x68,0x69,0x6e,0x74,0x29,0x29,0x20,0x66,0x6f,0x72,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x31,0x3b,0x20,0x69,0x20,0x3c,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x3b,0x20,0x69,0x2b,0x2b,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x2b,0x3d,0x20,0x73,0x75,0x6d,0x5b,0x6c,0x69,0x64,0x31,0x20,0x25,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x70,0x65,0x72,0x5f,0x77,0x67,0x5d,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x66,0x6d,0x61,0x78,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0x23,0x69,0x66,0x64,0x65,0x66,0x20,0x52,0x45,0x4c,0x55,0x36,0xa,0x20,0x20,0x20,0x20,0x64,0x73,0x74,0x20,0x3d,0x20,0x63,0x6c,0x61,0x6d,0x70,0x28,0x64,0x73,0x74,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x30,0x2c,0x20,0x28,0x43,0x4f,0x4d,0x50,0x55,0x54,0x45,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x29,0x36,0x29,0x3b,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0xa,0xa,0xa,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2b,0x31,0x29,0x2a,0x31,0x36,0x20,0x3e,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x28,0x66,0x65,0x61,0x74,0x75,0x72,0x65,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x2a,0x31,0x36,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x63,0x68,0x61,0x6e,0x6e,0x65,0x6c,0x29,0x20,0x26,0x26,0x20,0x28,0x78,0x20,0x2b,0x20,0x69,0x29,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x29,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0xa,0x20,0x20,0x20,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x2b,0x20,0x38,0x20,0x3c,0x3d,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x7c,0x7c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x20,0x3d,0x3d,0x20,0x30,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x47,0x52,0x4f,0x55,0x50,0x5f,0x57,0x52,0x49,0x54,0x45,0x38,0x28,0x6f,0x75,0x74,0x70,0x75,0x74,0x2c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x2c,0x20,0x43,0x4f,0x4e,0x56,0x45,0x52,0x54,0x5f,0x46,0x4c,0x4f,0x41,0x54,0x38,0x28,0x64,0x73,0x74,0x29,0x29,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x65,0x6c,0x73,0x65,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6f,0x72,0x20,0x28,0x69,0x6e,0x74,0x20,0x69,0x20,0x3d,0x20,0x30,0x3b,0x20,0x69,0x20,0x3c,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x77,0x69,0x64,0x74,0x68,0x20,0x25,0x20,0x38,0x3b,0x20,0x69,0x2b,0x2b,0x29,0x20,0x7b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5b,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x6f,0x66,0x66,0x73,0x65,0x74,0x20,0x2b,0x20,0x69,0x20,0x2a,0x20,0x6f,0x75,0x74,0x70,0x75,0x74,0x5f,0x78,0x5f,0x70,0x69,0x74,0x63,0x68,0x20,0x2b,0x20,0x73,0x67,0x6c,0x69,0x64,0x5d,0x20,0x3d,0x20,0x28,0x46,0x4c,0x4f,0x41,0x54,0x29,0x64,0x73,0x74,0x5b,0x69,0x5d,0x3b,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x69,0x66,0x20,0x53,0x4c,0x4d,0x5f,0x44,0x49,0x56,0x5f,0x46,0x41,0x43,0x54,0x4f,0x52,0x20,0x3e,0x20,0x31,0xa,0x20,0x20,0x20,0x20,0x7d,0xa,0x23,0x65,0x6e,0x64,0x69,0x66,0xa,0x7d,0xa, } }, #endif #endif diff --git a/source/backend/opencl/execution/cl/pooling_buf.cl b/source/backend/opencl/execution/cl/pooling_buf.cl index d8e77a898..1340973d1 100644 --- a/source/backend/opencl/execution/cl/pooling_buf.cl +++ b/source/backend/opencl/execution/cl/pooling_buf.cl @@ -30,7 +30,7 @@ __kernel void pooling(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, const int ih_start = mad24(oh_idx, stride_shape.x, -pad_shape.x); #ifdef POOL_AVG - FLOAT4 result = (FLOAT4)(0); + COMPUTE_FLOAT4 result = (COMPUTE_FLOAT4)(0); const int inp_offset = (((b_idx*channel_block+c_idx)*input_shape.x+ih_start)*input_shape.y+iw_start)*4; #ifdef COUNT_INCLUDE_PADDING int total_count = (min(ih_start + kernel_shape.x, input_shape.x + pad_shape.x) - ih_start) * (min(iw_start + kernel_shape.y, input_shape.y + pad_shape.y) - iw_start); @@ -47,16 +47,16 @@ __kernel void pooling(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, if(iw_cur < 0 || iw_cur >= input_shape.y) { continue; } - FLOAT4 inp_data = vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4); + COMPUTE_FLOAT4 inp_data = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4)); result += inp_data; #ifndef COUNT_INCLUDE_PADDING total_count++; #endif } } - result = result / (FLOAT4)(1.0*total_count); + result = result / (COMPUTE_FLOAT4)(1.0*total_count); #else - FLOAT4 result = (FLOAT4)(-FLT_MAX); + COMPUTE_FLOAT4 result = (COMPUTE_FLOAT4)(-FLT_MAX); #if RETURN_REDICE int4 redice = (int4)0; #endif @@ -71,7 +71,7 @@ __kernel void pooling(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, if(iw_cur < 0 || iw_cur >= input_shape.y) { continue; } - FLOAT4 inp_data = vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4); + COMPUTE_FLOAT4 inp_data = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4)); #if RETURN_REDICE redice = inp_data > result ? (int4)((ih_start + kh) * input_shape.y + iw_start + kw) : redice; #endif @@ -81,7 +81,7 @@ __kernel void pooling(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, #endif const int out_offset = (((b_idx*channel_block + c_idx)*output_shape.x + oh_idx)* output_shape.y + ow_idx)*4; - vstore4(result, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(result), 0, output+out_offset); #if RETURN_REDICE vstore4(CONVERT_FLOAT4(redice), 0, rediceOutput+out_offset); #endif @@ -102,22 +102,22 @@ __kernel void global_pooling_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, const int output_batch_idx = get_global_id(2); #ifdef POOL_AVG - FLOAT4 output_result = 0; + COMPUTE_FLOAT4 output_result = 0; #else - FLOAT4 output_result = (FLOAT4)(-FLT_MAX); + COMPUTE_FLOAT4 output_result = (COMPUTE_FLOAT4)(-FLT_MAX); #if RETURN_REDICE int4 redice = (int4)0; int4 local rediceId[LOCAL_SIZE]; #endif #endif - FLOAT4 local sum[LOCAL_SIZE]; + COMPUTE_FLOAT4 local sum[LOCAL_SIZE]; const int inp_offset = ((output_batch_idx*channel_block+output_channel_idx)*input_shape.x)*input_shape.y*4; const int size = input_shape.x * input_shape.y; for(int i = local_id; i < size; i+=LOCAL_SIZE){ int w = i % input_shape.y;; int h = i / input_shape.y; - FLOAT4 in = vload4(0, input+inp_offset+(h*input_shape.y+w)*4); + COMPUTE_FLOAT4 in = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(h*input_shape.y+w)*4)); #ifdef POOL_AVG output_result += in; #else @@ -153,7 +153,7 @@ __kernel void global_pooling_buf(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, #endif const int out_offset = (output_batch_idx*channel_block + output_channel_idx)*4; - vstore4(output_result, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(output_result), 0, output+out_offset); #if RETURN_REDICE redice = rediceId[0]; vstore4(CONVERT_FLOAT4(redice), 0, rediceOutput+out_offset); diff --git a/source/backend/opencl/execution/cl/pooling_subgroup_buf.cl b/source/backend/opencl/execution/cl/pooling_subgroup_buf.cl index 3f4ebd6fe..304c3b903 100644 --- a/source/backend/opencl/execution/cl/pooling_subgroup_buf.cl +++ b/source/backend/opencl/execution/cl/pooling_subgroup_buf.cl @@ -34,7 +34,7 @@ __kernel void pooling_c4_c4(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, const int ih_start = mad24(oh_idx, STRIDE_Y, -pad_shape.x); #ifdef POOL_AVG - FLOAT4 result = (FLOAT4)(0); + COMPUTE_FLOAT4 result = (COMPUTE_FLOAT4)(0); const int inp_offset = (((b_idx*in_channel_block+c_idx)*input_shape.x+ih_start)*input_shape.y+iw_start+input_pad_left)*4; #ifdef COUNT_INCLUDE_PADDING int total_count = (min(ih_start + KERNEL_Y, input_shape.x + pad_shape.x) - ih_start) * (min(iw_start + KERNEL_X, input_shape.y + pad_shape.y) - iw_start); @@ -51,16 +51,16 @@ __kernel void pooling_c4_c4(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, if(iw_cur < 0 || iw_cur >= input_shape.y) { continue; } - FLOAT4 inp_data = vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4); + COMPUTE_FLOAT4 inp_data = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4)); result += inp_data; #ifndef COUNT_INCLUDE_PADDING total_count++; #endif } } - result = result / (FLOAT4)(1.0*total_count); + result = result / (COMPUTE_FLOAT4)(1.0*total_count); #else - FLOAT4 result = (FLOAT4)(-FLT_MAX); + COMPUTE_FLOAT4 result = (COMPUTE_FLOAT4)(-FLT_MAX); #if RETURN_REDICE int4 redice = (int4)0; #endif @@ -75,7 +75,7 @@ __kernel void pooling_c4_c4(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, if(iw_cur < 0 || iw_cur >= input_shape.y) { continue; } - FLOAT4 inp_data = vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4); + COMPUTE_FLOAT4 inp_data = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4)); #if RETURN_REDICE redice = inp_data > result ? (int4)((ih_start + kh) * input_shape.y + iw_start + kw) : redice; #endif @@ -85,7 +85,7 @@ __kernel void pooling_c4_c4(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, #endif const int out_offset = (((b_idx*in_channel_block + c_idx)*output_shape.x + oh_idx)* output_shape.y + ow_idx + output_pad_left)*4; - vstore4(result, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(result), 0, output+out_offset); #if RETURN_REDICE vstore4(CONVERT_FLOAT4(redice), 0, rediceOutput+(((b_idx*in_channel_block + c_idx)*output_shape.x + oh_idx)* output_shape.y + ow_idx)*4); #endif @@ -118,7 +118,7 @@ __kernel void pooling_c4_c16(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, const int dst_width = output_shape.y + output_pad_left + output_pad_right; #ifdef POOL_AVG - FLOAT4 result = (FLOAT4)(0); + COMPUTE_FLOAT4 result = (COMPUTE_FLOAT4)(0); const int inp_offset = (((b_idx*in_channel_block+c_idx)*input_shape.x+ih_start)*input_shape.y+iw_start+input_pad_left)*4; #ifdef COUNT_INCLUDE_PADDING int total_count = (min(ih_start + KERNEL_Y, input_shape.x + pad_shape.x) - ih_start) * (min(iw_start + KERNEL_X, input_shape.y + pad_shape.y) - iw_start); @@ -135,16 +135,16 @@ __kernel void pooling_c4_c16(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, if(iw_cur < 0 || iw_cur >= input_shape.y) { continue; } - FLOAT4 inp_data = vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4); + COMPUTE_FLOAT4 inp_data = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4)); result += inp_data; #ifndef COUNT_INCLUDE_PADDING total_count++; #endif } } - result = result / (FLOAT4)(1.0*total_count); + result = result / (COMPUTE_FLOAT4)(1.0*total_count); #else - FLOAT4 result = (FLOAT4)(-FLT_MAX); + COMPUTE_FLOAT4 result = (COMPUTE_FLOAT4)(-FLT_MAX); #if RETURN_REDICE int4 redice = (int4)0; #endif @@ -159,7 +159,7 @@ __kernel void pooling_c4_c16(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, if(iw_cur < 0 || iw_cur >= input_shape.y) { continue; } - FLOAT4 inp_data = vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4); + COMPUTE_FLOAT4 inp_data = CONVERT_COMPUTE_FLOAT4(vload4(0, input+inp_offset+(kh*input_shape.y+kw)*4)); #if RETURN_REDICE redice = inp_data > result ? (int4)((ih_start + kh) * input_shape.y + iw_start + kw) : redice; #endif @@ -170,7 +170,7 @@ __kernel void pooling_c4_c16(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, const int c_left = (c_idx % 4) * 4; const int out_offset = (((b_idx*out_channel_block + c_idx/4)*output_shape.x + oh_idx)* dst_width + ow_idx + output_pad_left)*16 + c_left; - vstore4(result, 0, output+out_offset); + vstore4(CONVERT_FLOAT4(result), 0, output+out_offset); #if RETURN_REDICE vstore4(CONVERT_FLOAT4(redice), 0, rediceOutput+(((b_idx*out_channel_block + c_idx)*output_shape.x + oh_idx)* output_shape.y + ow_idx)*4); #endif @@ -214,20 +214,20 @@ __kernel void pooling_c16_c16(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, const int dst_width = output_shape.y + output_pad_left + output_pad_right; #ifdef POOL_AVG - FLOAT8 result = (FLOAT8)(0); - FLOAT8 w_start = (FLOAT8)(iw_start, iw_start + STRIDE_X, iw_start + STRIDE_X * 2, iw_start + STRIDE_X * 3, iw_start + STRIDE_X * 4, iw_start + STRIDE_X * 5, iw_start + STRIDE_X * 6, iw_start + STRIDE_X * 7); + COMPUTE_FLOAT8 result = (COMPUTE_FLOAT8)(0); + COMPUTE_FLOAT8 w_start = (COMPUTE_FLOAT8)(iw_start, iw_start + STRIDE_X, iw_start + STRIDE_X * 2, iw_start + STRIDE_X * 3, iw_start + STRIDE_X * 4, iw_start + STRIDE_X * 5, iw_start + STRIDE_X * 6, iw_start + STRIDE_X * 7); #ifdef COUNT_INCLUDE_PADDING - FLOAT8 w_size = fmin(w_start + KERNEL_X, input_shape.y + pad_shape.y) - w_start; - FLOAT8 total_count = (FLOAT8)(min(ih_start + KERNEL_Y, input_shape.x + pad_shape.x) - ih_start) * w_size; + COMPUTE_FLOAT8 w_size = fmin(w_start + KERNEL_X, input_shape.y + pad_shape.y) - w_start; + COMPUTE_FLOAT8 total_count = (COMPUTE_FLOAT8)(min(ih_start + KERNEL_Y, input_shape.x + pad_shape.x) - ih_start) * w_size; #else - w_start = fmax(w_start, (FLOAT8)0); - FLOAT8 w_end = fmin(w_start + KERNEL_X, (FLOAT8)input_shape.y); + w_start = fmax(w_start, (COMPUTE_FLOAT8)0); + COMPUTE_FLOAT8 w_end = fmin(w_start + KERNEL_X, (COMPUTE_FLOAT8)input_shape.y); float h_start = fmax((float)ih_start, 0); float h_end = fmin(h_start + KERNEL_Y, (float)input_shape.x); - FLOAT8 total_count = (w_end - w_start) * (FLOAT8)(h_end - h_start); + COMPUTE_FLOAT8 total_count = (w_end - w_start) * (COMPUTE_FLOAT8)(h_end - h_start); #endif #else - FLOAT8 result = (FLOAT8)(-FLT_MAX); + COMPUTE_FLOAT8 result = (COMPUTE_FLOAT8)(-FLT_MAX); #if RETURN_REDICE int8 redice = (int8)0; #endif @@ -251,14 +251,14 @@ __kernel void pooling_c16_c16(GLOBAL_SIZE_3_DIMS __global const FLOAT *input, #ifdef POOL_AVG line_cache[i] = 0; #else - line_cache[i] = (FLOAT)(-FLT_MAX); + line_cache[i] = (COMPUTE_FLOAT)(-FLT_MAX); #endif } } for(int kw=0; kw= 4 int lid = get_local_id(0); - FLOAT4 local sum[SOFTMAX_LOCAL_SIZE]; + COMPUTE_FLOAT4 local sum[SOFTMAX_LOCAL_SIZE]; - FLOAT4 maxValue = (FLOAT4)-FLT_MAX; + COMPUTE_FLOAT4 maxValue = (COMPUTE_FLOAT4)-FLT_MAX; for (int i = lid; i < shape.y - 1; i+=SOFTMAX_LOCAL_SIZE) { - maxValue = fmax(maxValue, vload4(i*shape.z*shape.w, input+offset)); + maxValue = fmax(maxValue, CONVERT_COMPUTE_FLOAT4(vload4(i*shape.z*shape.w, input+offset))); } sum[lid] = maxValue; @@ -48,7 +48,7 @@ __kernel void softmax_channel(GLOBAL_SIZE_3_DIMS maxValue.x = fmax(maxValue.x, maxValue.z); maxValue.x = fmax(maxValue.x, maxValue.w); - FLOAT4 input_data = vload4((shape.y - 1) *shape.z*shape.w, input+offset); + COMPUTE_FLOAT4 input_data = CONVERT_COMPUTE_FLOAT4(vload4((shape.y - 1) *shape.z*shape.w, input+offset)); if (remain_channels == 0) { maxValue.x = fmax(maxValue.x, input_data.x); maxValue.x = fmax(maxValue.x, input_data.y); @@ -65,9 +65,9 @@ __kernel void softmax_channel(GLOBAL_SIZE_3_DIMS maxValue.x = fmax(maxValue.x, input_data.x); } - FLOAT4 sumValue = (FLOAT4)0; + COMPUTE_FLOAT4 sumValue = (COMPUTE_FLOAT4)0; for (int i = lid; i < shape.y - 1; i+=SOFTMAX_LOCAL_SIZE) { - sumValue += exp(vload4(i*shape.z*shape.w, input+offset) - (FLOAT4)maxValue.x); + sumValue += exp(CONVERT_COMPUTE_FLOAT4(vload4(i*shape.z*shape.w, input+offset)) - (COMPUTE_FLOAT4)maxValue.x); } sum[lid] = sumValue; barrier(CLK_LOCAL_MEM_FENCE); @@ -97,20 +97,20 @@ __kernel void softmax_channel(GLOBAL_SIZE_3_DIMS sumValue.x += exp(input_data.x); } for(int i = lid; i < shape.y; i+=SOFTMAX_LOCAL_SIZE){ - FLOAT4 value = exp(vload4(i*shape.z*shape.w, input+offset) - maxValue.x) / sumValue.x; - vstore4(value, i*shape.z*shape.w, output+offset); + COMPUTE_FLOAT4 value = exp(CONVERT_COMPUTE_FLOAT4(vload4(i*shape.z*shape.w, input+offset)) - maxValue.x) / sumValue.x; + vstore4(CONVERT_FLOAT4(value), i*shape.z*shape.w, output+offset); } #else - FLOAT4 maxValue = (FLOAT4)-FLT_MAX; + COMPUTE_FLOAT4 maxValue = (COMPUTE_FLOAT4)-FLT_MAX; for (int i = 0; i < shape.y - 1; i++) { - maxValue = fmax(maxValue, vload4(i*shape.z*shape.w, input+offset)); + maxValue = fmax(maxValue, CONVERT_COMPUTE_FLOAT4(vload4(i*shape.z*shape.w, input+offset))); } maxValue.x = fmax(maxValue.x, maxValue.y); maxValue.x = fmax(maxValue.x, maxValue.z); maxValue.x = fmax(maxValue.x, maxValue.w); - FLOAT4 input_data = vload4((shape.y - 1) *shape.z*shape.w, input+offset); + COMPUTE_FLOAT4 input_data = CONVERT_COMPUTE_FLOAT4(vload4((shape.y - 1) *shape.z*shape.w, input+offset)); if (remain_channels == 0) { maxValue.x = fmax(maxValue.x, input_data.x); maxValue.x = fmax(maxValue.x, input_data.y); @@ -127,9 +127,9 @@ __kernel void softmax_channel(GLOBAL_SIZE_3_DIMS maxValue.x = fmax(maxValue.x, input_data.x); } - FLOAT4 sumValue = (FLOAT4)0; + COMPUTE_FLOAT4 sumValue = (COMPUTE_FLOAT4)0; for (int i = 0; i < shape.y - 1; i++) { - sumValue += exp(vload4(i*shape.z*shape.w, input+offset) - (FLOAT4)maxValue.x); + sumValue += exp(CONVERT_COMPUTE_FLOAT4(vload4(i*shape.z*shape.w, input+offset)) - (COMPUTE_FLOAT4)maxValue.x); } sumValue.x = sumValue.x + sumValue.y + sumValue.z + sumValue.w; input_data -= maxValue.x; @@ -149,8 +149,8 @@ __kernel void softmax_channel(GLOBAL_SIZE_3_DIMS sumValue.x += exp(input_data.x); } for(int i = 0; i < shape.y; i++){ - FLOAT4 value = exp(vload4(i*shape.z*shape.w, input+offset) - maxValue.x) / sumValue.x; - vstore4(value, i*shape.z*shape.w, output+offset); + COMPUTE_FLOAT4 value = exp(CONVERT_COMPUTE_FLOAT4(vload4(i*shape.z*shape.w, input+offset)) - maxValue.x) / sumValue.x; + vstore4(CONVERT_FLOAT4(value), i*shape.z*shape.w, output+offset); } #endif } @@ -172,12 +172,12 @@ __kernel void softmax_height(GLOBAL_SIZE_3_DIMS const int offset = (((b*shape.y+c)*shape.z+0)*shape.w+w)*4; #if SOFTMAX_LOCAL_SIZE >= 4 int lid = get_local_id(0); - FLOAT4 local sum[SOFTMAX_LOCAL_SIZE]; + COMPUTE_FLOAT4 local sum[SOFTMAX_LOCAL_SIZE]; /*Compute Max */ - FLOAT4 maxValue = (FLOAT4)(-FLT_MAX); + COMPUTE_FLOAT4 maxValue = (COMPUTE_FLOAT4)(-FLT_MAX); for (int i=lid; i= 4 int lid = get_local_id(0); - FLOAT4 local sum[SOFTMAX_LOCAL_SIZE]; + COMPUTE_FLOAT4 local sum[SOFTMAX_LOCAL_SIZE]; /*Compute Max */ - FLOAT4 maxValue = (FLOAT4)(-FLT_MAX); + COMPUTE_FLOAT4 maxValue = (COMPUTE_FLOAT4)(-FLT_MAX); for (int i=lid; i &inputs, const int idx = 0; #else if(openCLBackend->isUseRecordQueue()){ - if(openCLBackend->isDevideOpRecord()) - openCLBackend->addRecord(mRecording); + openCLBackend->addRecord(mRecording, mOpRecordUpdateInfo); return NO_ERROR; } #endif diff --git a/source/backend/opencl/execution/image/CommonExecution.hpp b/source/backend/opencl/execution/image/CommonExecution.hpp index f8ecaea6a..c5a043969 100644 --- a/source/backend/opencl/execution/image/CommonExecution.hpp +++ b/source/backend/opencl/execution/image/CommonExecution.hpp @@ -43,6 +43,7 @@ class CommonExecution : public Execution { const MNN::Op *mOp; OpType mOpType; cl_recording_qcom mRecording{NULL}; + std::vector mOpRecordUpdateInfo; }; } // namespace OpenCL } // namespace MNN diff --git a/source/backend/opencl/execution/image/ConvExecution.cpp b/source/backend/opencl/execution/image/ConvExecution.cpp index 440ba5ac9..74673a469 100644 --- a/source/backend/opencl/execution/image/ConvExecution.cpp +++ b/source/backend/opencl/execution/image/ConvExecution.cpp @@ -25,28 +25,13 @@ ConvCommonExecution::ConvCommonExecution(const Convolution2D *conv2dParams, Back int biasSize = conv2dParams->bias()->size(); const float *biasDataPtr = conv2dParams->bias()->data(); - int buffer_size = ALIGN_UP4(biasSize); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + int buffer_size = ALIGN_UP4(biasSize) * sizeof(float); cl::Buffer biasBuffer(runtime->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); cl_int error; - auto biasPtrCL = runtime->commandQueue().enqueueMapBuffer( - biasBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); + auto biasPtrCL = runtime->commandQueue().enqueueMapBuffer(biasBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(biasPtrCL != nullptr && error == CL_SUCCESS){ - if(runtime->isWeightCpuTransHalf()){ - for(int i=0; i &inputs, const std::vec std::shared_ptr filterBuffer( Tensor::createDevice({outputChannel, inputChannel, kernelWidth, kernelHeight})); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); @@ -219,13 +199,8 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(ptrCL != nullptr && error == CL_SUCCESS) { ::memset(ptrCL, 0, buffer_size); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i = 0 ; i < filterBuffer->elementSize(); i++){ - ((half_float::half*)ptrCL)[i] = (half_float::half)(filterDataPtr[i]); - } - }else{ - ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); - } + ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); + }else{ MNN_ERROR("Map error ptrCL == nullptr \n"); } @@ -243,10 +218,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec mResource->mFilter.get()->buffer().device = (uint64_t)mResource->mKernelBuffer.get(); MNN::OpenCL::BufferConvertor bufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - bool needTrans = false; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - needTrans = true; - } + bool needTrans = true; bufferConvertor.convertToNC4HW4Buffer(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->mFilter.get(), needTrans); } else #endif @@ -255,10 +227,7 @@ ConvExecution::ConvExecution(const std::vector &inputs, const std::vec mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::ImageBufferConvertor imageBufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - std::string buildOption = ""; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - buildOption = "-DBUFFER_INP_FP32"; - } + std::string buildOption = "-DBUFFER_INP_FP32"; imageBufferConvertor.convertBufferToImage(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->mFilter.get(), false, buildOption); } } diff --git a/source/backend/opencl/execution/image/ConvWinograd.cpp b/source/backend/opencl/execution/image/ConvWinograd.cpp index 547c7081b..25f793286 100644 --- a/source/backend/opencl/execution/image/ConvWinograd.cpp +++ b/source/backend/opencl/execution/image/ConvWinograd.cpp @@ -100,29 +100,15 @@ ConvWinograd::ConvWinograd(const MNN::Op *op, Backend* backend) : CommonExecutio mResource->mBias.reset(new cl::Image2D(runTime->context(), CL_MEM_READ_WRITE, cl::ImageFormat(CL_RGBA, imageChannelType), UP_DIV(co, 4), 1, 0, nullptr, nullptr)); - int buffer_size = ALIGN_UP4(co); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = ALIGN_UP4(co) * sizeof(float); std::shared_ptr biasBuffer( new cl::Buffer(runTime->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size)); cl_int error; auto biasC = queue.enqueueMapBuffer(*biasBuffer, CL_TRUE, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(biasC != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i=0; ibias()->data()[i]); - } - for(int i=co; ibias()->data(), co * sizeof(float)); - } + ::memset(biasC, 0, buffer_size); + ::memcpy(biasC, conv2D->bias()->data(), co * sizeof(float)); }else{ MNN_ERROR("Map error biasC == nullptr \n"); } @@ -140,24 +126,13 @@ ConvWinograd::ConvWinograd(const MNN::Op *op, Backend* backend) : CommonExecutio generator.transformWeight(weightDest.get(), sourceWeight.get()); auto weightDestSize = weightDest->size(); - buffer_size = weightDest->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + buffer_size = weightDest->elementSize() * sizeof(float); cl::Buffer weightBuffer(runTime->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); { cl_int error; auto weightPtr = queue.enqueueMapBuffer(weightBuffer, CL_TRUE, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(weightPtr != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i=0; ielementSize(); i++) { - ((half_float::half*)weightPtr)[i] = (half_float::half)(weightDest->host()[i]); - } - }else{ - ::memcpy(weightPtr, weightDest->host(), buffer_size); - } + ::memcpy(weightPtr, weightDest->host(), buffer_size); } else{ MNN_ERROR("Map error weightPtr == nullptr \n"); } diff --git a/source/backend/opencl/execution/image/DeconvExecution.cpp b/source/backend/opencl/execution/image/DeconvExecution.cpp index c61e93d1c..b16abb3ec 100644 --- a/source/backend/opencl/execution/image/DeconvExecution.cpp +++ b/source/backend/opencl/execution/image/DeconvExecution.cpp @@ -41,24 +41,13 @@ DeconvExecution::DeconvExecution(const std::vector &inputs, const MNN: std::shared_ptr filterBuffer( Tensor::createDevice({outputChannel, inputChannel, kernelHeight, kernelWidth})); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); cl_int error; auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(ptrCL != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i=0; ielementSize(); i++) { - ((half_float::half*)ptrCL)[i] = (half_float::half)(filterDataPtrTransformed[i]); - } - }else{ - ::memcpy(ptrCL, filterDataPtrTransformed.data(), filterBuffer->size()); - } + ::memcpy(ptrCL, filterDataPtrTransformed.data(), filterBuffer->size()); }else{ MNN_ERROR("Map error ptrCL == nullptr \n"); } @@ -68,10 +57,7 @@ DeconvExecution::DeconvExecution(const std::vector &inputs, const MNN: mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::ImageBufferConvertor imageBufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - std::string buildOption = ""; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - buildOption = "-DBUFFER_INP_FP32"; - } + std::string buildOption = "-DBUFFER_INP_FP32"; imageBufferConvertor.convertBufferToImage(filterBuffer.get(), MNN::OpenCL::CONV2D_FILTER, mResource->mFilter.get(), false, buildOption); mResource->mBuildOptions.emplace("-DBIAS"); diff --git a/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp b/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp index ba5bc93bc..dbdbd1bbd 100644 --- a/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp +++ b/source/backend/opencl/execution/image/DepthwiseConvExecution.cpp @@ -42,24 +42,13 @@ DepthwiseConvExecution::DepthwiseConvExecution(const std::vector &inpu mResource->mFilter.reset(Tensor::createDevice({1, filterImageShape[1], 1, 4 * filterImageShape[0]})); std::shared_ptr filterBuffer(Tensor::createDevice(filterShape)); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); cl_int error; auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(ptrCL != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for (int i = 0; i < filterBuffer->elementSize(); i++) { - ((half_float::half *)ptrCL)[i] = (half_float::half)(filterDataPtr[i]); - } - } else { - ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); - } + ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); }else{ MNN_ERROR("Map error ptrCL == nullptr \n"); } @@ -68,10 +57,7 @@ DepthwiseConvExecution::DepthwiseConvExecution(const std::vector &inpu mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::ImageBufferConvertor imageBufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - std::string buildOption = ""; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - buildOption = "-DBUFFER_INP_FP32"; - } + std::string buildOption = "-DBUFFER_INP_FP32"; imageBufferConvertor.convertBufferToImage(filterBuffer.get(), MNN::OpenCL::DW_CONV2D_FILTER, mResource->mFilter.get(), false, buildOption); if (mResource->mConv2dCommonParams->relu() == true) { diff --git a/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp b/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp index d157373ea..da85385a7 100644 --- a/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp +++ b/source/backend/opencl/execution/image/DepthwiseDeconvExecution.cpp @@ -38,24 +38,13 @@ DepthwiseDeconvExecution::DepthwiseDeconvExecution(const std::vector & mResource->mFilter.reset(Tensor::createDevice({1, filterImageShape[1], 1, 4 * filterImageShape[0]})); std::shared_ptr filterBuffer(Tensor::createDevice(filterShape)); - int buffer_size = filterBuffer->elementSize(); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = filterBuffer->elementSize() * sizeof(float); cl::Buffer filterBufferCL(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, buffer_size); filterBuffer->buffer().device = (uint64_t)(&filterBufferCL); cl_int error; auto ptrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer(filterBufferCL, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(nullptr != ptrCL && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i=0; ielementSize(); i++) { - ((half_float::half*)ptrCL)[i] = (half_float::half)(filterDataPtr[i]); - } - }else{ - ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); - } + ::memcpy(ptrCL, filterDataPtr, filterBuffer->size()); }else{ MNN_ERROR("Map error ptrCL == nullptr \n"); } @@ -63,10 +52,7 @@ DepthwiseDeconvExecution::DepthwiseDeconvExecution(const std::vector & mOpenCLBackend->onAcquireBuffer(mResource->mFilter.get(), Backend::STATIC); MNN::OpenCL::ImageBufferConvertor imageBufferConvertor{mOpenCLBackend->getOpenCLRuntime()}; - std::string buildOption = ""; - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf() == false){ - buildOption = "-DBUFFER_INP_FP32"; - } + std::string buildOption = "-DBUFFER_INP_FP32"; imageBufferConvertor.convertBufferToImage(filterBuffer.get(), MNN::OpenCL::DW_CONV2D_FILTER, mResource->mFilter.get(), false, buildOption); if (mResource->mConv2dCommonParams->relu() == true) { mResource->mBuildOptions.emplace("-DRELU"); diff --git a/source/backend/opencl/execution/image/ReluExecution.cpp b/source/backend/opencl/execution/image/ReluExecution.cpp index 583777f68..3a8c95f8a 100644 --- a/source/backend/opencl/execution/image/ReluExecution.cpp +++ b/source/backend/opencl/execution/image/ReluExecution.cpp @@ -20,28 +20,14 @@ ReluExecution::ReluExecution(const std::vector &inputs, const MNN::Op int preluSize = mPreluParamPtr->slopeCount(); const float *preluDataPtr = mPreluParamPtr->slope()->data(); - int buffer_size = ALIGN_UP4(preluSize); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = ALIGN_UP4(preluSize) * sizeof(float); cl::Buffer preluBuffer(mOpenCLBackend->getOpenCLRuntime()->context(), CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, buffer_size); cl_int error; auto preluDataPtrCL = mOpenCLBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer( preluBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(preluDataPtrCL != nullptr && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for(int i=0; i &inputs, const MNN::O int scaleSize = scaleParams->scaleData()->size(); const float *scaleDataPtr = scaleParams->scaleData()->data(); - int buffer_size = ALIGN_UP4(scaleSize); - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + size_t buffer_size = ALIGN_UP4(scaleSize) * sizeof(float); cl::Buffer scaleBuffer(openclBackend->getOpenCLRuntime()->context(), CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, buffer_size); cl_int error; auto scalePtrCL = openclBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer( scaleBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(nullptr != scalePtrCL && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for (int i = 0; i < scaleSize; i++) { - ((half_float::half *)scalePtrCL)[i] = (half_float::half)(scaleDataPtr[i]); - } - for(int i=scaleSize; i &inputs, const MNN::O MNN_ASSERT(biasSize == scaleSize); const float *biasDataPtr = scaleParams->biasData()->data(); - int buffer_size = ALIGN_UP4(biasSize); - if(openclBackend->getOpenCLRuntime()->isWeightCpuTransHalf()) { - buffer_size *= sizeof(half_float::half); - } else { - buffer_size *= sizeof(float); - } + int buffer_size = ALIGN_UP4(biasSize) * sizeof(float); cl::Buffer biasBuffer(openclBackend->getOpenCLRuntime()->context(), CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, buffer_size); cl_int error; auto biasPtrCL = openclBackend->getOpenCLRuntime()->commandQueue().enqueueMapBuffer( biasBuffer, true, CL_MAP_WRITE, 0, buffer_size, nullptr, nullptr, &error); if(nullptr != biasPtrCL && error == CL_SUCCESS){ - if(mOpenCLBackend->getOpenCLRuntime()->isWeightCpuTransHalf()){ - for (int i = 0; i < biasSize; i++) { - ((half_float::half *)biasPtrCL)[i] = (half_float::half)(biasDataPtr[i]); - } - for(int i=biasSize; i& inputs, const s class VulkanROIPoolingCreator : public VulkanBackend::Creator { public: virtual VulkanBasicExecution* onCreate(const std::vector& inputs, const std::vector& outputs, const MNN::Op* op, Backend* bn) const override { + if (TensorUtils::getDescribe(inputs[1])->dimensionFormat == MNN_DATA_FORMAT_NC4HW4) { + // Don't support old op version + return nullptr; + } return new VulkanROIPooling(bn, op->main_as_RoiParameters()->spatialScale()); } }; diff --git a/source/backend/vulkan/buffer/execution/glsl/roipooling.comp b/source/backend/vulkan/buffer/execution/glsl/roipooling.comp index c30868003..6d21e0016 100644 --- a/source/backend/vulkan/buffer/execution/glsl/roipooling.comp +++ b/source/backend/vulkan/buffer/execution/glsl/roipooling.comp @@ -1,5 +1,5 @@ #version 440 core -layout(std140) buffer; +layout(std430) buffer; layout(set = 0, binding = 0) writeonly buffer outputBuffer{ vec4 data[]; }uOutput; @@ -9,7 +9,7 @@ layout(set = 0, binding = 1) readonly buffer inputBuffer{ }uInput; layout(set = 0, binding = 2) readonly buffer roiBuffer{ - vec4 data[]; + float data[]; }uRoI; layout(set = 0, binding = 3) uniform constBuffer @@ -32,13 +32,16 @@ void main() int roiBatchIndex = pos.z % uRoiPoolingParam.outputImgSize.w; int inputZIndex = pos.z / uRoiPoolingParam.outputImgSize.w; // 0, xmin, ymin, xmax, ymax - vec4 roiData0 = uRoI.data[roiBatchIndex]; - vec4 roiData1 = uRoI.data[roiBatchIndex + uRoiPoolingParam.outputImgSize.w]; - int inputBatch = int(roiData0.x); - int x1 = int(round(float(roiData0.y) * uRoiPoolingParam.spatialScale)); - int y1 = int(round(float(roiData0.z) * uRoiPoolingParam.spatialScale)); - int x2 = int(round(float(roiData0.w) * uRoiPoolingParam.spatialScale)); - int y2 = int(round(float(roiData1.x) * uRoiPoolingParam.spatialScale)); + float roiData0 = uRoI.data[roiBatchIndex * 5 + 0]; + float roiData1 = uRoI.data[roiBatchIndex * 5 + 1]; + float roiData2 = uRoI.data[roiBatchIndex * 5 + 2]; + float roiData3 = uRoI.data[roiBatchIndex * 5 + 3]; + float roiData4 = uRoI.data[roiBatchIndex * 5 + 4]; + int inputBatch = int(roiData0); + int x1 = int(round(float(roiData1) * uRoiPoolingParam.spatialScale)); + int y1 = int(round(float(roiData2) * uRoiPoolingParam.spatialScale)); + int x2 = int(round(float(roiData3) * uRoiPoolingParam.spatialScale)); + int y2 = int(round(float(roiData4) * uRoiPoolingParam.spatialScale)); int roiW = max(x2 - x1 + 1, 1); int roiH = max(y2 - y1 + 1, 1); diff --git a/source/common/CommonCompute.hpp b/source/core/CommonCompute.hpp similarity index 100% rename from source/common/CommonCompute.hpp rename to source/core/CommonCompute.hpp diff --git a/source/core/ConvolutionCommon.cpp b/source/core/ConvolutionCommon.cpp index 9e1f8d524..9070fe9c7 100644 --- a/source/core/ConvolutionCommon.cpp +++ b/source/core/ConvolutionCommon.cpp @@ -11,412 +11,10 @@ #include "backend/cpu/compute/CommonOptFunction.h" #include "half.hpp" #include "core/OpCommonUtils.hpp" +#include "core/IDSTDecoder.hpp" namespace MNN { -static inline void *MNNMemoryAllocAlignZeroAlign(size_t size) { - return MNNMemoryCallocAlign(size, MNN_MEMORY_ALIGN_DEFAULT); -} -static int ReadBlobDim(unsigned char *&myfile, unsigned int* shape, int shapeBufCnt, bool useInt32) { - int uSize = myfile[0]; - myfile++; - if (uSize > 4) { - printf("Read shape error!\n"); - return 0; - } - int copyLength = uSize; - if (copyLength > shapeBufCnt) { - copyLength = shapeBufCnt; - } - if (useInt32) { - ::memcpy(shape, myfile, sizeof(unsigned int) * copyLength); - myfile += copyLength * sizeof(unsigned int); - } else { - std::vector tmpShapeInt16(copyLength); - ::memcpy(tmpShapeInt16.data(), myfile, copyLength * sizeof(int16_t)); - for (int i=0; i> (8 + uShift)) & cMask; - } else { - idx = (tmp[iOffset / 8] >> uShift) & cMask; - } - iOffset += iNeedBits; - if (iOffset % 8 == 0) { - tmp += iOffset / 8; - iOffset = 0; - } - arr[i] = idx; - } -} - -// fixme!!! not efficiency -typedef struct _SIMPLE_SET { - int8_t *UniSet; - uint32_t UniSetSize; - uint32_t CurUniCnt; -} SIMPLE_SET, *PSIMPLE_SET; - -static PSIMPLE_SET CreateSimpleSet(uint32_t maxSize) { - PSIMPLE_SET set = (PSIMPLE_SET)calloc(1, sizeof(SIMPLE_SET)); - if (set == nullptr) - return nullptr; - set->UniSet = (int8_t *)calloc(maxSize, sizeof(int8_t)); - set->UniSetSize = maxSize; - set->CurUniCnt = 0; - return set; -} - -static void SimpleRank(int8_t *data, uint32_t cnt, int up) { - if (up) { - for (uint32_t i = 0; i < cnt; i++) { - for (uint32_t j = i + 1; j < cnt; j++) { - if (data[i] > data[j]) { - int8_t tmp = data[i]; - data[i] = data[j]; - data[j] = tmp; - } - } - } - } else { - for (uint32_t i = 0; i < cnt; i++) { - for (uint32_t j = i + 1; j < cnt; j++) { - if (data[i] < data[j]) { - int8_t tmp = data[i]; - data[i] = data[j]; - data[j] = tmp; - } - } - } - } -} - -static void InsertSimpleSet(PSIMPLE_SET set, int8_t value) { - if (set->CurUniCnt >= set->UniSetSize) - return; - for (uint32_t i = 0; i < set->CurUniCnt; i++) { - if (set->UniSet[i] == value) - return; - } - set->UniSet[set->CurUniCnt++] = value; - // SimpleRank(set->UniSet, set->CurUniCnt, 1); -} - -void DestorySimpleSet(PSIMPLE_SET set) { - if (set->UniSet != nullptr) - free(set->UniSet); - free(set); -} - -typedef struct _SIMPLE_MAP { - int8_t *CharCharMap; - uint32_t CharMapSize; - uint32_t CurMapCnt; -} SIMPLE_MAP, *PSIMPLE_MAP; - -static PSIMPLE_MAP CreateSimpleMap(uint32_t MaxCnt) { - PSIMPLE_MAP map = (PSIMPLE_MAP)calloc(1, sizeof(SIMPLE_MAP)); - if (map == nullptr) - return nullptr; - map->CharMapSize = MaxCnt * sizeof(int8_t); - map->CurMapCnt = 0; - map->CharCharMap = (int8_t *)calloc(1, MaxCnt * 2); - return map; -} - -static void DestroySimpleMap(PSIMPLE_MAP map) { - if (map->CharCharMap) - free(map->CharCharMap); - free(map); -} -static void InsertMap(PSIMPLE_MAP map, int8_t k, int8_t v) { - for (uint32_t i = 0; i < map->CurMapCnt; i++) { - if (map->CharCharMap[i * 2] == k) { - map->CharCharMap[i * 2 + 1] = v; - return; - } - } - if (map->CurMapCnt >= map->CharMapSize) - return; - map->CharCharMap[map->CurMapCnt * 2] = k; - map->CharCharMap[map->CurMapCnt * 2 + 1] = v; - map->CurMapCnt++; -} - -static int8_t FindInMap(PSIMPLE_MAP map, int8_t k, int *found) { - for (uint32_t i = 0; i < map->CurMapCnt; i++) { - if (map->CharCharMap[i * 2] == k) { - if (found != nullptr) - *found = 1; - return map->CharCharMap[i * 2 + 1]; - } - } - if (found != nullptr) - *found = 0; - return 0; -} - -static void StreamSizeRead(void *dst, int unit, size_t count, unsigned char *&file) { - ::memcpy(dst, file, unit * count); - file += (unit * count); -} - -static bool isLinearSample(const std::vector& sample, int bit) { - const int offset = 1 << (bit - 1); - const int size = 1 << bit; - if (sample.size() != size) { - return false; - } - for (int i = 0; i < sample.size(); i++) { - if (static_cast(sample[i]) != i - offset) { - return false; - } - } - return true; -} - -static int8_t *ReadQuanData_c(unsigned char *&s, size_t* len, ConvolutionCommon::Int8Common* result, bool shapeInt32) { - int8_t *blob = nullptr; - uint8_t *idxBuf = nullptr; - uint8_t *idxBytes = nullptr; - uint32_t dataCnt = 1; - - do { - // blob shape - unsigned int shape[32] = {0}; - uint32_t shapeDim = (uint32_t)ReadBlobDim(s, shape, 32, shapeInt32); - if (shapeDim == 0 || shapeDim > 32) - break; - for (uint32_t i = 0; i < shapeDim; i++) - dataCnt *= shape[i]; - - // sample - uint32_t sampleCnt = 0; - StreamSizeRead(&sampleCnt, 1, 1, s); - if (sampleCnt == 0) { - sampleCnt = 256; - } - result->weightMap.resize(sampleCnt); - auto samples = result->weightMap.data(); - if (samples == nullptr) - break; - StreamSizeRead(samples, 1, sampleCnt, s); - SimpleRank(samples, sampleCnt, 1); - uint32_t idxBitsCnt = atLestBitsCnt(sampleCnt); - idxBitsCnt = idxBitsCnt < 1 ? 1 : idxBitsCnt; - // index - size_t idxBufSize = ceil(idxBitsCnt * dataCnt * 0.125); - idxBuf = (uint8_t *)MNNMemoryAllocAlignZeroAlign(idxBufSize); - if (nullptr == idxBuf) { - MNN_ERROR("Not enought memory\n"); - break; - } - StreamSizeRead(idxBuf, 1, idxBufSize, s); - if (idxBitsCnt == 4) { - dataCnt = UP_DIV(dataCnt, 2) * 2; - } - blob = (int8_t *)MNNMemoryAllocAlignZeroAlign((size_t)dataCnt); - if (nullptr == blob) { - break; - } - - if (isLinearSample(result->weightMap, idxBitsCnt) && (idxBitsCnt == 4 || idxBitsCnt == 8)) { - // fast sample for bit = 4 or 8 - if (idxBitsCnt == 4) { - for (int i = 0; i < idxBufSize; i++) { - int val = idxBuf[i]; - int x1 = val / 16; - int x2 = val % 16; - blob[2 * i] = x1 - 8; - blob[2 * i + 1] = x2 - 8; - } - } - if (idxBitsCnt == 8) { - for (int i = 0; i < idxBufSize; i++) { - int val = idxBuf[i]; - blob[i] = val - 128; - } - } - } else { - // split index value into bytes - idxBytes = (uint8_t *)MNNMemoryAllocAlignZeroAlign(dataCnt * sizeof(uint8_t)); - if (idxBitsCnt == 0 || nullptr == idxBytes) { - break; - } - SplitBufToArray(idxBuf, (uint32_t)idxBufSize, idxBytes, (uint32_t)dataCnt, (uint32_t)idxBitsCnt); - int i = 0; - for (; i < dataCnt; i++) { - if (idxBytes[i] >= sampleCnt) { - MNN_PRINT("iNeedBits is %u\nRead quan weights error with idx:%d\n", idxBitsCnt, (int)idxBytes[i]); - break; - } - blob[i] = samples[idxBytes[i]]; - } - - if (i < dataCnt) { - MNNMemoryFreeAlign(blob); - blob = nullptr; - break; - } - MNNMemoryFreeAlign(idxBytes); - idxBytes = nullptr; - } - } while (0); - - if (idxBuf != nullptr) - MNNMemoryFreeAlign(idxBuf); - if (idxBytes != nullptr) - MNNMemoryFreeAlign(idxBytes); - if (len) - *len = blob ? dataCnt : 0; - return blob; -} - -static int8_t *ReadSparseQuanData_c(unsigned char *&myfile, size_t* len, const float* alpha_ptr, size_t alpha_size, ConvolutionCommon::Int8Common* result, bool useInt32) { // MNN_ERROR("sparse:%d\n", 1); - unsigned int shape[32]; - uint32_t ucMapSize = 0; - PSIMPLE_SET setWeight = CreateSimpleSet(256); - if (setWeight == nullptr) { - return nullptr; - } - std::shared_ptr __autoReleaseSetWeight(nullptr, [setWeight](void *) { DestorySimpleSet(setWeight); }); - unsigned int nnz; - unsigned char iIdxNeedBits; - int8_t *blob = nullptr; - // 1. weights blob shape(unsigned int32) - int ShapeDim = ReadBlobDim(myfile, shape, 32, useInt32); - size_t Size = sizeof(int8_t); - for (int i = 0; i < ShapeDim; i++) - Size *= shape[i]; - blob = (int8_t *)MNNMemoryAllocAlignZeroAlign((size_t)Size); - if (blob == nullptr) - return nullptr; - // 2. nnz - StreamSizeRead(&nnz, 4, 1, myfile); - // 3. max_step use # bits () (unsigned char) - StreamSizeRead(&iIdxNeedBits, 1, 1, myfile); - // read idx array - // 4. buf for steps ceil(nnz*step need bits/8) - AutoStorage arrIdxBuffer(nnz); - unsigned char *arrIdx = arrIdxBuffer.get(); - if (nullptr == arrIdx) { - return nullptr; - } - { - size_t bufLen = (size_t)(ceil(0.125 * iIdxNeedBits * nnz)); - char *buf = (char *)MNNMemoryAllocAlignZeroAlign(bufLen * sizeof(char)); - if (nullptr == buf) { - return nullptr; - } - StreamSizeRead(buf, 1, bufLen, myfile); - SplitBufToArray((uint8_t *)buf, (uint32_t)bufLen, (uint8_t *)arrIdx, (uint32_t)nnz, (uint32_t)iIdxNeedBits); - MNNMemoryFreeAlign(buf); - } - // 5. Avalable values Count(unsigned char) - StreamSizeRead(&ucMapSize, 1, 1, myfile); - if (0 == ucMapSize) { - ucMapSize = 256; - } - result->weightMap.resize(ucMapSize); - // 6. valueset(signed char * valueset_size) - for (int i = 0; i < ucMapSize; i++) { - int8_t tmp; - StreamSizeRead(&tmp, 1, 1, myfile); - InsertSimpleSet(setWeight, tmp); - result->weightMap[i] = tmp; - } - SimpleRank(setWeight->UniSet, setWeight->CurUniCnt, 1); - // map mapWeight; - PSIMPLE_MAP mapWeight = CreateSimpleMap(256); - if (mapWeight == nullptr) { - return nullptr; - } - std::shared_ptr __autoReleaseMapWeight(nullptr, [mapWeight](void *) { DestroySimpleMap(mapWeight); }); - - for (int i = 0; i < setWeight->CurUniCnt; i++) { - InsertMap(mapWeight, i, setWeight->UniSet[i]); - } - // unsigned char iIdx = 0; - // 7. none zero weights indexes(nnz*ceil(log2(Avalable_values_Count))/8) - AutoStorage arrWeightIdxBuffer(nnz); - unsigned char *arrWeightIdx = arrWeightIdxBuffer.get(); - if (nullptr == arrWeightIdx) { - return nullptr; - } - int iDataNeedBits = (int)ceil(_log2(ucMapSize)); - iDataNeedBits = iDataNeedBits < 1 ? 1 : iDataNeedBits; - { - size_t bufLen = (size_t)(ceil(0.125 * iDataNeedBits * nnz)); - char *buf = (char *)MNNMemoryAllocAlignZeroAlign(bufLen * sizeof(char)); - if (nullptr == buf) { - return nullptr; - } - StreamSizeRead(buf, 1, bufLen, myfile); - SplitBufToArray((uint8_t *)buf, (uint32_t)bufLen, (uint8_t *)arrWeightIdx, (uint32_t)nnz, - (uint32_t)iDataNeedBits); - MNNMemoryFreeAlign(buf); - } - // set blob data with idx and weight idx - { - if (alpha_size == 2 * shape[0]) { - const int min_value = -(1 << (iDataNeedBits - 1)); - auto alphaPtr = alpha_ptr; - int area = Size / shape[0]; - for (int i = 0; i < shape[0]; i++) { - float min = alphaPtr[2*i]; - float scale = alphaPtr[2*i+1]; - int zeroQuant = min_value; - if (scale > 1e-6) { - zeroQuant = round((0.0f - min) / scale) + min_value; - } - memset(blob+area*i, zeroQuant, area * sizeof(signed char)); - } - } else { - memset(blob, 0, Size * sizeof(signed char)); //backward compability with previous symmetric weight quant - } - int iPreIdx = 0; - for (int i = 0; i < nnz; i++) { - iPreIdx += arrIdx[i]; - int found = 0; - int8_t value = FindInMap(mapWeight, arrWeightIdx[i], &found); - if (!found) { - MNN_ERROR("Read quan weights error with idx:%d\n", arrWeightIdx[i]); - MNNMemoryFreeAlign(blob); - return nullptr; - } - blob[iPreIdx] = value; - } - } - *len = Size; - return blob; -} std::shared_ptr ConvolutionCommon::load(const Convolution2D *conv, Backend* backend, bool forceFloat, bool forceInt8) { auto quan = conv->quanParameter(); auto result = std::make_shared(); @@ -456,10 +54,10 @@ std::shared_ptr ConvolutionCommon::load(const Con int8_t *buffer = nullptr; auto originBuffer = (unsigned char *)buffer_ptr; if (1 == quan->type()) { - buffer = ReadQuanData_c(originBuffer, &weightLength, result.get(), quan->shapeInt32()); + buffer = IDSTDecoder::ReadQuanData_c(originBuffer, &weightLength, result.get(), quan->shapeInt32()); } if (2 == quan->type()) { - buffer = ReadSparseQuanData_c(originBuffer, &weightLength, alpha_ptr, alpha_size, result.get(), quan->shapeInt32()); + buffer = IDSTDecoder::ReadSparseQuanData_c(originBuffer, &weightLength, alpha_ptr, alpha_size, result.get(), quan->shapeInt32()); } if (result->weightMap.size() > 0) { result->canUseInt4 = true; diff --git a/source/core/IDSTDecoder.hpp b/source/core/IDSTDecoder.hpp new file mode 100644 index 000000000..14ddc60be --- /dev/null +++ b/source/core/IDSTDecoder.hpp @@ -0,0 +1,430 @@ +// +// IDSTDecoder.hpp +// MNN +// +// Created by MNN on 2024/03/18. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef IDSTDECODER_HPP +#define IDSTDECODER_HPP + +#include +#include +#include +#include "MNN_generated.h" +#include "core/ConvolutionCommon.hpp" + +using namespace MNN; + +namespace IDSTDecoder { + +static inline void *MNNMemoryAllocAlignZeroAlign(size_t size) { + return MNNMemoryCallocAlign(size, MNN_MEMORY_ALIGN_DEFAULT); +} + +static int ReadBlobDim(unsigned char *&myfile, unsigned int* shape, int shapeBufCnt, bool useInt32) { + int uSize = myfile[0]; + myfile++; + if (uSize > 4) { + printf("Read shape error!\n"); + return 0; + } + int copyLength = uSize; + if (copyLength > shapeBufCnt) { + copyLength = shapeBufCnt; + } + if (useInt32) { + ::memcpy(shape, myfile, sizeof(unsigned int) * copyLength); + myfile += copyLength * sizeof(unsigned int); + } else { + auto myfileint16 = (uint16_t*)myfile; + for (int i=0; i> (8 + uShift)) & cMask; + } else { + idx = (tmp[iOffset / 8] >> uShift) & cMask; + } + iOffset += iNeedBits; + if (iOffset % 8 == 0) { + tmp += iOffset / 8; + iOffset = 0; + } + arr[i] = idx; + } +} + +// fixme!!! not efficiency +typedef struct _SIMPLE_SET { + int8_t *UniSet; + uint32_t UniSetSize; + uint32_t CurUniCnt; +} SIMPLE_SET, *PSIMPLE_SET; + +static PSIMPLE_SET CreateSimpleSet(uint32_t maxSize) { + PSIMPLE_SET set = (PSIMPLE_SET)calloc(1, sizeof(SIMPLE_SET)); + if (set == nullptr) + return nullptr; + set->UniSet = (int8_t *)calloc(maxSize, sizeof(int8_t)); + set->UniSetSize = maxSize; + set->CurUniCnt = 0; + return set; +} + +static void SimpleRank(int8_t *data, uint32_t cnt, int up) { + if (up) { + for (uint32_t i = 0; i < cnt; i++) { + for (uint32_t j = i + 1; j < cnt; j++) { + if (data[i] > data[j]) { + int8_t tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; + } + } + } + } else { + for (uint32_t i = 0; i < cnt; i++) { + for (uint32_t j = i + 1; j < cnt; j++) { + if (data[i] < data[j]) { + int8_t tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; + } + } + } + } +} + +static void InsertSimpleSet(PSIMPLE_SET set, int8_t value) { + if (set->CurUniCnt >= set->UniSetSize) + return; + for (uint32_t i = 0; i < set->CurUniCnt; i++) { + if (set->UniSet[i] == value) + return; + } + set->UniSet[set->CurUniCnt++] = value; + // SimpleRank(set->UniSet, set->CurUniCnt, 1); +} + +void DestorySimpleSet(PSIMPLE_SET set) { + if (set->UniSet != nullptr) + free(set->UniSet); + free(set); +} + +typedef struct _SIMPLE_MAP { + int8_t *CharCharMap; + uint32_t CharMapSize; + uint32_t CurMapCnt; +} SIMPLE_MAP, *PSIMPLE_MAP; + +static PSIMPLE_MAP CreateSimpleMap(uint32_t MaxCnt) { + PSIMPLE_MAP map = (PSIMPLE_MAP)calloc(1, sizeof(SIMPLE_MAP)); + if (map == nullptr) + return nullptr; + map->CharMapSize = MaxCnt * sizeof(int8_t); + map->CurMapCnt = 0; + map->CharCharMap = (int8_t *)calloc(1, MaxCnt * 2); + return map; +} + +static void DestroySimpleMap(PSIMPLE_MAP map) { + if (map->CharCharMap) + free(map->CharCharMap); + free(map); +} + +static void InsertMap(PSIMPLE_MAP map, int8_t k, int8_t v) { + for (uint32_t i = 0; i < map->CurMapCnt; i++) { + if (map->CharCharMap[i * 2] == k) { + map->CharCharMap[i * 2 + 1] = v; + return; + } + } + if (map->CurMapCnt >= map->CharMapSize) + return; + map->CharCharMap[map->CurMapCnt * 2] = k; + map->CharCharMap[map->CurMapCnt * 2 + 1] = v; + map->CurMapCnt++; +} + +static int8_t FindInMap(PSIMPLE_MAP map, int8_t k, int *found) { + for (uint32_t i = 0; i < map->CurMapCnt; i++) { + if (map->CharCharMap[i * 2] == k) { + if (found != nullptr) + *found = 1; + return map->CharCharMap[i * 2 + 1]; + } + } + if (found != nullptr) + *found = 0; + return 0; +} + +static void StreamSizeRead(void *dst, int unit, size_t count, unsigned char *&file) { + ::memcpy(dst, file, unit * count); + file += (unit * count); +} + +static bool isLinearSample(const std::vector& sample, int bit) { + const int offset = 1 << (bit - 1); + const int size = 1 << bit; + if (sample.size() != size) { + return false; + } + for (int i = 0; i < sample.size(); i++) { + if (static_cast(sample[i]) != i - offset) { + return false; + } + } + return true; +} + +static int8_t *ReadQuanData_c(unsigned char *&s, size_t* len, ConvolutionCommon::Int8Common* result, bool shapeInt32) { + int8_t *blob = nullptr; + uint8_t *idxBuf = nullptr; + uint8_t *idxBytes = nullptr; + uint32_t dataCnt = 1; + + do { + // blob shape + unsigned int shape[32] = {0}; + uint32_t shapeDim = (uint32_t)ReadBlobDim(s, shape, 32, shapeInt32); + if (shapeDim == 0 || shapeDim > 32) + break; + for (uint32_t i = 0; i < shapeDim; i++) + dataCnt *= shape[i]; + + // sample + uint32_t sampleCnt = 0; + StreamSizeRead(&sampleCnt, 1, 1, s); + if (sampleCnt == 0) { + sampleCnt = 256; + } + result->weightMap.resize(sampleCnt); + auto samples = result->weightMap.data(); + if (samples == nullptr) + break; + StreamSizeRead(samples, 1, sampleCnt, s); + SimpleRank(samples, sampleCnt, 1); + uint32_t idxBitsCnt = atLestBitsCnt(sampleCnt); + idxBitsCnt = idxBitsCnt < 1 ? 1 : idxBitsCnt; + // index + size_t idxBufSize = ceil(idxBitsCnt * dataCnt * 0.125); + idxBuf = (uint8_t *)MNNMemoryAllocAlignZeroAlign(idxBufSize); + if (nullptr == idxBuf) { + MNN_ERROR("Not enought memory\n"); + break; + } + StreamSizeRead(idxBuf, 1, idxBufSize, s); + if (idxBitsCnt == 4) { + dataCnt = UP_DIV(dataCnt, 2) * 2; + } + blob = (int8_t *)MNNMemoryAllocAlignZeroAlign((size_t)dataCnt); + if (nullptr == blob) { + break; + } + + if (isLinearSample(result->weightMap, idxBitsCnt) && (idxBitsCnt == 4 || idxBitsCnt == 8)) { + // fast sample for bit = 4 or 8 + if (idxBitsCnt == 4) { + for (int i = 0; i < idxBufSize; i++) { + int val = idxBuf[i]; + int x1 = val / 16; + int x2 = val % 16; + blob[2 * i] = x1 - 8; + blob[2 * i + 1] = x2 - 8; + } + } + if (idxBitsCnt == 8) { + for (int i = 0; i < idxBufSize; i++) { + int val = idxBuf[i]; + blob[i] = val - 128; + } + } + } else { + // split index value into bytes + idxBytes = (uint8_t *)MNNMemoryAllocAlignZeroAlign(dataCnt * sizeof(uint8_t)); + if (idxBitsCnt == 0 || nullptr == idxBytes) { + break; + } + SplitBufToArray(idxBuf, (uint32_t)idxBufSize, idxBytes, (uint32_t)dataCnt, (uint32_t)idxBitsCnt); + int i = 0; + for (; i < dataCnt; i++) { + if (idxBytes[i] >= sampleCnt) { + MNN_PRINT("iNeedBits is %u\nRead quan weights error with idx:%d\n", idxBitsCnt, (int)idxBytes[i]); + break; + } + blob[i] = samples[idxBytes[i]]; + } + + if (i < dataCnt) { + MNNMemoryFreeAlign(blob); + blob = nullptr; + break; + } + MNNMemoryFreeAlign(idxBytes); + idxBytes = nullptr; + } + } while (0); + + if (idxBuf != nullptr) + MNNMemoryFreeAlign(idxBuf); + if (idxBytes != nullptr) + MNNMemoryFreeAlign(idxBytes); + if (len) + *len = blob ? dataCnt : 0; + return blob; +} + +static int8_t *ReadSparseQuanData_c(unsigned char *&myfile, size_t* len, const float* alpha_ptr, size_t alpha_size, ConvolutionCommon::Int8Common* result, bool useInt32) { // MNN_ERROR("sparse:%d\n", 1); + unsigned int shape[32]; + uint32_t ucMapSize = 0; + PSIMPLE_SET setWeight = CreateSimpleSet(256); + if (setWeight == nullptr) { + return nullptr; + } + std::shared_ptr __autoReleaseSetWeight(nullptr, [setWeight](void *) { DestorySimpleSet(setWeight); }); + unsigned int nnz; + unsigned char iIdxNeedBits; + int8_t *blob = nullptr; + // 1. weights blob shape(unsigned int32) + int ShapeDim = ReadBlobDim(myfile, shape, 32, useInt32); + size_t Size = sizeof(int8_t); + for (int i = 0; i < ShapeDim; i++) + Size *= shape[i]; + blob = (int8_t *)MNNMemoryAllocAlignZeroAlign((size_t)Size); + if (blob == nullptr) + return nullptr; + // 2. nnz + StreamSizeRead(&nnz, 4, 1, myfile); + // 3. max_step use # bits () (unsigned char) + StreamSizeRead(&iIdxNeedBits, 1, 1, myfile); + // read idx array + // 4. buf for steps ceil(nnz*step need bits/8) + AutoStorage arrIdxBuffer(nnz); + unsigned char *arrIdx = arrIdxBuffer.get(); + if (nullptr == arrIdx) { + return nullptr; + } + { + size_t bufLen = (size_t)(ceil(0.125 * iIdxNeedBits * nnz)); + char *buf = (char *)MNNMemoryAllocAlignZeroAlign(bufLen * sizeof(char)); + if (nullptr == buf) { + return nullptr; + } + StreamSizeRead(buf, 1, bufLen, myfile); + SplitBufToArray((uint8_t *)buf, (uint32_t)bufLen, (uint8_t *)arrIdx, (uint32_t)nnz, (uint32_t)iIdxNeedBits); + MNNMemoryFreeAlign(buf); + } + // 5. Avalable values Count(unsigned char) + StreamSizeRead(&ucMapSize, 1, 1, myfile); + if (0 == ucMapSize) { + ucMapSize = 256; + } + result->weightMap.resize(ucMapSize); + // 6. valueset(signed char * valueset_size) + for (int i = 0; i < ucMapSize; i++) { + int8_t tmp; + StreamSizeRead(&tmp, 1, 1, myfile); + InsertSimpleSet(setWeight, tmp); + result->weightMap[i] = tmp; + } + SimpleRank(setWeight->UniSet, setWeight->CurUniCnt, 1); + // map mapWeight; + PSIMPLE_MAP mapWeight = CreateSimpleMap(256); + if (mapWeight == nullptr) { + return nullptr; + } + std::shared_ptr __autoReleaseMapWeight(nullptr, [mapWeight](void *) { DestroySimpleMap(mapWeight); }); + + for (int i = 0; i < setWeight->CurUniCnt; i++) { + InsertMap(mapWeight, i, setWeight->UniSet[i]); + } + // unsigned char iIdx = 0; + // 7. none zero weights indexes(nnz*ceil(log2(Avalable_values_Count))/8) + AutoStorage arrWeightIdxBuffer(nnz); + unsigned char *arrWeightIdx = arrWeightIdxBuffer.get(); + if (nullptr == arrWeightIdx) { + return nullptr; + } + int iDataNeedBits = (int)ceil(_log2(ucMapSize)); + iDataNeedBits = iDataNeedBits < 1 ? 1 : iDataNeedBits; + { + size_t bufLen = (size_t)(ceil(0.125 * iDataNeedBits * nnz)); + char *buf = (char *)MNNMemoryAllocAlignZeroAlign(bufLen * sizeof(char)); + if (nullptr == buf) { + return nullptr; + } + StreamSizeRead(buf, 1, bufLen, myfile); + SplitBufToArray((uint8_t *)buf, (uint32_t)bufLen, (uint8_t *)arrWeightIdx, (uint32_t)nnz, + (uint32_t)iDataNeedBits); + MNNMemoryFreeAlign(buf); + } + // set blob data with idx and weight idx + { + if (alpha_size == 2 * shape[0]) { + const int min_value = -(1 << (iDataNeedBits - 1)); + auto alphaPtr = alpha_ptr; + int area = Size / shape[0]; + for (int i = 0; i < shape[0]; i++) { + float min = alphaPtr[2*i]; + float scale = alphaPtr[2*i+1]; + int zeroQuant = min_value; + if (scale > 1e-6) { + zeroQuant = round((0.0f - min) / scale) + min_value; + } + memset(blob+area*i, zeroQuant, area * sizeof(signed char)); + } + } else { + memset(blob, 0, Size * sizeof(signed char)); //backward compability with previous symmetric weight quant + } + int iPreIdx = 0; + for (int i = 0; i < nnz; i++) { + iPreIdx += arrIdx[i]; + int found = 0; + int8_t value = FindInMap(mapWeight, arrWeightIdx[i], &found); + if (!found) { + MNN_ERROR("Read quan weights error with idx:%d\n", arrWeightIdx[i]); + MNNMemoryFreeAlign(blob); + return nullptr; + } + blob[iPreIdx] = value; + } + } + *len = Size; + return blob; +} + + +} // namespace IDSTDecoder + +#endif // IDSTDECODER_HPP diff --git a/tools/cpp/IDSTEncoder.hpp b/source/core/IDSTEncoder.hpp similarity index 100% rename from tools/cpp/IDSTEncoder.hpp rename to source/core/IDSTEncoder.hpp diff --git a/source/common/MemoryFormater.h b/source/core/MemoryFormater.h similarity index 100% rename from source/common/MemoryFormater.h rename to source/core/MemoryFormater.h diff --git a/source/core/OpCommonUtils.cpp b/source/core/OpCommonUtils.cpp index c36635e45..405b9d9bb 100644 --- a/source/core/OpCommonUtils.cpp +++ b/source/core/OpCommonUtils.cpp @@ -572,6 +572,7 @@ bool OpCommonUtils::opCompabilityForLowp(const Op* op, int bytes) { case OpType_ROIPooling: case OpType_ROIAlign: case OpType_DynamicQuant: + case OpType_Attention: return true; default: break; diff --git a/source/core/Pipeline.cpp b/source/core/Pipeline.cpp index 3be39b13a..641120d2f 100644 --- a/source/core/Pipeline.cpp +++ b/source/core/Pipeline.cpp @@ -901,7 +901,8 @@ ErrorCode Pipeline::fixResizeCache() { if (info.type != Schedule::CONSTANT) { totalNumber += buffer.command.size(); } - if (info.computeCache.needComputeShape) { + if ((!info.computeCache.canCache()) && info.computeCache.needComputeShape) { + // If the session has been resized and the op is checked will change shape, set as shape mutable info.computeCache.close(false); continue; } diff --git a/source/core/Schedule.cpp b/source/core/Schedule.cpp index 74b949941..475708567 100644 --- a/source/core/Schedule.cpp +++ b/source/core/Schedule.cpp @@ -36,7 +36,7 @@ void Schedule::OpResizeCache::addContentIndex(int index) { mNeedCompareContent.emplace_back(index); } -bool Schedule::OpResizeCache::match(const std::vector& inputs) { +bool Schedule::OpResizeCache::match(const std::vector& inputs, bool& compared) { if (!mCanCache) { return mPass; } @@ -46,6 +46,7 @@ bool Schedule::OpResizeCache::match(const std::vector& inputs) { if (mInputInfos.size() != inputs.size()) { return false; } + compared = true; for (int u=0; udimensionFormat) { @@ -55,12 +56,10 @@ bool Schedule::OpResizeCache::match(const std::vector& inputs) { return false; } if (mInputInfos[u].dim.size() != inputs[u]->dimensions()) { - mCanCache = false; return false; } for (int v=0; vlength(v)) { - mCanCache = false; return false; } } @@ -72,7 +71,6 @@ bool Schedule::OpResizeCache::match(const std::vector& inputs) { auto t = inputs[dim]; auto& s = mInputInfos[dim]; if (0 != ::memcmp(s.buffer.data(), t->host(), s.buffer.size())) { - mCanCache = false; return false; } } diff --git a/source/core/Schedule.hpp b/source/core/Schedule.hpp index e05c3133c..83e5da7c2 100644 --- a/source/core/Schedule.hpp +++ b/source/core/Schedule.hpp @@ -35,7 +35,7 @@ class MNN_PUBLIC Schedule { }; class OpResizeCache { public: - bool match(const std::vector& inputs); + bool match(const std::vector& inputs, bool& compared); void insert(const std::vector& inputs); void close(bool pass = false); void open(); @@ -43,6 +43,9 @@ class MNN_PUBLIC Schedule { bool needExecuteConst = false; void addContentIndex(int index); void copyImmutable(const OpResizeCache& cache); + bool canCache() const { + return mCanCache; + } private: struct ShapeInfo { int order; diff --git a/source/common/WinogradInt8Attr.hpp b/source/core/WinogradInt8Attr.hpp similarity index 100% rename from source/common/WinogradInt8Attr.hpp rename to source/core/WinogradInt8Attr.hpp diff --git a/source/geometry/GeometryComputer.cpp b/source/geometry/GeometryComputer.cpp index dae9f9e56..29a34cade 100644 --- a/source/geometry/GeometryComputer.cpp +++ b/source/geometry/GeometryComputer.cpp @@ -84,6 +84,201 @@ static bool _virtualMemory(Tensor::InsideDescribe::NativeInsideDescribe* des) { return des->memoryType == Tensor::InsideDescribe::MEMORY_VIRTUAL && nullptr == des->rasterCommand.lock().get(); } +bool GeometryComputer::ComputePermuteRegion(Tensor* input, Tensor* output, int* newshape, int shapeDim) { + auto inputDes = TensorUtils::getDescribe(input); + auto outputDes = TensorUtils::getDescribe(output); + MNN_ASSERT(input->dimensions() >= 1); + MNN_ASSERT(output->dimensions() == input->dimensions()); + MNN_ASSERT(shapeDim == input->dimensions()); + auto originTensor = input; + int shape[MNN_MAX_TENSOR_DIM]; + if (nullptr != newshape) { + for (int i = 0; i < input->buffer().dimensions; ++i) { + shape[i] = newshape[i]; + } + } else { + for (int i = 0; i < input->buffer().dimensions; ++i) { + shape[i] = input->buffer().dimensions - i - 1; + } + } + + int inputShape[MNN_MAX_TENSOR_DIM]; + int inputStrides[MNN_MAX_TENSOR_DIM]; + int inputShapeSize = 0; + int preAxis = -2; + for (int i=0; ibuffer().dimensions; ++i) { + auto axis = shape[i]; + auto len = input->length(axis); + if (1 == len) { + continue; + } + if (axis - preAxis == 1) { + // Fuse dimension if possible + inputShape[inputShapeSize - 1] *= len; + } else { + if (preAxis >= 0) { + // Compute last stride + int stride = 1; + for (int v=preAxis+1; v < input->buffer().dimensions; ++v) { + stride *= input->length(v); + } + inputStrides[inputShapeSize - 1] = stride; + } + inputShapeSize+=1; + inputShape[inputShapeSize - 1] = len; + } + preAxis = shape[i]; + } + if (preAxis >= 0) { + // Compute last stride + int stride = 1; + for (int v=preAxis+1; v < input->buffer().dimensions; ++v) { + stride *= input->length(v); + } + inputStrides[inputShapeSize - 1] = stride; + } + if (0 == inputShapeSize) { + outputDes->memoryType = Tensor::InsideDescribe::MEMORY_VIRTUAL; + outputDes->regions = {TensorUtils::makeFullSlice(input)}; + return true; + } + int outputStrides[MNN_MAX_TENSOR_DIM]; + { + int stride = 1; + for (int i=inputShapeSize-1; i>=0; --i) { + outputStrides[i] = stride; + stride *= inputShape[i]; + } + } + /** Move max three inputShapeSize to last three location. + * Don't change max three number relative position + * */ +bool isReorderShape = false; +isReorderShape = (inputShapeSize > 4); + if (inputShapeSize == 4) { + // TODO: Opt this logic + isReorderShape = (inputShape[0] > inputShape[1] + inputShape[2] + inputShape[3]); + } + if (isReorderShape) { + int max1 = inputShape[0], max2 = -1, max3 = -1; + // Find Max Three Number + for (int i = 1; i < inputShapeSize; i++) { + if (inputShape[i] > max1) { + max3 = max2; + max2 = max1; + max1 = inputShape[i]; + } else if (inputShape[i] > max2) { + max3 = max2; + max2 = inputShape[i]; + } + else if (inputShape[i] > max3) { + max3 = inputShape[i]; + } + } + + // Move Max Three Number to Last Location + int lastIndex = inputShapeSize-1; + for (int i = inputShapeSize-1; i >= 0; i--) { + if (inputShape[i] == max1) { + if(i != lastIndex) { + std::swap(inputShape[i], inputShape[lastIndex]); + std::swap(inputStrides[i], inputStrides[lastIndex]); + std::swap(outputStrides[i], outputStrides[lastIndex]); + } + max1 = -1; + lastIndex--; + } else if (inputShape[i] == max2) { + if(i != lastIndex) { + std::swap(inputShape[i], inputShape[lastIndex]); + std::swap(inputStrides[i], inputStrides[lastIndex]); + std::swap(outputStrides[i], outputStrides[lastIndex]); + } + max2 = -1; + lastIndex--; + } else if (inputShape[i] == max3) { + if(i != lastIndex) { + std::swap(inputShape[i], inputShape[lastIndex]); + std::swap(inputStrides[i], inputStrides[lastIndex]); + std::swap(outputStrides[i], outputStrides[lastIndex]); + } + max3 = -1; + lastIndex--; + } + if(lastIndex < inputShapeSize-3) { + break; + } + } + } +// Compute inside, outside, axis + int inside = 1; + int insideStride = 0; + int outside = 1; + int outsideStride = 0; + int axis = 1; + int axisStride = 0; + int breakAxis = -1; + int remainSize = 1; + int outputInsideStride = 0; + int outputAxisStride = 0; + int outputOutsideStride = 0; + { + if (inputShapeSize >= 1) { + inside = inputShape[inputShapeSize-1]; + insideStride = inputStrides[inputShapeSize-1]; + outputInsideStride = outputStrides[inputShapeSize-1]; + } + if (inputShapeSize >= 2) { + axis = inputShape[inputShapeSize-2]; + axisStride = inputStrides[inputShapeSize-2]; + outputAxisStride = outputStrides[inputShapeSize-2]; + } + if (inputShapeSize >= 3) { + outside = inputShape[inputShapeSize-3]; + outsideStride = inputStrides[inputShapeSize-3]; + outputOutsideStride = outputStrides[inputShapeSize-3]; + breakAxis = inputShapeSize - 3; + for (int i = 0; i < inputShapeSize - 3; ++i) { + remainSize *= inputShape[i]; + } + } + } + outputDes->regions.resize(remainSize); + outputDes->memoryType = Tensor::InsideDescribe::MEMORY_VIRTUAL; + int32_t mod[MNN_MAX_TENSOR_DIM]; + for (int i = 0; i < breakAxis; ++i) { + int value = 1; + for (int j = i + 1; j < breakAxis; ++j) { + value *= inputShape[j]; + } + mod[i] = value; + } + for (int indice = 0; indice < remainSize; ++indice) { + int value = indice; + int inputOffset = 0; + int outputOffset = 0; + for (int i = 0; i < breakAxis; ++i) { + auto coordinate = value / mod[i]; + inputOffset += coordinate * inputStrides[i]; + outputOffset += coordinate * outputStrides[i]; + value = value % mod[i]; + } + Tensor::InsideDescribe::Region& slice = outputDes->regions[indice]; + slice.src.offset = inputOffset; + slice.src.stride[0] = outsideStride; + slice.size[0] = outside; + slice.src.stride[1] = axisStride; + slice.size[1] = axis; + slice.src.stride[2] = insideStride; + slice.size[2] = inside; + slice.origin = originTensor; + slice.dst.offset = outputOffset; + slice.dst.stride[0] = outputOutsideStride; + slice.dst.stride[1] = outputAxisStride; + slice.dst.stride[2] = outputInsideStride; + } + return true; +} + void GeometryComputer::Context::getRasterCacheCreateRecursive(Tensor* src, CommandBuffer& cmd) { auto srcDes = TensorUtils::getDescribe(src); if (!_virtualMemory(srcDes)) { diff --git a/source/geometry/GeometryComputer.hpp b/source/geometry/GeometryComputer.hpp index f603d361c..a049be684 100644 --- a/source/geometry/GeometryComputer.hpp +++ b/source/geometry/GeometryComputer.hpp @@ -61,6 +61,7 @@ class GeometryComputer { Context& context, CommandBuffer& cmd) const { return false; } + static bool ComputePermuteRegion(Tensor* input, Tensor* output, int* newshape, int shapeDim); }; class DefaultGeometryComputer : public GeometryComputer { diff --git a/source/geometry/GeometryComputerUtils.cpp b/source/geometry/GeometryComputerUtils.cpp index 0dc328691..54607eab6 100644 --- a/source/geometry/GeometryComputerUtils.cpp +++ b/source/geometry/GeometryComputerUtils.cpp @@ -182,7 +182,12 @@ ErrorCode GeometryComputerUtils::shapeComputeAndGeometryTransform( for (auto t : info.outputs) { TensorUtils::getDescribe(t)->stageMask &= (~Tensor::InsideDescribe::StageInfo::COMPUTE_SHAPE_STAGE); } - bool needCompute = !info.computeCache.match(info.inputs); + bool compared = false; + bool needCompute = !info.computeCache.match(info.inputs, compared); + if (needCompute && compared) { + // If not match, means the op's shape is mutable, close cache and don't compare + info.computeCache.close(false); + } if ((!skipShapeCompute) && needCompute) { auto res = SizeComputer::computeOutputSize(info.op, info.inputs, info.outputs); if (!res) { @@ -468,6 +473,44 @@ std::shared_ptr GeometryComputerUtils::makeReduce(ReductionType type, T cmd.op = flatbuffers::GetRoot(cmd.buffer->buffer()); return cmdP; } +std::shared_ptr GeometryComputerUtils::makeLayerNorm(Tensor* input0, Tensor* output, std::vector axis, float epsilon, std::vector gamma, std::vector beta, std::vector external, int group, bool useRMS) { + flatbuffers::FlatBufferBuilder builder(DEFAULT_ALLOCATE_SIZE); + std::vector g, b; + auto vecaxis = builder.CreateVector(axis); + auto vecgamma = builder.CreateVector(g); + auto vecbeta = builder.CreateVector(b); + if (gamma.size() > 0 && beta.size() > 0) { + vecgamma = builder.CreateVector(gamma.data(), gamma.size()); + vecbeta = builder.CreateVector(beta.data(), beta.size()); + } + + auto vecexternal = builder.CreateVector(external); + LayerNormBuilder builder_(builder); + builder_.add_axis(vecaxis); + builder_.add_group(group); + builder_.add_epsilon(epsilon); + if (gamma.size() > 0 && beta.size() > 0) { + builder_.add_gamma(vecgamma); + builder_.add_beta(vecbeta); + } + + builder_.add_useRMSNorm(useRMS); + builder_.add_external(vecexternal); + auto mainOffset = builder_.Finish().Union(); + OpBuilder opB(builder); + opB.add_type(OpType_LayerNorm); + opB.add_main(mainOffset); + opB.add_main_type(OpParameter_LayerNorm); + builder.Finish(opB.Finish()); + std::shared_ptr cmdP(new Command); + auto& cmd = *cmdP; + cmd.buffer.reset(new BufferStorage); + cmd.buffer->storage = builder.ReleaseRaw(cmd.buffer->allocated_size, cmd.buffer->offset); + cmd.inputs = {input0}; + cmd.outputs = {output}; + cmd.op = flatbuffers::GetRoot(cmd.buffer->buffer()); + return cmdP; +} std::shared_ptr GeometryComputerUtils::makeUnary(UnaryOpOperation type, Tensor* input0, Tensor* output) { flatbuffers::FlatBufferBuilder builder(DEFAULT_ALLOCATE_SIZE); UnaryOpBuilder builder_(builder); diff --git a/source/geometry/GeometryComputerUtils.hpp b/source/geometry/GeometryComputerUtils.hpp index 4fc26c449..4da7210ae 100644 --- a/source/geometry/GeometryComputerUtils.hpp +++ b/source/geometry/GeometryComputerUtils.hpp @@ -20,6 +20,7 @@ class GeometryComputerUtils { static std::shared_ptr makeBinary(int type, Tensor* input0, Tensor* input1, Tensor* output); static std::shared_ptr makeReduce(ReductionType type, Tensor* input0, Tensor* output); static std::shared_ptr makeUnary(UnaryOpOperation type, Tensor* input0, Tensor* output); + static std::shared_ptr makeLayerNorm(Tensor* input0, Tensor* output, std::vector axis, float epsilon, std::vector gamma, std::vector beta, std::vector external, int group = 1, bool useRMS = false); static std::shared_ptr makeMatMul(Tensor* input0, Tensor* input1, Tensor* output, Tensor* Bias = nullptr, bool transposeA = false, bool transposeB = false); static flatbuffers::Offset makePool(flatbuffers::FlatBufferBuilder& builder, std::pair kernel, std::pair stride, PoolType type, MNN::PoolPadType pad, std::pair pads, bool isglobal, AvgPoolCountType countType = AvgPoolCountType_DEFAULT); diff --git a/source/geometry/GeometryLayernorm.cpp b/source/geometry/GeometryLayernorm.cpp new file mode 100644 index 000000000..120a95c91 --- /dev/null +++ b/source/geometry/GeometryLayernorm.cpp @@ -0,0 +1,138 @@ +// +// GeometryLayerNorm.cpp +// MNN +// +// Created by MNN on 2020/06/09. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include "geometry/GeometryComputer.hpp" +#include "geometry/GeometryComputerUtils.hpp" +#include "core/OpCommonUtils.hpp" +namespace MNN { + +class GeometryLayerNorm : public GeometryComputer { +public: + virtual bool onCompute(const Op* op, const std::vector& inputs, const std::vector& outputs, + Context& context, CommandBuffer& res) const override { + /* Target: Ensure reduce dimensions must be a sequence subset [-rank,...,rank-1] */ + MNN_ASSERT(1 == outputs.size()); + MNN_ASSERT(1 == inputs.size()); + auto layernorm = op->main_as_LayerNorm(); + if (!layernorm->axis()) { + std::shared_ptr cmdP(new Command); + auto& cmd = *cmdP; + cmd.op = op; + cmd.inputs = {inputs[0]}; + cmd.outputs = std::move(outputs); + res.command.emplace_back(std::move(cmdP)); + return true; + } + auto reduceDims = layernorm->axis()->data(); + int reduceDimensionCount = layernorm->axis()->size(); + auto inputShape = inputs[0]->shape(); + auto outputShape = outputs[0]->shape(); + int rank = static_cast(inputShape.size()); + + // Case1: Do not need permute + bool needPermute = true; + if (reduceDims[0] < 0 && reduceDims[reduceDimensionCount - 1] == -1) { // [-r,-r+1...] + needPermute = false; + } + if (reduceDims[reduceDimensionCount - 1] > 0 && reduceDims[reduceDimensionCount - 1] == rank - 1 ) { // [...,r-2,r-1] + needPermute = false; + } + if (reduceDims[0] == 0 && rank == 1) { // reduce dim:[0], input dimensions=1 + needPermute = false; + } + std::vector lastdims(reduceDimensionCount); + for (int i = 0; i < reduceDimensionCount; ++i) { + lastdims[i] = (reduceDims[i] + rank) % rank; + } + if (false == needPermute) { + std::shared_ptr cmdP(new Command); + auto& cmd = *cmdP; + cmd.op = op; + cmd.inputs = {inputs[0]}; + cmd.outputs = std::move(outputs); + res.command.emplace_back(std::move(cmdP)); + return true; + } + // Case2 : Need permute + int oldorder[MNN_MAX_TENSOR_DIM]; + int neworder[MNN_MAX_TENSOR_DIM]; + + { + int di = 0; + int idx = 0; + while (di < rank) { + if (di < lastdims[0] || di > lastdims[reduceDimensionCount - 1]) { + neworder[idx++] = di; + } + di++; + } + for (int i = 0; i < reduceDimensionCount; ++i) { + neworder[idx++] = lastdims[i]; + } + } + { + int idx = 0; + for (int i = 0; i < rank; ++i) { + int j = 0; + while (i != neworder[j]) { + ++j; + } + oldorder[idx++] = j; + } + } + std::vector newshape; + for (int i = 0; i < rank; ++i) { + newshape.emplace_back(inputShape[neworder[i]]); + } + + std::shared_ptr outputTensorPermute(Tensor::createDevice(newshape, inputs[0]->getType(), inputs[0]->getDimensionType())); + res.extras.emplace_back(outputTensorPermute); + GeometryComputer::ComputePermuteRegion(inputs[0], outputTensorPermute.get(), neworder, rank); + + // Create LayerNorm command + auto currentInput = outputTensorPermute.get(); + float epislon = layernorm->epsilon(); + bool useRMS = layernorm->useRMSNorm(); + std::vector externalData; + if (layernorm->external()) { + externalData.resize(3); + externalData = {layernorm->external()->data()[0], layernorm->external()->data()[1], layernorm->external()->data()[2]}; + } + std::vector gamma, beta; + if (layernorm->gamma() && layernorm->beta()) { + int gammaSize = layernorm->gamma()->size(); + gamma.resize(gammaSize); + beta.resize(gammaSize); + int group = layernorm->group(); + ::memcpy(gamma.data(), layernorm->gamma()->data(), gammaSize * sizeof(float)); + ::memcpy(beta.data(), layernorm->beta()->data(), gammaSize * sizeof(float)); + } + std::shared_ptr inputTensorLayernorm(Tensor::createDevice(newshape, inputs[0]->getType(), inputs[0]->getDimensionType())); + auto des = TensorUtils::getDescribe(inputTensorLayernorm.get()); + des->memoryType = Tensor::InsideDescribe::MEMORY_VIRTUAL; + des->regions = {TensorUtils::makeFullSlice(currentInput)}; + res.extras.emplace_back(inputTensorLayernorm); + std::shared_ptr outputTensorLayerNorm(Tensor::createDevice(newshape, inputs[0]->getType(), inputs[0]->getDimensionType())); + res.extras.emplace_back(outputTensorLayerNorm); + { + auto cmd = GeometryComputerUtils::makeLayerNorm(inputTensorLayernorm.get(), outputTensorLayerNorm.get(), lastdims, epislon, gamma, beta, externalData, 1, useRMS); + res.command.emplace_back(std::move(cmd)); + } + + GeometryComputer::ComputePermuteRegion(outputTensorLayerNorm.get(), outputs[0], oldorder, rank); + return true; + } +}; +static void _create() { + std::shared_ptr comp(new GeometryLayerNorm); + GeometryComputer::registerGeometryComputer(comp, {OpType_LayerNorm}); +} + +REGISTER_GEOMETRY(GeometryLayerNorm, _create); + +} // namespace MNN diff --git a/source/geometry/GeometryOPRegister.cpp b/source/geometry/GeometryOPRegister.cpp index 023b08a50..91a743a1a 100644 --- a/source/geometry/GeometryOPRegister.cpp +++ b/source/geometry/GeometryOPRegister.cpp @@ -40,6 +40,7 @@ extern void ___GeometrySlice___create__(); extern void ___GeometryConcat___create__(); extern void ___GeometryUnary___create__(); extern void ___GeometryBinary___create__(); +extern void ___GeometryLayerNorm___create__(); void registerGeometryOps() { ___GeometryShape___create__(); @@ -81,5 +82,6 @@ ___GeometrySlice___create__(); ___GeometryConcat___create__(); ___GeometryUnary___create__(); ___GeometryBinary___create__(); +___GeometryLayerNorm___create__(); } } diff --git a/source/geometry/GeometryPermute.cpp b/source/geometry/GeometryPermute.cpp index a1e306793..0daa639cc 100644 --- a/source/geometry/GeometryPermute.cpp +++ b/source/geometry/GeometryPermute.cpp @@ -14,209 +14,30 @@ class GeometryPermute : public GeometryComputer { public: virtual bool onCompute(const Op* op, const std::vector& inputs, const std::vector& outputs, Context& context, CommandBuffer& res) const override { - auto input = inputs[0]; - auto output = outputs[0]; - auto inputDes = TensorUtils::getDescribe(input); - auto outputDes = TensorUtils::getDescribe(output); - auto inputSlice = inputDes->regions; - MNN_ASSERT(input->dimensions() >= 1); - MNN_ASSERT(output->dimensions() == input->dimensions()); - auto originTensor = input; - int shape[MNN_MAX_TENSOR_DIM]; + int dims = inputs[0]->buffer().dimensions; + int neworder[MNN_MAX_TENSOR_DIM]; + // get neworder if (op->type() == OpType_Permute) { auto shapeValue = op->main_as_Permute()->dims(); if (nullptr != shapeValue) { - for (int i = 0; i < input->buffer().dimensions; ++i) { - shape[i] = shapeValue->data()[i]; + for (int i = 0; i < dims; ++i) { + neworder[i] = shapeValue->data()[i]; } } else { - for (int i = 0; i < input->buffer().dimensions; ++i) { - shape[i] = input->buffer().dimensions - i - 1; + for (int i = 0; i < dims; ++i) { + neworder[i] = dims - i - 1; } } } else if (op->type() == OpType_Transpose) { + MNN_ASSERT(inputs.size() > 1); auto shapeValue = inputs[1]->host(); - for (int i = 0; i < input->buffer().dimensions; ++i) { - shape[i] = shapeValue[i]; + for (int i = 0; i < dims; ++i) { + neworder[i] = shapeValue[i]; } } else { MNN_ASSERT(false); } - int inputShape[MNN_MAX_TENSOR_DIM]; - int inputStrides[MNN_MAX_TENSOR_DIM]; - int inputShapeSize = 0; - int preAxis = -2; - for (int i=0; ibuffer().dimensions; ++i) { - auto axis = shape[i]; - auto len = input->length(axis); - if (1 == len) { - continue; - } - if (axis - preAxis == 1) { - // Fuse dimension if possible - inputShape[inputShapeSize - 1] *= len; - } else { - if (preAxis >= 0) { - // Compute last stride - int stride = 1; - for (int v=preAxis+1; v < input->buffer().dimensions; ++v) { - stride *= input->length(v); - } - inputStrides[inputShapeSize - 1] = stride; - } - inputShapeSize+=1; - inputShape[inputShapeSize - 1] = len; - } - preAxis = shape[i]; - } - if (preAxis >= 0) { - // Compute last stride - int stride = 1; - for (int v=preAxis+1; v < input->buffer().dimensions; ++v) { - stride *= input->length(v); - } - inputStrides[inputShapeSize - 1] = stride; - } - if (0 == inputShapeSize) { - outputDes->memoryType = Tensor::InsideDescribe::MEMORY_VIRTUAL; - outputDes->regions = {TensorUtils::makeFullSlice(input)}; - return true; - } - int outputStrides[MNN_MAX_TENSOR_DIM]; - { - int stride = 1; - for (int i=inputShapeSize-1; i>=0; --i) { - outputStrides[i] = stride; - stride *= inputShape[i]; - } - } - /** Move max three inputShapeSize to last three location. - * Don't change max three number relative position - * */ - bool isReorderShape = false; - isReorderShape = (inputShapeSize > 4); - if (inputShapeSize == 4) { - // TODO: Opt this logic - isReorderShape = (inputShape[0] > inputShape[1] + inputShape[2] + inputShape[3]); - } - if (isReorderShape) { - int max1 = inputShape[0], max2 = -1, max3 = -1; - // Find Max Three Number - for (int i = 1; i < inputShapeSize; i++) { - if (inputShape[i] > max1) { - max3 = max2; - max2 = max1; - max1 = inputShape[i]; - } else if (inputShape[i] > max2) { - max3 = max2; - max2 = inputShape[i]; - } - else if (inputShape[i] > max3) { - max3 = inputShape[i]; - } - } - - // Move Max Three Number to Last Location - int lastIndex = inputShapeSize-1; - for (int i = inputShapeSize-1; i >= 0; i--) { - if (inputShape[i] == max1) { - if(i != lastIndex) { - std::swap(inputShape[i], inputShape[lastIndex]); - std::swap(inputStrides[i], inputStrides[lastIndex]); - std::swap(outputStrides[i], outputStrides[lastIndex]); - } - max1 = -1; - lastIndex--; - } else if (inputShape[i] == max2) { - if(i != lastIndex) { - std::swap(inputShape[i], inputShape[lastIndex]); - std::swap(inputStrides[i], inputStrides[lastIndex]); - std::swap(outputStrides[i], outputStrides[lastIndex]); - } - max2 = -1; - lastIndex--; - } else if (inputShape[i] == max3) { - if(i != lastIndex) { - std::swap(inputShape[i], inputShape[lastIndex]); - std::swap(inputStrides[i], inputStrides[lastIndex]); - std::swap(outputStrides[i], outputStrides[lastIndex]); - } - max3 = -1; - lastIndex--; - } - if(lastIndex < inputShapeSize-3) { - break; - } - } - } - // Compute inside, outside, axis - int inside = 1; - int insideStride = 0; - int outside = 1; - int outsideStride = 0; - int axis = 1; - int axisStride = 0; - int breakAxis = -1; - int remainSize = 1; - int outputInsideStride = 0; - int outputAxisStride = 0; - int outputOutsideStride = 0; - { - if (inputShapeSize >= 1) { - inside = inputShape[inputShapeSize-1]; - insideStride = inputStrides[inputShapeSize-1]; - outputInsideStride = outputStrides[inputShapeSize-1]; - } - if (inputShapeSize >= 2) { - axis = inputShape[inputShapeSize-2]; - axisStride = inputStrides[inputShapeSize-2]; - outputAxisStride = outputStrides[inputShapeSize-2]; - } - if (inputShapeSize >= 3) { - outside = inputShape[inputShapeSize-3]; - outsideStride = inputStrides[inputShapeSize-3]; - outputOutsideStride = outputStrides[inputShapeSize-3]; - breakAxis = inputShapeSize - 3; - for (int i = 0; i < inputShapeSize - 3; ++i) { - remainSize *= inputShape[i]; - } - } - } - outputDes->regions.resize(remainSize); - outputDes->memoryType = Tensor::InsideDescribe::MEMORY_VIRTUAL; - int32_t mod[MNN_MAX_TENSOR_DIM]; - for (int i = 0; i < breakAxis; ++i) { - int value = 1; - for (int j = i + 1; j < breakAxis; ++j) { - value *= inputShape[j]; - } - mod[i] = value; - } - for (int indice = 0; indice < remainSize; ++indice) { - int value = indice; - int inputOffset = 0; - int outputOffset = 0; - for (int i = 0; i < breakAxis; ++i) { - auto coordinate = value / mod[i]; - inputOffset += coordinate * inputStrides[i]; - outputOffset += coordinate * outputStrides[i]; - value = value % mod[i]; - } - Tensor::InsideDescribe::Region& slice = outputDes->regions[indice]; - slice.src.offset = inputOffset; - slice.src.stride[0] = outsideStride; - slice.size[0] = outside; - slice.src.stride[1] = axisStride; - slice.size[1] = axis; - slice.src.stride[2] = insideStride; - slice.size[2] = inside; - slice.origin = originTensor; - slice.dst.offset = outputOffset; - slice.dst.stride[0] = outputOutsideStride; - slice.dst.stride[1] = outputAxisStride; - slice.dst.stride[2] = outputInsideStride; - } - return true; + return GeometryComputer::ComputePermuteRegion(inputs[0], outputs[0], neworder, dims); } }; static void _create() { diff --git a/source/math/Vec.hpp b/source/math/Vec.hpp index 8f992dffd..5e28154d5 100644 --- a/source/math/Vec.hpp +++ b/source/math/Vec.hpp @@ -296,10 +296,10 @@ struct Vec { vec1.value = m0m1.val[1]; vec2.value = m2m3.val[0]; vec3.value = m2m3.val[1]; - vec0.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64(m2m3.val[0], 0), vec0.value, 1)); - vec1.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64(m2m3.val[1], 0), vec1.value, 1)); - vec2.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64(m0m1.val[0], 1), vec2.value, 0)); - vec3.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64(m0m1.val[1], 1), vec3.value, 0)); + vec0.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64((int64x2_t)m2m3.val[0], 0), (int64x2_t)vec0.value, 1)); + vec1.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64((int64x2_t)m2m3.val[1], 0), (int64x2_t)vec1.value, 1)); + vec2.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64((int64x2_t)m0m1.val[0], 1), (int64x2_t)vec2.value, 0)); + vec3.value = (int32x4_t)(vsetq_lane_s64(vgetq_lane_s64((int64x2_t)m0m1.val[1], 1), (int64x2_t)vec3.value, 0)); #endif } diff --git a/source/shape/ShapeAttention.cpp b/source/shape/ShapeAttention.cpp index 525266449..9b59c1b38 100644 --- a/source/shape/ShapeAttention.cpp +++ b/source/shape/ShapeAttention.cpp @@ -5,12 +5,13 @@ // Created by MNN on 2023/09/10. // Copyright © 2018, Alibaba Group Holding Limited // -#ifdef MNN_SUPPORT_TRANSFORMER_FUSE #include "shape/SizeComputer.hpp" #include "core/Macro.h" #include "core/TensorUtils.hpp" + namespace MNN { +#ifdef MNN_SUPPORT_TRANSFORMER_FUSE class FmhaV2SizeComputer : public SizeComputer { virtual bool onComputeSize(const MNN::Op* op, const std::vector& inputs, @@ -18,7 +19,7 @@ class FmhaV2SizeComputer : public SizeComputer { auto input0 = inputs[0], output0 = outputs[0]; MNN_ASSERT(inputs.size() == 1); MNN_ASSERT(input0->buffer().dimensions == 3); - + output0->buffer().dim[0].extent = input0->buffer().dim[0].extent; output0->buffer().dim[1].extent = input0->buffer().dim[1].extent; output0->buffer().dim[2].extent = input0->buffer().dim[2].extent/3; @@ -42,7 +43,7 @@ class FmhcaSizeComputer : public SizeComputer { auto output0 = outputs[0]; MNN_ASSERT(input0->buffer().dimensions == 3); MNN_ASSERT(input1->buffer().dimensions == 3); - + output0->buffer().dim[0].extent = input0->buffer().dim[0].extent; output0->buffer().dim[1].extent = input0->buffer().dim[1].extent; output0->buffer().dim[2].extent = input0->buffer().dim[2].extent; @@ -56,8 +57,27 @@ class FmhcaSizeComputer : public SizeComputer { return true; } }; + +class AttentionSizeComputer : public SizeComputer { + virtual bool onComputeSize(const MNN::Op* op, const std::vector& inputs, + const std::vector& outputs) const override { + auto input = inputs[0], output = outputs[0]; + MNN_ASSERT(input->buffer().dimensions == 4); + output->buffer().dim[0].extent = input->buffer().dim[0].extent; + output->buffer().dim[1].extent = input->buffer().dim[1].extent; + output->buffer().dim[2].extent = input->buffer().dim[2].extent * input->buffer().dim[3].extent; + output->buffer().dimensions = 3; + output->buffer().type = input->buffer().type; + TensorUtils::getDescribe(output)->dimensionFormat = TensorUtils::getDescribe(input)->dimensionFormat; + return true; + } +}; + + REGISTER_SHAPE_INPUTS_TRANSFORMER_FUSE(FmhaV2SizeComputer, OpType_FmhaV2); REGISTER_SHAPE_INPUTS_TRANSFORMER_FUSE(FmhcaSizeComputer, OpType_Fmhca); +REGISTER_SHAPE_INPUTS_TRANSFORMER_FUSE(AttentionSizeComputer, OpType_Attention); +#endif } // namespace MNN -#endif + diff --git a/source/shape/ShapeRegister.cpp b/source/shape/ShapeRegister.cpp index 2c2615817..4763d7ab5 100644 --- a/source/shape/ShapeRegister.cpp +++ b/source/shape/ShapeRegister.cpp @@ -119,6 +119,7 @@ extern void ___SplitGeLUSizeComputer__OpType_SplitGeLU__(); extern void ___SeqLen2SpatialSizeComputer__OpType_SeqLen2Spatial__(); extern void ___FmhaV2SizeComputer__OpType_FmhaV2__(); extern void ___FmhcaSizeComputer__OpType_Fmhca__(); +extern void ___AttentionSizeComputer__OpType_Attention__(); #endif void registerShapeOps() { ___ShapeSizeComputer__OpType_Shape__(); @@ -239,6 +240,7 @@ ___SplitGeLUSizeComputer__OpType_SplitGeLU__(); ___SeqLen2SpatialSizeComputer__OpType_SeqLen2Spatial__(); ___FmhaV2SizeComputer__OpType_FmhaV2__(); ___FmhcaSizeComputer__OpType_Fmhca__(); +___AttentionSizeComputer__OpType_Attention__(); #endif } } diff --git a/test.sh b/test.sh index 5dc09f3f7..0d0e90e1b 100755 --- a/test.sh +++ b/test.sh @@ -42,7 +42,8 @@ SOURCE_CHANGE=$(git show --name-only | grep -E "^source/(internal|backend|core|c PYMNN_CHANGE=$(git show --name-only | grep -E "^pymnn/.*\.(cpp|cc|c|h|hpp|py)$") PY_CHANGE=$(git show --name-only | grep -E "^pymnn/pip_package/MNN/.*\.(py)$") OPENCV_CHANGE=$(git show --name-only | grep -E "^tools/cv/.*\.(cpp|cc|c|h|hpp)$") - +# OPENCL_CHANGE=$(git show --name-only | grep -E "^source/backend/opencl/.*\.(cpp|cc|c|h|hpp)$") +OPENCL_CHANGE=true failed() { printf "TEST_NAME_EXCEPTION: Exception\nTEST_CASE_AMOUNT_EXCEPTION: {\"blocked\":0,\"failed\":1,\"passed\":0,\"skipped\":0}\n" exit 1 @@ -272,11 +273,12 @@ unit_test() { echo '### 多线程单元测试失败,测试终止!' failed fi - - ./run_test.out op 3 1 4 - if [ $? -ne 0 ]; then - echo '### OpenCL单元测试失败,测试终止!' - failed + if [ "$OPENCL_CHANGE" ]; then + ./run_test.out op 3 1 4 + if [ $? -ne 0 ]; then + echo '### OpenCL单元测试失败,测试终止!' + failed + fi fi } @@ -293,10 +295,12 @@ model_test() { failed fi - ../tools/script/modelTest.py ~/AliNNModel 3 0.002 1 - if [ $? -ne 0 ]; then - echo '### OpenCL模型测试失败,测试终止!' - failed + if [ "$OPENCL_CHANGE" ]; then + ../tools/script/modelTest.py ~/AliNNModel 3 0.002 1 + if [ $? -ne 0 ]; then + echo '### OpenCL模型测试失败,测试终止!' + failed + fi fi } @@ -437,7 +441,7 @@ llm_test() { failed fi # 2. run llm model test - ./llm_demo ~/AliNNModel/qwen-1.8b-int4 0 ~/AliNNModel/qwen-1.8b-int4/prompt.txt + ./llm_demo ~/AliNNModel/qwen-1.8b-int4 0 10 ~/AliNNModel/qwen-1.8b-int4/prompt.txt if [ $? -gt 0 ]; then echo '### LLM模型测试失败,测试终止!' failed @@ -508,10 +512,12 @@ android_unit_test() { echo '### Android单元测试FP16-roipooling多线程失败,测试终止!' failed fi - adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op 3 1 4 $1" - if [ $? -ne 0 ]; then - echo '### Android单元测试OpenCL失败,测试终止!' - failed + if [ "$OPENCL_CHANGE" ]; then + adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op 3 1 4 $1" + if [ $? -ne 0 ]; then + echo '### Android单元测试OpenCL失败,测试终止!' + failed + fi fi } android_model_test() { @@ -528,11 +534,13 @@ android_model_test() { else pass_num=$[$pass_num+1] fi - adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/OpTestResource/$model/temp.bin ../AliNNModel/OpTestResource/$model/input_0.txt ../AliNNModel/OpTestResource/$model/output_0.txt 3 0.002 1" - if [ $? -ne 0 ]; then - fail_cl_num=$[$fail_cl_num+1] - else - pass_cl_num=$[$pass_cl_num+1] + if [ "$OPENCL_CHANGE" ]; then + adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/OpTestResource/$model/temp.bin ../AliNNModel/OpTestResource/$model/input_0.txt ../AliNNModel/OpTestResource/$model/output_0.txt 3 0.002 1" + if [ $? -ne 0 ]; then + fail_cl_num=$[$fail_cl_num+1] + else + pass_cl_num=$[$pass_cl_num+1] + fi fi done @@ -545,11 +553,13 @@ android_model_test() { else pass_num=$[$pass_num+1] fi + if [ "$OPENCL_CHANGE" ]; then adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/TestResource/$model/temp.bin ../AliNNModel/TestResource/$model/input_0.txt ../AliNNModel/TestResource/$model/output.txt 3 0.002 1" - if [ $? -ne 0 ]; then - fail_cl_num=$[$fail_cl_num+1] - else - pass_cl_num=$[$pass_cl_num+1] + if [ $? -ne 0 ]; then + fail_cl_num=$[$fail_cl_num+1] + else + pass_cl_num=$[$pass_cl_num+1] + fi fi done @@ -562,11 +572,13 @@ android_model_test() { else pass_num=$[$pass_num+1] fi - adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModelWithDescribe.out ../AliNNModel/TestWithDescribe/$model/temp.bin ../AliNNModel/TestWithDescribe/$model/config.txt 3 0.002 1" - if [ $? -ne 0 ]; then - fail_cl_num=$[$fail_cl_num+1] - else - pass_cl_num=$[$pass_cl_num+1] + if [ "$OPENCL_CHANGE" ]; then + adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModelWithDescribe.out ../AliNNModel/TestWithDescribe/$model/temp.bin ../AliNNModel/TestWithDescribe/$model/config.txt 3 0.002 1" + if [ $? -ne 0 ]; then + fail_cl_num=$[$fail_cl_num+1] + else + pass_cl_num=$[$pass_cl_num+1] + fi fi done printf "TEST_NAME_ANDROID_MODEL_TEST_$1: Android_$1模型测试\nTEST_CASE_AMOUNT_ANDROID_MODEL_TEST_$1: {\"blocked\":0,\"failed\":$fail_num,\"passed\":$pass_num,\"skipped\":0}\n" @@ -574,10 +586,12 @@ android_model_test() { echo '### Android模型测试失败,测试终止!' failed fi - printf "TEST_NAME_ANDROID_MODEL_OPENCL_TEST_$1: Android_$1模型测试\nTEST_CASE_AMOUNT_ANDROID_MODEL_TEST_$1: {\"blocked\":0,\"failed\":$fail_cl_num,\"passed\":$pass_cl_num,\"skipped\":0}\n" - if [ $fail_cl_num -ne 0 ]; then - echo '### Android OpenCL后端模型测试失败,测试终止!' - failed + if [ "$OPENCL_CHANGE" ]; then + printf "TEST_NAME_ANDROID_MODEL_OPENCL_TEST_$1: Android_$1模型测试\nTEST_CASE_AMOUNT_ANDROID_MODEL_TEST_$1: {\"blocked\":0,\"failed\":$fail_cl_num,\"passed\":$pass_cl_num,\"skipped\":0}\n" + if [ $fail_cl_num -ne 0 ]; then + echo '### Android OpenCL后端模型测试失败,测试终止!' + failed + fi fi } android_unit_test_low_memory() { diff --git a/test/CommonOpCreator.hpp b/test/CommonOpCreator.hpp index 64700a253..1097589cd 100644 --- a/test/CommonOpCreator.hpp +++ b/test/CommonOpCreator.hpp @@ -9,7 +9,7 @@ #ifndef CommonOpCreator_hpp #define CommonOpCreator_hpp #include "TestUtils.h" -#include "cpp/IDSTEncoder.hpp" +#include "core/IDSTEncoder.hpp" namespace MNN { static PadMode _convertPadMode(Express::PaddingMode mode) { switch (mode) { diff --git a/test/core/IDSTTest.cpp b/test/core/IDSTTest.cpp index 56d1a4cf7..62e620d60 100644 --- a/test/core/IDSTTest.cpp +++ b/test/core/IDSTTest.cpp @@ -8,7 +8,7 @@ #include "MNNTestSuite.h" #include -#include "cpp/IDSTEncoder.hpp" +#include "core/IDSTEncoder.hpp" #include "core/ConvolutionCommon.hpp" using namespace MNN; diff --git a/test/main.cpp b/test/main.cpp index 06462b152..862ecdc0c 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -27,8 +27,12 @@ int main(int argc, char* argv[]) { int memory = (int)MNN::BackendConfig::Memory_Normal; int thread = 1; const char* flag = ""; + MNN::BackendConfig config; + config.precision = (MNN::BackendConfig::PrecisionMode)precision; + config.memory = (MNN::BackendConfig::MemoryMode)memory; + auto type = MNN_FORWARD_CPU; if (argc > 2) { - auto type = (MNNForwardType)atoi(argv[2]); + type = (MNNForwardType)atoi(argv[2]); FUNC_PRINT(type); if (argc > 3) { precision = atoi(argv[3]); @@ -53,11 +57,16 @@ int main(int argc, char* argv[]) { MNN_ERROR("Invalid memory mode, use 0 instead\n"); memory = 0; } - MNN::BackendConfig config; config.precision = (MNN::BackendConfig::PrecisionMode)precision; config.memory = (MNN::BackendConfig::MemoryMode)memory; - MNN::Express::Executor::getGlobalExecutor()->setGlobalExecutorConfig(type, config, thread); } + auto exe = MNN::Express::Executor::newExecutor(type, config, thread); + if (exe == nullptr) { + MNN_ERROR("Can't create executor with type:%d, exit!\n", type); + return 0; + } + MNN::Express::ExecutorScope scope(exe); + exe->setGlobalExecutorConfig(type, config, thread); if (argc > 1) { auto name = argv[1]; if (strcmp(name, "all") == 0) { diff --git a/test/op/ConvInt8Test.cpp b/test/op/ConvInt8Test.cpp index 89fd3c617..68d25ad65 100644 --- a/test/op/ConvInt8Test.cpp +++ b/test/op/ConvInt8Test.cpp @@ -12,9 +12,9 @@ #include "MNN_generated.h" #include "MNNTestSuite.h" #include "TestUtils.h" -#include "common/CommonCompute.hpp" -#include "common/MemoryFormater.h" -#include "common/WinogradInt8Attr.hpp" +#include "core/CommonCompute.hpp" +#include "core/MemoryFormater.h" +#include "core/WinogradInt8Attr.hpp" #include "math/WingoradGenerater.hpp" #include @@ -271,7 +271,7 @@ class ConvInt8TestCommon : public MNNTestCase { // warm up, do onResize first for shapeDirty x->writeMap(); y->readMap(); - + MNN::Timer _t; const int LOOP = 100; for (int i = 0; i < LOOP; ++i) { @@ -442,10 +442,10 @@ class ConvInt8WinogradTestCommon : public MNNTestCase { public: static VARP referenceWinograd(const VARP xInt, const std::vector& weight, const std::vector& wScale, const std::vector& bias, INTS kernel, INTS channel, INTS pads, const WinogradInt8Attr::Attr& attr, float xScale, float yScale, int8_t xZeroPoint, int8_t yZeroPoint, bool relu) { auto clamp = [](VARP x) {return _Maximum(_Minimum(x, _Scalar(127)), _Scalar(-127));}; - + //auto round = [](VARP x) { return _Round(x); }; auto roundWithEps = [](VARP x) { return _Round(x + _Sign(x) * _Scalar(1e-6)); }; - + auto inDims = xInt->getInfo()->dim; int batch = inDims[0], inH = inDims[2], inW = inDims[3]; int outChannel = channel[1], inChannel = channel[0], kernelH = kernel[1], kernelW = kernel[0]; @@ -453,10 +453,10 @@ class ConvInt8WinogradTestCommon : public MNNTestCase { int outH = inH + 2 * padH - kernelH + 1, outW = inW + 2 * padW - kernelW + 1; int unitH = attr.unitY, unitW = attr.unitX, unitNumH = UP_DIV(outH, unitH), unitNumW = UP_DIV(outW, unitW); int alphaH = unitH + kernelH - 1, alphaW = unitW + kernelW - 1; - + int needH = unitNumH * unitH + kernelH - 1, needW = unitNumW * unitW + kernelW - 1; int paddings[] = {0, 0, 0, 0, padH, needH - inH - padH, padW, needW - inW - padW}; - + auto xx = _Int8ToFloat(xInt, _Scalar(xScale), xZeroPoint); xx = _Convert(xx, NCHW); xx = _Pad(xx, _Const(paddings, {8}, NCHW, halide_type_of())); @@ -470,12 +470,12 @@ class ConvInt8WinogradTestCommon : public MNNTestCase { xx = _MatMul(_MatMul(_Transpose(srcTransH, {1, 0}), xx), srcTransW); // [alphaH * alphaW, ic, N * h_unit_num * w_unit_num] xx = _Reshape(_Transpose(xx, {2, 3, 1, 0}), {alphaH * alphaW, inChannel, -1}); - + // simulate input asym quant auto xxScale = _Const(attr.inputScales.data(), {alphaH * alphaW, 1, 1}, NCHW); auto xxZeroPoint = _Cast(_Const(attr.inputZeroPoints.data(), {alphaH * alphaW, 1, 1}, NCHW, halide_type_of())); xx = (clamp(_Round(xx / xxScale + xxZeroPoint)) - xxZeroPoint) * xxScale; - + auto w = _Const(weight.data(), {outChannel, inChannel, kernelH, kernelW}, NCHW, halide_type_of()); w = _Cast(w) * _Const(wScale.data(), {outChannel, 1, 1, 1}, NCHW); auto wTransH = _Const(genH.G()->host(), {alphaH, kernelH}, NCHW); @@ -539,11 +539,11 @@ class ConvInt8WinogradTestCommon : public MNNTestCase { } } } - + x = _Convert(x, NC4HW4); // For sse we use uint8 instead of int8, use FloatToInt8 to hidden detail x = _FloatToInt8(x, _Scalar(1.0 / xScale), -127, 127, xZeroPoint); - + WinogradInt8Attr attrs; std::vector transInputScales(alpha2, 0.9), transWeightScales(alpha2 * oc, 1.1); std::vector transInputZeroPoint(alpha2, 1); @@ -553,7 +553,7 @@ class ConvInt8WinogradTestCommon : public MNNTestCase { kernel, CAFFE, {1, 1}, {1, 1}, 1, pads, relu, xScale, yScale, xZeroPoint, yZeroPoint, -127, 127, 127, false); y = attrs.turnToWinogradConv(y); - + yTarget = _Convert(_Cast(_Int8ToFloat(yTarget, _Scalar(1.0))), NCHW); y = _Convert(_Cast(_Int8ToFloat(y, _Scalar(1.0))), NCHW); auto yTargetInfo = yTarget->getInfo(), yInfo = y->getInfo(); @@ -575,7 +575,7 @@ class ConvInt8WinogradTestCommon : public MNNTestCase { // warm up, do onResize first for shapeDirty x->writeMap(); y->readMap(); - + MNN::Timer _t; const int LOOP = 20; for (int i = 0; i < LOOP; ++i) { @@ -626,7 +626,7 @@ class ConvSpeedInt8WinogradTest : public ConvInt8WinogradTestCommon { std::vector kernels = { {3, 3}//, {5, 5}, {7, 1}, {1, 7} // {w, h} }; - + std::vector titles = {"3x3", "5x5", "1x7", "7x1"}; for (int i = 0; i < kernels.size(); ++i) { auto res = testKernel(inputShape, kernels[i], channel, pad, {4, 4}, true, titles[i] + ",alpha=4"); diff --git a/test/op/ConvolutionTest.cpp b/test/op/ConvolutionTest.cpp index 8cc334624..f8245b0fe 100644 --- a/test/op/ConvolutionTest.cpp +++ b/test/op/ConvolutionTest.cpp @@ -17,8 +17,8 @@ #include "CommonOpCreator.hpp" #include "core/Session.hpp" #include "core/TensorUtils.hpp" -#include "common/MemoryFormater.h" -#include "common/CommonCompute.hpp" +#include "core/MemoryFormater.h" +#include "core/CommonCompute.hpp" #define TEST_RANDOM_SEED 100 @@ -610,7 +610,7 @@ class ConvolutionInt8CommonTest : public ConvolutionCommonTest { int beginIndex = k * kernel_size; auto absMax = findAbsMax(weightData.data() + beginIndex, kernel_size); wScale[k] = absMax / threshold; - + float* ptr = weightData.data() + beginIndex; for (int i = 0; i < kernel_size; ++i) { int8_t quantVal = (int8_t)(fmax(fmin(round(ptr[i] / wScale[k]), threshold), clampMin)); diff --git a/test/op/LayerNormTest.cpp b/test/op/LayerNormTest.cpp index 427f3dbea..fb3020112 100644 --- a/test/op/LayerNormTest.cpp +++ b/test/op/LayerNormTest.cpp @@ -14,7 +14,7 @@ using namespace MNN; using namespace MNN::Express; -VARP _LayerNorm(VARP x, std::vector axis, float epsilon, std::vector gamma, std::vector beta, int group = 1) { +static VARP _LayerNorm(VARP x, std::vector axis, float epsilon, std::vector gamma, std::vector beta, int group = 1, bool useRMS = false) { std::unique_ptr op(new OpT); op->main.type = OpParameter_LayerNorm; op->type = OpType_LayerNorm; @@ -28,450 +28,215 @@ VARP _LayerNorm(VARP x, std::vector axis, float epsilon, std::vectormain.AsLayerNorm()->epsilon = epsilon; op->main.AsLayerNorm()->axis = axis; op->main.AsLayerNorm()->group = group; + op->main.AsLayerNorm()->useRMSNorm = useRMS; return (Variable::create(Expr::create(std::move(op), {x}))); } -static void _refLayerNorm(float *dst, const float *src, const float *gamma, const float *beta, float epsilon, size_t in_size, size_t out_size) { - for(int i = 0; i < out_size; ++i){ - const float* input = src + i * in_size; - float* output = dst + i * in_size; - float sum = 0.f; - for (int j = 0; j < in_size; ++j) { - sum += input[j]; - } - float mean = sum / in_size; - float square_sum = 0.f; - for (int j = 0; j < in_size; ++j) { - square_sum += (input[j] - mean) * (input[j] - mean); - } - float variable = square_sum / in_size; - variable = 1.f / std::sqrt(variable + epsilon); - - if (gamma && beta) { - for (int j = 0; j < in_size; ++j) { - output[j] = (input[j] - mean) * variable * gamma[j] + beta[j]; - } - } else { - for (int j = 0; j < in_size; ++j) { - output[j] = (input[j] - mean) * variable; - } - } +std::vector inputdata_0 = {0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, + 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, + 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, + 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, + 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, + 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, + 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, + 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, + 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, + 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, + 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, + 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, + 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, 4.6, 5.6, 6.6, 7.6, 8.6, 9.6, 0.6, 1.6, 2.6, 3.6, + 4.6, 5.6, 6.6, 7.6, 8.6, 9.6}; +std::vector tgdata_0 = {-1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, + -1.34164079, -0.4472136 , 0.4472136 , 1.34164079, -1.34164079, + -0.4472136 , 0.4472136 , 1.34164079, 0.86824314, 1.11631261, + -1.11631261, -0.86824314, -1.34164079, -0.4472136 , 0.4472136 , + 1.34164079, -1.34164079, -0.4472136 , 0.4472136 , 1.34164079}; +std::vector inputdata_1 = {0.7742, 0.5332, -0.8799, -1.0676, -0.7402, -1.5074, 0.2052, 0.3648, + 1.5056, -0.2804, 1.2785, 1.3410, 0.5395, 0.1665, -1.4594, 0.1158, + -1.8436, -0.1581, -1.5055, 0.3366, 0.4938, 0.0630, 0.5465, 0.9264, + -1.0491, 2.4297, 1.9942, 0.4256, 1.3902, -0.1021, -0.9883, 0.4500}; +std::vector tgdata_1 = {1.1381, 0.8445, -0.8770, -1.1056, -0.4238, -1.4374, 0.8252, 1.0360, + 0.7544, -1.7206, 0.4397, 0.5264, 0.9098, 0.4242, -1.6923, 0.3583, + -1.1587, 0.6996, -0.7859, 1.2451, -0.0446, -1.4518, 0.1277, 1.3688, + -1.4550, 1.0769, 0.7599, -0.3818, 1.3930, -0.3354, -1.3618, 0.3041}; +float eps = 0.000001f; + +static bool testKernel (std::vector inputdata, std::vector targetdata, std::vector dimensions, std::vector reduceAxis, float epsilon, std::vector gamma, std::vector beta, std::vector inputQuan, std::vector outputQuan, std::string testName, int precision, int group = 1) { + int size = 1; + for (int i = 0; i < dimensions.size(); ++i) { + size *= dimensions[i]; + } + int reducesize = 1; + for (int i = 0; i < reduceAxis.size(); ++i) { + reducesize *= dimensions[reduceAxis[i]]; } + MNN_ASSERT(gamma.size() == 0 || (gamma.size() >0 && reducesize == gamma.size())); + MNN_ASSERT(gamma.size() == beta.size()); + auto input = _Input(dimensions, NCHW); + if (inputQuan.size() > 0) { + input->writeScaleMap(inputQuan[0], inputQuan[1]); + } + auto inputPtr = input->writeMap(); + ::memcpy(inputPtr, inputdata.data(), input->getInfo()->size * sizeof(float)); + auto output = _LayerNorm(input, reduceAxis, epsilon, gamma, beta, group, false); + if (outputQuan.size() > 0) { + output->writeScaleMap(outputQuan[0], outputQuan[1]); + } + const float* outputPtr = output->readMap(); + float ratio = 0.02; + if (!checkVector(outputPtr, targetdata.data(), size, ratio)) { + MNN_ERROR("%s failed: data dimension=[", testName.c_str()); + for (int i = 0; i < dimensions.size(); ++i) { + if (i < dimensions.size() - 1) MNN_PRINT("%d, ", dimensions[i]); + else MNN_PRINT("%d], reduce axis=[", dimensions[i]); + } + for (int i = 0; i < reduceAxis.size(); ++i) { + if (i < reduceAxis.size() - 1) MNN_PRINT("%d, ", reduceAxis[i]); + else MNN_PRINT("%d]\n", reduceAxis[i]); + } + return false; + } + return true; } class LayerNormTest : public MNNTestCase { public: virtual ~LayerNormTest() = default; virtual bool run(int precision) { - { - std::vector dims = {1, 4, 1, 2}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector gammaData = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f}; - std::vector betaData = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f}; + { // test 1. std::vector axis = {0, 1, 2}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, gammaData, betaData); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, gammaData.data(), betaData.data(), eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest axis = %d test failed!\n", axis_size); - return false; - } - } - // LayerNorm Int8 test. - { std::vector dims = {1, 4, 1, 2}; - auto input = _Input(dims, NCHW); // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - input->writeScaleMap(0.063745, 2.0); - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector gammaData = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f}; - std::vector betaData = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f}; - std::vector axis = {0, 1, 2}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, gammaData, betaData); - output->writeScaleMap(0.0095, 0.0); - std::vector expectedOutput(8); + std::vector inputdata = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; + std::vector tgdata = {0.03527864, 0.0242914, 0.14944272, 0.1714172, -0.24249224, -0.22996021, 0.68665631, 0.66994695}; + std::vector gammaData = {0.1f, 0.2f, 0.3f, 0.4f}; + std::vector betaData = {0.08f, 0.06f, 0.16f, 0.15f}; - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, gammaData.data(), betaData.data(), eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 0.01)) { - MNN_ERROR("Int8 LayerNormTest axis = %d test failed!\n", axis_size); + bool testSuc = testKernel(inputdata, tgdata, dims, axis, eps, gammaData, betaData, {}, {}, "Float LayerNorm Test", 1); + if (!testSuc) { return false; } } - { - std::vector dims = {1, 4, 1, 2}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); + { // test 2. std::vector axis = {0, 1, 2}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, {}, {}); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, nullptr, nullptr, eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); - return false; - } - } - { std::vector dims = {1, 4, 1, 2}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - input->writeScaleMap(0.063745, 2.0); - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector axis = {0, 1, 2}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, {}, {}); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, nullptr, nullptr, eps, inner_size, outter_size); - output->writeScaleMap(0.01087, 0.0); - auto gotOutput = output->readMap(); - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 0.01)) { - MNN_ERROR("Int8 LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); - return false; - } - } - { - std::vector dims = {1, 2, 2, 2}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector gammaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector betaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector axis = {0, 1}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, gammaData, betaData); - std::vector expectedOutput(8); - - int axis_size = axis.size(); - int rank = dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, gammaData.data(), betaData.data(), eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest axis = %d test failed!\n", axis_size); - return false; - } - } - { - std::vector dims = {1, 2, 2, 2}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - input->writeScaleMap(0.063745, 2.0); - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector gammaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector betaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector axis = {0, 1}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, gammaData, betaData); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, gammaData.data(), betaData.data(), eps, inner_size, outter_size); - output->writeScaleMap(0.0084, 0.0); - auto gotOutput = output->readMap(); - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 0.01)) { - MNN_ERROR("Int8 LayerNormTest axis = %d test failed!\n", axis_size); - return false; - } - } - { - std::vector dims = {1, 2, 2, 2}; - auto input = _Input(dims, NCHW); // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector axis = {0, 1}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, {}, {}); - std::vector expectedOutput(8); + std::vector inputdata = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; + std::vector tgdata = {0.03527864, 0.0242914, 0.14944272, 0.1714172, -0.24249224, -0.22996021, 0.68665631, 0.66994695}; + std::vector inputQuan = {0.063745, 2.0}; + std::vector outputQuan = {0.0095, 0.0}; + std::vector gammaData = {0.1f, 0.2f, 0.3f, 0.4f}; + std::vector betaData = {0.08f, 0.06f, 0.16f, 0.15f}; - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, nullptr, nullptr, eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); + bool testSuc = testKernel(inputdata, tgdata, dims, axis, eps, gammaData, betaData, inputQuan, outputQuan, "Int8 LayerNorm Test", 1); + if (!testSuc) { return false; } } - { - std::vector dims = {1, 2, 2, 2}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - input->writeScaleMap(0.064, 2.0); - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector axis = {0, 1}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, {}, {}); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, nullptr, nullptr, eps, inner_size, outter_size); - output->writeScaleMap(0.0089, 0.0); - auto gotOutput = output->readMap(); - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 0.01)) { - MNN_ERROR("Int8 LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); - return false; - } - } - { - std::vector dims = {1, 2, 1, 4}; - auto input = _Input(dims, NCHW); + { // test 3. + std::vector axis = {0, 1, 2}; + std::vector dims = {1, 4, 1, 2}; + std::vector gammaData = {}; + std::vector betaData = {}; // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector gammaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector betaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector axis = {0}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, gammaData, betaData); - std::vector expectedOutput(8); + std::vector inputdata = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; + std::vector tgdata = {-0.4472136, -0.55708601, 0.4472136, 0.55708601, -1.34164079, -1.29986737, 1.34164079, 1.29986737}; - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, gammaData.data(), betaData.data(), eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest axis = %d test failed!\n", axis_size); + bool testSuc = testKernel(inputdata, tgdata, dims, axis, eps, gammaData, betaData, {}, {}, "Float LayerNorm Test", 1); + if (!testSuc) { return false; } } - { - std::vector dims = {1, 2, 1, 4}; - auto input = _Input(dims, NCHW); + { // test 4. + std::vector axis = {0, 1, 2}; + std::vector dims = {1, 4, 1, 2}; + std::vector gammaData = {}; + std::vector betaData = {}; // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - input->writeScaleMap(0.064, 2.0); - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector gammaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector betaData = {0.5f, 0.5f, 0.5f, 0.5f}; - std::vector axis = {0}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, gammaData, betaData); - std::vector expectedOutput(8); + std::vector inputdata = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; + std::vector tgdata = {-0.4472136, -0.55708601, 0.4472136, 0.55708601, -1.34164079, -1.29986737, 1.34164079, 1.29986737}; + std::vector inputQuan = {0.063745, 2.0}; + std::vector outputQuan = {0.0105, 0.0}; - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, gammaData.data(), betaData.data(), eps, inner_size, outter_size); - output->writeScaleMap(0.0099, 0.0); - auto gotOutput = output->readMap(); - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 0.01)) { - MNN_ERROR("Int8 LayerNormTest axis = %d test failed!\n", axis_size); + bool testSuc = testKernel(inputdata, tgdata, dims, axis, eps, gammaData, betaData, inputQuan, outputQuan, "Int8 LayerNorm Test", 1); + if (!testSuc) { return false; } } - { - std::vector dims = {1, 2, 1, 4}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector axis = {0}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, {}, {}); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, nullptr,nullptr, eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); + { // test 5. + std::vector axis = {2, 3}; + std::vector dims = {6, 10, 2, 2}; + std::vector gammaData = {}; + std::vector betaData = {}; + + bool testSuc = testKernel(inputdata_0, tgdata_0, dims, axis, eps, gammaData, betaData, {}, {}, "Float LayerNorm Test", 1); + if (!testSuc) { return false; } } { - std::vector dims = {1, 2, 1, 4}; - auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - input->writeScaleMap(0.06375, 2.0); - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector axis = {0}; - float eps = 1.00f; - auto output = _LayerNorm(input, axis, eps, {}, {}); - std::vector expectedOutput(8); + std::vector axis = {2, 3}; + std::vector dims = {6, 10, 2, 2}; + std::vector gammaData = {}; + std::vector betaData = {}; + std::vector inputQuan = {0.0752, 0.f}; + std::vector outputQuan = {0.0105, 0.f}; - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = 1; - int inner_size = 1; - for (int i = 0; i < rank - axis_size; ++i) { - outter_size *= dims[i]; - } - for (int i = rank - axis_size; i < rank; ++i) { - inner_size *= dims[i]; - } - _refLayerNorm(expectedOutput.data(), inpudata, nullptr,nullptr, eps, inner_size, outter_size); - output->writeScaleMap(0.00858, 0.f); - auto gotOutput = output->readMap(); - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 0.01)) { - MNN_ERROR("Int8 LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); + bool testSuc = testKernel(inputdata_0, tgdata_0, dims, axis, eps, gammaData, betaData, inputQuan, outputQuan, "Int8 LayerNorm Test", 1); + if (!testSuc) { return false; } } - { - std::vector dims = {1, 2, 1, 4}; + { // Group Norm without axis + std::vector dims = {2, 4, 2, 2}; auto input = _Input(dims, NCHW); - // set input data - const float inpudata[] = {-1.0, -2.0, 3.0, 4.0, -5.0, -6.0, 7.0, 8.0}; - auto inputPtr = input->writeMap(); - memcpy(inputPtr, inpudata, 8 * sizeof(float)); - std::vector axis = {}; - float eps = 1.00f; - int group = 2; - auto output = _LayerNorm(input, axis, eps, {}, {}, group); - std::vector expectedOutput(8); - - int axis_size = (int)axis.size(); - int rank = (int)dims.size(); - int outter_size = group * dims[0]; - int inner_size = 1; - for (int i = 1; i < rank; ++i) { - inner_size *= dims[i]; - } - inner_size /= group; - _refLayerNorm(expectedOutput.data(), inpudata, nullptr,nullptr, eps, inner_size, outter_size); - auto gotOutput = output->readMap(); - float errorScale = precision <= MNN::BackendConfig::Precision_High ? 1 : 1000; - if (!checkVectorByRelativeError(gotOutput, expectedOutput.data(), 8, 1e-5 * errorScale)) { - MNN_ERROR("Float LayerNormTest without gamma beta axis = %d test failed!\n", axis_size); + bool testSuc = testKernel(inputdata_1, tgdata_1, dims, {}, eps, {}, {}, {}, {}, "Flaot GroupNorm Test", 1, 4); + if (!testSuc) { return false; } } - return true; } }; diff --git a/test/op/SequenceGRUTest.cpp b/test/op/SequenceGRUTest.cpp index c1478b5e3..e64394ea8 100644 --- a/test/op/SequenceGRUTest.cpp +++ b/test/op/SequenceGRUTest.cpp @@ -8,7 +8,7 @@ // #include #include -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #include "MNNTestSuite.h" #include "TestUtils.h" diff --git a/tools/converter/source/common/AddSparseInfo.cpp b/tools/converter/source/common/AddSparseInfo.cpp index 7097bc7a9..2ae05111d 100644 --- a/tools/converter/source/common/AddSparseInfo.cpp +++ b/tools/converter/source/common/AddSparseInfo.cpp @@ -8,7 +8,7 @@ #include #include "CommonUtils.hpp" -#include "common/CommonCompute.hpp" +#include "core/CommonCompute.hpp" #include "backend/cpu/compute/SparseConvolutionTiledExecutor.hpp" using namespace MNN; diff --git a/tools/converter/source/common/FullQuantAndCoding.cpp b/tools/converter/source/common/FullQuantAndCoding.cpp index 2f31db6e7..a9e8b61ce 100644 --- a/tools/converter/source/common/FullQuantAndCoding.cpp +++ b/tools/converter/source/common/FullQuantAndCoding.cpp @@ -9,7 +9,7 @@ #include #include "CommonUtils.hpp" #include "MNN/expr/ExprCreator.hpp" -#include "cpp/IDSTEncoder.hpp" +#include "core/IDSTEncoder.hpp" using namespace MNN; using namespace MNN::Express; diff --git a/tools/converter/source/common/WeightQuantAndCoding.cpp b/tools/converter/source/common/WeightQuantAndCoding.cpp index 9e29bcd14..3fd718dfb 100644 --- a/tools/converter/source/common/WeightQuantAndCoding.cpp +++ b/tools/converter/source/common/WeightQuantAndCoding.cpp @@ -7,8 +7,8 @@ // #include "CommonUtils.hpp" -#include "common/CommonCompute.hpp" -#include "cpp/IDSTEncoder.hpp" +#include "core/CommonCompute.hpp" +#include "core/IDSTEncoder.hpp" static float findAbsMax(const float *weights, const int count) { float absMax = fabs(weights[0]); diff --git a/tools/converter/source/common/cli.cpp b/tools/converter/source/common/cli.cpp index 33660788e..c2a64a8ee 100644 --- a/tools/converter/source/common/cli.cpp +++ b/tools/converter/source/common/cli.cpp @@ -37,7 +37,7 @@ #include #include #include -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" namespace MNN { @@ -465,7 +465,7 @@ bool Cli::initializeMNNConvertArgs(modelConfig &modelPath, int argc, char **argv if (result.count("convertMatmulToConv")) { modelPath.convertMatmulToConv = result["convertMatmulToConv"].as(); } - + if (result.count("testdir")) { modelPath.testDir = result["testdir"].as(); } @@ -1234,7 +1234,7 @@ bool CommonKit::json2protobuf(const char* jsonFile, const char* protoFile, MNN:: if (layerInfo.HasMember("method")) { newLayer->set_method((MNN::Compression::LayerQuantizeParams_QuantMethod)layerInfo["method"].GetInt()); } - + // Weight. auto weights_ = layerInfo["weight"].GetArray(); for (auto w = weights_.begin(); w != weights_.end(); ++w) { @@ -1255,7 +1255,7 @@ bool CommonKit::json2protobuf(const char* jsonFile, const char* protoFile, MNN:: weight->add_scales(scale[k].GetFloat()); } } - + // Input. auto inputs_ = layerInfo["input"].GetArray(); for (auto w = inputs_.begin(); w != inputs_.end(); ++w) { @@ -1276,7 +1276,7 @@ bool CommonKit::json2protobuf(const char* jsonFile, const char* protoFile, MNN:: input->add_scales(scale[k].GetFloat()); } } - + // Output. auto outputs_ = layerInfo["output"].GetArray(); for (auto w = outputs_.begin(); w != outputs_.end(); ++w) { diff --git a/tools/converter/source/onnx/SigmoidOnnx.cpp b/tools/converter/source/onnx/SigmoidOnnx.cpp index de3515ac3..33a36e430 100644 --- a/tools/converter/source/onnx/SigmoidOnnx.cpp +++ b/tools/converter/source/onnx/SigmoidOnnx.cpp @@ -11,15 +11,18 @@ DECLARE_OP_CONVERTER(SigmoidOnnx); MNN::OpType SigmoidOnnx::opType() { - return MNN::OpType_Sigmoid; + return MNN::OpType_UnaryOp; } MNN::OpParameter SigmoidOnnx::type() { - return MNN::OpParameter_NONE; + return MNN::OpParameter_UnaryOp; } void SigmoidOnnx::run(MNN::OpT *dstOp, const onnx::NodeProto *onnxNode, OnnxScope* scope) { + auto res = new MNN::UnaryOpT; + res->opType = MNN::UnaryOpOperation_SIGMOID;; + dstOp->main.value = res; return; } diff --git a/tools/converter/source/onnx/TanhOnnx.cpp b/tools/converter/source/onnx/TanhOnnx.cpp index 069d0d724..21b9be672 100644 --- a/tools/converter/source/onnx/TanhOnnx.cpp +++ b/tools/converter/source/onnx/TanhOnnx.cpp @@ -12,15 +12,17 @@ DECLARE_OP_CONVERTER(TanhOnnx); MNN::OpType TanhOnnx::opType() { - return MNN::OpType_TanH; + return MNN::OpType_UnaryOp; } MNN::OpParameter TanhOnnx::type() { - return MNN::OpParameter_NONE; + return MNN::OpParameter_UnaryOp; } void TanhOnnx::run(MNN::OpT* dstOp, const onnx::NodeProto* onnxNode, OnnxScope* scope) { - dstOp->main.value = nullptr; + auto res = new MNN::UnaryOpT; + res->opType = MNN::UnaryOpOperation_TANH; + dstOp->main.value = res; } REGISTER_CONVERTER(TanhOnnx, Tanh); diff --git a/tools/converter/source/optimizer/merge/FuseAttention.cpp b/tools/converter/source/optimizer/merge/FuseAttention.cpp new file mode 100644 index 000000000..b13132ac5 --- /dev/null +++ b/tools/converter/source/optimizer/merge/FuseAttention.cpp @@ -0,0 +1,226 @@ +// +// FuseAttention.cpp +// MNNConverter +// +// Created by MNN on 2024/03/18. +// Copyright © 2018, Alibaba Group Holding Limited +// +#include + +#include "../TemplateMerge.hpp" +#include "MNN/expr/ExprCreator.hpp" +#include "MNN_generated.h" +#include "MergeHelpers.hpp" + +namespace MNN { +namespace Express { + +class FuseAttention { +public: + FuseAttention(); +private: + VARP query, key, value, mask; +}; + +FuseAttention::FuseAttention() { + auto match = [this](EXPRP expr) -> bool { + auto config = Global::Get(); + if(!config->transformerFuse) { + return false; + } + // transpose + if (!helpers::IsReshape(expr)) { + return false; + } + + expr = expr->inputs().at(0)->expr().first; + if (!helpers::IsTranspose(expr)) { + return false; + } + + EXPRP x, y; + // softmax @ v + auto matmul = expr->inputs().at(0)->expr().first; + if (!helpers::IsMatMul(matmul)) { + return false; + } + + // transpose + y = matmul->inputs().at(1)->expr().first; + if (!helpers::IsTranspose(y)) { + return false; + } + // concat + y = y->inputs().at(0)->expr().first; + if (!helpers::IsConcat(y)) { + return false; + } + // value + value = y->inputs().at(1); + + // softmax + x = matmul->inputs().at(0)->expr().first; + if (helpers::IsCast(x)) { + x = x->inputs().at(0)->expr().first; + } + if (!helpers::IsSoftmax(x)) { + return false; + } + // where + x = x->inputs().at(0)->expr().first; + if (!helpers::IsSelect(x)) { + return false; + } + // mask + mask = x->inputs().at(0); + // div + x = x->inputs().at(1)->expr().first; + if (helpers::IsCast(x)) { + x = x->inputs().at(0)->expr().first; + } + if (!helpers::IsBinaryOp(x)) { + return false; + } + // q @ k + x = x->inputs().at(0)->expr().first; + if (!helpers::IsMatMul(x)) { + return false; + } + // transpose + auto z = x->inputs().at(0)->expr().first; + if (!helpers::IsTranspose(z)) { + return false; + } + // query + query = z->inputs().at(0); + + // transpose + y = x->inputs().at(1)->expr().first; + if (!helpers::IsTranspose(y)) { + return false; + } + // concat + y = y->inputs().at(0)->expr().first; + if (!helpers::IsConcat(y)) { + return false; + } + // key + key = y->inputs().at(1); + return true; + }; + + auto fold = [this](EXPRP expr) -> bool { + auto config = Global::Get(); + auto version = config->targetVersion; + if (version < 2.8f) { + // For target version < 2.8 , don't support fmha_v2 + return false; + } + + std::unique_ptr attention(new OpT); + attention->name = "Attention" + expr->name(); + attention->type = OpType_Attention; + attention->main.type = OpParameter_AttentionParam; + attention->main.value = new AttentionParamT; + + auto attention_expr = Variable::create(Expr::create(attention.get(), {query, key, value, mask}, 1)); + + attention_expr->setName(expr->name()); + Expr::replace(expr, attention_expr->expr().first); + return true /*modified*/; + }; + TemplateMerge::getInstance("Merge").insertTemplate("FuseAttention", match, fold); +} + +class RemovePastKeyValue { +public: + RemovePastKeyValue(); +private: + VARP kv_in; +}; + +RemovePastKeyValue::RemovePastKeyValue() { + auto match = [this](EXPRP expr) -> bool { + auto config = Global::Get(); + if(!config->transformerFuse) { + return false; + } + /* + llm: out <- stack [concat + unsqueeze] <- stack [concat + unsqueeze] <- concat <- gatherv2 <- gatherv2 <- in + block: out <------------------------------- stack [concat + unsqueeze] <- concat <- gatherv2 <------------- in + */ + if (!helpers::IsConcat(expr)) { + return false; + } + expr = expr->inputs().at(0)->expr().first; + if (!helpers::IsUnsqueeze(expr)) { + return false; + } + expr = expr->inputs().at(0)->expr().first; + if (!helpers::IsConcat(expr) && expr->inputs().size() == 2) { + return false; + } + expr = expr->inputs().at(0)->expr().first; + // llm model + if (helpers::IsUnsqueeze(expr)) { + // concat [past_k, k] + expr = expr->inputs().at(0)->expr().first; + if (!helpers::IsConcat(expr) && expr->inputs().size() == 2) { + return false; + } + // gatherv2 + expr = expr->inputs().at(0)->expr().first; + if (!helpers::IsGatherV2(expr)) { + return false; + } + // gatherv2 + expr = expr->inputs().at(0)->expr().first; + if (!helpers::IsGatherV2(expr)) { + return false; + } + kv_in = expr->inputs().at(0); + if (!kv_in->expr().first->inputs().empty()) { + return false; + } + return true; + } + // block model + if (helpers::IsGatherV2(expr)) { + kv_in = expr->inputs().at(0); + if (!kv_in->expr().first->inputs().empty()) { + return false; + } + return true; + } + return false; + }; + + auto fold = [this](EXPRP expr) -> bool { + auto config = Global::Get(); + auto version = config->targetVersion; + if (version < 2.8f) { + // For target version < 2.8 , don't support fmha_v2 + return false; + } + + // past-kv remove + std::unique_ptr reshape(new OpT); + reshape->name = expr->name(); + reshape->type = OpType_Reshape; + reshape->main.type = OpParameter_Reshape; + auto reshape_t = new ReshapeT; + reshape_t->dims = {-1}; + reshape->main.value = reshape_t; + auto copy_expr = Variable::create(Expr::create(reshape.get(), {kv_in}, 1)); + Expr::replace(expr, copy_expr->expr().first); + return true /*modified*/; + }; + TemplateMerge::getInstance("Merge").insertTemplate("RemovePastKeyValue", match, fold); +} + + +static FuseAttention g_fuse_attenion; +static RemovePastKeyValue g_remove_kv; + +} // namespace Express +} // namespace MNN diff --git a/tools/converter/source/optimizer/merge/MergeHelpers.cpp b/tools/converter/source/optimizer/merge/MergeHelpers.cpp index 3327b7dac..b49201c0e 100644 --- a/tools/converter/source/optimizer/merge/MergeHelpers.cpp +++ b/tools/converter/source/optimizer/merge/MergeHelpers.cpp @@ -71,6 +71,16 @@ bool IsSoftmax(EXPRP expr) { return op && op->type() == OpType_Softmax; } +bool IsSelect(EXPRP expr) { + const Op* op = expr->get(); + return op && op->type() == OpType_Select; +} + +bool IsGatherV2(EXPRP expr) { + const Op* op = expr->get(); + return op && op->type() == OpType_GatherV2; +} + bool IsSlice(EXPRP expr) { const Op* op = expr->get(); return op && (op->type() == OpType_Slice || op->type() == OpType_StridedSlice || op->type() == OpType_SliceTf); diff --git a/tools/converter/source/optimizer/merge/MergeHelpers.hpp b/tools/converter/source/optimizer/merge/MergeHelpers.hpp index e2fea0a4a..bfc720c97 100644 --- a/tools/converter/source/optimizer/merge/MergeHelpers.hpp +++ b/tools/converter/source/optimizer/merge/MergeHelpers.hpp @@ -28,6 +28,8 @@ bool IsScatterNd(Express::EXPRP expr); bool IsMatMul(Express::EXPRP expr); bool IsSoftmax(Express::EXPRP expr); bool IsSlice(Express::EXPRP expr); +bool IsSelect(Express::EXPRP expr); +bool IsGatherV2(Express::EXPRP expr); bool IsBinaryAdd(Express::EXPRP expr); bool IsBinarySub(Express::EXPRP expr); diff --git a/tools/converter/source/optimizer/onnxextra/OnnxBatchNormMerge.cpp b/tools/converter/source/optimizer/onnxextra/OnnxBatchNormMerge.cpp index 648c11d2a..f902a64f0 100644 --- a/tools/converter/source/optimizer/onnxextra/OnnxBatchNormMerge.cpp +++ b/tools/converter/source/optimizer/onnxextra/OnnxBatchNormMerge.cpp @@ -183,7 +183,7 @@ class OnnxInstanceNormalTransform : public OnnxExtraManager::Transform { layerNormOp->main.type = OpParameter_LayerNorm; { auto param = layerNormOp->main.AsLayerNorm(); - param->axis = {2}; // Layernorm only need axis's size as 1 + param->axis = {-1}; // Layernorm only need axis's size as 1 param->epsilon = epsilon; param->group = 1; } diff --git a/tools/converter/source/tflite/liteConverter.cpp b/tools/converter/source/tflite/liteConverter.cpp index 33faab79c..49d307e28 100644 --- a/tools/converter/source/tflite/liteConverter.cpp +++ b/tools/converter/source/tflite/liteConverter.cpp @@ -7,7 +7,7 @@ // #include - +#include #include "logkit.h" #include "liteConverter.hpp" @@ -69,21 +69,61 @@ static void _converteConstantDataToMNNConstantNode( MNNNetT->tensorName.emplace_back(mnnConstantOp->name); MNNNetT->oplists.emplace_back(std::move(mnnConstantOp)); } +template +void convert(const SRC* s, DST* d, size_t sizeInBytes) { + auto size = sizeInBytes / sizeof(SRC); + for (size_t i=0; i _getConvertFunction(tflite::TensorType type) { + switch (type) { + case tflite::TensorType_FLOAT64: + return [](const void* s, void* d, size_t size) { + convert((double*)s, (float*)d, size); + }; + case tflite::TensorType_UINT64: + return [](const void* s, void* d, size_t size) { + convert((uint64_t*)s, (int32_t*)d, size); + }; + case tflite::TensorType_INT16: + return [](const void* s, void* d, size_t size) { + convert((int16_t*)s, (int32_t*)d, size); + }; + case tflite::TensorType_INT64: + return [](const void* s, void* d, size_t size) { + convert((int64_t*)s, (int32_t*)d, size); + }; + default: + break; + } + return nullptr; +} static MNN::DataType _convertType(tflite::TensorType type) { if (type == tflite::TensorType_FLOAT32) { return MNN::DataType_DT_FLOAT; } + if (type == tflite::TensorType_FLOAT64) { + return MNN::DataType_DT_FLOAT; + } if (type == tflite::TensorType_INT8) { return MNN::DataType_DT_INT8; } if (type == tflite::TensorType_INT16) { - return MNN::DataType_DT_INT16; + return MNN::DataType_DT_INT32; + } + if (type == tflite::TensorType_INT32) { + return MNN::DataType_DT_INT32; + } + if (type == tflite::TensorType_INT64) { + return MNN::DataType_DT_INT32; } if (type == tflite::TensorType_UINT8) { return MNN::DataType_DT_UINT8; } - if (type == tflite::TensorType_INT32) { + if (type == tflite::TensorType_UINT64) { return MNN::DataType_DT_INT32; } if (type == tflite::TensorType_FLOAT16) { @@ -234,7 +274,12 @@ int tflite2MNNNet(const std::string inputModel, const std::string bizCode, default: break; } - ::memcpy(dst, buffer->data.data(), buffer->data.size()); + auto func = _getConvertFunction(tensor->type); + if (nullptr == func) { + ::memcpy(dst, buffer->data.data(), buffer->data.size()); + } else { + func(buffer->data.data(), dst, buffer->data.size()); + } MNNNetT->oplists.emplace_back(std::move(newOp)); } } diff --git a/tools/converter/source/torch/LayerNormTorch.cpp b/tools/converter/source/torch/LayerNormTorch.cpp index 02193553a..f6ed99976 100644 --- a/tools/converter/source/torch/LayerNormTorch.cpp +++ b/tools/converter/source/torch/LayerNormTorch.cpp @@ -32,7 +32,7 @@ void LayerNormTorch::run(MNN::OpT* dstOp, const torch::jit::Node* node, TorchSco std::string opType = getRealOpType(node); if (opType == "group_norm") { param->group = getValue(inputs[1]); - param->axis = {1,2,3}; + param->axis = {-1}; // add scale op after layernorm { auto scaleName = dstOp->name + "/scale"; @@ -54,7 +54,7 @@ void LayerNormTorch::run(MNN::OpT* dstOp, const torch::jit::Node* node, TorchSco } else { auto norm_shape = getValue>(inputs[1]); // TODO: convert norm_shape to axis - param->axis = {1}; + param->axis = {-1}; param->gamma = getValue(weight, shape); param->beta = getValue(bias, shape); } diff --git a/tools/cpp/CMakeLists.txt b/tools/cpp/CMakeLists.txt index 29461d638..eca3a884a 100644 --- a/tools/cpp/CMakeLists.txt +++ b/tools/cpp/CMakeLists.txt @@ -52,6 +52,9 @@ list(APPEND MNN_CPP_TOOLS testTrain.out) add_executable(fuseTest ${CMAKE_CURRENT_LIST_DIR}/fuseTest.cpp) list(APPEND MNN_CPP_TOOLS fuseTest) +add_executable(LoRA ${CMAKE_CURRENT_LIST_DIR}/LoRA.cpp) +list(APPEND MNN_CPP_TOOLS LoRA) + foreach(TARGET ${MNN_CPP_TOOLS}) target_link_libraries(${TARGET} ${MNN_DEPS}) if (MSVC) diff --git a/tools/cpp/ConvertToFullQuant.hpp b/tools/cpp/ConvertToFullQuant.hpp index a7bd45ce3..4d996756d 100644 --- a/tools/cpp/ConvertToFullQuant.hpp +++ b/tools/cpp/ConvertToFullQuant.hpp @@ -15,7 +15,7 @@ #include #include #include "MNN_generated.h" -#include "cpp/IDSTEncoder.hpp" +#include "core/IDSTEncoder.hpp" using namespace MNN; @@ -175,7 +175,7 @@ void convert(std::string modelFile) { outputOs << input.rdbuf(); netT = MNN::UnPackNet(outputOs.str().c_str()); auto net = netT.get(); - + std::vector netNeedEraseIndices; for (int i = 0; i < net->oplists.size(); i++) { auto& op = net->oplists[i]; diff --git a/tools/cpp/GpuInterTest.cpp b/tools/cpp/GpuInterTest.cpp index 0ac9d6e14..c92b698ce 100644 --- a/tools/cpp/GpuInterTest.cpp +++ b/tools/cpp/GpuInterTest.cpp @@ -13,7 +13,7 @@ #define MNN_OPEN_TIME_TRACE #include #include "rapidjson/document.h" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #include #include #include @@ -208,7 +208,7 @@ int main(int argc, char *argv[]) { testMode = atoi(argv[3]); MNN_PRINT("Use extra forward type: %d(0:OpenCL 1:OpenGL)\n", testMode); } - + auto type = MNN_FORWARD_CPU; if (argc > 4) { type = (MNNForwardType)atoi(argv[4]); @@ -267,7 +267,7 @@ int main(int argc, char *argv[]) { } backendConfig.sharedContext = &DeviceContext; - + std::shared_ptr rtmgr(Executor::RuntimeManager::createRuntimeManager(config)); rtmgr->setCache(cacheFileName); std::shared_ptr net; diff --git a/tools/cpp/LoRA.cpp b/tools/cpp/LoRA.cpp new file mode 100644 index 000000000..c2fc7137f --- /dev/null +++ b/tools/cpp/LoRA.cpp @@ -0,0 +1,271 @@ +// +// LoRA.cpp +// MNN +// +// Created by MNN on 2024/03/15. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "LoRA.hpp" +#include "core/CommonCompute.hpp" +#include "core/MemoryFormater.h" +#include "core/IDSTDecoder.hpp" +#include "core/IDSTEncoder.hpp" +#include "core/ConvolutionCommon.hpp" + +#include +#include +#include + +int SymmetricQuantizeWeight(const float* weight, const int size, int8_t* quantizedWeight, float* scale, + const int channels, float weightClampValue) { + const int channelStride = size / channels; + const int quantizedMaxValue = weightClampValue; + + for (int c = 0; c < channels; ++c) { + const auto weightChannelStart = weight + c * channelStride; + auto quantizedWeightChannelStart = quantizedWeight + c * channelStride; + auto minmaxValue = std::minmax_element(weightChannelStart, weightChannelStart + channelStride); + const float dataAbsMax = std::fmax(std::fabs(*minmaxValue.first), std::fabs(*minmaxValue.second)); + + float scaleDataToInt8 = 1.0f; + if (dataAbsMax == 0) { + scale[c] = 0.0f; + } else { + scale[c] = dataAbsMax / quantizedMaxValue; + scaleDataToInt8 = quantizedMaxValue / dataAbsMax; + } + + for (int i = 0; i < channelStride; ++i) { + const int32_t quantizedInt8Value = static_cast(roundf(weightChannelStart[i] * scaleDataToInt8)); + quantizedWeightChannelStart[i] = + std::min(quantizedMaxValue, std::max(-quantizedMaxValue, quantizedInt8Value)); + } + } + + return 0; +} + +std::unique_ptr LoRA::load_model(const char* name) { + std::ifstream inputFile(name, std::ios::binary); + inputFile.seekg(0, std::ios::end); + const auto size = inputFile.tellg(); + inputFile.seekg(0, std::ios::beg); + + char* buffer = new char[size]; + inputFile.read(buffer, size); + inputFile.close(); + auto net = MNN::UnPackNet(buffer); + delete[] buffer; + MNN_ASSERT(net->oplists.size() > 0); + return net; +} + +static float findAbsMax(const float *weights, const int count) { + float absMax = fabs(weights[0]); + for (int i = 1; i < count; i++) { + float value = fabs(weights[i]); + if (value > absMax) { + absMax = value; + } + } + + return absMax; +} + +static std::vector findMinMax(const float *weights, const int count) { + float min = weights[0]; + float max = weights[0]; + + for (int i = 1; i < count; i++) { + float value = weights[i]; + if (value > max) { + max = value; + } + if (value < min) { + min = value; + } + } + + return {min, max}; +} + + +LoRA::LoRA(const char* origin_model, const char* lora_model) { + mMNNNet = std::move(load_model(origin_model)); + mLoRANet = std::move(load_model(lora_model)); + mExternalFile.reset(new std::fstream(std::string(origin_model) + ".weight", std::ios::in | std::ios::out | std::ios::binary)); + if (mExternalFile->bad()) { + mExternalFile.reset(nullptr); + } +} + +LoRA::~LoRA() { +} + +std::vector split(const std::string& name, char delimiter) { + std::vector tokens; + std::string token; + std::istringstream tokenStream(name); + while (std::getline(tokenStream, token, delimiter)) { + tokens.push_back(token); + } + return tokens; +} + +inline MNN::Express::VARP OpT2Const(MNN::OpT* op) { + return MNN::Express::Variable::create(MNN::Express::Expr::create(op, {}, 1)); +} + +inline MNN::Express::VARP computeLoRA(MNN::OpT *lora_A, MNN::OpT *lora_B) { + auto A = MNN::Express::_Cast(OpT2Const(lora_A), halide_type_of()); + auto B = MNN::Express::_Cast(OpT2Const(lora_B), halide_type_of()); + auto scale = MNN::Express::_Scalar(4.0 * 5); + auto lora = MNN::Express::_Multiply(MNN::Express::_MatMul(B, A), scale); + // lora = MNN::Express::_Transpose(lora, {1, 0}); + return lora; +} + +void LoRA::apply_external(MNN::OpT* op, MNN::OpT* lora_A, MNN::OpT* lora_B) { + // lora origin weight + auto result = std::make_shared(); + auto param = op->main.AsConvolution2D(); + int ic = param->common->inputCount; + int oc = param->common->outputCount; + auto buffer_size = param->external[1]; + auto alpha_size = param->external[2]; + result->weight.reset(buffer_size); + result->alpha.reset(alpha_size / sizeof(float)); + mExternalFile->seekg(param->external[0]); + mExternalFile->read(reinterpret_cast(result->weight.get()), buffer_size); + mExternalFile->read(reinterpret_cast(result->alpha.get()), alpha_size); + auto& quan = param->quanParameter; + size_t weightLength = 0; + auto ptr = reinterpret_cast(result->weight.get()); + auto new_ptr = IDSTDecoder::ReadQuanData_c(ptr, &weightLength, result.get(), quan->shapeInt32); + result->weight.set(new_ptr, weightLength); + result->weightFloat.reset(weightLength); + // dequant to float + bool oldType4 = (quan->type == 4 && quan->aMin == 0 && std::abs(quan->quantScale) < 1e-6); + if (quan->readType != 0 || oldType4) { + result->asymmetric = true; + float clampMin = quan->aMin == 0 ? -128 : quan->aMin; + for (int o = 0; o < oc; ++o) { + float min = result->alpha.get()[2 * o]; + float alpha = result->alpha.get()[2 * o + 1]; + min = min - clampMin * alpha; + auto dstW = result->weightFloat.get() + o * ic; + auto srcW = result->weight.get() + o * ic; + for (int v=0; v < ic; ++v) { + dstW[v] = (float)srcW[v] * alpha + min; + } + } + } else { + result->asymmetric = false; + for (int o = 0; o < oc; ++o) { + float alpha = result->alpha.get()[o]; + auto dstW = result->weightFloat.get() + o * ic; + auto srcW = result->weight.get() + o * ic; + for (int v=0; v < ic; ++v) { + dstW[v] = (float)srcW[v] * alpha; + } + } + } + result->weight.release(); + result->alpha.release(); + auto weight = Express::_Const(result->weightFloat.get(), {oc, ic}); + auto lora = computeLoRA(lora_A, lora_B); + result->weightFloat.release(); + weight = Express::_Add(weight, lora); + // weight = Express::_Subtract(weight, lora); + // quant + int bits = 4; + float threshold = (float)(1 << (bits - 1)) - 1.0f; + auto clampMin = quan->aMin; + std::vector scales; + std::vector quantWeights; + if (result->asymmetric) { + scales.resize(oc*2); + for (int o = 0; o < oc; ++o) { + const float* ptr = weight->readMap() + o * ic; + auto minAndMax = findMinMax(ptr, ic); + float min = minAndMax[0]; + float max = minAndMax[1]; + float scale = (max - min) / (threshold - clampMin); + + scales[2*o] = min; + scales[2*o+1] = scale; + /* + for (int ii = 0; ii < partWeightSize; ii++) { + int8_t quantValue = int8_t(std::round((ptr[ii] - min) / scale + clampMin)); + quantWeights.emplace_back(quantValue); + } + */ + } + } + auto res = IDSTEncoder::encode(weight->readMap(), scales, ic, oc, result->asymmetric, /*quantWeights.data()*/nullptr, int(clampMin), bits, false); + mExternalFile->seekp(param->external[0]); + mExternalFile->write(reinterpret_cast(res->buffer.data()), buffer_size); + mExternalFile->write(reinterpret_cast(res->alpha.data()), alpha_size); +} + +void LoRA::apply_lora() { + std::set lora_keys; + std::map> loras; + for (int i = 0; i < mLoRANet->oplists.size(); i+= 2) { + auto& op_A = mLoRANet->oplists[i]; + auto& op_B = mLoRANet->oplists[i + 1]; + auto tokens = split(op_A->name, '/'); + auto layer = tokens[4]; + auto key = tokens[6]; + lora_keys.insert(key); + loras[layer + key] = std::make_pair(op_A.get(), op_B.get()); + } + for (auto& op : mMNNNet->oplists) { + if (op->type == MNN::OpType_Convolution) { + bool has_lora = false; + for (auto key : lora_keys) { + if (op->name.find(key) != std::string::npos) { + has_lora = true; + break; + } + } + if (!has_lora) continue; + auto tokens = split(op->name, '/'); + auto layer = split(tokens[1], '.')[1]; + auto key = tokens[3]; + auto lora = loras[layer + key]; + apply_external(op.get(), lora.first, lora.second); + } + } + mExternalFile->flush(); + mExternalFile->close(); +} + +int main(int argc, char *argv[]) { + if (argc < 3) { + MNN_ERROR("Usage: ./LoRA ${origin.mnn} ${lora.mnn}\n"); + return 0; + } + const char* origin_model = argv[1]; + const char* lora_model = argv[2]; + auto lora = std::unique_ptr(new LoRA(origin_model, lora_model)); + auto st = std::chrono::system_clock::now(); + lora->apply_lora(); + auto et = std::chrono::system_clock::now(); + auto lora_during = std::chrono::duration_cast(et - st).count() * 1e-6; + printf("### total time = %.2f s\n", lora_during); + return 0; +} diff --git a/tools/cpp/LoRA.hpp b/tools/cpp/LoRA.hpp new file mode 100644 index 000000000..2fecd587e --- /dev/null +++ b/tools/cpp/LoRA.hpp @@ -0,0 +1,32 @@ +// +// LoRA.hpp +// MNN +// +// Created by MNN on 2024/03/15. +// Copyright © 2018, Alibaba Group Holding Limited +// + +#ifndef LORA_HPP +#define LORA_HPP + +#include "MNN_generated.h" + +class LoRA { +public: + LoRA(const char* originalModelFileName, const char* loraModelFileName); + ~LoRA(); + void* getBuffer() const; + const size_t getBufferSize() const; + void apply_lora(); + void revert_lora(); +private: + std::unique_ptr load_model(const char* name); + void apply_external(MNN::OpT* conv, MNN::OpT* lora_A, MNN::OpT* lora_B); +private: + LoRA(); + std::unique_ptr mMNNNet, mLoRANet; + std::unique_ptr mExternalFile; + void packMNNNet(); +}; + +#endif // LORA_HPP diff --git a/tools/cpp/ModuleBasic.cpp b/tools/cpp/ModuleBasic.cpp index e13f39b47..9dafd4c7e 100644 --- a/tools/cpp/ModuleBasic.cpp +++ b/tools/cpp/ModuleBasic.cpp @@ -13,7 +13,7 @@ #define MNN_OPEN_TIME_TRACE #include #include "rapidjson/document.h" -#include "common/MemoryFormater.h" +#include "core/MemoryFormater.h" #include #include #include diff --git a/tools/cpp/revertMNNModel.cpp b/tools/cpp/revertMNNModel.cpp index 3663267dc..fd3e17064 100644 --- a/tools/cpp/revertMNNModel.cpp +++ b/tools/cpp/revertMNNModel.cpp @@ -16,9 +16,9 @@ #include #include #include "revertMNNModel.hpp" -#include "common/CommonCompute.hpp" -#include "common/MemoryFormater.h" -#include "IDSTEncoder.hpp" +#include "core/CommonCompute.hpp" +#include "core/MemoryFormater.h" +#include "core/IDSTEncoder.hpp" #include "core/ConvolutionCommon.hpp" int SymmetricQuantizeWeight(const float* weight, const int size, int8_t* quantizedWeight, float* scale, @@ -98,7 +98,7 @@ void Revert::writeExtraDescribeTensor(float* scale, float* offset) { const float inputScale = *scale; const float outputScale = *scale; const int outputChannel = static_cast(op->outputIndexes.size()); - + auto param = op->main.AsConvolution2D(); float* originWeight = param->weight.data(); const int channels = param->common->outputCount; @@ -108,7 +108,7 @@ void Revert::writeExtraDescribeTensor(float* scale, float* offset) { param->common->inputCount = weightSize / (channels * param->common->kernelX * param->common->kernelY); std::vector quantizedWeight(weightSize); std::vector quantizedWeightScale(channels); - + if (originWeight[0] == 0.f && originWeight[1] == 0.f) { // Process weight is null. // Initialize originWeight std::uniform_real_distribution u(-200, 200); @@ -117,7 +117,7 @@ void Revert::writeExtraDescribeTensor(float* scale, float* offset) { originWeight[i] = u(e); } } - + SymmetricQuantizeWeight(originWeight, weightSize, quantizedWeight.data(), quantizedWeightScale.data(), channels, 127.0f); param->quanParameter = IDSTEncoder::encode(param->weight.data(), quantizedWeightScale, weightSize/channels, channels, false, quantizedWeight.data(), -127.0f); param->quanParameter->scaleIn = *scale; diff --git a/tools/quantization/calibration.cpp b/tools/quantization/calibration.cpp index 4c9046d00..32d13aaad 100644 --- a/tools/quantization/calibration.cpp +++ b/tools/quantization/calibration.cpp @@ -25,7 +25,7 @@ #include #include "Helper.hpp" #include "core/TensorUtils.hpp" -#include "cpp/IDSTEncoder.hpp" +#include "core/IDSTEncoder.hpp" #include #include @@ -298,7 +298,7 @@ std::vector Calibration::_getInputShape(std::string filename) { void Calibration::_resizeIfNeeded(std::string filename, bool force) { std::vector inputShape = _getInputShape(filename); - + if ((inputShape != _inputTensorDims && _featureQuantizeMethod == "KL") || force) { _inputTensorDims = inputShape; _interpreter->resizeTensor(_inputTensor, _inputTensorDims); @@ -689,7 +689,7 @@ void Calibration::_insertScale() { if (iter != _skip_quant_ops.end()) { continue; } - + if (opType != MNN::OpType_Convolution && opType != MNN::OpType_ConvolutionDepthwise && opType != MNN::OpType_Deconvolution) { continue; } @@ -981,7 +981,7 @@ void Calibration::_quantizeModelEMA() { } Variable::save(predicts, _destModelFile.c_str()); ConvertToFullQuant::convert(_destModelFile); - + std::unique_ptr netT; { std::ifstream input(_destModelFile, std::ifstream::in | std::ifstream::binary); @@ -1037,7 +1037,7 @@ void Calibration::dumpTensorScales(const std::string& modelFile) { auto op = iter->get(); const auto opType = op->type; const auto name = op->name; - + if (opType == MNN::OpType_Raster) { continue; } @@ -1055,10 +1055,10 @@ void Calibration::dumpTensorScales(const std::string& modelFile) { writer.StartArray(); for (int i = 0; i < inputSize; ++i) { const auto curInputIndex = inputIndexes[i]; - + auto input = _tensorMap[curInputIndex]; auto inputOpScale = _scales[input]; - + writer.StartObject(); writer.Key("tensorIndex"); writer.Int(curInputIndex); @@ -1077,7 +1077,7 @@ void Calibration::dumpTensorScales(const std::string& modelFile) { } writer.EndArray(); } - + auto& outputIndexes = op->outputIndexes; const int outputSize = static_cast(outputIndexes.size()); @@ -1086,10 +1086,10 @@ void Calibration::dumpTensorScales(const std::string& modelFile) { writer.StartArray(); for (int i = 0; i < outputSize; ++i) { const auto curOutputIndex = outputIndexes[i]; - + auto output = _tensorMap[curOutputIndex]; auto outputOpScale = _scales[output]; - + writer.StartObject(); writer.Key("tensorIndex"); writer.Int(curOutputIndex); diff --git a/tools/script/convertTfliteTest.py b/tools/script/convertTfliteTest.py index b06dc486f..f25257c1c 100755 --- a/tools/script/convertTfliteTest.py +++ b/tools/script/convertTfliteTest.py @@ -7,8 +7,10 @@ import os def run_cmd(args): - from subprocess import Popen, PIPE, STDOUT - stdout, _ = Popen(args, stdout=PIPE, stderr=STDOUT).communicate() + cmd = args[0] + for i in range(1, len(args)): + cmd += ' ' + args[i] + stdout = os.popen(cmd).read() global total_num total_num += 1 return stdout diff --git a/tools/script/register.py b/tools/script/register.py index e2dc6710e..3e679648c 100644 --- a/tools/script/register.py +++ b/tools/script/register.py @@ -96,6 +96,7 @@ def generateCPUFile(rootDir): cpuRegFile = os.path.join(cpuDir, "CPUOPRegister.cpp") funcNames = [] renderNames = [] + transformerNamse = [] def collectFile(fileNames, dirname): for fi in fileNames: f = os.path.join(dirname, fi) @@ -113,6 +114,8 @@ def collectFile(fileNames, dirname): funcName = '___' + l[0] + '__' + l[1] + '__' if lo.find('REGISTER_CPU_OP_CREATOR_RENDER') >=0: renderNames.append(funcName) + elif lo.find('REGISTER_CPU_OP_CREATOR_TRANSFORMER') >= 0: + transformerNamse.append(funcName) else: funcNames.append(funcName) fileNames = os.listdir(cpuDir) @@ -132,6 +135,10 @@ def collectFile(fileNames, dirname): for l in renderNames: f.write("extern void " + l + '();\n') f.write('#endif\n') + f.write('#ifdef ' + 'MNN_SUPPORT_TRANSFORMER_FUSE' + '\n') + for l in transformerNamse: + f.write("extern void " + l + '();\n') + f.write('#endif\n') f.write('void registerCPUOps() {\n') for l in funcNames: f.write(l+'();\n') @@ -139,7 +146,70 @@ def collectFile(fileNames, dirname): for l in renderNames: f.write(l+'();\n') f.write('#endif\n') + f.write('#ifdef ' + 'MNN_SUPPORT_TRANSFORMER_FUSE' + '\n') + for l in transformerNamse: + f.write(l+'();\n') + f.write('#endif\n') f.write("}\n}\n") + +def generateOPENCLFile(rootDir): + openclDir = os.path.join(rootDir, "source", "backend", "opencl") + openclBufferDir = os.path.join(rootDir, "source", "backend", "opencl", "execution", "buffer") + openclImageDir = os.path.join(rootDir, "source", "backend", "opencl", "execution", "image") + openclRegFile = os.path.join(openclDir, "core", "OpenCLOPRegister.cpp") + opNames = [] + transformerNamse = [] + def collectFile(fileNames, dirname): + end = '__IMAGE__' + if "buffer" in dirname: + end = '__BUFFER__' + for fi in fileNames: + f = os.path.join(dirname, fi) + if os.path.isdir(f): + continue + with open(f) as fileC: + c = fileC.read().split('\n') + c = list(filter(lambda l:l.find('REGISTER_OPENCL_OP_CREATOR')>=0, c)) + c = list(filter(lambda l:l.find('OpType')>=0, c)) + for lo in c: + l = lo.split('(')[1] + l = l.split(')')[0] + l = l.replace(' ', '') + l = l.split(',') + funcName = '___' + 'OpenCL' + l[0] + '__' + l[1] + end + if lo.find('REGISTER_OPENCL_OP_CREATOR_TRANSFORMER') >=0: + transformerNamse.append(funcName) + else: + opNames.append(funcName) + bufferFileNames = os.listdir(openclBufferDir) + print(bufferFileNames) + collectFile(bufferFileNames, openclBufferDir) + + imageFileNames = os.listdir(openclImageDir) + print(imageFileNames) + collectFile(imageFileNames, openclImageDir) + + with open(openclRegFile, 'w') as f: + f.write('// This file is generated by Shell for ops register\n') + f.write('#ifndef MNN_OPENCL_SEP_BUILD\n') + f.write('namespace MNN {\n') + f.write('namespace OpenCL {\n') + for l in opNames: + f.write("extern void " + l + '();\n') + f.write('\n') + f.write('#ifdef ' + 'MNN_SUPPORT_TRANSFORMER_FUSE' + '\n') + for l in transformerNamse: + f.write("extern void " + l + '();\n') + f.write('#endif\n') + f.write('void registerOpenCLOps() {\n') + for l in opNames: + f.write(l+'();\n') + f.write('#ifdef ' + 'MNN_SUPPORT_TRANSFORMER_FUSE' + '\n') + for l in transformerNamse: + f.write(l+'();\n') + f.write('#endif\n') + f.write("}\n}\n}\n") + f.write('#endif\n') def generateGeoFile(rootDir): geoDir = os.path.join(rootDir, "source", "geometry") @@ -257,3 +327,4 @@ def generateNNAPIFile(rootDir): generateGeoFile(sys.argv[1]) generateCoreMLFile(sys.argv[1]) generateNNAPIFile(sys.argv[1]) +generateOPENCLFile(sys.argv[1]) diff --git a/tools/train/source/nn/NN.cpp b/tools/train/source/nn/NN.cpp index 71941fba4..7594e7197 100644 --- a/tools/train/source/nn/NN.cpp +++ b/tools/train/source/nn/NN.cpp @@ -17,7 +17,7 @@ #include "RandomGenerator.hpp" #include "core/Macro.h" #include "math/WingoradGenerater.hpp" -#include "common/WinogradInt8Attr.hpp" +#include "core/WinogradInt8Attr.hpp" #include using namespace MNN::Express; @@ -592,11 +592,11 @@ class ConvBNReluFusedModule : public Module { mWeightClampValue = _Scalar(mLimit); // mInputClampValue = _Scalar(mLimit); // mOutputClampValue = _Scalar(mLimit); - + // lower bits only apply to weights mInputClampValue = _Scalar((float)(1 << (8 - 1)) - 1.0f); mOutputClampValue = _Scalar((float)(1 << (8 - 1)) - 1.0f); - + mInputMinPos = addParameter(mInputMin); mInputMaxPos = addParameter(mInputMax); mOutputMinPos = addParameter(mOutputMin); @@ -761,13 +761,13 @@ class ConvBNReluFusedModule : public Module { xx = _MatMul(_MatMul(_Transpose(srcTransH, {1, 0}), xx), srcTransW); // [alphaH * alphaW, ic, N * h_unit_num * w_unit_num] xx = _Reshape(_Transpose(xx, {2, 3, 1, 0}), {alphaH * alphaW, inChannel, -1}); - + auto inputPair = fakeQuantFeatureWithMinMax(xx, nullptr, nullptr, mInputClampValue, {1, 2, 3}); mWinogradTransInputMin = updateParameter(mWinogradTransInputMin, inputPair[1]); mWinogradTransInputMax = updateParameter(mWinogradTransInputMax, inputPair[2]); setParameter(mWinogradTransInputMin, mWinogradTransInputMinPos); setParameter(mWinogradTransInputMax, mWinogradTransInputMaxPos); - + auto wTransH = _Const(genH.G()->host(), {alphaH, kernelH}, NCHW); auto wTransW = _Const(genW.G()->host(), {alphaW, kernelW}, NCHW); // [oc, ic, alphaH, alphaW] @@ -775,12 +775,12 @@ class ConvBNReluFusedModule : public Module { // [alphaH * alphaW, oc, ic] ww = _Transpose(_Reshape(ww, {outChannel, inChannel, -1}), {2, 0, 1}); auto wwInfo = ww->getInfo(); - + // simulate weight quant auto weightScale = _Maximum(_ReduceMax(_Abs(ww), {2}, true), _Scalar(1E-6)) * _Reciprocal(mWeightClampValue); // ww = clamp(_Round(ww * _Reciprocal(weightScale)), mWeightClampValue) * weightScale; setParameter(weightScale, mWinogradTransWeightScalePos); - + // [alphaH * alphaW, oc, N * h_unit_num * w_unit_num] auto yy = _MatMul(ww, xx); // [oc, N * h_unit_num * w_unit_num, alphaH, alphaW] @@ -963,7 +963,7 @@ class ConvBNReluFusedModule : public Module { bias.resize(biasinfo->size); auto ptr = fusedBias->readMap(); ::memcpy(bias.data(), ptr, bias.size() * sizeof(float)); - + auto info = weightScale->getInfo(); weightScaleVector.resize(info->size); MNN_ASSERT(weightScaleVector.size() == bias.size()); @@ -973,7 +973,7 @@ class ConvBNReluFusedModule : public Module { } bool relu = mActivation == NN::None ? false : true; res = _Conv(std::move(weight), std::move(bias), std::move(weightScaleVector), _Convert(x, NC4HW4), mOption.channel, - mOption.kernelSize, mOption.padMode, mOption.stride, mOption.dilate, mGroup, mOption.pads, relu, + mOption.kernelSize, mOption.padMode, mOption.stride, mOption.dilate, mGroup, mOption.pads, relu, mInputScale->readMap()[0], mOutputScale->readMap()[0], inputZeroPoint, outputZeroPoint, -int8_t(mOutputClampValue->readMap()[0]), int8_t(mOutputClampValue->readMap()[0]), mWeightClampValue->readMap()[0], mAccumulateToInt16); @@ -982,7 +982,7 @@ class ConvBNReluFusedModule : public Module { auto inputScaleVar = scaleAndZeroPoint.first; auto inputZeroPointVar = scaleAndZeroPoint.second; auto weightScaleVar = parameters()[mWinogradTransWeightScalePos]; - + // Winograd Transformed input scale auto inputScaleInfo = inputScaleVar->getInfo(); auto inputScaleData = inputScaleVar->readMap(); @@ -1008,11 +1008,11 @@ class ConvBNReluFusedModule : public Module { return {}; } std::vector weightScales(weightScaleData, weightScaleData + weightScaleInfo->size); - + mWinogradAttr->attrs[0].inputScales = inputScales; mWinogradAttr->attrs[0].inputZeroPoints = inputZeroPoints; mWinogradAttr->attrs[0].weightScales = weightScales; - + res = mWinogradAttr->turnToWinogradConv(res); } res->setName(name()); diff --git a/transformers/diffusion/CMakeLists.txt b/transformers/diffusion/CMakeLists.txt new file mode 100644 index 000000000..b8b7460cb --- /dev/null +++ b/transformers/diffusion/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.10) + +# source files +FILE(GLOB SRCS ${CMAKE_CURRENT_LIST_DIR}/*.cpp) +include_directories(${CMAKE_CURRENT_LIST_DIR}/../../tools/cv/include) +add_executable(diffusion_demo ${SRCS}) +IF(MNN_SEP_BUILD) +target_link_libraries(diffusion_demo MNN MNN_Express MNNOpenCV) +IF(MNN_OPENCL) + target_link_libraries(diffusion_demo MNN_CL) +ENDIF() +ELSE() +target_link_libraries(diffusion_demo MNN) +ENDIF() diff --git a/transformers/diffusion/main.cpp b/transformers/diffusion/main.cpp new file mode 100644 index 000000000..2b6fbf25b --- /dev/null +++ b/transformers/diffusion/main.cpp @@ -0,0 +1,19 @@ +#include +#include "pipeline.hpp" + +int main(int argc, const char* argv[]) { + if (argc < 3) { + printf("Usage: ./diffusion_demo "); + return 1; + } + auto sentence = argv[1]; + auto img_name = argv[2]; + auto resource_path = argv[3]; + + printf("input setnetce: %s\n", sentence); + printf("output img_name: %s\n", img_name); + printf("model resource path: %s\n", resource_path); + diffusion::Pipeline pipeline(resource_path); + pipeline.run(sentence, img_name); + return 0; +} diff --git a/transformers/diffusion/pipeline.cpp b/transformers/diffusion/pipeline.cpp new file mode 100644 index 000000000..3cd64e5f3 --- /dev/null +++ b/transformers/diffusion/pipeline.cpp @@ -0,0 +1,318 @@ +#include +#include +#include +#include "pipeline.hpp" +#include "tokenizer.hpp" +#define MNN_OPEN_TIME_TRACE +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +#include +#undef min +#undef max +#else +#include +#endif + +//#define MNN_DUMP_DATA + +using namespace CV; + +namespace diffusion { + +static inline int64_t getTime() { + uint64_t time; +#if defined(_MSC_VER) + LARGE_INTEGER now, freq; + QueryPerformanceCounter(&now); + QueryPerformanceFrequency(&freq); + uint64_t sec = now.QuadPart / freq.QuadPart; + uint64_t usec = (now.QuadPart % freq.QuadPart) * 1000000 / freq.QuadPart; + time = sec * 1000000 + usec; +#else + struct timeval tv; + gettimeofday(&tv, nullptr); + time = static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; +#endif + return time; +} + +void display_progress(int cur, int total){ + putchar('\r'); + printf("["); + for (int i = 0; i < cur; i++) putchar('#'); + for (int i = 0; i < total - cur; i++) putchar('-'); + printf("]"); + fprintf(stdout, " [%3d%%]", cur * 100 / total); + if (cur == total) putchar('\n'); + fflush(stdout); +} + +Pipeline::Pipeline(std::string modelPath) : mModelPath(modelPath) { + std::ifstream alphaFile(modelPath + "/alphas.txt"); + int index = 0; + float alpha; + while (alphaFile >> alpha) { + mAlphas.push_back(alpha); + } +#if 0 // Different steps setting + mTimeSteps = { // 50 steps + 981, 961, 961, 941, 921, 901, 881, 861, 841, 821, 801, 781, 761, 741, + 721, 701, 681, 661, 641, 621, 601, 581, 561, 541, 521, 501, 481, 461, + 441, 421, 401, 381, 361, 341, 321, 301, 281, 261, 241, 221, 201, 181, + 161, 141, 121, 101, 81, 61, 41, 21, 1 + }; + mTimeSteps = { // 20 steps + 951, 901, 901, 851, 801, 751, 701, 651, 601, 551, 501, 451, + 401, 351, 301, 251, 201, 151, 101, 51, 1 + }; +#endif + mTimeSteps = { + 801, 601, 601, + 401, 201, 1 + }; +} + +bool Pipeline::load_modules(std::string modelPath) { + AUTOTIME; + + ScheduleConfig config; + BackendConfig backendConfig; +// config.type = MNN_FORWARD_CPU; + config.type = MNN_FORWARD_OPENCL; + config.numThread = 65; + backendConfig.precision = BackendConfig::Precision_Normal; + backendConfig.memory = BackendConfig::Memory_Low; + config.backendConfig = &backendConfig; + + + Module::Config module_config; + module_config.shapeMutable = false; + // module_config.rearrange = true; + runtime_manager_.reset(Executor::RuntimeManager::createRuntimeManager(config)); + + // if (config.type == MNN_FORWARD_OPENCL) { + // const char* cacheFileName = ".tempcache"; + // runtime_manager_->setCache(cacheFileName); + // } + + mModules.resize(3); + // load text_encoder model + { + std::string model_path = modelPath + "/text_encoder.mnn"; + mModules[0].reset(Module::load( + {"input_ids"}, {"last_hidden_state", "pooler_output"}, model_path.c_str(), runtime_manager_, &module_config)); + + } + // load unet model + { + std::string model_path = modelPath + "/unet.mnn"; + mModules[1].reset(Module::load( + {"sample", "timestep", "encoder_hidden_states"}, {"out_sample"}, model_path.c_str(), runtime_manager_, &module_config)); + } + // load vae_decoder model + { + std::string model_path = modelPath + "/vae_decoder.mnn"; + mModules[2].reset(Module::load( + {"latent_sample"}, {"sample"}, model_path.c_str(), runtime_manager_, &module_config)); + } + + auto exe = ExecutorScope::Current(); + exe->lazyEval = false; + exe->setGlobalExecutorConfig(config.type, backendConfig, config.numThread); + + return true; +} + +VARP Pipeline::text_encoder(const std::vector& ids) { + auto inputs_ids_ = _Const(ids.data(), {2, 512}, NCHW, halide_type_of()); + + auto outputs = mModules[0]->onForward({inputs_ids_}); + auto output = _Convert(outputs[0], NCHW); + output.fix(VARP::CONSTANT); + +#ifdef MNN_DUMP_DATA + auto xx = output->readMap(); + for(int i=0; i<10; i+=2) { + printf("%f %f ", xx[i], xx[i+512*768]); + } + printf("\n\n"); +#endif + return output; +} + +VARP Pipeline::step_plms(VARP sample, VARP model_output, int index) { + int timestep = mTimeSteps[index]; + int prev_timestep = 0; + if (index + 1 < mTimeSteps.size()) { + prev_timestep = mTimeSteps[index + 1]; + } + if (index != 1) { + if (mEts.size() >= 4) { + mEts[mEts.size() - 4] = nullptr; + } + mEts.push_back(model_output); + } else { + timestep = mTimeSteps[0]; + prev_timestep = mTimeSteps[1]; + } + int ets = mEts.size() - 1; + if (index == 0) { + mSample = sample; + } else if (index == 1) { + model_output = (model_output + mEts[ets]) * _Const(0.5); + sample = mSample; + } else if (ets == 1) { + model_output = (_Const(3.0) * mEts[ets] - mEts[ets-1]) * _Const(0.5); + } else if (ets == 2) { + model_output = (_Const(23.0) * mEts[ets] - _Const(16.0) * mEts[ets-1] + _Const(5.0) * mEts[ets-2]) * _Const(1.0 / 12.0); + } else if (ets >= 3) { + model_output = _Const(1. / 24.) * (_Const(55.0) * mEts[ets] - _Const(59.0) * mEts[ets-1] + _Const(37.0) * mEts[ets-2] - _Const(9.0) * mEts[ets-3]); + } + auto alpha_prod_t = mAlphas[timestep]; + auto alpha_prod_t_prev = mAlphas[prev_timestep]; + auto beta_prod_t = 1 - alpha_prod_t; + auto beta_prod_t_prev = 1 - alpha_prod_t_prev; + auto sample_coeff = std::sqrt(alpha_prod_t_prev / alpha_prod_t); + auto model_output_denom_coeff = alpha_prod_t * std::sqrt(beta_prod_t_prev) + std::sqrt(alpha_prod_t * beta_prod_t * alpha_prod_t_prev); + auto prev_sample = _Scalar(sample_coeff) * sample - _Scalar((alpha_prod_t_prev - alpha_prod_t)/model_output_denom_coeff) * model_output; + return prev_sample; +} + +VARP Pipeline::unet(VARP text_embeddings) { + mModules[0].reset(); + std::mt19937 rng; + rng.seed(std::random_device()()); + std::normal_distribution normal(0, 1); + std::vector initVal(16384); + +#ifdef MNN_DUMP_DATA + std::ostringstream fileName; + fileName << "random.txt"; + std::ifstream input(fileName.str().c_str()); + for (int i = 0; i < 16384; ++i) { + input >> initVal[i]; + } +#else + for (int i = 0; i < 16384; i++) { + initVal[i] = normal(rng); + } +#endif + + // VARP latentvar = _Const(initVal.data(), {1, 4, 64, 64}, NCHW); + VARP latentvar = _Input({1, 4, 64, 64}, NCHW, halide_type_of()); + memcpy((void *)latentvar->writeMap(), initVal.data(), 16384*sizeof(float)); + + VARP scalevar = _Input({1}, NCHW, halide_type_of()); + auto scaleptr = scalevar->writeMap(); + scaleptr[0] = 7.5; + + + VARP timestepvar = _Input({1}, NCHW, halide_type_of()); + auto floatVar = _Input({1}, NCHW, halide_type_of()); + auto ptr = floatVar->writeMap(); + + for (int i = 0; i < mTimeSteps.size(); i++) { + AUTOTIME; + display_progress(i, mTimeSteps.size()); + + auto t0 = getTime(); + + int timestep = mTimeSteps[i]; + + ptr[0] = timestep; + auto temp = _Cast(floatVar, halide_type_of()); + timestepvar->input(temp); + + VARP samplevar = _Concat({latentvar, latentvar}, 0); + auto outputs = mModules[1]->onForward({samplevar, timestepvar, text_embeddings}); + + auto output = _Convert(outputs[0], NCHW); + auto t1 = getTime(); + + auto noise_pred = output; + + auto splitvar = _Split(noise_pred, {2}, 0); + auto noise_pred_uncond = splitvar[0]; + auto noise_pred_text = splitvar[1]; + + noise_pred = scalevar * (noise_pred_text - noise_pred_uncond) + noise_pred_uncond; + auto t2 = getTime(); + + latentvar = step_plms(latentvar, noise_pred, i); + auto t3 = getTime(); + MNN_PRINT("Times: %f %f %f ms\n", (t1-t0)/ 1000.0f, (t2-t1)/ 1000.0f, (t3-t2)/ 1000.0f); + // latentvar.fix(VARP::CONSTANT); +#ifdef MNN_DUMP_DATA + auto xx = output->readMap(); + auto yy = samplevar->readMap(); + auto zz = text_embeddings->readMap(); + + for(int i=0; i<6; i+=2) { + printf("%f %f %f ", xx[i], yy[i], zz[i]); + } + for(int i=0; i<6; i+=2) { + printf("%f %f %f ", xx[16384+i], yy[16384+i], zz[512*768+i]); + } + printf("\n\n"); +#endif + } + latentvar.fix(VARP::CONSTANT); + +#ifdef MNN_DUMP_DATA + auto xx = latentvar->readMap(); + for(int i=0; i<10; i+=2) { + printf("%f ", xx[i]); + } + printf("\n\n"); +#endif + return latentvar; +} + +VARP Pipeline::vae_decoder(VARP latent) { + mModules[1].reset(); + latent = latent * _Const(1 / 0.18215); + + auto outputs = mModules[2]->onForward({latent}); + auto output = _Convert(outputs[0], NCHW); + +#ifdef MNN_DUMP_DATA + auto xx = output->readMap(); + for(int i=0; i<320; i+=32) { + printf("%f ", xx[i]); + } + printf("\n\n"); +#endif + + auto image = output; + image = _Relu6(image * _Const(0.5) + _Const(0.5), 0, 1); + image = _Squeeze(_Transpose(image, {0, 2, 3, 1})); + image = _Cast(_Round(image * _Const(255.0)), halide_type_of()); + image = cvtColor(image, COLOR_BGR2RGB); + image.fix(VARP::CONSTANT); + return image; +} + +bool Pipeline::run(const std::string& sentence, const std::string& img_name) { + diffusion::tokenizer tok(mModelPath + "/vocab.txt"); + load_modules(mModelPath); + + AUTOTIME; + auto ids = tok.sentence(sentence, 512); + auto text_embeddings = text_encoder(ids); + + auto latent = unet(text_embeddings); + auto image = vae_decoder(latent); + bool res = imwrite(img_name, image); + if (res) { + printf("SUCCESS! write to %s\n", img_name.c_str()); + } + // runtime_manager_->updateCache(); + return res; +} + +} diff --git a/transformers/diffusion/pipeline.hpp b/transformers/diffusion/pipeline.hpp new file mode 100644 index 000000000..b00cec0fb --- /dev/null +++ b/transformers/diffusion/pipeline.hpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace MNN; +using namespace MNN::Express; + +namespace diffusion { + +class Pipeline { +public: + Pipeline(std::string modelPath); + ~Pipeline() = default; + bool run(const std::string& sentence, const std::string& img_name); +private: + bool load_modules(std::string modelPath); + VARP step_plms(VARP sample, VARP model_output, int index); + VARP text_encoder(const std::vector& ids); + VARP unet(VARP text_embeddings); + VARP vae_decoder(VARP latent); +private: + std::shared_ptr runtime_manager_; + std::vector> mModules; + + std::string mModelPath; + // step_plms + std::vector mTimeSteps; + std::vector mAlphas; + std::vector mEts; + VARP mSample; +}; + +} diff --git a/transformers/diffusion/tokenizer.cpp b/transformers/diffusion/tokenizer.cpp new file mode 100644 index 000000000..02400e487 --- /dev/null +++ b/transformers/diffusion/tokenizer.cpp @@ -0,0 +1,56 @@ + +#include +#include +#include +#include "tokenizer.hpp" + +namespace diffusion { + +tokenizer::tokenizer(std::string dictPath) { + std::ifstream dictFile(dictPath); + int index = 0; + std::string word; + while (dictFile >> word) { + mWordDict.insert(std::make_pair(std::move(word), index++)); + } + mStartIdx = this->word("[CLS]"); + mEndIdx = this->word("[SEP]"); +} + +int tokenizer::word(std::string word) { + const auto& iter = mWordDict.find(word); + if (iter != mWordDict.end()) { + return iter->second; + } + return -1; +} + +std::vector tokenizer::sentence(std::string sentence, int maxlen) { + std::vector ids(maxlen * 2, 0); + // uncond + ids[0] = mStartIdx; + ids[1] = mEndIdx; + // ids + int idx = maxlen; + ids[idx++] = mStartIdx; + for (size_t i = 0; i < sentence.length();) { + int wordlen = 1; + if ((sentence[i] & 0xf8) == 0xf0) { + wordlen = 4; + } else if ((sentence[i] & 0xf0) == 0xe0) { + wordlen = 3; + } else if ((sentence[i] & 0xe0) == 0xc0) { + wordlen = 2; + } + if ((i + wordlen) > sentence.length()) { + wordlen = 1; + } + std::string word = sentence.substr(i, wordlen); + ids[idx++] = this->word(word); + i += wordlen; + } + ids[idx++] = mEndIdx; + return ids; +} + +} // diffusion \ No newline at end of file diff --git a/transformers/diffusion/tokenizer.hpp b/transformers/diffusion/tokenizer.hpp new file mode 100644 index 000000000..529aa05bf --- /dev/null +++ b/transformers/diffusion/tokenizer.hpp @@ -0,0 +1,18 @@ +#include +#include +#include + +namespace diffusion { + +class tokenizer { +public: + tokenizer(std::string dictPath); + ~tokenizer() {} + int word(std::string word); + std::vector sentence(std::string sentence, int maxlen = 0); +private: + int mStartIdx, mEndIdx; + std::unordered_map mWordDict; +}; + +} // diffusion \ No newline at end of file diff --git a/llm/CMakeLists.txt b/transformers/llm/engine/CMakeLists.txt similarity index 100% rename from llm/CMakeLists.txt rename to transformers/llm/engine/CMakeLists.txt diff --git a/llm/include/llm.hpp b/transformers/llm/engine/include/llm.hpp similarity index 98% rename from llm/include/llm.hpp rename to transformers/llm/engine/include/llm.hpp index d003ed106..3053b0f0c 100644 --- a/llm/include/llm.hpp +++ b/transformers/llm/engine/include/llm.hpp @@ -59,7 +59,8 @@ class MNN_PUBLIC Llm { visual_module_.reset(); runtime_manager_.reset(); } - static Llm* createLLM(const std::string& path, std::string model_type = "auto", int forwardType = 0); + // Default memory is low, precision is low + static Llm* createLLM(const std::string& path, std::string model_type = "auto", int forwardType = 0, int memoryprecison = 10); void load(const std::string& model_dir); void chat(); void trace(bool start); @@ -89,6 +90,7 @@ class MNN_PUBLIC Llm { std::vector tokenizer_encode(const std::string& input_str); std::string decode(int id); protected: + VARP inputs_embeds_, attention_mask_, position_ids_; // model configs bool is_single_ = false; bool is_disk_embedding_ = false; @@ -119,6 +121,7 @@ class MNN_PUBLIC Llm { // model dir std::string model_dir_; int mForwardType = 0; + int mPrecisionMemory = 0; }; // some llm models @@ -369,6 +372,7 @@ class Bge : public Embedding { virtual VARP gen_attention_mask(int seq_len) override; virtual VARP gen_position_ids(int seq_len) override; }; + // Embedding end #endif // LLM_hpp diff --git a/llm/include/tokenizer.hpp b/transformers/llm/engine/include/tokenizer.hpp similarity index 100% rename from llm/include/tokenizer.hpp rename to transformers/llm/engine/include/tokenizer.hpp diff --git a/llm/llm_demo.cpp b/transformers/llm/engine/llm_demo.cpp similarity index 89% rename from llm/llm_demo.cpp rename to transformers/llm/engine/llm_demo.cpp index 4a59954ae..37b7b44c4 100644 --- a/llm/llm_demo.cpp +++ b/transformers/llm/engine/llm_demo.cpp @@ -75,7 +75,7 @@ static void benchmark(Llm* llm, std::string prompt_file) { int main(int argc, const char* argv[]) { if (argc < 2) { - std::cout << "Usage: " << argv[0] << " model_dir " << std::endl; + std::cout << "Usage: " << argv[0] << " model_dir " << std::endl; return 0; } std::string model_dir = argv[1]; @@ -84,8 +84,13 @@ int main(int argc, const char* argv[]) { std::istringstream os(argv[2]); os >> forwardType; } + int memoryprecision = 10; + if (argc >= 4) { + std::istringstream os(argv[3]); + os >> memoryprecision; + } std::cout << "model path is " << model_dir << std::endl; - std::unique_ptr llm(Llm::createLLM(model_dir, "auto", forwardType)); + std::unique_ptr llm(Llm::createLLM(model_dir, "auto", forwardType, memoryprecision)); { AUTOTIME; llm->load(model_dir); @@ -94,10 +99,10 @@ int main(int argc, const char* argv[]) { AUTOTIME; trace_prepare(llm.get()); } - if (argc < 4) { + if (argc < 5) { llm->chat(); } - std::string prompt_file = argv[3]; + std::string prompt_file = argv[4]; benchmark(llm.get(), prompt_file); return 0; } diff --git a/llm/src/llm.cpp b/transformers/llm/engine/src/llm.cpp similarity index 96% rename from llm/src/llm.cpp rename to transformers/llm/engine/src/llm.cpp index 89c38fa1b..466f4ffa5 100644 --- a/llm/src/llm.cpp +++ b/transformers/llm/engine/src/llm.cpp @@ -23,7 +23,7 @@ #endif // Llm start -Llm* Llm::createLLM(const std::string& path, std::string model_type, int forwardType) { +Llm* Llm::createLLM(const std::string& path, std::string model_type, int forwardType, int preicsionmemory) { auto size = path.size(); // end with '.mnn' is single model file, otherwise split block models @@ -97,6 +97,7 @@ Llm* Llm::createLLM(const std::string& path, std::string model_type, int forward } llm->mForwardType = forwardType; llm->is_single_ = is_single; + llm->mPrecisionMemory = preicsionmemory; std::cout << "### model name : "<< llm->model_name_ << std::endl; return llm; } @@ -228,8 +229,8 @@ void Llm::load(const std::string& model_dir) { } ExecutorScope::Current()->setGlobalExecutorConfig(MNN_FORWARD_CPU, cpuBackendConfig, config.numThread); - cpuBackendConfig.precision = BackendConfig::Precision_Low; - cpuBackendConfig.memory = BackendConfig::Memory_Low; + cpuBackendConfig.precision = (BackendConfig::PrecisionMode)(mPrecisionMemory % 4); + cpuBackendConfig.memory = (BackendConfig::MemoryMode)((mPrecisionMemory / 4) % 4); config.backendConfig = &cpuBackendConfig; runtime_manager_.reset(Executor::RuntimeManager::createRuntimeManager(config)); runtime_manager_->setHint(MNN::Interpreter::MEM_ALLOCATOR_TYPE, 0); @@ -318,6 +319,7 @@ void Llm::load(const std::string& model_dir) { decode_modules_.resize(modules_.size()); for (int v=0; v& input_ids) { return id; } +static inline bool needNewVar(VARP var, int axis, int seq_len) { + if (var == nullptr) { + return true; + } + if (var->getInfo()->dim[axis] != seq_len) { + return true; + } + return false; +} + VARP Llm::txt_embedding(const std::vector& input_ids) { if (!is_disk_embedding_) { // using model forward @@ -385,23 +397,26 @@ VARP Llm::txt_embedding(const std::vector& input_ids) { } AUTOTIME; // disk embedding to save memory - size_t seq_len = input_ids.size(); - auto embedding = _Input({static_cast(seq_len), 1, hidden_size_}, NCHW); + int seq_len = static_cast(input_ids.size()); + if (needNewVar(inputs_embeds_, 0, seq_len)) { + inputs_embeds_ = _Input({seq_len, 1, hidden_size_}, NCHW); + } size_t size = hidden_size_ * sizeof(int16_t); FILE* file = fopen(disk_embedding_file_.c_str(), "rb"); std::unique_ptr buffer(new int16_t[hidden_size_]); for (size_t i = 0; i < seq_len; i++) { fseek(file, input_ids[i] * size, SEEK_SET); fread(buffer.get(), 1, size, file); - auto ptr = embedding->writeMap() + i * hidden_size_ * 2; + auto ptr = inputs_embeds_->writeMap() + i * hidden_size_ * 2; for (int j = 0; j < hidden_size_; j++) { ptr[j * 2] = 0; ptr[j * 2 + 1] = buffer[j]; } } fclose(file); - return embedding; + return inputs_embeds_; } + void Llm::trace(bool start) { auto status = MNN::Interpreter::Session_Resize_Check; if (start) { @@ -544,19 +559,25 @@ std::vector Qwen_7b::tokenizer(const std::string& query) { } VARP Qwen_7b::gen_attention_mask(int seq_len) { - auto attention_mask = _Input({1, 1, seq_len, seq_len}, NCHW, halide_type_of()); - auto ptr = attention_mask->writeMap(); + if (needNewVar(attention_mask_, 2, seq_len)) { + attention_mask_ = _Input({1, 1, seq_len, seq_len}, NCHW, halide_type_of()); + } else { + return attention_mask_; + } + auto ptr = attention_mask_->writeMap(); for (int i = 0; i < seq_len; i++) { for (int j = 0; j < seq_len; j++) { ptr[seq_len * i + j] = j <= i; } } - return attention_mask; + return attention_mask_; } VARP Qwen_7b::gen_position_ids(int seq_len) { - auto position_ids = _Input({seq_len}, NCHW, halide_type_of()); - auto ptr = position_ids->writeMap(); + if (needNewVar(position_ids_, 0, seq_len)) { + position_ids_ = _Input({seq_len}, NCHW, halide_type_of()); + } + auto ptr = position_ids_->writeMap(); if (seq_len == 1) { ptr[0] = all_seq_len_; } else { @@ -564,7 +585,7 @@ VARP Qwen_7b::gen_position_ids(int seq_len) { ptr[i] = i; } } - return position_ids; + return position_ids_; } bool Qwen_7b::is_stop(int token_id) { diff --git a/llm/src/tokenizer.cpp b/transformers/llm/engine/src/tokenizer.cpp similarity index 100% rename from llm/src/tokenizer.cpp rename to transformers/llm/engine/src/tokenizer.cpp diff --git a/transformers/llm/export/README.md b/transformers/llm/export/README.md new file mode 100644 index 000000000..bc72b39da --- /dev/null +++ b/transformers/llm/export/README.md @@ -0,0 +1,159 @@ +# llm-export + +[English](./README_en.md) + +llm-export是一个llm模型导出工具,能够将llm模型导出为onnx和mnn模型。 + +- 🚀 均完成`onnxruntime`正确性测试 +- 🚀 优化原始代码,支持动态形状 +- 🚀 优化原始代码,减少常量部分 +- 🚀 使用[OnnxSlim](https://github.com/WeLoveAI/OnnxSlim)优化onnx模型,性能提升约5%; by [@inisis](https://github.com/inisis) +- 🚀 支持将lora权重导出为onnx和mnn + +## 模型支持与下载 +- [![Download][download-chatglm-6b-onnx]][release-chatglm-6b-onnx] +- [![Download][download-chatglm2-6b-onnx]][release-chatglm2-6b-onnx] +- [![Download][download-chatglm3-6b-onnx]][release-chatglm3-6b-onnx] +- [![Download][download-codegeex2-6b-onnx]][release-codegeex2-6b-onnx] +- [![Download][download-qwen-7b-chat-onnx]][release-qwen-7b-chat-onnx] +- [![Download][download-baichuan2-7b-chat-onnx]][release-baichuan2-7b-chat-onnx] +- [![Download][download-llama2-7b-chat-onnx]][release-llama2-7b-chat-onnx] +- [![Download][download-qwen-1.8b-chat-onnx]][release-qwen-1.8b-chat-onnx] +- [![Download][download-phi-2-onnx]][release-phi-2-onnx] +- [![Download][download-internlm-7b-onnx]][release-internlm-7b-onnx] +- [![Download][download-qwen-vl-onnx]][release-qwen-vl-onnx] +- [![Download][download-bge-large-zh-onnx]][release-bge-large-zh-onnx] +- [![Download][download-tinyllama-1.1b-chat-onnx]][release-tinyllama-1.1b-chat-onnx] +- [![Download][download-yi-6b-chat-onnx]][release-yi-6b-chat-onnx] +- [![Download][download-deepseek-7b-chat-onnx]][release-deepseek-7b-chat-onnx] +- [![Download][download-qwen1.5-0.5b-chat-onnx]][release-qwen1.5-0.5b-chat-onnx] +- [![Download][download-qwen1.5-1.8b-chat-onnx]][release-qwen1.5-1.8b-chat-onnx] +- [![Download][download-qwen1.5-4b-chat-onnx]][release-qwen1.5-4b-chat-onnx] +- [![Download][download-qwen1.5-7b-chat-onnx]][release-qwen1.5-7b-chat-onnx] +- [![Download][download-llama3-8b-instruct-onnx]][release-llama3-8b-instruct-onnx] + +[download-chatglm-6b-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/chatglm-6b-onnx/total +[download-chatglm2-6b-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/chatglm2-6b-onnx/total +[download-chatglm3-6b-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/chatglm3-6b-onnx/total +[download-codegeex2-6b-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/codegeex2-6b-onnx/total +[download-qwen-7b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen-7b-chat-onnx/total +[download-baichuan2-7b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/baichuan2-7b-chat-onnx/total +[download-llama2-7b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/llama2-7b-chat-onnx/total +[download-qwen-1.8b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen-1.8b-onnx/total +[download-phi-2-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/phi-2-onnx/total +[download-internlm-7b-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/internlm-7b-onnx/total +[download-qwen-vl-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen-vl-onnx/total +[download-bge-large-zh-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/bge-large-zh-onnx/total +[download-tinyllama-1.1b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/tinyllama-1.1b-chat-onnx/total +[download-yi-6b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/yi-6b-chat-onnx/total +[download-deepseek-7b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/deepseek-7b-chat-onnx/total +[download-qwen1.5-0.5b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen1.5-0.5b-chat-onnx/total +[download-qwen1.5-1.8b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen1.5-1.8b-chat-onnx/total +[download-qwen1.5-4b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen1.5-4b-chat-onnx/total +[download-qwen1.5-7b-chat-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/qwen1.5-7b-chat-onnx/total +[download-llama3-8b-instruct-onnx]: https://img.shields.io/github/downloads/wangzhaode/llm-export/llama3-8b-instruct-onnx/total +[release-chatglm-6b-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/chatglm-6b-onnx +[release-chatglm2-6b-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/chatglm2-6b-onnx +[release-chatglm3-6b-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/chatglm3-6b-onnx +[release-codegeex2-6b-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/codegeex2-6b-onnx +[release-qwen-7b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen-7b-chat-onnx +[release-baichuan2-7b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/baichuan2-7b-chat-onnx +[release-llama2-7b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/llama2-7b-chat-onnx +[release-qwen-1.8b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen-1.8b-onnx +[release-phi-2-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/phi-2-onnx +[release-internlm-7b-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/internlm-7b-onnx +[release-qwen-vl-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen-vl-onnx +[release-bge-large-zh-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/bge-large-zh-onnx +[release-tinyllama-1.1b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/tinyllama-1.1b-chat-onnx +[release-yi-6b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/yi-6b-chat-onnx +[release-deepseek-7b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/deepseek-7b-chat-onnx +[release-qwen1.5-0.5b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen1.5-0.5b-chat-onnx +[release-qwen1.5-1.8b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen1.5-1.8b-chat-onnx +[release-qwen1.5-4b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen1.5-4b-chat-onnx +[release-qwen1.5-7b-chat-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/qwen1.5-7b-chat-onnx +[release-llama3-8b-instruct-onnx]: https://github.com/wangzhaode/llm-export/releases/tag/llama3-8b-instruct-onnx + +## 用法 +1. 将该项目clone到本地 +```sh +git clone git@github.com:wangzhaode/llm-export.git +``` +2. 将需要导出的LLM项目clone到本地,如:chatglm2-6b +```sh +git clone https://huggingface.co/THUDM/chatglm2-6b +# 如果huggingface下载慢可以使用modelscope +git clone https://modelscope.cn/ZhipuAI/chatglm2-6b.git +``` +3. 执行LLMExporter导出模型 +```sh +cd mnn-llm +# 将chatglm2-6b分为embedding, blocks, lm分别导出为onnx并转换为mnn, 并导出tokenizer.txt +python llm_export.py \ + --path ../chatglm2-6b \ + --export_split \ + --export_token \ + --export_mnn \ + --onnx_path ./chatglm2-6b-onnx \ + --mnn_path ./chatglm2-6b-mnn +``` + +## 功能 +- 支持将模型完整导出为一个onnx模型,使用`--export` +- 支持将模型分段导出为多个模型,使用`--export_split` +- 支持导出模型的词表到一个文本文件,每行代表一个token;其中token使用base64编码;使用`--export_verbose` +- 支持导出模型的Embedding层为一个onnx模型,使用`--export_embed`,同时支持bf16格式,使用`--embed_bf16` +- 支持分层导出模型的block,使用`--export_blocks`导出全部层;使用`--export_block $id`导出指定层 +- 支持导出模型的lm_head层为一个onnx模型,使用`--export_lm` +- 支持导出多模态模型的visual模型为一个onnx模型,使用`--export_visual` +- 支持对模型进行对话测试,使用`--test $query`会返回llm的回复内容 +- 支持在导出onnx模型后使用onnxruntime对结果一致性进行校验,使用`--export_test` +- 支持将tokenizer导出为文本文件,使用`--export_token` +- 支持将导出的onnx模型转换为mnn模型,默认转换为非对称4bit量化,使用`--export_mnn` +- 指定导出路径使用`--onnx_path`和`--mnn_path` +- 默认会使用onnx-slim对onnx模型进行优化,跳过该步骤使用`--skip_slim` +- 支持合并lora权重后导出,指定lora权重的目录使用`--lora_path` + +## 参数 +``` +usage: llm_export.py [-h] --path PATH + [--type {chatglm-6b,chatglm2-6b,chatglm3-6b,codegeex2-6b,Qwen-7B-Chat,Qwen-1_8B-Chat,Qwen-1_8B,Qwen-VL-Chat,Qwen1_5-0_5B-Chat,Qwen1_5-1_8B-Chat,Qwen1_5-4B-Chat,Qwen1_5-7B-Chat,Baichuan2-7B-Chat,Llama-2-7b-chat-ms,Llama-3-8B-Instruct,internlm-chat-7b,TinyLlama-1_1B-Chat,Yi-6B-Chat,deepseek-llm-7b-chat,phi-2,bge-large-zh,lora}] + [--lora_path LORA_PATH] [--onnx_path ONNX_PATH] [--mnn_path MNN_PATH] [--export_mnn] [--export_verbose] [--export_test] [--test TEST] [--export] + [--export_split] [--export_token] [--export_embed] [--export_visual] [--export_lm] [--export_block EXPORT_BLOCK] [--export_blocks] [--embed_bin] + [--embed_bf16] [--skip_slim] + +llm_exporter + +optional arguments: + -h, --help show this help message and exit + --path PATH path(`str` or `os.PathLike`): + Can be either: + - A string, the *model id* of a pretrained model like `THUDM/chatglm-6b`. [TODO] + - A path to a *directory* clone from repo like `../chatglm-6b`. + --type {chatglm-6b,chatglm2-6b,chatglm3-6b,codegeex2-6b,Qwen-7B-Chat,Qwen-1_8B-Chat,Qwen-1_8B,Qwen-VL-Chat,Qwen1_5-0_5B-Chat,Qwen1_5-1_8B-Chat,Qwen1_5-4B-Chat,Qwen1_5-7B-Chat,Baichuan2-7B-Chat,Llama-2-7b-chat-ms,Llama-3-8B-Instruct,internlm-chat-7b,TinyLlama-1_1B-Chat,Yi-6B-Chat,deepseek-llm-7b-chat,phi-2,bge-large-zh,lora} + type(`str`, *optional*): + The pretrain llm model type. + --lora_path LORA_PATH + lora path, defaut is `None` mean not apply lora. + --onnx_path ONNX_PATH + export onnx model path, defaut is `./onnx`. + --mnn_path MNN_PATH export mnn model path, defaut is `./mnn`. + --export_mnn Whether or not to export mnn model after onnx. + --export_verbose Whether or not to export onnx with verbose. + --export_test Whether or not to export onnx with test using onnxruntime. + --test TEST test model inference with query `TEST`. + --export export model to an `onnx` model. + --export_split export model split to some `onnx` models: + - embedding model. + - block models. + - lm_head model. + --export_token export llm tokenizer to a txt file. + --export_embed export llm embedding to an `onnx` model. + --export_visual export llm visual model to an `onnx` model. + --export_lm export llm lm_head to an `onnx` model. + --export_block EXPORT_BLOCK + export llm block [id] to an `onnx` model. + --export_blocks export llm all blocks to `onnx` models. + --embed_bin export embedding weight as bin file with dtype `bfloat16` + --embed_bf16 using `bfloat16` replace `float32` in embedding. + --skip_slim Whether or not to skip onnx-slim. +``` diff --git a/transformers/llm/export/README_en.md b/transformers/llm/export/README_en.md new file mode 100644 index 000000000..9942c23f1 --- /dev/null +++ b/transformers/llm/export/README_en.md @@ -0,0 +1,92 @@ +# llm-export + +[中文](./README_en.md) + +llm-export is a tool for exporting llm models, capable of converting llm models into ONNX or MNN models. +- 🚀 All passed `onnxruntime` correctness tests +- 🚀 Optimized the original code to support dynamic shapes +- 🚀 Optimized the original code to reduce the constant portion +- 🚀 Using [OnnxSlim](https://github.com/WeLoveAI/OnnxSlim) slim onnx model,speed up 5%; by [@inisis](https://github.com/inisis) +- 🚀 Support export lora weight to onnx or MNN model + +## Model Support and Downloads + +## Usage +1. Clone this project locally +```sh +git clnoe git@github.com:wangzhaode/llm-export.git +``` +2. Clone the LLM project that you want to export locally, such as: chatglm2-6b +```sh +git clone https://huggingface.co/THUDM/chatglm2-6b +# If downloading from Hugging Face is slow, you can use ModelScope +git clone https://modelscope.cn/ZhipuAI/chatglm2-6b.git +``` +3. Execute LLMExporter to export the model +```sh +cd mnn-llm +# Divide chatglm2-6b into embedding, blocks, lm, export each as ONNX and convert to MNN, and also export tokenizer.txt +python llm_export.py \ + --path ../chatglm2-6b \ + --export_split \ + --export_token \ + --export_mnn \ + --onnx_path ./chatglm2-6b-onnx \ + --mnn_path ./chatglm2-6b-mnn +``` + +## Features +- Supports exporting the entire model as a single ONNX model, use --export +- Supports exporting the model in segments as multiple models, use --export_split +- Supports exporting the model's vocabulary to a text file, each line representing a token; tokens are encoded using base64, use --export_verbose +- Supports exporting the model's Embedding layer as an ONNX model, use --export_embed, also supports bf16 format, use --embed_bf16 +- Supports layered export of the model's blocks, use --export_blocks to export all layers; use --export_block $id to export a specified layer +- Supports exporting the model's lm_head layer as an ONNX model, use --export_lm +- Supports exporting the VL model's visual model as an ONNX model, use --export_visual +- Supports conducting a dialogue test on the model, using --test $query will return the llm's response +- Supports verifying the consistency of results using onnxruntime after exporting the ONNX model, use --export_test +- Supports exporting the tokenizer as a text file, use --export_token +- Supports converting the exported ONNX model to an MNN model, with default conversion to non-symmetric 4bit quantization, use --export_mnn +- Specify export paths using --onnx_path and --mnn_path +- Default using onnx-slim, skip using --skip_slim + +## Commad Args +``` +usage: llm_export.py [-h] --path PATH + [--type {chatglm-6b,chatglm2-6b,chatglm3-6b,codegeex2-6b,Qwen-7B-Chat,Qwen-1_8B-Chat,Qwen-VL-Chat,Baichuan2-7B-Chat,Llama-2-7b-chat-ms,internlm-chat-7b,TinyLlama-1_1B-Chat,Yi-6B-Chat,deepseek-llm-7b-chat,phi-2,bge-large-zh}] + [--onnx_path ONNX_PATH] [--mnn_path MNN_PATH] [--export_mnn] [--export_verbose] [--export_test] [--test TEST] [--export] [--export_split] [--export_token] [--export_embed] [--export_visual] [--export_lm] + [--export_block EXPORT_BLOCK] [--export_blocks] [--embed_bf16] [--skip_slim] + +llm_exporter + +optional arguments: + -h, --help show this help message and exit + --path PATH path(`str` or `os.PathLike`): + Can be either: + - A string, the *model id* of a pretrained model like `THUDM/chatglm-6b`. [TODO] + - A path to a *directory* clone from repo like `../chatglm-6b`. + --type {chatglm-6b,chatglm2-6b,chatglm3-6b,codegeex2-6b,Qwen-7B-Chat,Qwen-1_8B-Chat,Qwen-VL-Chat,Baichuan2-7B-Chat,Llama-2-7b-chat-ms,internlm-chat-7b,TinyLlama-1_1B-Chat,Yi-6B-Chat,deepseek-llm-7b-chat,phi-2,bge-large-zh} + type(`str`, *optional*): + The pretrain llm model type. + --onnx_path ONNX_PATH + export onnx model path, defaut is `./onnx`. + --mnn_path MNN_PATH export mnn model path, defaut is `./mnn`. + --export_mnn Whether or not to export mnn model after onnx. + --export_verbose Whether or not to export onnx with verbose. + --export_test Whether or not to export onnx with test using onnxruntime. + --test TEST test model inference with query `TEST`. + --export export model to an `onnx` model. + --export_split export model split to some `onnx` models: + - embedding model. + - block models. + - lm_head model. + --export_token export llm tokenizer to a txt file. + --export_embed export llm embedding to an `onnx` model. + --export_visual export llm visual model to an `onnx` model. + --export_lm export llm lm_head to an `onnx` model. + --export_block EXPORT_BLOCK + export llm block [id] to an `onnx` model. + --export_blocks export llm all blocks to `onnx` models. + --embed_bf16 using `bfloat16` replace `float32` in embedding. + --skip_slim Whether or not to skip onnx-slim. +``` diff --git a/transformers/llm/export/llm_export.py b/transformers/llm/export/llm_export.py new file mode 100644 index 000000000..3ee64ca77 --- /dev/null +++ b/transformers/llm/export/llm_export.py @@ -0,0 +1,1280 @@ +import os +import base64 +import glob +import shutil +import argparse +import torch +import numpy as np +from onnxslim import slim +import onnxruntime as ort +import sentencepiece as spm +from transformers import AutoModel, AutoModelForCausalLM, AutoTokenizer +from peft import LoraConfig, TaskType, get_peft_model, PeftModel +try: + import _tools as MNNTools +except: + MNNTools = None + +def onnx2mnn(onnx_path, mnn_dir, quant_bit = 4, asymmetric = True, external_data = False, bizCode : str= None): + model_name, model_extension = os.path.splitext(os.path.basename(onnx_path)) + if model_extension != '.onnx': + return + mnn_name = model_name + '.mnn' + mnn_path = os.path.join(mnn_dir, mnn_name) + convert_args = [ + '', + '-f', + 'ONNX', + '--modelFile', + str(onnx_path), + '--MNNModel', + str(mnn_path), + '--weightQuantBits', + str(quant_bit), + ] + if asymmetric: + convert_args.append("--weightQuantAsymmetric") + if external_data: + convert_args.append("--saveExternalData") + if bizCode is not None: + convert_args.append("--bizCode") + convert_args.append(str(bizCode)) + MNNTools.mnnconvert(convert_args) + +# some wrapper class for export +class Embedding(torch.nn.Module): + def __init__(self, embed, using_bf16: bool = False): + super().__init__() + self.bf16 = using_bf16 + self.embed_dim = embed.weight.shape[-1] + if using_bf16: + # using bf16 embedding weight + self.embed = embed.bfloat16() + else: + self.embed = embed + + def forward(self, input_ids): + res = self.embed(input_ids) + if self.bf16: + res = res.float() + return res.view(-1, 1, self.embed_dim) + +class Lm(torch.nn.Module): + def __init__(self, lm): + super().__init__() + self.lm = lm + + def forward(self, hidden_states): + m_logits = self.lm(hidden_states) + token = torch.argmax(m_logits) + return token + +class LLM(torch.nn.Module): + ''' + Base class for all llm model. Inherits from [`torch.nn.Module`]. + ''' + + def __init__(self, args): + super().__init__() + self.quant_bit = 4 + self.asymmetric = True + self.onnx_path = args.onnx_path + self.mnn_path = args.mnn_path + if not os.path.exists(self.onnx_path): + os.makedirs(self.onnx_path) + if not os.path.exists(self.mnn_path): + os.makedirs(self.mnn_path) + self.export_mnn = args.export_mnn + self.export_verbose = args.export_verbose + self.export_test = args.export_test + # default is False, just set True when using below command: + # `python llm_export ../path --export --embed_bin` to export single model without embedding + self.without_embed = False + self.embed_bin = args.embed_bin + if self.embed_bin: + self.embed_bf16 = True + else: + self.embed_bf16 = args.embed_bf16 + self.skip_slim = args.skip_slim + tokenizer_model = os.path.join(args.path, 'tokenizer.model') + if os.path.exists(tokenizer_model): + self.sp_model = spm.SentencePieceProcessor(tokenizer_model) + else: + self.sp_model = None + merge_file = os.path.join(args.path, 'merges.txt') + if os.path.exists(merge_file): + self.merge_txt = merge_file + else: + self.merge_txt = None + self.stop_ids = [] + self.max_length = 1024 + self.hidden_size = 4096 + self.visual = None # defualt is not visual + self.lora_path = args.lora_path + self.load_hf(args.path) + self.load_model() + + def load_hf(self, model_path: str): + self.tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) + self.model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).float().eval() + self.config = self.model.config + if self.lora_path is not None: + adapter = PeftModel.from_pretrained(self.model, model_id=self.lora_path) + self.model = adapter.merge_and_unload(progressbar=True) + + def load_model(self): + raise NotImplementedError + + def get_attention_mask(self) -> torch.Tensor: + raise NotImplementedError + + def get_position_ids(self) -> torch.Tensor: + raise NotImplementedError + + def export_vocab(self): + raise NotImplementedError + + def visual_embed(self, input_ids): + raise NotImplementedError + + def __embedding(self, input_ids): + if self.visual is not None and self.token_len == 0: + input_embeds = self.visual_embed(input_ids) + else: + input_embeds = self.embed(input_ids) + return input_embeds + + def __decode(self, hidden_states, attention_mask, position_ids, past_key_values): + presents = [] + for i in range(self.block_nums): + hidden_states, kv = self.blocks[i](hidden_states, attention_mask, position_ids, past_key_values[i]) + presents.append(kv) + token_id = self.lm(hidden_states).view(1) + presents = torch.stack(presents) + self.seq_len += 1 + self.token_len += 1 + return token_id, presents + + def forward(self, input_ids, attention_mask, position_ids, past_key_values): + if self.without_embed: + return self.__decode(input_ids, attention_mask, position_ids, past_key_values) + return self.__decode(self.__embedding(input_ids), attention_mask, position_ids, past_key_values) + + # some test functions + def build_prompt(self, query): + if hasattr(self.tokenizer, 'build_prompt'): + prompt = self.tokenizer.build_prompt(query) + else: + prompt = query + return prompt + + def str_to_ids(self, prompt): + input_ids = self.tokenizer(prompt, return_tensors="pt")['input_ids'] + return input_ids + + def id_to_str(self, token_id): + word = self.tokenizer._convert_id_to_token(int(token_id)) + word = self.tokenizer.convert_tokens_to_string([word]) + return word + + def response(self, query): + prompt = self.build_prompt(query) + input_ids = self.str_to_ids(prompt) + self.seq_len = input_ids.numel() + self.context_len = self.seq_len - 2 + self.token_len = 0 + past_key_values = [None for i in range(self.block_nums)] + token_id = input_ids + while self.token_len < self.max_length: + attention_mask = self.get_attention_mask() + position_ids = self.get_position_ids() + token_id, past_key_values = self.forward(token_id, attention_mask, position_ids, past_key_values) + if token_id == self.stop_id or token_id in self.stop_ids: + print("", end='\n') + break + word = self.id_to_str(token_id) + print(word, end="", flush=True) + + # some export functions + def assert_equal(self, torch_outs, onnx_outs): + if type(torch_outs) not in (list, tuple): + torch_outs = (torch_outs, ) + onnx_outs = (onnx_outs, ) + same = True + for orig, onnx in zip(torch_outs, onnx_outs): + orig = orig.detach().numpy() + if not np.allclose(orig, onnx, rtol=1e-3, atol=1e-3): + print('Error: onnx outputs dont match original. [shape = {}] onnx: {}, original: {}'.format(onnx.shape, onnx, orig)) + same = False + break + if same: + print('onnx test SUCCESS') + + def export_lm(self): + model = self.lm + hidden_states = torch.randn(1, self.hidden_size) + onnx_model = f'./{self.onnx_path}/lm.onnx' + torch.onnx.export(model, (hidden_states), + onnx_model, + verbose=self.export_verbose, + input_names=['hidden_states'], + output_names=['token_id'], + do_constant_folding=True, + opset_version=15) + if not self.skip_slim: + slim(onnx_model, output_model=onnx_model) + # test lm + if self.export_test: + original_outs = model(hidden_states) + ort_session = ort.InferenceSession(onnx_model, providers=['CPUExecutionProvider']) + inputs = { + 'hidden_states' : hidden_states.numpy(), + } + onnx_outs = ort_session.run(None, inputs) + self.assert_equal(original_outs, onnx_outs) + if self.export_mnn: + onnx2mnn(onnx_model, self.mnn_path, self.quant_bit, self.asymmetric) + + def export_visual(self): + if self.visual is None: + return + input_images = torch.randn((1, 3, self.image_size, self.image_size)) + model = self.visual + onnx_model = f'./{self.onnx_path}/visual.onnx' + torch.onnx.export(model, (input_images), + onnx_model, + verbose=self.export_verbose, + input_names=['input_images'], + output_names=['image_embeds'], + dynamic_axes={"input_images": { + 0: "size" + }}, + do_constant_folding=True, + opset_version=15) + if not self.skip_slim: + slim(onnx_model, output_model=onnx_model) + # test + if self.export_test: + original_outs = model(input_images) + ort_session = ort.InferenceSession(onnx_model, providers=['CPUExecutionProvider']) + inputs = { + 'input_images' : input_images.numpy(), + } + onnx_outs = ort_session.run(None, inputs)[0] + self.assert_equal(original_outs, onnx_outs) + if self.export_mnn: + onnx2mnn(onnx_model, self.mnn_path) + + def export_embed(self): + model = self.embed + if self.embed_bin: + import ctypes + tensor_data = model.embed.weight.data + data_ptr = tensor_data.untyped_storage().data_ptr() + buffer = (ctypes.c_byte * (tensor_data.numel() * 2)).from_address(data_ptr) + with open(f'./{self.mnn_path}/embeddings_bf16.bin', 'wb') as f: + f.write(buffer) + return + input_ids = torch.arange(3, dtype=torch.long) + onnx_model = f'./{self.onnx_path}/embedding.onnx' + torch.onnx.export(model, (input_ids), + onnx_model, + verbose=self.export_verbose, + input_names=['input_ids'], + output_names=['inputs_embeds'], + dynamic_axes={"input_ids": { + 0: "length" + }}, + do_constant_folding=True, + opset_version=15) + if not self.skip_slim: + slim(onnx_model, output_model=onnx_model) + # test + if self.export_test: + original_outs = model(input_ids) + ort_session = ort.InferenceSession(onnx_model, providers=['CPUExecutionProvider']) + inputs = { + 'input_ids' : input_ids.numpy(), + } + onnx_outs = ort_session.run(None, inputs) + self.assert_equal(original_outs, onnx_outs) + if self.export_mnn: + onnx2mnn(onnx_model, self.mnn_path) + + def export_block(self, block_id: int): + self.seq_len = 3 + self.token_len = 0 + inputs_embeds = torch.randn((self.seq_len, 1, self.hidden_size)) + attention_mask = self.get_attention_mask() + position_ids = self.get_position_ids() + past_key_values = torch.zeros(self.past_kv_shape[1:]) + model = self.blocks[block_id] + onnx_model = f'./{self.onnx_path}/block_{block_id}.onnx' + torch.onnx.export( + model, (inputs_embeds, attention_mask, position_ids, past_key_values), + onnx_model, + verbose=self.export_verbose, + input_names=[ + 'inputs_embeds', 'attention_mask', 'position_ids', 'past_key_values' + ], + output_names=['hidden_states', 'presents'], + dynamic_axes=self.block_dynamic_axes, + do_constant_folding=True, + opset_version=15) + if not self.skip_slim: + slim(onnx_model, output_model=onnx_model) + if self.export_test: + original_outs = model(inputs_embeds, attention_mask, position_ids, past_key_values) + ort_session = ort.InferenceSession(onnx_model, providers=['CPUExecutionProvider']) + inputs = { + 'inputs_embeds' : inputs_embeds.detach().numpy(), + 'attention_mask' : attention_mask.numpy(), + 'position_ids' : position_ids.numpy(), + 'past_key_values' : past_key_values.numpy() + } + onnx_outs = ort_session.run(None, inputs) + self.assert_equal(original_outs, onnx_outs) + if self.export_mnn: + onnx2mnn(onnx_model, self.mnn_path, self.quant_bit, self.asymmetric) + + def export_blocks(self): + for i in range(self.block_nums): + self.export_block(i) + + def export(self): + model = self + self.seq_len = 3 + self.token_len = 0 + input_ids = torch.arange(3, dtype=torch.long) + attention_mask = self.get_attention_mask() + position_ids = self.get_position_ids() + past_key_values = torch.zeros(self.past_kv_shape) + onnx_model = f'./{self.onnx_path}/llm.onnx' + if self.embed_bin: + self.without_embed = True + input_ids = self.__embedding(input_ids) + print('export start ...') + torch.onnx.export( + model, (input_ids, attention_mask, position_ids, past_key_values), + onnx_model, + verbose=self.export_verbose, + input_names=[ + 'input_ids', 'attention_mask', 'position_ids', 'past_key_values' + ], + output_names=['token_id', 'presents'], + dynamic_axes=self.model_dynamic_axes, + do_constant_folding=True, + opset_version=15) + print('export done!') + if not self.skip_slim: + slim(onnx_model, output_model=onnx_model) + if self.export_test: + # test + original_outs = model(input_ids, attention_mask, position_ids, past_key_values) + ort_session = ort.InferenceSession(onnx_model, providers=['CPUExecutionProvider']) + inputs = { + 'input_ids' : input_ids.detach().numpy(), + 'attention_mask' : attention_mask.numpy(), + 'position_ids' : position_ids.numpy(), + 'past_key_values' : past_key_values.numpy() + } + onnx_outs = ort_session.run(None, inputs) + self.assert_equal(original_outs, onnx_outs) + if self.export_mnn: + # single model is > 2G, using external_data + onnx2mnn(onnx_model, self.mnn_path, self.quant_bit, self.asymmetric, True) + if self.without_embed: + self.without_embed = False + + def export_tokenizer(self): + file_path = os.path.join(self.onnx_path, "tokenizer.txt") + if self.sp_model is not None: + # senetencepiece + print('# senetencepiece tokenier') + NORMAL = 1; UNKNOWN = 2; CONTROL = 3 + USER_DEFINED = 4; UNUSED = 5; BYTE = 6 + fp = open(file_path, "w", encoding="utf8") + for i in range(self.sp_model.GetPieceSize()): + token = self.sp_model.IdToPiece(i) + score = self.sp_model.GetScore(i) + type = NORMAL + if self.sp_model.IsUnknown(i): + type = UNKNOWN + elif self.sp_model.IsControl(i): + type = CONTROL + elif self.sp_model.IsUnused(i): + type = UNUSED + elif self.sp_model.IsByte(i): + type = BYTE + if self.model_name == 'Chatglm_6b': + if '' in token: token = '\n' + if '<|tab|>' in token: token = '\t' + if '<|blank_' in token: token = ' ' * int(token[8:token.find('|>')]) + if '▁' in token: token = token.replace('▁', ' ') + token_encode = base64.b64encode(token.encode("utf-8")).decode("utf8") + fp.write(f'{token_encode} {score} {type}\n') + fp.close() + elif hasattr(self.tokenizer, 'mergeable_ranks'): + print('# tiktoken tokenier') + # tikton + with open(file_path, "w", encoding="utf8") as fp: + for k, v in self.tokenizer.mergeable_ranks.items(): + line = base64.b64encode(k).decode("utf8") + "\n" + fp.write(line) + if hasattr(self.tokenizer, 'special_tokens'): + for k, v in self.tokenizer.special_tokens.items(): + line = base64.b64encode(k.encode("utf-8")).decode("utf8") + "\n" + fp.write(line) + elif self.merge_txt is not None: + # huggingface tokenizer + merge_list = [] + vocab = self.tokenizer.get_vocab() + vocab_list = ['' for i in range(len(vocab))] + # load vocab + for k, v in vocab.items(): + vocab_list[int(v)] = k + # load merge + with open(self.merge_txt, 'rt') as merge: + for line in merge.readlines(): + merge_list.append(line) + # write to tokenizer.txt + with open(file_path, "w", encoding="utf8") as fp: + fp.write(f'{len(vocab_list)} {len(merge_list)}\n') + for v in vocab_list: + fp.write(v + '\n') + for m in merge_list: + fp.write(m) + else: + # huggingface tokenizer + def unicode_to_byte(u: int): + if u >= 256 and u <= 288: + return u - 256 + if u >= 289 and u <= 322: + return u - 162 + if u == 323: + return 173 + if u == 65372: # | + return 124 + if u == 9601: # _ + return 95 + return u + with open(file_path, "w", encoding="utf8") as fp: + vocab = self.tokenizer.get_vocab() + vocab_list = ['' for i in range(len(vocab))] + for k, v in vocab.items(): + try: + vocab_list[int(v)] = bytes([unicode_to_byte(ord(c)) for c in k]).decode('utf-8', errors='ignore') + except: + vocab_list[int(v)] = k + for v in vocab_list: + line = base64.b64encode(v.encode('utf-8')).decode("utf8") + "\n" + fp.write(line) + + +# chatglm +class GLMBlock(torch.nn.Module): + def __init__(self, block, block_id, final_layernorm = None): + super().__init__() + self.block = block + self.block_id = block_id + self.final_layernorm = final_layernorm + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + hidden_states, presents = self.block(hidden_states, + position_ids, + attention_mask, + self.block_id, + past_kv, + use_cache=True) + if self.final_layernorm is not None: + hidden_states = self.final_layernorm(hidden_states) + hidden_states = hidden_states.view(-1, self.hidden_size)[-1].view(1, 1, self.hidden_size) + if isinstance(presents, tuple): + presents = torch.stack(presents) + return hidden_states, presents + +class Chatglm_6b(LLM): + def __init__(self, args): + super().__init__(args) + self.model_name = 'Chatglm_6b' + + def load_model(self): + transformer = self.model.transformer + self.lm_ = self.model.lm_head + self.embed_ = transformer.word_embeddings + self.blocks_ = transformer.layers + self.final_layernorm_ = transformer.final_layernorm + # some wrapper + self.stop_id = self.tokenizer._convert_token_to_id(self.tokenizer.eos_token) + self.block_nums = len(self.blocks_) + self.lm = Lm(self.lm_) + # chatglm embedding and lm using same param, copy embedding when using bf16 + if self.embed_bf16: + import copy + embed_copy = copy.deepcopy(self.embed_) + self.embed = Embedding(embed_copy, self.embed_bf16) + else: + self.embed = Embedding(self.embed_, self.embed_bf16) + self.blocks = [GLMBlock(self.blocks_[i], i, self.final_layernorm_ if i == len(self.blocks_) - 1 else None) for i in range(self.block_nums)] + # some config for export + self.past_kv_shape = [28, 2, 0, 1, 32, 128] + self.block_dynamic_axes = { + "inputs_embeds" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 2: "seq_len" }, + "past_key_values" : { 1: "history_len" } + } + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 2: "seq_len" }, + "past_key_values" : { 2: "history_len" } + } + + def get_attention_mask(self) -> torch.Tensor: + if self.token_len: + return torch.zeros([1]).bool().reshape([1, 1, 1, 1]) + attention_mask = torch.zeros([self.seq_len, self.seq_len], dtype=torch.bool) + for i in range(self.seq_len): + attention_mask[i][-1] = True + attention_mask = attention_mask.reshape([1, 1, self.seq_len, self.seq_len]) + return attention_mask + + def get_position_ids(self) -> torch.Tensor: + if self.token_len: + return torch.tensor([1, self.seq_len - self.context_len]).reshape([1, 2, 1]) + position_ids_0 = torch.arange(self.seq_len, dtype=torch.long) + position_ids_1 = torch.zeros(self.seq_len, dtype=torch.long) + position_ids_1[-1] = 1 + position_ids = torch.stack([position_ids_0, position_ids_1]).view(1, 2, -1) + return position_ids + +# chatglm2 +class GLM2Block(torch.nn.Module): + def __init__(self, block, block_id, final_layernorm = None): + super().__init__() + self.block = block + self.block_id = block_id + self.final_layernorm = final_layernorm + self.hidden_size = 4096 + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + theta = 1.0 / (10000 ** (torch.arange(0, 64, 2, dtype=torch.float32) / 64)) + position_ids = position_ids.float().reshape(-1, 1) + idx_theta = position_ids * theta + rotary_pos_emb = torch.stack([torch.cos(idx_theta), torch.sin(idx_theta)], dim=-1).unsqueeze(0).contiguous() + hidden_states, presents = self.block(hidden_states, + attention_mask, + kv_cache=past_kv, + rotary_pos_emb=rotary_pos_emb) + if self.final_layernorm is not None: + hidden_states = self.final_layernorm(hidden_states) + hidden_states = hidden_states.view(-1, self.hidden_size)[-1].view(1, 1, self.hidden_size) + if isinstance(presents, tuple): + presents = torch.stack(presents) + return hidden_states, presents + +class Chatglm2_6b(LLM): + def __init__(self, args): + super().__init__(args) + self.model_name = 'Chatglm2_6b' + if 'codegeex2-6b' in args.path: + self.model_name = 'Codegeex2_6b' + + def load_model(self): + transformer = self.model.transformer + self.lm_ = transformer.output_layer + self.embed_ = transformer.embedding.word_embeddings + self.blocks_ = transformer.encoder.layers + self.final_layernorm_ = transformer.encoder.final_layernorm + # some wrapper + self.stop_id = self.tokenizer.eos_token_id + if self.stop_id is None: + # codegeex2-6b + self.stop_id = self.tokenizer.tokenizer.eos_id + self.block_nums = len(self.blocks_) + self.embed = Embedding(self.embed_, self.embed_bf16) + self.lm = Lm(self.lm_) + self.blocks = [GLM2Block(self.blocks_[i], i, self.final_layernorm_ if i == len(self.blocks_) - 1 else None) for i in range(self.block_nums)] + # some config for export + self.past_kv_shape = [28, 2, 0, 1, 2, 128] + self.block_dynamic_axes = { + "inputs_embeds" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 1: "history_len" } + } + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 2: "history_len" } + } + + def get_attention_mask(self) -> torch.Tensor: + if self.token_len: + return torch.zeros([1, 1, 1, 1]).bool() + attention_mask = ~torch.tril(torch.ones([1, 1, self.seq_len, self.seq_len]).bool()) + return attention_mask + + def get_position_ids(self) -> torch.Tensor: + if self.token_len: + return torch.tensor([self.token_len], dtype=torch.long) + return torch.arange(self.seq_len, dtype=torch.long) + +# chatglm3 +class Chatglm3_6b(Chatglm2_6b): + def __init__(self, args): + super().__init__(args) + self.model_name = 'Chatglm3_6b' + + def build_prompt(self, query): + return f'<|user|>\n{query}\n<|assistant|>\n' + +# qwen +class QWENBlock(torch.nn.Module): + def __init__(self, name, block, block_id, hidden_size, final_layernorm = None): + super().__init__() + self.name = name + self.block = block + self.block_id = block_id + self.final_layernorm = final_layernorm + self.hidden_size = hidden_size + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + theta = 1.0 / (10000.0 ** (torch.arange(0, 128, 2, dtype=torch.float32) / 128)) + position_ids = position_ids.float().reshape(-1, 1) + idx_theta = position_ids * theta + rotary_pos_emb = torch.cat((idx_theta, idx_theta), dim=-1) + rotary_pos_emb = rotary_pos_emb.unsqueeze(1).unsqueeze(0) + if self.name != 'Qwen-7B': + rotary_pos_emb = torch.stack([torch.cos(rotary_pos_emb), torch.sin(rotary_pos_emb)]) + hidden_states = hidden_states.view(1, -1, self.hidden_size) + hidden_states, presents = self.block(hidden_states=hidden_states, + layer_past=past_kv, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + use_cache=True) + if self.final_layernorm is not None: + hidden_states = self.final_layernorm(hidden_states) + hidden_states = hidden_states.view(-1, self.hidden_size)[-1].view(1, 1, self.hidden_size) + if isinstance(presents, tuple): + presents = torch.stack(presents) + return hidden_states, presents + +class QWEN18Block(torch.nn.Module): + def __init__(self, block, block_id, hidden_size, final_layernorm = None): + super().__init__() + self.block = block + self.block_id = block_id + self.final_layernorm = final_layernorm + self.hidden_size = hidden_size + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + theta = 1.0 / (10000.0 ** (torch.arange(0, 128, 2, dtype=torch.float32) / 128)) + position_ids = position_ids.float().reshape(-1, 1) + idx_theta = position_ids * theta + rotary_pos_emb = torch.cat((idx_theta, idx_theta), dim=-1).unsqueeze(1).unsqueeze(0) + rotary_pos_emb = torch.stack([torch.cos(rotary_pos_emb), torch.sin(rotary_pos_emb)]) + hidden_states = hidden_states.view(1, -1, self.hidden_size) + hidden_states, presents = self.block(hidden_states, + rotary_pos_emb, + past_kv, + attention_mask, + use_cache=True) + if self.final_layernorm is not None: + hidden_states = self.final_layernorm(hidden_states) + hidden_states = hidden_states.view(-1, self.hidden_size)[-1].view(1, 1, self.hidden_size) + if isinstance(presents, tuple): + presents = torch.stack(presents) + return hidden_states, presents + +class Qwen_Chat(LLM): + def __init__(self, args): + super().__init__(args) + + def load_model(self): + # Qwen models + self.model_name = 'Qwen-7B' + if '1_8' in model_path: + self.model_name = 'Qwen-1_8b' + if 'VL' in model_path: + self.model_name = 'Qwen-VL' + transformer = self.model.transformer + self.lm_ = self.model.lm_head + self.embed_ = transformer.wte + self.blocks_ = transformer.h + self.final_layernorm_ = transformer.ln_f + if hasattr(transformer, 'visual'): + self.visual = transformer.visual + self.image_start_id = transformer.config.visual['image_start_id'] + self.image_size = transformer.config.visual['image_size'] + # some wrapper + self.stop_id = self.tokenizer.im_end_id + self.block_nums = len(self.blocks_) + self.hidden_size = transformer.embed_dim + self.embed = Embedding(self.embed_, self.embed_bf16) + self.lm = Lm(self.lm_) + self.blocks = [QWENBlock(self.model_name, self.blocks_[i], i, self.hidden_size, self.final_layernorm_ if i == len(self.blocks_) - 1 else None) for i in range(self.block_nums)] + if self.block_nums == 32: + # qwen-7b, qwen-vl + self.past_kv_shape = [32, 2, 1, 0, 32, 128] + elif self.block_nums == 24: + # qwen-1.8b + self.past_kv_shape = [24, 2, 1, 0, 16, 128] + # some config for export + self.block_dynamic_axes = { + "inputs_embeds" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 2: "history_len" } + } + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 3: "history_len" } + } + + def build_prompt(self, query): + return f'\n<|im_start|>user\n{query}<|im_end|>\n<|im_start|>assistant\n' + + def get_attention_mask(self) -> torch.Tensor: + if self.model_name == 'Qwen-VL': + if self.token_len: + return torch.zeros([1, 1, 1, self.seq_len], dtype=torch.float32) + return (1 - torch.tril(torch.ones([1, 1, self.seq_len, self.seq_len]))) * torch.finfo(torch.float32).min + if self.token_len: + return torch.ones([1, 1, 1, 1]).bool() + return torch.tril(torch.ones([1, 1, self.seq_len, self.seq_len]).bool()) + + def get_position_ids(self) -> torch.Tensor: + if self.token_len: + return torch.tensor([self.seq_len - 1], dtype=torch.long) + return torch.arange(self.seq_len, dtype=torch.long) + + def visual_embed(self, input_ids): + if not torch.any(input_ids == self.image_start_id): + return self.embed(input_ids) + bos_pos = torch.where(input_ids == self.image_start_id) + eos_pos = torch.where(input_ids == self.image_start_id + 1) + img_pos = torch.stack((bos_pos[0], bos_pos[1], eos_pos[1]), dim=1) + images = [] + for i, a, b in img_pos: + image = input_ids[i][a + 1 : b - 1].tolist() + image = image[ : image.index(self.image_start_id + 2)] + images.append(bytes(image).decode('utf-8')) + images = self.visual.encode(images) + hidden_states = self.embed(input_ids).view(1, -1, self.hidden_size) + for idx, (i, a, b) in enumerate(img_pos): + hidden_states[i][a + 1 : b] = images[idx] + return hidden_states.view(-1, 1, self.hidden_size) + +class QWEN2Block(torch.nn.Module): + def __init__(self, name, block, block_id, hidden_size, head_dim, final_layernorm = None): + super().__init__() + self.name = name + self.block = block + self.block_id = block_id + self.final_layernorm = final_layernorm + self.hidden_size = hidden_size + self.head_dim = head_dim + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + theta = 1.0 / (10000.0 ** (torch.arange(0, self.head_dim, 2, dtype=torch.float32) / self.head_dim)) + position_ids = position_ids.float().reshape(-1, 1) + idx_theta = position_ids * theta + rotary_pos_emb = torch.cat((idx_theta, idx_theta), dim=-1) + rotary_pos_emb = rotary_pos_emb.unsqueeze(0).unsqueeze(0) + rotary_pos_emb = torch.stack([torch.cos(rotary_pos_emb), torch.sin(rotary_pos_emb)]) + hidden_states = hidden_states.view(1, -1, self.hidden_size) + hidden_states, presents = self.block(hidden_states=hidden_states, + attention_mask=attention_mask, + past_key_value=past_kv, + rotary_pos_emb=rotary_pos_emb, + use_cache=True) + if self.final_layernorm is not None: + hidden_states = self.final_layernorm(hidden_states) + hidden_states = hidden_states.view(-1, self.hidden_size)[-1].view(1, 1, self.hidden_size) + if isinstance(presents, tuple): + presents = torch.stack(presents) + # print('###', presents.shape) + return hidden_states, presents + +class Qwen2_Chat(LLM): + def __init__(self, args): + super().__init__(args) + + def load_model(self): + # Qwen2 models + self.model_name = 'Qwen2' + transformer = self.model.model + self.lm_ = self.model.lm_head + self.embed_ = transformer.embed_tokens + self.blocks_ = transformer.layers + self.final_layernorm_ = transformer.norm + # some wrapper + self.stop_id = self.tokenizer.eos_token_id + if hasattr(model, 'generation_config'): + self.stop_ids.append(self.stop_id) + for id in self.model.generation_config.eos_token_id: + self.stop_ids.append(id) + self.block_nums = self.config.num_hidden_layers + self.hidden_size = self.config.hidden_size + self.num_heads = self.config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.embed = Embedding(self.embed_, self.embed_bf16) + self.lm = Lm(self.lm_) + self.past_kv_shape = [self.block_nums, 2, 1, self.num_heads, 0, self.head_dim] + self.blocks = [QWEN2Block(self.model_name, self.blocks_[i], i, self.hidden_size, self.head_dim, self.final_layernorm_ if i == len(self.blocks_) - 1 else None) for i in range(self.block_nums)] + # some config for export + self.block_dynamic_axes = { + "inputs_embeds" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 2: "history_len" } + } + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 3: "history_len" } + } + + def build_prompt(self, query): + return f'<|im_start|>user\n{query}<|im_end|>\n<|im_start|>assistant\n' + + def get_attention_mask(self) -> torch.Tensor: + if self.token_len: + return torch.zeros([1, 1, 1, self.seq_len], dtype=torch.float32) + return (1 - torch.tril(torch.ones([1, 1, self.seq_len, self.seq_len]))) * torch.finfo(torch.float32).min + + + def get_position_ids(self) -> torch.Tensor: + if self.token_len: + return torch.tensor([[self.seq_len - 1]], dtype=torch.long) + return torch.arange(self.seq_len, dtype=torch.long).unsqueeze(0) + + def visual_embed(self, input_ids): + if not torch.any(input_ids == self.image_start_id): + return self.embed(input_ids) + bos_pos = torch.where(input_ids == self.image_start_id) + eos_pos = torch.where(input_ids == self.image_start_id + 1) + img_pos = torch.stack((bos_pos[0], bos_pos[1], eos_pos[1]), dim=1) + images = [] + for i, a, b in img_pos: + image = input_ids[i][a + 1 : b - 1].tolist() + image = image[ : image.index(self.image_start_id + 2)] + images.append(bytes(image).decode('utf-8')) + images = self.visual.encode(images) + hidden_states = self.embed(input_ids).view(1, -1, self.hidden_size) + for idx, (i, a, b) in enumerate(img_pos): + hidden_states[i][a + 1 : b] = images[idx] + return hidden_states.view(-1, 1, self.hidden_size) + +# llama2 +class LLAMA2Block(torch.nn.Module): + def __init__(self, block, block_id, hidden_size, final_layernorm = None): + super().__init__() + self.block = block + self.block_id = block_id + self.final_layernorm = final_layernorm + self.hidden_size = hidden_size + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + hidden_states = hidden_states.view(1, -1, self.hidden_size) + hidden_states, presents = self.block(hidden_states, + attention_mask, + position_ids, + past_kv, + use_cache=True) + if self.final_layernorm is not None: + hidden_states = self.final_layernorm(hidden_states) + hidden_states = hidden_states.view(-1, self.hidden_size)[-1].view(1, 1, self.hidden_size) + if isinstance(presents, tuple): + presents = torch.stack(presents) + return hidden_states, presents + +class Llama2_7b_Chat(LLM): + def __init__(self, args): + self.model_name = 'Llama2_7b' + if 'Baichuan2' in args.path: + self.model_name = 'Baichuan2_7B' + if 'internlm' in args.path: + self.model_name = 'Internlm_7b' + if 'TinyLlama' in args.path: + self.model_name = 'TinyLlama' + if 'Yi' in args.path: + self.model_name = 'Yi' + if 'deepseek' in args.path: + self.model_name = 'deepseek' + if 'Llama-3' in args.path: + self.model_name = 'Llama3_8B' + super().__init__(args) + + def load_model(self): + self.config = self.model.config + transformer = self.model.model + self.lm_ = self.model.lm_head + self.embed_ = transformer.embed_tokens + self.blocks_ = transformer.layers + self.final_layernorm_ = transformer.norm + # some wrapper + self.hidden_size = self.embed_.weight.shape[-1] + self.stop_id = self.tokenizer.eos_token_id + if hasattr(model, 'generation_config'): + self.stop_ids.append(self.stop_id) + self.stop_ids.append(self.model.generation_config.eos_token_id) + if self.model_name == 'Llama3_8B': + self.stop_ids.append(self.tokenizer.convert_tokens_to_ids("<|eot_id|>")) + self.block_nums = len(self.blocks_) + self.embed = Embedding(self.embed_, self.embed_bf16) + self.lm = Lm(self.lm_) + self.blocks = [LLAMA2Block(self.blocks_[i], i, self.hidden_size, self.final_layernorm_ if i == len(self.blocks_) - 1 else None) for i in range(self.block_nums)] + self.block_nums = self.config.num_hidden_layers + self.hidden_size = self.config.hidden_size + self.num_attention_heads = self.config.num_attention_heads + self.head_dim = self.hidden_size // self.num_attention_heads + self.num_key_value_heads = self.config.num_key_value_heads + self.past_kv_shape = [self.block_nums, 2, 1, self.num_key_value_heads, 0, self.head_dim] + self.block_dynamic_axes = { + "inputs_embeds" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 3: "history_len" } + } + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 4: "history_len" } + } + + def build_prompt(self, query): + if 'Baichuan2' in self.model_name: + return f'{query}' + if 'Internlm_7b' in self.model_name: + return f'<|User|>:{query}\n<|Bot|>:' + if 'TinyLlama' in self.model_name: + return f'<|system|>\nYou are a friendly chatbot who always responds in the style of a pirate\n<|user|>\n{query}\n<|assistant|>\n' + if 'Yi' in self.model_name: + return f'<|im_start|> user\n{query}<|im_end|>\n<|im_start|> assistant\n' + if 'deepseek' in self.model_name: + return f'<|begin▁of▁sentence|>User: {query}\nAssistant:' + if 'Llama3' in self.model_name: + return f'<|begin_of_text|><|start_header_id|>user<|end_header_id|>\n\n{query}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n' + return f'[INST]{query}[/INST]' + + def get_attention_mask(self) -> torch.Tensor: + if self.token_len: + return torch.zeros([1, 1, 1, self.seq_len], dtype=torch.float32) + return (1 - torch.tril(torch.ones([1, 1, self.seq_len, self.seq_len]))) * torch.finfo(torch.float32).min + + def get_position_ids(self) -> torch.Tensor: + if self.token_len: + return torch.tensor([[self.seq_len - 1]], dtype=torch.long) + return torch.arange(self.seq_len, dtype=torch.long).unsqueeze(0) + +# phi-2 +class PHI2Block(torch.nn.Module): + def __init__(self, block, block_id, hidden_size): + super().__init__() + self.block = block + self.block_id = block_id + self.hidden_size = hidden_size + + def forward(self, hidden_states, attention_mask, position_ids, past_kv): + theta = 1.0 / (10000 ** (torch.arange(0, 32, 2, dtype=torch.float32) / 32)) + position_ids = position_ids.float().reshape(-1, 1) + idx_theta = position_ids * theta + rotary_pos_emb = torch.stack([torch.cos(idx_theta), torch.sin(idx_theta)], dim=0).contiguous() + hidden_states = hidden_states.view(1, -1, self.hidden_size) + hidden_states, presents = self.block(hidden_states, + past_kv, + rotary_pos_emb=rotary_pos_emb, + causal_mask=attention_mask + ) + if self.block_id == 31: + hidden_states = hidden_states[:, -1, :] + return hidden_states, presents + +class phi_2(LLM): + def __init__(self, args): + super().__init__(args) + self.model_name = 'phi-2' + self.asymmetric = False # TODO: some precision bug when using asymmetric + + def load_model(self): + transformer = self.model.transformer + self.lm_ = self.model.lm_head + self.embed_ = transformer.embd.wte + self.hidden_size = self.embed_.weight.shape[-1] + self.blocks_ = transformer.h + # self.final_layernorm_ = transformer.final_layernorm + # some wrapper + self.stop_id = self.tokenizer.eos_token_id + self.block_nums = len(self.blocks_) + self.embed = Embedding(self.embed_, self.embed_bf16) + self.lm = Lm(self.lm_) + self.blocks = [PHI2Block(self.blocks_[i], i, self.hidden_size) for i in range(self.block_nums)] + # some config for export + self.past_kv_shape = [len(self.blocks), 1, 0, 2, 32, 80] + self.block_dynamic_axes = { + "inputs_embeds" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 1: "history_len" } + } + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "attention_mask" : { 2: "seq_len", 3: "seq_len" }, + "position_ids" : { 0: "seq_len" }, + "past_key_values" : { 2: "history_len" } + } + + def build_prompt(self, query): + return f'Instruct: {query}\nOutput:' + + def get_attention_mask(self) -> torch.Tensor: + if self.token_len: + return torch.zeros([1, 1, 1, 1]).bool() + attention_mask = ~torch.tril(torch.ones([1, 1, self.seq_len, self.seq_len]).bool()) + return attention_mask + + def get_position_ids(self) -> torch.Tensor: + if self.token_len: + return torch.tensor([[self.seq_len - 1]], dtype=torch.long) + return torch.arange(self.seq_len, dtype=torch.long).unsqueeze(0) + +# BGE is Embedding Model based Bert +class BGEBlock(torch.nn.Module): + def __init__(self, block, block_id, hidden_size): + super().__init__() + self.block = block + self.block_id = block_id + self.hidden_size = hidden_size + + def forward(self, hidden_states, attention_mask): + hidden_states = self.block(hidden_states, attention_mask)[0] + return hidden_states + +class bge(LLM): + def __init__(self, args): + super().__init__(args) + self.model_name = 'bge-large-zh' + + def forward(self, input_ids, position_ids, attention_mask): + input_ids = input_ids.view(1, -1) + token_type_ids = (1 - attention_mask).view(1, -1) + hidden_states = self.embed(input_ids, token_type_ids, position_ids)[0].unsqueeze(0) + for i in range(self.block_nums): + hidden_states = self.blocks[i](hidden_states, attention_mask) + # hidden_states = self.lm(hidden_states) # sentence_embeddings not need + sentence_embeddings = hidden_states[:, 0] + sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1) + return sentence_embeddings + + def response(self, query): + self.eval() + input_ids = self.tokenizer(query)['input_ids'] + self.seq_len = len(input_ids) + input_ids = torch.tensor(input_ids) + position_ids = self.get_position_ids() + attention_mask = self.get_attention_mask() + res = self.forward(input_ids, position_ids, attention_mask) + return res + + def load_model(self): + transformer = self.model.encoder + self.lm_ = self.model.pooler + self.embed_ = self.model.embeddings + self.hidden_size = self.embed_.word_embeddings.weight.shape[-1] + self.blocks_ = transformer.layer + # some wrapper + self.stop_id = self.tokenizer.eos_token_id + self.block_nums = len(self.blocks_) + self.embed = self.embed_ + self.lm = self.lm_ + self.blocks = [BGEBlock(self.blocks_[i], i, self.hidden_size) for i in range(self.block_nums)] + # some config for export + self.model_dynamic_axes = { + "input_ids" : { 0: "seq_len" }, + "position_ids" : { 1: "seq_len" }, + "attention_mask" : { 3: "seq_len" } + } + + def export(self): + model = self.eval() + self.seq_len = 3 + input_ids = torch.arange(3, dtype=torch.long) + position_ids = self.get_position_ids() + attention_mask = self.get_attention_mask() + onnx_model = f'./{self.onnx_path}/bge.onnx' + torch.onnx.export( + model, (input_ids, position_ids, attention_mask), + onnx_model, + verbose=self.export_verbose, + input_names=[ + 'input_ids', + 'position_ids', + 'attention_mask' + ], + output_names=['sentence_embeddings'], + dynamic_axes=self.model_dynamic_axes, + do_constant_folding=True, + opset_version=15) + if not self.skip_slim: + slim(onnx_model, output_model=onnx_model) + if self.export_test: + self.seq_len = 4 + position_ids = self.get_position_ids() + input_ids = torch.tensor([ 101, 872, 1962, 102 ], dtype=torch.long) + attention_mask = self.get_attention_mask() + # test + original_outs = model(input_ids, position_ids, attention_mask) + ort_session = ort.InferenceSession(onnx_model, providers=['CPUExecutionProvider']) + inputs = { + 'input_ids' : input_ids.detach().numpy(), + 'position_ids' : position_ids.detach().numpy(), + 'attention_mask' : attention_mask.detach().numpy() + } + onnx_outs = ort_session.run(None, inputs)[0] + self.assert_equal(original_outs, onnx_outs) + + token_str = None + if False: # save tokenizer in mnn + self.export_tokenizer() + token_path = os.path.join(self.onnx_path, "tokenizer.txt") + token_str = open(token_path, 'rt').read() + + if self.export_mnn: + onnx2mnn(onnx_model, self.mnn_path, 8, True, bizCode=token_str) + + def get_position_ids(self) -> torch.Tensor: + return torch.arange(self.seq_len, dtype=torch.long).unsqueeze(0) + + def get_attention_mask(self) -> torch.Tensor: + return torch.ones([1, 1, 1, self.seq_len], dtype=torch.long) + +class LoraModule(torch.nn.Module): + def __init__(self, args): + super().__init__() + self.onnx_path = args.onnx_path + self.mnn_path = args.mnn_path + self.export_mnn = args.export_mnn + import peft + lora_weight = peft.load_peft_weights(args.path) + for k, v in lora_weight.items(): + k = k.replace('.', '/') + self.register_buffer(k, v.cpu()) + + def forward(self, dummpy): + return self._buffers + + def export(self): + onnx_model = f'./{self.onnx_path}/lora.onnx' + torch.onnx.export(self.eval(), torch.tensor([]), onnx_model) + if self.export_mnn: + onnx2mnn(onnx_model, self.mnn_path) + + +if __name__ == '__main__': + llm_models = { + 'chatglm-6b': Chatglm_6b, + 'chatglm2-6b': Chatglm2_6b, + 'chatglm3-6b': Chatglm3_6b, + 'codegeex2-6b': Chatglm2_6b, + 'Qwen-7B-Chat': Qwen_Chat, + 'Qwen-1_8B-Chat': Qwen_Chat, + 'Qwen-1_8B': Qwen_Chat, + 'Qwen-VL-Chat': Qwen_Chat, + 'Qwen1_5-0_5B-Chat': Qwen2_Chat, + 'Qwen1_5-1_8B-Chat': Qwen2_Chat, + 'Qwen1_5-4B-Chat': Qwen2_Chat, + 'Qwen1_5-7B-Chat': Qwen2_Chat, + 'Baichuan2-7B-Chat': Llama2_7b_Chat, + 'Llama-2-7b-chat-ms': Llama2_7b_Chat, + 'Llama-3-8B-Instruct': Llama2_7b_Chat, + 'internlm-chat-7b': Llama2_7b_Chat, + 'TinyLlama-1_1B-Chat': Llama2_7b_Chat, + 'Yi-6B-Chat': Llama2_7b_Chat, + 'deepseek-llm-7b-chat': Llama2_7b_Chat, + 'phi-2': phi_2, + 'bge-large-zh': bge, + 'lora': LoraModule + } + parser = argparse.ArgumentParser(description='llm_exporter', formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument('--path', type=str, default='THUDM/chatglm-6b', required=True, + help='path(`str` or `os.PathLike`):\nCan be either:' + '\n\t- A string, the *model id* of a pretrained model like `THUDM/chatglm-6b`. [TODO]' + '\n\t- A path to a *directory* clone from repo like `../chatglm-6b`.') + parser.add_argument('--type', type=str, choices=llm_models.keys(), default=None, + help='type(`str`, *optional*):' + '\n\tThe pretrain llm model type.' + ) + parser.add_argument('--lora_path', type=str, default=None, help='lora path, defaut is `None` mean not apply lora.') + parser.add_argument('--onnx_path', type=str, default='./onnx', help='export onnx model path, defaut is `./onnx`.') + parser.add_argument('--mnn_path', type=str, default='./mnn', help='export mnn model path, defaut is `./mnn`.') + parser.add_argument('--export_mnn', action='store_true', default=False, help='Whether or not to export mnn model after onnx.') + parser.add_argument('--export_verbose', action='store_true', default=False, help='Whether or not to export onnx with verbose.') + parser.add_argument('--export_test', action='store_true', help='Whether or not to export onnx with test using onnxruntime.') + parser.add_argument('--test', type=str, help='test model inference with query `TEST`.') + parser.add_argument('--export', action='store_true', help='export model to an `onnx` model.') + parser.add_argument('--export_split', action='store_true', + help='export model split to some `onnx` models:' + '\n\t- embedding model.' + '\n\t- block models.' + '\n\t- lm_head model.' + ) + parser.add_argument('--export_token', action='store_true', help='export llm tokenizer to a txt file.') + parser.add_argument('--export_embed', action='store_true', help='export llm embedding to an `onnx` model.') + parser.add_argument('--export_visual', action='store_true', help='export llm visual model to an `onnx` model.') + parser.add_argument('--export_lm', action='store_true', help='export llm lm_head to an `onnx` model.') + parser.add_argument('--export_block', type=int, help='export llm block [id] to an `onnx` model.') + parser.add_argument('--export_blocks', action='store_true', help='export llm all blocks to `onnx` models.') + parser.add_argument('--embed_bin', action='store_true', help='export embedding weight as bin file with dtype `bfloat16`') + parser.add_argument('--embed_bf16', action='store_true', help='using `bfloat16` replace `float32` in embedding.') + parser.add_argument('--skip_slim', action='store_true', help='Whether or not to skip onnx-slim.') + + + args = parser.parse_args() + model_path = args.path + model_type = args.type + # not sepcify model type, using path + if model_type is None: + for model in llm_models: + if model in model_path: + model_type = model + if model_type is None: + raise RuntimeError('Please specify model type.') + + # copy modeling py file to pretrain model for export + for file in glob.glob(f'./llm_models/{model_type}/*'): + shutil.copy2(file, model_path) + + llm_exporter = llm_models[model_type](args) + + # some actions + if args.test is not None: + llm_exporter.response(args.test) + + if args.export: + llm_exporter.export() + + if args.export_token: + llm_exporter.export_tokenizer() + + if args.export_embed or args.export_split: + llm_exporter.export_embed() + + if args.export_visual or args.export_split: + llm_exporter.export_visual() + + if args.export_lm or args.export_split: + llm_exporter.export_lm() + + if args.export_blocks or args.export_split: + llm_exporter.export_blocks() + + if args.export_block is not None: + llm_exporter.export_block(args.export_block) diff --git a/transformers/llm/export/llm_models/Baichuan2-7B-Chat/modeling_baichuan.py b/transformers/llm/export/llm_models/Baichuan2-7B-Chat/modeling_baichuan.py new file mode 100755 index 000000000..9f2968cc4 --- /dev/null +++ b/transformers/llm/export/llm_models/Baichuan2-7B-Chat/modeling_baichuan.py @@ -0,0 +1,796 @@ +# Copyright 2023 Baichuan Inc. All Rights Reserved. + +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from .configuration_baichuan import BaichuanConfig +from .generation_utils import build_chat_input, TextIterStreamer + +import math +from typing import List, Optional, Tuple, Union +from threading import Thread + +import torch +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss +from torch.nn import functional as F +from transformers import PreTrainedModel, PretrainedConfig +from transformers.activations import ACT2FN +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast +from transformers.generation.utils import GenerationConfig +from transformers.utils import logging, ContextManagers + +import os +from contextlib import contextmanager +logger = logging.get_logger(__name__) + +try: + from xformers import ops as xops +except ImportError: + xops = None + logger.warning( + "Xformers is not installed correctly. If you want to use memory_efficient_attention to accelerate training use the following command to install Xformers\npip install xformers." + ) + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.tensor(torch.finfo(dtype).min, device=device), device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + if len(mask.size()) == 3: + bsz, src_len, _ = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + expanded_mask = mask[:,None,:,:].expand(bsz, 1, tgt_len, src_len).to(dtype) + else: + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class RMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + RMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + + # convert into half-precision if necessary + if self.weight.dtype in [torch.float16, torch.bfloat16]: + hidden_states = hidden_states.to(self.weight.dtype) + + return self.weight * hidden_states + + +class RotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + self.inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float().to(device) / dim)) + self.max_seq_len_cached = max_position_embeddings + t = torch.arange(self.max_seq_len_cached, device=self.inv_freq.device, dtype=torch.float32) + freqs = torch.outer(t, self.inv_freq) + emb = torch.cat((freqs, freqs), dim=-1) + self.cos_cached = emb.cos()[None, None, :, :].to(torch.float32) + self.sin_cached = emb.sin()[None, None, :, :].to(torch.float32) + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + # This `if` block is unlikely to be run after we build sin/cos in `__init__`. Keep the logic here just in case. + if seq_len > self.max_seq_len_cached: + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=self.inv_freq.device, dtype=torch.float32) + freqs = torch.outer(t, self.inv_freq) + emb = torch.cat((freqs, freqs), dim=-1) + self.cos_cached = emb.cos()[None, None, :, :].to(torch.float32).to(x.device) + self.sin_cached = emb.sin()[None, None, :, :].to(torch.float32).to(x.device) + elif self.cos_cached.device != x.device: + self.cos_cached = self.cos_cached.to(x.device) + self.sin_cached = self.sin_cached.to(x.device) + return ( + self.cos_cached[:, :, :seq_len, ...], + self.sin_cached[:, :, :seq_len, ...], + ) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2:] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos_, sin_, position_ids): + cos = torch.squeeze(cos_) # [seq_len, dim] + sin = torch.squeeze(sin_) # [seq_len, dim] + # print(f'### cos.shape = {cos.shape}, position_ids.shape = {position_ids.shape}, cos[position_ids].shape = {cos[position_ids].shape}') + # cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + # sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + # print(f'### q.shape = {q.shape}, cos.shape = {cos.shape}') + cos = cos[position_ids] + sin = sin[position_ids] + q_embed = (q.float() * cos) + (rotate_half(q.float()) * sin) + k_embed = (k.float() * cos) + (rotate_half(k.float()) * sin) + return q_embed.to(q.dtype), k_embed.to(k.dtype) + + +class MLP(nn.Module): + def __init__( + self, + hidden_size: int, + intermediate_size: int, + hidden_act: str, + ): + super().__init__() + self.gate_proj = nn.Linear(hidden_size, intermediate_size, bias=False) + self.down_proj = nn.Linear(intermediate_size, hidden_size, bias=False) + self.up_proj = nn.Linear(hidden_size, intermediate_size, bias=False) + self.act_fn = ACT2FN[hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +class Attention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + def __init__(self, config: BaichuanConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.W_pack = nn.Linear(self.hidden_size, 3 * self.hidden_size, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self.rotary_emb = RotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def raw_atten(self, query_layer, key_layer, value_layer, attention_mask): + attn_weight = torch.softmax((query_layer @ key_layer.transpose(-2, -1) / math.sqrt(query_layer.size(-1))) + attention_mask, dim=-1) + return attn_weight @ value_layer + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + proj = self.W_pack(hidden_states) + proj = proj.reshape([1, -1, 3, 4096]).permute([2, 0, 1, 3]) + # proj = proj.unflatten(-1, (3, self.hidden_size)).unsqueeze(0).transpose(0, -2).squeeze(-2) + query_states = proj[0].view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = proj[1].view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + value_states = proj[2].view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + # [bsz, nh, t, hd] + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + if xops is not None and self.training: + attn_weights = None + query_states = query_states.transpose(1, 2) + key_states = key_states.transpose(1, 2) + value_states = value_states.transpose(1, 2) + attn_output = xops.memory_efficient_attention( + query_states, key_states, value_states, attn_bias=xops.LowerTriangularMask() + ) + else: + ''' + with torch.backends.cuda.sdp_kernel(enable_flash=True, enable_math=True, enable_mem_efficient=True): + attn_output = F.scaled_dot_product_attention(query_states, key_states, value_states, attn_mask = attention_mask) + ''' + attn_output = self.raw_atten(query_states, key_states, value_states, attention_mask) + attn_output = attn_output.transpose(1, 2) + + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class DecoderLayer(nn.Module): + def __init__(self, config: BaichuanConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = Attention(config=config) + self.mlp = MLP( + hidden_size=self.hidden_size, + intermediate_size=config.intermediate_size, + hidden_act=config.hidden_act, + ) + self.input_layernorm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +class BaichuanPreTrainedModel(PreTrainedModel): + config_class = BaichuanConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["DecoderLayer"] + _keys_to_ignore_on_load_unexpected = [r"decoder\.version"] + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, BaichuanModel): + module.gradient_checkpointing = value + + +class BaichuanModel(BaichuanPreTrainedModel): + def __init__(self, config: BaichuanConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([DecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class NormHead(nn.Module): + def __init__(self, hidden_size, vocab_size, bias=False): + super().__init__() + self.weight = nn.Parameter(torch.empty((vocab_size, hidden_size))) + nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) + self.first_flag = True + + def forward(self, hidden_states): + if self.training: + norm_weight = nn.functional.normalize(self.weight) + elif self.first_flag: + self.first_flag = False + self.weight = nn.Parameter(nn.functional.normalize(self.weight)) + norm_weight = self.weight + else: + norm_weight = self.weight + return nn.functional.linear(hidden_states, norm_weight) + +_init_weights = True +@contextmanager +def no_init_weights(_enable=True): + global _init_weights + old_init_weights = _init_weights + if _enable: + _init_weights = False + try: + yield + finally: + _init_weights = old_init_weights + +class BaichuanForCausalLM(BaichuanPreTrainedModel): + def __init__(self, config, *model_args, **model_kwargs): + super().__init__(config, *model_args, **model_kwargs) + self.model = BaichuanModel(config) + + self.lm_head = NormHead(config.hidden_size, config.vocab_size, bias=False) + if hasattr(config, "quantization_config") and config.quantization_config['load_in_4bit']: + try: + from .quantizer import quantize_offline, init_model_weight_int4 + except ImportError: + raise ImportError(f"Needs QLinear to run quantize.") + quantize_offline(self, 4) + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path: Optional[Union[str, os.PathLike]], + *model_args, + config: Optional[Union[PretrainedConfig, str, os.PathLike]] = None, + cache_dir: Optional[Union[str, os.PathLike]] = None, + ignore_mismatched_sizes: bool = False, + force_download: bool = False, + local_files_only: bool = False, + token: Optional[Union[str, bool]] = None, + revision: str = "main", + use_safetensors: bool = None, + **kwargs, + ): + # Load config if we don't provide a configuration + if not isinstance(config, PretrainedConfig): + config_path = config if config is not None else pretrained_model_name_or_path + config, model_kwargs = cls.config_class.from_pretrained( + config_path, + cache_dir=cache_dir, + return_unused_kwargs=True, + force_download=force_download, + resume_download=False, + proxies=None, + local_files_only=local_files_only, + token=token, + revision=revision, + subfolder="", + _from_auto=False, + _from_pipeline=None, + **kwargs, + ) + else: + model_kwargs = kwargs + + if hasattr(config, "quantization_config") and config.quantization_config['load_in_4bit']: + try: + from .quantizer import init_model_weight_int4 + from accelerate import init_empty_weights, dispatch_model, infer_auto_device_map + from accelerate.utils import CustomDtype + from accelerate.utils import get_balanced_memory + except ImportError: + raise ImportError(f"Needs import model weight init func to run quantize.") + # Instantiate model. + init_contexts = [no_init_weights(_enable=True)] + init_contexts.append(init_empty_weights()) + with ContextManagers(init_contexts): + model = cls(config) + + model_file = os.path.join(pretrained_model_name_or_path, 'pytorch_model.bin') + state_dict = torch.load(model_file, map_location="cpu") + model.is_quantized = True + + device_map = kwargs.pop("device_map", None) + torch_dtype = kwargs.pop("torch_dtype", None) + + kwargs = {"no_split_module_classes": model._no_split_modules} + target_dtype = CustomDtype.INT4 + max_memory = get_balanced_memory( + model, + dtype=target_dtype, + low_zero=(device_map == "balanced_low_0"), + max_memory=None, + **kwargs, + ) + kwargs["max_memory"] = max_memory + + device_map = infer_auto_device_map(model, dtype=target_dtype, **kwargs) + model = init_model_weight_int4(config, model, state_dict) + + # Set model in evaluation mode to deactivate DropOut modules by default + model.eval() + # If it is a model with generation capabilities, attempt to load the generation config + if model.can_generate(): + try: + model.generation_config = GenerationConfig.from_pretrained( + pretrained_model_name_or_path, + cache_dir=cache_dir, + force_download=force_download, + resume_download=False, + proxies=None, + local_files_only=local_files_only, + token=token, + revision=revision, + subfolder="", + _from_auto=False, + _from_pipeline=None, + **kwargs, + ) + except (OSError, TypeError): + logger.info( + "Generation config file not found, using a generation config created from the model config." + ) + pass + + if device_map is not None: + dispatch_model(model, device_map=device_map) + + return model + return super(BaichuanForCausalLM, cls).from_pretrained(pretrained_model_name_or_path, *model_args, + config=config, cache_dir=cache_dir, ignore_mismatched_sizes=ignore_mismatched_sizes, + force_download=force_download, local_files_only=local_files_only, token=token, revision=revision, + use_safetensors=use_safetensors, **kwargs) + + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + softmax_normalizer = shift_logits.max(-1).values ** 2 + z_loss = self.config.z_loss_weight * softmax_normalizer.mean() + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + z_loss + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += (tuple(past_state.index_select(0, beam_idx) for past_state in layer_past),) + return reordered_past + + def quantize(self, bits: int): + try: + from .quantizer import quantize_online + except ImportError: + raise ImportError(f"Needs QLinear to run quantize.") + return quantize_online(self, bits) + + def chat(self, tokenizer, messages: List[dict], stream=False, + generation_config: Optional[GenerationConfig]=None): + generation_config = generation_config or self.generation_config + input_ids = build_chat_input(self, tokenizer, messages, generation_config.max_new_tokens) + if stream: + streamer = TextIterStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True) + Thread(target=self.generate, kwargs=dict( + inputs=input_ids, streamer=streamer, + generation_config=generation_config, + )).start() + return streamer + else: + outputs = self.generate(input_ids, generation_config=generation_config) + print(outputs[0]) + response = tokenizer.decode(outputs[0][len(input_ids[0]):], skip_special_tokens=True) + return response diff --git a/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/config.json b/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/config.json new file mode 100755 index 000000000..e2ba91313 --- /dev/null +++ b/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/config.json @@ -0,0 +1,28 @@ +{ + "architectures": [ + "LlamaForCausalLM" + ], + "auto_map": { + "AutoModelForCausalLM": "modeling_llama.LlamaForCausalLM" + }, + "bos_token_id": 1, + "eos_token_id": 2, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 11008, + "max_position_embeddings": 4096, + "model_type": "llama", + "num_attention_heads": 32, + "num_hidden_layers": 32, + "num_key_value_heads": 32, + "pad_token_id": 0, + "pretraining_tp": 1, + "rms_norm_eps": 1e-05, + "rope_scaling": null, + "tie_word_embeddings": false, + "torch_dtype": "float16", + "transformers_version": "4.31.0.dev0", + "use_cache": true, + "vocab_size": 32000 +} diff --git a/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/configuration_llama.py b/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/configuration_llama.py new file mode 100644 index 000000000..1b0e9c357 --- /dev/null +++ b/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/configuration_llama.py @@ -0,0 +1,174 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" LLaMA model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +LLAMA_PRETRAINED_CONFIG_ARCHIVE_MAP = {} + + +class LlamaConfig(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`LlamaModel`]. It is used to instantiate an LLaMA + model according to the specified arguments, defining the model architecture. Instantiating a configuration with the + defaults will yield a similar configuration to that of the LLaMA-7B. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 32000): + Vocabulary size of the LLaMA model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`LlamaModel`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 11008): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + pretraining_tp (`int`, *optional*, defaults to `1`): + Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this + document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is + necessary to ensure exact reproducibility of the pretraining results. Please refer to [this + issue](https://github.com/pytorch/pytorch/issues/76232). + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 2048): + The maximum sequence length that this model might ever be used with. Typically set this to something large + just in case (e.g., 512 or 1024 or 2048). + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-12): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings(`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_scaling (`Dict`, *optional*): + Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports three scaling + strategies: linear and dynamic. Their scaling factor must be an float greater than 1. The expected format + is `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update + `max_position_embeddings` to the expected new maximum. See the following thread for more information on how + these scaling strategies behave: + https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an + experimental feature, subject to breaking API changes in future versions. + + Example: + + ```python + >>> from transformers import LlamaModel, LlamaConfig + + >>> # Initializing a LLaMA llama-7b style configuration + >>> configuration = LlamaConfig() + + >>> # Initializing a model from the llama-7b style configuration + >>> model = LlamaModel(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + model_type = "llama" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=32000, + hidden_size=4096, + intermediate_size=11008, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + hidden_act="silu", + max_position_embeddings=2048, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + pad_token_id=0, + bos_token_id=1, + eos_token_id=2, + pretraining_tp=1, + tie_word_embeddings=False, + rope_scaling=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.pretraining_tp = pretraining_tp + self.use_cache = use_cache + self.rope_scaling = rope_scaling + self._rope_scaling_validation() + + super().__init__( + pad_token_id=pad_token_id, + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + def _rope_scaling_validation(self): + """ + Validate the `rope_scaling` configuration. + """ + if self.rope_scaling is None: + return + + if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 2: + raise ValueError( + "`rope_scaling` must be a dictionary with with two fields, `name` and `factor`, " + f"got {self.rope_scaling}" + ) + rope_scaling_type = self.rope_scaling.get("type", None) + rope_scaling_factor = self.rope_scaling.get("factor", None) + if rope_scaling_type is None or rope_scaling_type not in ["linear", "dynamic"]: + raise ValueError( + f"`rope_scaling`'s name field must be one of ['linear', 'dynamic'], got {rope_scaling_type}" + ) + if rope_scaling_factor is None or not isinstance(rope_scaling_factor, float) or rope_scaling_factor <= 1.0: + raise ValueError(f"`rope_scaling`'s factor field must be an float > 1, got {rope_scaling_factor}") diff --git a/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/modeling_llama.py b/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/modeling_llama.py new file mode 100644 index 000000000..8c562c604 --- /dev/null +++ b/transformers/llm/export/llm_models/Llama-2-7b-chat-ms/modeling_llama.py @@ -0,0 +1,1010 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch LLaMA model.""" +import math +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings +from .configuration_llama import LlamaConfig + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "LlamaConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.finfo(dtype).min, device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class LlamaRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + LlamaRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +class LlamaRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +class LlamaLinearScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with linear scaling. Credits to the Reddit user /u/kaiokendev""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + t = t / self.scaling_factor + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +class LlamaDynamicNTKScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with Dynamic NTK scaling. Credits to the Reddit users /u/bloc97 and /u/emozilla""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + + if seq_len > self.max_position_embeddings: + base = self.base * ( + (self.scaling_factor * seq_len / self.max_position_embeddings) - (self.scaling_factor - 1) + ) ** (self.dim / (self.dim - 2)) + inv_freq = 1.0 / (base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + # The first two dimensions of cos and sin are always 1, so we can `squeeze` them. + # cos = cos.squeeze(1).squeeze(0) # [seq_len, dim] + # sin = sin.squeeze(1).squeeze(0) # [seq_len, dim] + cos = torch.squeeze(cos) # [seq_len, dim] + sin = torch.squeeze(sin) # [seq_len, dim] + cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class LlamaMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.pretraining_tp = config.pretraining_tp + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + if self.pretraining_tp > 1: + slice = self.intermediate_size // self.pretraining_tp + gate_proj_slices = self.gate_proj.weight.split(slice, dim=0) + up_proj_slices = self.up_proj.weight.split(slice, dim=0) + down_proj_slices = self.down_proj.weight.split(slice, dim=1) + + gate_proj = torch.cat([F.linear(x, gate_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + up_proj = torch.cat([F.linear(x, up_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + + intermediate_states = (self.act_fn(gate_proj) * up_proj).split(slice, dim=2) + down_proj = [F.linear(intermediate_states[i], down_proj_slices[i]) for i in range(self.pretraining_tp)] + down_proj = sum(down_proj) + else: + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + return down_proj + + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class LlamaAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: LlamaConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.pretraining_tp = config.pretraining_tp + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self._init_rope() + + def _init_rope(self): + if self.config.rope_scaling is None: + self.rotary_emb = LlamaRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + else: + scaling_type = self.config.rope_scaling["type"] + scaling_factor = self.config.rope_scaling["factor"] + if scaling_type == "linear": + self.rotary_emb = LlamaLinearScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + elif scaling_type == "dynamic": + self.rotary_emb = LlamaDynamicNTKScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + else: + raise ValueError(f"Unknown RoPE scaling type {scaling_type}") + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + if self.pretraining_tp > 1: + key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.pretraining_tp + query_slices = self.q_proj.weight.split((self.num_heads * self.head_dim) // self.pretraining_tp, dim=0) + key_slices = self.k_proj.weight.split(key_value_slicing, dim=0) + value_slices = self.v_proj.weight.split(key_value_slicing, dim=0) + + query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.pretraining_tp)] + query_states = torch.cat(query_states, dim=-1) + + key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.pretraining_tp)] + key_states = torch.cat(key_states, dim=-1) + + value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.pretraining_tp)] + value_states = torch.cat(value_states, dim=-1) + + else: + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + if self.pretraining_tp > 1: + attn_output = attn_output.split(self.hidden_size // self.pretraining_tp, dim=2) + o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.pretraining_tp, dim=1) + attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.pretraining_tp)]) + else: + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class LlamaDecoderLayer(nn.Module): + def __init__(self, config: LlamaConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = LlamaAttention(config=config) + self.mlp = LlamaMLP(config) + self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +LLAMA_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`LlamaConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaPreTrainedModel(PreTrainedModel): + config_class = LlamaConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["LlamaDecoderLayer"] + _skip_keys_device_placement = "past_key_values" + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, LlamaModel): + module.gradient_checkpointing = value + + +LLAMA_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaModel(LlamaPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`] + + Args: + config: LlamaConfig + """ + + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class LlamaForCausalLM(LlamaPreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = LlamaModel(config) + self.pretraining_tp = config.pretraining_tp + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, LlamaForCausalLM + + >>> model = LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + if self.pretraining_tp > 1: + lm_head_slices = self.lm_head.weight.split(self.vocab_size // self.pretraining_tp, dim=0) + logits = [F.linear(hidden_states, lm_head_slices[i]) for i in range(self.pretraining_tp)] + logits = torch.cat(logits, dim=-1) + else: + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The LLaMa Model transformer with a sequence classification head on top (linear layer). + + [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + LLAMA_START_DOCSTRING, +) +class LlamaForSequenceClassification(LlamaPreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = LlamaModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/Llama-3-8B-Instruct/config.json b/transformers/llm/export/llm_models/Llama-3-8B-Instruct/config.json new file mode 100755 index 000000000..d9c36dfca --- /dev/null +++ b/transformers/llm/export/llm_models/Llama-3-8B-Instruct/config.json @@ -0,0 +1,31 @@ +{ + "_name_or_path": "meta-llama/Meta-Llama-3-8B-Instruct", + "architectures": [ + "LlamaForCausalLM" + ], + "auto_map": { + "AutoModelForCausalLM": "modeling_llama.LlamaForCausalLM" + }, + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": 128000, + "eos_token_id": 128001, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 14336, + "max_position_embeddings": 8192, + "model_type": "llama", + "num_attention_heads": 32, + "num_hidden_layers": 32, + "num_key_value_heads": 8, + "pretraining_tp": 1, + "rms_norm_eps": 1e-05, + "rope_scaling": null, + "rope_theta": 500000.0, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.38.2", + "use_cache": true, + "vocab_size": 128256 +} diff --git a/transformers/llm/export/llm_models/Llama-3-8B-Instruct/configuration_llama.py b/transformers/llm/export/llm_models/Llama-3-8B-Instruct/configuration_llama.py new file mode 100644 index 000000000..1b0e9c357 --- /dev/null +++ b/transformers/llm/export/llm_models/Llama-3-8B-Instruct/configuration_llama.py @@ -0,0 +1,174 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" LLaMA model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +LLAMA_PRETRAINED_CONFIG_ARCHIVE_MAP = {} + + +class LlamaConfig(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`LlamaModel`]. It is used to instantiate an LLaMA + model according to the specified arguments, defining the model architecture. Instantiating a configuration with the + defaults will yield a similar configuration to that of the LLaMA-7B. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 32000): + Vocabulary size of the LLaMA model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`LlamaModel`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 11008): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + pretraining_tp (`int`, *optional*, defaults to `1`): + Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this + document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is + necessary to ensure exact reproducibility of the pretraining results. Please refer to [this + issue](https://github.com/pytorch/pytorch/issues/76232). + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 2048): + The maximum sequence length that this model might ever be used with. Typically set this to something large + just in case (e.g., 512 or 1024 or 2048). + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-12): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings(`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_scaling (`Dict`, *optional*): + Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports three scaling + strategies: linear and dynamic. Their scaling factor must be an float greater than 1. The expected format + is `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update + `max_position_embeddings` to the expected new maximum. See the following thread for more information on how + these scaling strategies behave: + https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an + experimental feature, subject to breaking API changes in future versions. + + Example: + + ```python + >>> from transformers import LlamaModel, LlamaConfig + + >>> # Initializing a LLaMA llama-7b style configuration + >>> configuration = LlamaConfig() + + >>> # Initializing a model from the llama-7b style configuration + >>> model = LlamaModel(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + model_type = "llama" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=32000, + hidden_size=4096, + intermediate_size=11008, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + hidden_act="silu", + max_position_embeddings=2048, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + pad_token_id=0, + bos_token_id=1, + eos_token_id=2, + pretraining_tp=1, + tie_word_embeddings=False, + rope_scaling=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.pretraining_tp = pretraining_tp + self.use_cache = use_cache + self.rope_scaling = rope_scaling + self._rope_scaling_validation() + + super().__init__( + pad_token_id=pad_token_id, + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + def _rope_scaling_validation(self): + """ + Validate the `rope_scaling` configuration. + """ + if self.rope_scaling is None: + return + + if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 2: + raise ValueError( + "`rope_scaling` must be a dictionary with with two fields, `name` and `factor`, " + f"got {self.rope_scaling}" + ) + rope_scaling_type = self.rope_scaling.get("type", None) + rope_scaling_factor = self.rope_scaling.get("factor", None) + if rope_scaling_type is None or rope_scaling_type not in ["linear", "dynamic"]: + raise ValueError( + f"`rope_scaling`'s name field must be one of ['linear', 'dynamic'], got {rope_scaling_type}" + ) + if rope_scaling_factor is None or not isinstance(rope_scaling_factor, float) or rope_scaling_factor <= 1.0: + raise ValueError(f"`rope_scaling`'s factor field must be an float > 1, got {rope_scaling_factor}") diff --git a/transformers/llm/export/llm_models/Llama-3-8B-Instruct/modeling_llama.py b/transformers/llm/export/llm_models/Llama-3-8B-Instruct/modeling_llama.py new file mode 100644 index 000000000..8c562c604 --- /dev/null +++ b/transformers/llm/export/llm_models/Llama-3-8B-Instruct/modeling_llama.py @@ -0,0 +1,1010 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch LLaMA model.""" +import math +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings +from .configuration_llama import LlamaConfig + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "LlamaConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.finfo(dtype).min, device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class LlamaRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + LlamaRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +class LlamaRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +class LlamaLinearScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with linear scaling. Credits to the Reddit user /u/kaiokendev""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + t = t / self.scaling_factor + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +class LlamaDynamicNTKScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with Dynamic NTK scaling. Credits to the Reddit users /u/bloc97 and /u/emozilla""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + + if seq_len > self.max_position_embeddings: + base = self.base * ( + (self.scaling_factor * seq_len / self.max_position_embeddings) - (self.scaling_factor - 1) + ) ** (self.dim / (self.dim - 2)) + inv_freq = 1.0 / (base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + # The first two dimensions of cos and sin are always 1, so we can `squeeze` them. + # cos = cos.squeeze(1).squeeze(0) # [seq_len, dim] + # sin = sin.squeeze(1).squeeze(0) # [seq_len, dim] + cos = torch.squeeze(cos) # [seq_len, dim] + sin = torch.squeeze(sin) # [seq_len, dim] + cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class LlamaMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.pretraining_tp = config.pretraining_tp + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + if self.pretraining_tp > 1: + slice = self.intermediate_size // self.pretraining_tp + gate_proj_slices = self.gate_proj.weight.split(slice, dim=0) + up_proj_slices = self.up_proj.weight.split(slice, dim=0) + down_proj_slices = self.down_proj.weight.split(slice, dim=1) + + gate_proj = torch.cat([F.linear(x, gate_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + up_proj = torch.cat([F.linear(x, up_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + + intermediate_states = (self.act_fn(gate_proj) * up_proj).split(slice, dim=2) + down_proj = [F.linear(intermediate_states[i], down_proj_slices[i]) for i in range(self.pretraining_tp)] + down_proj = sum(down_proj) + else: + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + return down_proj + + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class LlamaAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: LlamaConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.pretraining_tp = config.pretraining_tp + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self._init_rope() + + def _init_rope(self): + if self.config.rope_scaling is None: + self.rotary_emb = LlamaRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + else: + scaling_type = self.config.rope_scaling["type"] + scaling_factor = self.config.rope_scaling["factor"] + if scaling_type == "linear": + self.rotary_emb = LlamaLinearScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + elif scaling_type == "dynamic": + self.rotary_emb = LlamaDynamicNTKScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + else: + raise ValueError(f"Unknown RoPE scaling type {scaling_type}") + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + if self.pretraining_tp > 1: + key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.pretraining_tp + query_slices = self.q_proj.weight.split((self.num_heads * self.head_dim) // self.pretraining_tp, dim=0) + key_slices = self.k_proj.weight.split(key_value_slicing, dim=0) + value_slices = self.v_proj.weight.split(key_value_slicing, dim=0) + + query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.pretraining_tp)] + query_states = torch.cat(query_states, dim=-1) + + key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.pretraining_tp)] + key_states = torch.cat(key_states, dim=-1) + + value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.pretraining_tp)] + value_states = torch.cat(value_states, dim=-1) + + else: + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + if self.pretraining_tp > 1: + attn_output = attn_output.split(self.hidden_size // self.pretraining_tp, dim=2) + o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.pretraining_tp, dim=1) + attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.pretraining_tp)]) + else: + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class LlamaDecoderLayer(nn.Module): + def __init__(self, config: LlamaConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = LlamaAttention(config=config) + self.mlp = LlamaMLP(config) + self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +LLAMA_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`LlamaConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaPreTrainedModel(PreTrainedModel): + config_class = LlamaConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["LlamaDecoderLayer"] + _skip_keys_device_placement = "past_key_values" + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, LlamaModel): + module.gradient_checkpointing = value + + +LLAMA_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaModel(LlamaPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`] + + Args: + config: LlamaConfig + """ + + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class LlamaForCausalLM(LlamaPreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = LlamaModel(config) + self.pretraining_tp = config.pretraining_tp + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, LlamaForCausalLM + + >>> model = LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + if self.pretraining_tp > 1: + lm_head_slices = self.lm_head.weight.split(self.vocab_size // self.pretraining_tp, dim=0) + logits = [F.linear(hidden_states, lm_head_slices[i]) for i in range(self.pretraining_tp)] + logits = torch.cat(logits, dim=-1) + else: + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The LLaMa Model transformer with a sequence classification head on top (linear layer). + + [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + LLAMA_START_DOCSTRING, +) +class LlamaForSequenceClassification(LlamaPreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = LlamaModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/Qwen-1_8B-Chat/modeling_qwen.py b/transformers/llm/export/llm_models/Qwen-1_8B-Chat/modeling_qwen.py new file mode 100755 index 000000000..5138eea76 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen-1_8B-Chat/modeling_qwen.py @@ -0,0 +1,1406 @@ +# Copyright (c) Alibaba Cloud. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import copy +import importlib +import math +import pathlib +from typing import TYPE_CHECKING, Optional, Tuple, Union, Callable, List, Any, Generator + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +import warnings + +from torch.nn import CrossEntropyLoss +from transformers import PreTrainedTokenizer, GenerationConfig, StoppingCriteriaList +from transformers.generation.logits_process import LogitsProcessorList + +if TYPE_CHECKING: + from transformers.generation.streamers import BaseStreamer +from transformers.generation.utils import GenerateOutput +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging + +try: + from einops import rearrange +except ImportError: + rearrange = None +from torch import nn + +SUPPORT_CUDA = torch.cuda.is_available() +SUPPORT_BF16 = SUPPORT_CUDA and torch.cuda.is_bf16_supported() +SUPPORT_FP16 = SUPPORT_CUDA and torch.cuda.get_device_capability(0)[0] >= 7 +SUPPORT_TORCH2 = hasattr(torch, '__version__') and int(torch.__version__.split(".")[0]) >= 2 + + +from .configuration_qwen import QWenConfig +from .qwen_generation_utils import ( + HistoryType, + make_context, + decode_tokens, + get_stop_words_ids, + StopWordsLogitsProcessor, +) + + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "qwen" +_CONFIG_FOR_DOC = "QWenConfig" + +QWen_PRETRAINED_MODEL_ARCHIVE_LIST = ["qwen-7b"] + +_ERROR_BAD_CHAT_FORMAT = """\ +We detect you are probably using the pretrained model (rather than chat model) for chatting, since the chat_format in generation_config is not "chatml". +If you are directly using the model downloaded from Huggingface, please make sure you are using our "Qwen/Qwen-7B-Chat" Huggingface model (rather than "Qwen/Qwen-7B") when you call model.chat(). +我们检测到您可能在使用预训练模型(而非chat模型)进行多轮chat,因为您当前在generation_config指定的chat_format,并未设置为我们在对话中所支持的"chatml"格式。 +如果您在直接使用我们从Huggingface提供的模型,请确保您在调用model.chat()时,使用的是"Qwen/Qwen-7B-Chat"模型(而非"Qwen/Qwen-7B"预训练模型)。 +""" + +_SENTINEL = object() +_ERROR_STREAM_IN_CHAT = """\ +Pass argument `stream` to model.chat() is buggy, deprecated, and marked for removal. Please use model.chat_stream(...) instead of model.chat(..., stream=True). +向model.chat()传入参数stream的用法可能存在Bug,该用法已被废弃,将在未来被移除。请使用model.chat_stream(...)代替model.chat(..., stream=True)。 +""" + +_ERROR_INPUT_CPU_QUERY_WITH_FLASH_ATTN_ACTIVATED = """\ +We detect you have activated flash attention support, but running model computation on CPU. Please make sure that your input data has been placed on GPU. If you actually want to run CPU computation, please following the readme and set device_map="cpu" to disable flash attention when loading the model (calling AutoModelForCausalLM.from_pretrained). +检测到您的模型已激活了flash attention支持,但正在执行CPU运算任务。如使用flash attention,请您确认模型输入已经传到GPU上。如果您确认要执行CPU运算,请您在载入模型(调用AutoModelForCausalLM.from_pretrained)时,按照readme说法,指定device_map="cpu"以禁用flash attention。 +""" + +apply_rotary_emb_func = None +rms_norm = None +flash_attn_unpadded_func = None +flash_attn_func = None + +def _import_flash_attn(): + global apply_rotary_emb_func, rms_norm, flash_attn_unpadded_func, flash_attn_func + try: + from flash_attn.layers.rotary import apply_rotary_emb_func as __apply_rotary_emb_func + apply_rotary_emb_func = __apply_rotary_emb_func + except ImportError: + logger.warn( + "Warning: import flash_attn rotary fail, please install FlashAttention rotary to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention/tree/main/csrc/rotary" + ) + + try: + from flash_attn.ops.rms_norm import rms_norm as __rms_norm + rms_norm = __rms_norm + except ImportError: + logger.warn( + "Warning: import flash_attn rms_norm fail, please install FlashAttention layer_norm to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention/tree/main/csrc/layer_norm" + ) + + try: + import flash_attn + _flash_attn_func = None + if not hasattr(flash_attn, '__version__'): + from flash_attn.flash_attn_interface import flash_attn_unpadded_func as __flash_attn_unpadded_func + else: + if int(flash_attn.__version__.split(".")[0]) >= 2: + if int(flash_attn.__version__.split(".")[1]) >= 1: + from flash_attn.flash_attn_interface import flash_attn_func as _flash_attn_func + from flash_attn.flash_attn_interface import flash_attn_varlen_func as __flash_attn_unpadded_func + else: + from flash_attn.flash_attn_interface import flash_attn_unpadded_func as __flash_attn_unpadded_func + flash_attn_unpadded_func = __flash_attn_unpadded_func + flash_attn_func = _flash_attn_func + except ImportError: + logger.warn( + "Warning: import flash_attn fail, please install FlashAttention to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention" + ) + +def quantize_cache_v(fdata, bits, qmax, qmin): + # b, s, head, h-dim->b, head, s, h-dim + qtype = torch.uint8 + device = fdata.device + shape = fdata.shape + + fdata_cal = torch.flatten(fdata, 2) + fmax = torch.amax(fdata_cal, dim=-1, keepdim=True) + fmin = torch.amin(fdata_cal, dim=-1, keepdim=True) + # Compute params + if qmax.device != fmax.device: + qmax = qmax.to(device) + qmin = qmin.to(device) + scale = (fmax - fmin) / (qmax - qmin) + zero = qmin - fmin / scale + scale = scale.unsqueeze(-1).repeat(1,1,shape[2],1).contiguous() + zero = zero.unsqueeze(-1).repeat(1,1,shape[2],1).contiguous() + # Quantize + res_data = fdata / scale + zero + qdata = torch.clamp(res_data, qmin, qmax).to(qtype) + return qdata.contiguous(), scale, zero + +def dequantize_cache_torch(qdata, scale, zero): + data = scale * (qdata - zero) + return data + +class FlashSelfAttention(torch.nn.Module): + def __init__( + self, + causal=False, + softmax_scale=None, + attention_dropout=0.0, + ): + super().__init__() + assert flash_attn_unpadded_func is not None, ( + "Please install FlashAttention first, " "e.g., with pip install flash-attn" + ) + assert ( + rearrange is not None + ), "Please install einops first, e.g., with pip install einops" + self.causal = causal + self.softmax_scale = softmax_scale + self.dropout_p = attention_dropout + + def unpad_input(self, hidden_states, attention_mask): + valid_mask = attention_mask.squeeze(1).squeeze(1).eq(0) + seqlens_in_batch = valid_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(valid_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0)) + hidden_states = hidden_states[indices] + return hidden_states, indices, cu_seqlens, max_seqlen_in_batch + + def pad_input(self, hidden_states, indices, batch, seqlen): + output = torch.zeros(batch * seqlen, *hidden_states.shape[1:], device=hidden_states.device, + dtype=hidden_states.dtype) + output[indices] = hidden_states + return rearrange(output, '(b s) ... -> b s ...', b=batch) + + def forward(self, q, k, v, attention_mask=None): + assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v))) + assert all((i.is_cuda for i in (q, k, v))) + batch_size, seqlen_q = q.shape[0], q.shape[1] + seqlen_k = k.shape[1] + seqlen_out = seqlen_q + + if flash_attn_func is not None and batch_size == 1: + dropout_p = self.dropout_p if self.training else 0 + output = flash_attn_func(q, k, v, dropout_p, softmax_scale=self.softmax_scale, causal=self.causal) + return output + + q, k, v = [rearrange(x, "b s ... -> (b s) ...") for x in [q, k, v]] + cu_seqlens_q = torch.arange( + 0, + (batch_size + 1) * seqlen_q, + step=seqlen_q, + dtype=torch.int32, + device=q.device, + ) + + if batch_size > 1 and attention_mask is not None: + k, indices_k, cu_seqlens_k, seqlen_k = self.unpad_input(k, attention_mask) + if q.size(0) == v.size(0): + q = q[indices_k] + cu_seqlens_q = cu_seqlens_k + seqlen_q = seqlen_k + v = v[indices_k] + else: + cu_seqlens_k = torch.arange( + 0, + (batch_size + 1) * seqlen_k, + step=seqlen_k, + dtype=torch.int32, + device=q.device, + ) + + if self.training: + assert seqlen_k == seqlen_q + is_causal = self.causal + dropout_p = self.dropout_p + else: + is_causal = seqlen_q == seqlen_k + dropout_p = 0 + + output = flash_attn_unpadded_func( + q, + k, + v, + cu_seqlens_q, + cu_seqlens_k, + seqlen_q, + seqlen_k, + dropout_p, + softmax_scale=self.softmax_scale, + causal=is_causal, + ) + if batch_size > 1 and attention_mask is not None and seqlen_q == seqlen_k: + output = self.pad_input(output, indices_k, batch_size, seqlen_out) + else: + new_shape = (batch_size, output.shape[0] // batch_size) + output.shape[1:] + output = output.view(new_shape) + return output + + +class QWenAttention(nn.Module): + def __init__(self, config): + super().__init__() + + self.register_buffer("masked_bias", torch.tensor(-1e4), persistent=False) + self.seq_length = config.seq_length + + self.hidden_size = config.hidden_size + self.split_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + + self.use_flash_attn = config.use_flash_attn + self.scale_attn_weights = True + + self.projection_size = config.kv_channels * config.num_attention_heads + + assert self.projection_size % config.num_attention_heads == 0 + self.hidden_size_per_attention_head = ( + self.projection_size // config.num_attention_heads + ) + + self.c_attn = nn.Linear(config.hidden_size, 3 * self.projection_size) + + self.c_proj = nn.Linear( + config.hidden_size, self.projection_size, bias=not config.no_bias + ) + + self.is_fp32 = not (config.bf16 or config.fp16) + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + ): + self.core_attention_flash = FlashSelfAttention( + causal=True, attention_dropout=config.attn_dropout_prob + ) + self.bf16 = config.bf16 + + self.use_dynamic_ntk = config.use_dynamic_ntk + self.use_logn_attn = config.use_logn_attn + + logn_list = [ + math.log(i, self.seq_length) if i > self.seq_length else 1 + for i in range(1, 32768) + ] + logn_tensor = torch.tensor(logn_list)[None, :, None, None] + self.register_buffer("logn_tensor", logn_tensor, persistent=False) + + self.attn_dropout = nn.Dropout(config.attn_dropout_prob) + self.softmax_in_fp32 = config.softmax_in_fp32 if hasattr(config, 'softmax_in_fp32') else False + self.use_cache_quantization = config.use_cache_quantization if hasattr(config, 'use_cache_quantization') else False + self.use_cache_kernel = config.use_cache_kernel if hasattr(config,'use_cache_kernel') else False + cache_dtype = torch.float + if self.bf16: + cache_dtype=torch.bfloat16 + elif config.fp16: + cache_dtype = torch.float16 + self.cache_qmax = torch.tensor(torch.iinfo(torch.uint8).max, dtype=cache_dtype) + self.cache_qmin = torch.tensor(torch.iinfo(torch.uint8).min, dtype=cache_dtype) + + if config.use_cache_quantization and config.use_cache_kernel: + # pre check if the support files existing + module_root = pathlib.Path(__file__).parent + src_files = ("cache_autogptq_cuda_256.cpp", "cache_autogptq_cuda_kernel_256.cu") + if any(not (module_root/src).is_file() for src in src_files): + warnings.warn("KV cache kernel source files (.cpp and .cu) not found.") + self.cache_kernels = None + else: + try: + from .cpp_kernels import cache_autogptq_cuda_256 + self.cache_kernels = cache_autogptq_cuda_256 + except ImportError: + warnings.warn("Failed to import KV cache kernels.") + self.cache_kernels = None + + def _attn(self, query, key, value, no_use_mask, attention_mask=None, head_mask=None): + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + if self.scale_attn_weights: + attn_weights = attn_weights / torch.full( + [], + value.size(-1) ** 0.5, + dtype=attn_weights.dtype, + device=attn_weights.device, + ) + + query_length, key_length = query.size(-2), key.size(-2) + if attention_mask is None: + causal_mask = self.bias[ + :, :, key_length - query_length : key_length, :key_length + ] + else: + causal_mask = attention_mask + mask_value = torch.finfo(attn_weights.dtype).min + mask_value = torch.full([], mask_value, dtype=attn_weights.dtype).to( + attn_weights.device + ) + attn_weights = torch.where( + causal_mask, attn_weights.to(attn_weights.dtype), mask_value + ) + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + attn_weights = attn_weights.type(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + attn_output = attn_output.transpose(1, 2) + + return attn_output, attn_weights + + def __attn(self, query, key, value, causal_mask=None, attention_mask=None, head_mask=None): + device = query.device + if self.use_cache_quantization: + qk, qk_scale, qk_zero = key + if self.use_cache_kernel and self.cache_kernels is not None: + shape = query.shape[:-1] + (qk.shape[-2],) + attn_weights = torch.zeros(shape, dtype=torch.float16, device=device) + self.cache_kernels.vecquant8matmul_batched_faster_old( + query.contiguous() if query.dtype == torch.float16 else query.to(torch.float16).contiguous(), + qk.transpose(-1, -2).contiguous(), + attn_weights, + qk_scale.contiguous() if qk_scale.dtype == torch.float16 else qk_scale.to(torch.float16).contiguous(), + qk_zero.contiguous()if qk_zero.dtype == torch.float16 else qk_zero.to(torch.float16).contiguous()) + # attn_weights = attn_weights.to(query.dtype).contiguous() + else: + key = dequantize_cache_torch(qk, qk_scale, qk_zero) + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + else: + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + if self.scale_attn_weights: + if self.use_cache_quantization: + size_temp = value[0].size(-1) + else: + size_temp = value.size(-1) + attn_weights = attn_weights / (size_temp ** 0.5) + + mask_value = torch.finfo(attn_weights.dtype).min + if causal_mask is not None: + attn_weights = torch.where( + causal_mask, attn_weights.to(attn_weights.dtype), mask_value + ) + + if attention_mask is not None: + attn_weights = attn_weights + attention_mask + + if self.softmax_in_fp32: + attn_weights = nn.functional.softmax(attn_weights.float(), dim=-1) + else: + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + attn_weights = attn_weights.type(query.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + if self.use_cache_quantization: + qv, qv_scale, qv_zero = value + if self.use_cache_kernel and self.cache_kernels is not None: + shape = attn_weights.shape[:-1] + (query.shape[-1],) + attn_output = torch.zeros(shape, dtype=torch.float16, device=device) + self.cache_kernels.vecquant8matmul_batched_column_compression_faster_old( + attn_weights.contiguous() if attn_weights.dtype == torch.float16 else attn_weights.to(torch.float16).contiguous(), + qv.contiguous(), # dtype: int32 + attn_output, + qv_scale.contiguous() if qv_scale.dtype == torch.float16 else qv_scale.to(torch.float16).contiguous(), + qv_zero.contiguous() if qv_zero.dtype == torch.float16 else qv_zero.to(torch.float16).contiguous()) + if attn_output.dtype != query.dtype: + attn_output = attn_output.to(query.dtype) + attn_weights = attn_weights.to(query.dtype) + else: + value = dequantize_cache_torch(qv, qv_scale, qv_zero) + attn_output = torch.matmul(attn_weights, value) + else: + attn_output = torch.matmul(attn_weights, value) + + attn_output = attn_output.transpose(1, 2) + + return attn_output, attn_weights + + def _split_heads(self, tensor, num_heads, attn_head_size): + new_shape = tensor.size()[:-1] + (num_heads, attn_head_size) + tensor = tensor.view(new_shape) + return tensor + + def _merge_heads(self, tensor, num_heads, attn_head_size): + tensor = tensor.contiguous() + new_shape = tensor.size()[:-2] + (num_heads * attn_head_size,) + return tensor.view(new_shape) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + rotary_pos_emb_list: Optional[List[torch.Tensor]] = None, + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ): + mixed_x_layer = self.c_attn(hidden_states) + + query, key, value = mixed_x_layer.split(self.split_size, dim=2) + + query = self._split_heads(query, self.num_heads, self.head_dim) + key = self._split_heads(key, self.num_heads, self.head_dim) + value = self._split_heads(value, self.num_heads, self.head_dim) + + if rotary_pos_emb_list is not None: + cur_len = query.shape[1] + if True: + rotary_pos_emb = rotary_pos_emb_list + rotary_pos_emb = [i[:, -cur_len:, :, :] for i in rotary_pos_emb] + rotary_pos_emb = (rotary_pos_emb,) * 2 + q_pos_emb, k_pos_emb = rotary_pos_emb + # Slice the pos emb for current inference + query = apply_rotary_pos_emb(query, q_pos_emb) + key = apply_rotary_pos_emb(key, k_pos_emb) + else: + query_list = [] + key_list = [] + for i, rotary_pos_emb in enumerate(rotary_pos_emb_list): + rotary_pos_emb = [i[:, -cur_len:, :, :] for i in rotary_pos_emb] + rotary_pos_emb = (rotary_pos_emb,) * 2 + q_pos_emb, k_pos_emb = rotary_pos_emb + # Slice the pos emb for current inference + query_list += [apply_rotary_pos_emb(query[i:i+1, :, :], q_pos_emb)] + key_list += [apply_rotary_pos_emb(key[i:i+1, :, :], k_pos_emb)] + query = torch.cat(query_list, dim=0) + key = torch.cat(key_list, dim=0) + + if self.use_cache_quantization: + key = quantize_cache_v(key.permute(0, 2, 1, 3), + bits=8, + qmin=self.cache_qmin, + qmax=self.cache_qmax) + value = quantize_cache_v(value.permute(0, 2, 1, 3), + bits=8, + qmin=self.cache_qmin, + qmax=self.cache_qmax) + + + if layer_past is not None: + past_key, past_value = layer_past[0], layer_past[1] + if self.use_cache_quantization: + # use_cache_quantization: + # present=((q_key,key_scale,key_zero_point), + # (q_value,value_scale,value_zero_point)) + key = (torch.cat((past_key[0], key[0]), dim=2), + torch.cat((past_key[1], key[1]), dim=2), + torch.cat((past_key[2], key[2]), dim=2)) + value = (torch.cat((past_value[0], value[0]), dim=2), + torch.cat((past_value[1], value[1]), dim=2), + torch.cat((past_value[2], value[2]), dim=2)) + else: + # not use_cache_quantization: + # present=(key,value) + key = torch.cat((past_key, key), dim=1) + value = torch.cat((past_value, value), dim=1) + + if use_cache: + present = (key, value) + else: + present = None + + key_size = key[0].size(2) if self.use_cache_quantization else key.size(1) + if key_size > self.seq_length and self.use_logn_attn and not self.training: + if self.use_cache_quantization: + seq_start = key[0].size(2) - query.size(1) + seq_end = key[0].size(2) + else: + seq_start = key.size(1) - query.size(1) + seq_end = key.size(1) + logn_tensor = self.logn_tensor[:, seq_start:seq_end, :, :].type_as(query) + query = query * logn_tensor.expand_as(query) + + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + and query.is_cuda + ): + q, k, v = query, key, value + attn_output = self.core_attention_flash(q, k, v, attention_mask=attention_mask) + else: + key_size = key[0].size(2) if self.use_cache_quantization else key.size(1) + if query.size(1) == key_size: + causal_mask = torch.tril( + torch.ones((key_size, key_size), dtype=torch.bool, device=query.device) + ).view(1, 1, key_size, key_size) + else: + causal_mask = None + query = query.permute(0, 2, 1, 3) + if not self.use_cache_quantization: + key = key.permute(0, 2, 1, 3) + value = value.permute(0, 2, 1, 3) + if ( + causal_mask is None + and self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + and not query.is_cuda + ): + raise Exception(_ERROR_INPUT_CPU_QUERY_WITH_FLASH_ATTN_ACTIVATED) + + if not self.use_cache_quantization and SUPPORT_TORCH2 and False: + if attention_mask is not None: + # attention_mask = attention_mask.expand( + # -1, -1, causal_mask.size(2), -1 + # ) + # if causal_mask is not None: + # attention_mask.masked_fill(~causal_mask, torch.finfo(query.dtype).min) + causal_mask = attention_mask + else: + attention_mask = causal_mask + attn_output = F.scaled_dot_product_attention( + query, key, value, attn_mask=attention_mask + ).transpose(1, 2) + attn_weight = None + else: + attn_output, attn_weight = self._attn( + # query, key, value, causal_mask, attention_mask, head_mask + query, key, value, attention_mask, attention_mask, head_mask + ) + context_layer = self._merge_heads( + attn_output, self.num_heads, self.head_dim + ) + + attn_output = self.c_proj(context_layer) + + outputs = (attn_output, present) + if output_attentions: + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + ): + raise ValueError("Cannot output attentions while using flash-attn") + elif not self.use_cache_quantization and SUPPORT_TORCH2: + raise ValueError("Cannot output attentions while using scaled_dot_product_attention") + else: + outputs += (attn_weight,) + + return outputs + + +class QWenMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.w1 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + self.w2 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + ff_dim_in = config.intermediate_size // 2 + self.c_proj = nn.Linear(ff_dim_in, config.hidden_size, bias=not config.no_bias) + + def forward(self, hidden_states): + a1 = self.w1(hidden_states) + a2 = self.w2(hidden_states) + intermediate_parallel = a1 * F.silu(a2) + output = self.c_proj(intermediate_parallel) + return output + + +class QWenBlock(nn.Module): + def __init__(self, config): + super().__init__() + hidden_size = config.hidden_size + self.bf16 = config.bf16 + + self.ln_1 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + self.attn = QWenAttention(config) + self.ln_2 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + + self.mlp = QWenMLP(config) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + rotary_pos_emb: Optional[List[List[torch.Tensor]]] = None, + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + ): + layernorm_output = self.ln_1(hidden_states) + + attn_outputs = self.attn( + layernorm_output, + rotary_pos_emb, + layer_past=layer_past, + attention_mask=attention_mask, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + attn_output = attn_outputs[0] + + outputs = attn_outputs[1:] + + residual = hidden_states + layernorm_input = attn_output + residual + + layernorm_output = self.ln_2(layernorm_input) + + residual = layernorm_input + mlp_output = self.mlp(layernorm_output) + hidden_states = residual + mlp_output + + if use_cache: + outputs = (hidden_states,) + outputs + else: + outputs = (hidden_states,) + outputs[1:] + + return outputs + + +class QWenPreTrainedModel(PreTrainedModel): + config_class = QWenConfig + base_model_prefix = "transformer" + is_parallelizable = False + supports_gradient_checkpointing = True + _no_split_modules = ["QWenBlock"] + _skip_keys_device_placement = "past_key_values" + + def __init__(self, *inputs, **kwargs): + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module): + """Initialize the weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, RMSNorm): + module.weight.data.fill_(1.0) + + for name, p in module.named_parameters(): + if name == "c_proj.weight": + p.data.normal_( + mean=0.0, + std=( + self.config.initializer_range + / math.sqrt(2 * self.config.num_hidden_layers) + ), + ) + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, QWenModel): + module.gradient_checkpointing = value + + +class QWenModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = ["attn.masked_bias"] + + def __init__(self, config): + super().__init__(config) + self.vocab_size = config.vocab_size + self.num_hidden_layers = config.num_hidden_layers + self.embed_dim = config.hidden_size + self.use_cache_quantization = self.config.use_cache_quantization if hasattr(self.config, 'use_cache_quantization') else False + + self.gradient_checkpointing = False + self.use_dynamic_ntk = config.use_dynamic_ntk + self.seq_length = config.seq_length + + self.wte = nn.Embedding(self.vocab_size, self.embed_dim) + + self.drop = nn.Dropout(config.emb_dropout_prob) + + if config.rotary_pct == 1.0: + self.rotary_ndims = None + else: + assert config.rotary_pct < 1 + self.rotary_ndims = int( + config.kv_channels * config.rotary_pct + ) + dim = ( + self.rotary_ndims + if self.rotary_ndims is not None + else config.kv_channels + ) + self.rotary_emb = RotaryEmbedding(dim, base=config.rotary_emb_base) + + self.use_flash_attn = config.use_flash_attn + self.is_fp32 = not (config.bf16 or config.fp16) + + self.h = nn.ModuleList( + [ + QWenBlock( + config + ) + for i in range(config.num_hidden_layers) + ] + ) + self.ln_f = RMSNorm( + self.embed_dim, + eps=config.layer_norm_epsilon, + ) + + self.post_init() + + def get_input_embeddings(self): + return self.wte + + def set_input_embeddings(self, new_embeddings): + self.wte = new_embeddings + + def get_ntk_alpha(self, true_seq_len): + context_value = math.log(true_seq_len / self.seq_length, 2) + 1 + ntk_alpha = 2 ** math.ceil(context_value) - 1 + ntk_alpha = max(ntk_alpha, 1) + return ntk_alpha + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) + batch_size = input_ids.shape[0] + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + batch_size = inputs_embeds.shape[0] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + device = input_ids.device if input_ids is not None else inputs_embeds.device + + if token_type_ids is not None: + token_type_ids = token_type_ids.view(-1, input_shape[-1]) + if position_ids is not None: + position_ids = position_ids.view(-1, input_shape[-1]) + + if past_key_values is None: + past_length = 0 + past_key_values = tuple([None] * len(self.h)) + else: + if self.use_cache_quantization: + past_length = past_key_values[0][0][0].size(2) + else: + past_length = past_key_values[0][0].size(-2) + if position_ids is None: + position_ids = torch.arange( + past_length, + input_shape[-1] + past_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1]) + + if attention_mask is not None: + if batch_size <= 0: + raise ValueError("batch_size has to be defined and > 0") + attention_mask = attention_mask.view(batch_size, -1) + attention_mask = attention_mask[:, None, None, :] + attention_mask = attention_mask.to(dtype=self.dtype) + attention_mask = (1.0 - attention_mask) * torch.finfo(self.dtype).min + + encoder_attention_mask = None + head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers) + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + hidden_states = inputs_embeds + + kv_seq_len = hidden_states.size()[1] + if past_key_values[0] is not None: + # past key values[0][0] shape: bs * seq_len * head_num * dim + if self.use_cache_quantization: + kv_seq_len += past_key_values[0][0][0].shape[2] + else: + kv_seq_len += past_key_values[0][0].shape[1] + + if self.training or not self.use_dynamic_ntk: + ntk_alpha_list = [1.0] + elif kv_seq_len != hidden_states.size()[1]: + ntk_alpha_list = self.rotary_emb._ntk_alpha_cached_list + else: + ntk_alpha_list = [] + if attention_mask is not None and kv_seq_len > self.seq_length: + true_seq_lens = attention_mask.squeeze(1).squeeze(1).eq(0).sum(dim=-1, dtype=torch.int32) + for i in range(hidden_states.size()[0]): + true_seq_len = true_seq_lens[i].item() + ntk_alpha = self.get_ntk_alpha(true_seq_len) + ntk_alpha_list.append(ntk_alpha) + else: + ntk_alpha = self.get_ntk_alpha(kv_seq_len) + ntk_alpha_list.append(ntk_alpha) + self.rotary_emb._ntk_alpha_cached_list = ntk_alpha_list + rotary_pos_emb_list = [ + self.rotary_emb(kv_seq_len, ntk_alpha=ntk_alpha) for ntk_alpha in ntk_alpha_list + ] + + hidden_states = self.drop(hidden_states) + output_shape = input_shape + (hidden_states.size(-1),) + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, use_cache, output_attentions) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + rotary_pos_emb_list, + None, + attention_mask, + head_mask[i], + encoder_hidden_states, + encoder_attention_mask, + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + rotary_pos_emb=rotary_pos_emb_list, + attention_mask=attention_mask, + head_mask=head_mask[i], + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) + + if output_attentions: + all_self_attentions = all_self_attentions + (outputs[2 if use_cache else 1],) + + hidden_states = self.ln_f(hidden_states) + hidden_states = hidden_states.view(output_shape) + # Add last hidden state + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if not return_dict: + return tuple( + v for v in [hidden_states, presents, all_hidden_states] if v is not None + ) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class QWenLMHeadModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = [r"h\.\d+\.attn\.rotary_emb\.inv_freq"] + _keys_to_ignore_on_load_unexpected = [r"h\.\d+\.attn\.masked_bias"] + + def __init__(self, config): + super().__init__(config) + assert ( + config.bf16 + config.fp16 + config.fp32 <= 1 + ), "Only one of \"bf16\", \"fp16\", \"fp32\" can be true" + + autoset_precision = config.bf16 + config.fp16 + config.fp32 == 0 + + if autoset_precision: + if SUPPORT_BF16: + logger.warn( + "The model is automatically converting to bf16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.bf16 = True + elif SUPPORT_FP16: + logger.warn( + "The model is automatically converting to fp16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.fp16 = True + else: + config.fp32 = True + + if config.bf16 and SUPPORT_CUDA and not SUPPORT_BF16: + logger.warn("Your device does NOT seem to support bf16, you can switch to fp16 or fp32 by by passing fp16/fp32=True in \"AutoModelForCausalLM.from_pretrained\".") + if config.fp16 and SUPPORT_CUDA and not SUPPORT_FP16: + logger.warn("Your device does NOT support faster inference with fp16, please switch to fp32 which is likely to be faster") + if config.fp32: + if SUPPORT_BF16: + logger.warn("Your device support faster inference by passing bf16=True in \"AutoModelForCausalLM.from_pretrained\".") + elif SUPPORT_FP16: + logger.warn("Your device support faster inference by passing fp16=True in \"AutoModelForCausalLM.from_pretrained\".") + + if config.use_flash_attn == "auto": + if config.bf16 or config.fp16: + logger.warn("Try importing flash-attention for faster inference...") + config.use_flash_attn = True + else: + config.use_flash_attn = False + if config.use_flash_attn and config.fp32: + logger.warn("Flash attention will be disabled because it does NOT support fp32.") + + if config.use_flash_attn: + _import_flash_attn() + + self.transformer = QWenModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + if config.bf16: + self.transformer.bfloat16() + self.lm_head.bfloat16() + if config.fp16: + self.transformer.half() + self.lm_head.half() + self.post_init() + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1].unsqueeze(-1) + + if input_ids.size(0) == 1: + attention_mask = None + else: + attention_mask = kwargs.get("attention_mask", None) + + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + token_type_ids=token_type_ids, + position_ids=position_ids, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + labels = labels.to(lm_logits.device) + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + loss_fct = CrossEntropyLoss() + loss = loss_fct( + shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1) + ) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past_key_values: Tuple[Tuple[torch.Tensor]], beam_idx: torch.Tensor + ) -> Tuple[Tuple[torch.Tensor]]: + + return tuple( + tuple( + past_state.index_select(0, beam_idx.to(past_state.device)) + for past_state in layer_past + ) + for layer_past in past_key_values + ) + + def chat( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + stream: Optional[bool] = _SENTINEL, + stop_words_ids: Optional[List[List[int]]] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Tuple[str, HistoryType]: + generation_config = generation_config if generation_config is not None else self.generation_config + + assert stream is _SENTINEL, _ERROR_STREAM_IN_CHAT + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + else: + # make a copy of the user's input such that is is left untouched + history = copy.deepcopy(history) + + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + input_ids = torch.tensor([context_tokens]).to(self.device) + outputs = self.generate( + input_ids, + stop_words_ids=stop_words_ids, + return_dict_in_generate=False, + generation_config=generation_config, + **kwargs, + ) + + response = decode_tokens( + outputs[0], + tokenizer, + raw_text_len=len(raw_text), + context_length=len(context_tokens), + chat_format=generation_config.chat_format, + verbose=False, + errors='replace' + ) + + # as history is a copy of the user inputs, + # we can always return the new turn to the user. + # separating input history and output history also enables the user + # to implement more complex history management + history.append((query, response)) + + return response, history + + def chat_stream( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + stop_words_ids: Optional[List[List[int]]] = None, + logits_processor: Optional[LogitsProcessorList] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Generator[str, Any, None]: + generation_config = generation_config if generation_config is not None else self.generation_config + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + input_ids = torch.tensor([context_tokens]).to(self.device) + + from transformers_stream_generator.main import NewGenerationMixin, StreamGenerationConfig + self.__class__.generate_stream = NewGenerationMixin.generate + self.__class__.sample_stream = NewGenerationMixin.sample_stream + stream_config = StreamGenerationConfig(**generation_config.to_dict(), do_stream=True) + + def stream_generator(): + outputs = [] + for token in self.generate_stream( + input_ids, + return_dict_in_generate=False, + generation_config=stream_config, + logits_processor=logits_processor, + seed=-1, + **kwargs): + outputs.append(token.item()) + yield tokenizer.decode(outputs, skip_special_tokens=True, errors='ignore') + + return stream_generator() + + def generate( + self, + inputs: Optional[torch.Tensor] = None, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[ + Callable[[int, torch.Tensor], List[int]] + ] = None, + synced_gpus: Optional[bool] = None, + assistant_model: Optional["PreTrainedModel"] = None, + streamer: Optional["BaseStreamer"] = None, + **kwargs, + ) -> Union[GenerateOutput, torch.LongTensor]: + generation_config = generation_config if generation_config is not None else self.generation_config + + # Process stop_words_ids. + stop_words_ids = kwargs.pop("stop_words_ids", None) + if stop_words_ids is None and generation_config is not None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + if stop_words_ids is None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + + return super().generate( + inputs, + generation_config=generation_config, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + synced_gpus=synced_gpus, + assistant_model=assistant_model, + streamer=streamer, + **kwargs, + ) + + +class RotaryEmbedding(torch.nn.Module): + def __init__(self, dim, base=10000): + super().__init__() + self.dim = dim + self.base = base + inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + if importlib.util.find_spec("einops") is None: + raise RuntimeError("einops is required for Rotary Embedding") + + self._rotary_pos_emb_cache = None + self._seq_len_cached = 0 + self._ntk_alpha_cached = 1.0 + self._ntk_alpha_cached_list = [1.0] + + def update_rotary_pos_emb_cache(self, seqlen, ntk_alpha=1.0): + if seqlen > self._seq_len_cached or ntk_alpha != self._ntk_alpha_cached: + base = self.base * ntk_alpha ** (self.dim / (self.dim - 2)) + self.inv_freq = 1.0 / ( + base + ** ( + torch.arange(0, self.dim, 2, device=self.inv_freq.device).float() + / self.dim + ) + ) + self._seq_len_cached = max(2 * seqlen, 16) + self._ntk_alpha_cached = ntk_alpha + seq = torch.arange(self._seq_len_cached, device=self.inv_freq.device) + freqs = torch.outer(seq.type_as(self.inv_freq), self.inv_freq) + + emb = torch.cat((freqs, freqs), dim=-1) + from einops import rearrange + + emb = rearrange(emb, "n d -> 1 n 1 d") + + cos, sin = emb.cos(), emb.sin() + self._rotary_pos_emb_cache = [cos, sin] + + def forward(self, max_seq_len, ntk_alpha=1.0): + self.update_rotary_pos_emb_cache(max_seq_len, ntk_alpha) + cos, sin = self._rotary_pos_emb_cache + return [cos[:, :max_seq_len], sin[:, :max_seq_len]] + + +def _rotate_half(x): + from einops import rearrange + + x = rearrange(x, "... (j d) -> ... j d", j=2) + x1, x2 = x.unbind(dim=-2) + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(t, freqs): + """ Apply rotary embedding to the first rotary_dim of the iput + + Arguments: + t (tensor(batch_size, seq_len, n_head, head_dim)): + the input embedding/hidden states + freqs (list[tensor(1, seq_len, 1, rotary_dim), tensor(1, seq_len, 1, rotary_dim)]): + the cached cos/sin position embeddings + """ + rot_dim = freqs[0].shape[-1] + cos, sin = freqs + t_float = t.float() + if apply_rotary_emb_func is not None and t.is_cuda: + # apply_rotary_emb in flash_attn requires cos/sin to be of + # shape (seqlen, rotary_dim / 2) and apply rotary embedding + # to the first rotary_dim of the input + cos = cos.squeeze(0).squeeze(1)[:, : rot_dim // 2] + sin = sin.squeeze(0).squeeze(1)[:, : rot_dim // 2] + return apply_rotary_emb_func(t_float, cos, sin).type_as(t) + else: + t_rot, t_pass = t_float[..., :rot_dim], t_float[..., rot_dim:] + t_rot = (t_rot * cos) + (_rotate_half(t_rot) * sin) + return torch.cat((t_rot, t_pass), dim=-1).type_as(t) + + +class RMSNorm(torch.nn.Module): + def __init__(self, dim: int, eps: float = 1e-6): + super().__init__() + self.eps = eps + self.weight = nn.Parameter(torch.ones(dim)) + + def _norm(self, x): + return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) + + def forward(self, x): + if rms_norm is not None and x.is_cuda: + return rms_norm(x, self.weight, self.eps) + else: + output = self._norm(x.float()).type_as(x) + return output * self.weight diff --git a/transformers/llm/export/llm_models/Qwen-1_8B/modeling_qwen.py b/transformers/llm/export/llm_models/Qwen-1_8B/modeling_qwen.py new file mode 100755 index 000000000..5138eea76 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen-1_8B/modeling_qwen.py @@ -0,0 +1,1406 @@ +# Copyright (c) Alibaba Cloud. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import copy +import importlib +import math +import pathlib +from typing import TYPE_CHECKING, Optional, Tuple, Union, Callable, List, Any, Generator + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +import warnings + +from torch.nn import CrossEntropyLoss +from transformers import PreTrainedTokenizer, GenerationConfig, StoppingCriteriaList +from transformers.generation.logits_process import LogitsProcessorList + +if TYPE_CHECKING: + from transformers.generation.streamers import BaseStreamer +from transformers.generation.utils import GenerateOutput +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging + +try: + from einops import rearrange +except ImportError: + rearrange = None +from torch import nn + +SUPPORT_CUDA = torch.cuda.is_available() +SUPPORT_BF16 = SUPPORT_CUDA and torch.cuda.is_bf16_supported() +SUPPORT_FP16 = SUPPORT_CUDA and torch.cuda.get_device_capability(0)[0] >= 7 +SUPPORT_TORCH2 = hasattr(torch, '__version__') and int(torch.__version__.split(".")[0]) >= 2 + + +from .configuration_qwen import QWenConfig +from .qwen_generation_utils import ( + HistoryType, + make_context, + decode_tokens, + get_stop_words_ids, + StopWordsLogitsProcessor, +) + + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "qwen" +_CONFIG_FOR_DOC = "QWenConfig" + +QWen_PRETRAINED_MODEL_ARCHIVE_LIST = ["qwen-7b"] + +_ERROR_BAD_CHAT_FORMAT = """\ +We detect you are probably using the pretrained model (rather than chat model) for chatting, since the chat_format in generation_config is not "chatml". +If you are directly using the model downloaded from Huggingface, please make sure you are using our "Qwen/Qwen-7B-Chat" Huggingface model (rather than "Qwen/Qwen-7B") when you call model.chat(). +我们检测到您可能在使用预训练模型(而非chat模型)进行多轮chat,因为您当前在generation_config指定的chat_format,并未设置为我们在对话中所支持的"chatml"格式。 +如果您在直接使用我们从Huggingface提供的模型,请确保您在调用model.chat()时,使用的是"Qwen/Qwen-7B-Chat"模型(而非"Qwen/Qwen-7B"预训练模型)。 +""" + +_SENTINEL = object() +_ERROR_STREAM_IN_CHAT = """\ +Pass argument `stream` to model.chat() is buggy, deprecated, and marked for removal. Please use model.chat_stream(...) instead of model.chat(..., stream=True). +向model.chat()传入参数stream的用法可能存在Bug,该用法已被废弃,将在未来被移除。请使用model.chat_stream(...)代替model.chat(..., stream=True)。 +""" + +_ERROR_INPUT_CPU_QUERY_WITH_FLASH_ATTN_ACTIVATED = """\ +We detect you have activated flash attention support, but running model computation on CPU. Please make sure that your input data has been placed on GPU. If you actually want to run CPU computation, please following the readme and set device_map="cpu" to disable flash attention when loading the model (calling AutoModelForCausalLM.from_pretrained). +检测到您的模型已激活了flash attention支持,但正在执行CPU运算任务。如使用flash attention,请您确认模型输入已经传到GPU上。如果您确认要执行CPU运算,请您在载入模型(调用AutoModelForCausalLM.from_pretrained)时,按照readme说法,指定device_map="cpu"以禁用flash attention。 +""" + +apply_rotary_emb_func = None +rms_norm = None +flash_attn_unpadded_func = None +flash_attn_func = None + +def _import_flash_attn(): + global apply_rotary_emb_func, rms_norm, flash_attn_unpadded_func, flash_attn_func + try: + from flash_attn.layers.rotary import apply_rotary_emb_func as __apply_rotary_emb_func + apply_rotary_emb_func = __apply_rotary_emb_func + except ImportError: + logger.warn( + "Warning: import flash_attn rotary fail, please install FlashAttention rotary to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention/tree/main/csrc/rotary" + ) + + try: + from flash_attn.ops.rms_norm import rms_norm as __rms_norm + rms_norm = __rms_norm + except ImportError: + logger.warn( + "Warning: import flash_attn rms_norm fail, please install FlashAttention layer_norm to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention/tree/main/csrc/layer_norm" + ) + + try: + import flash_attn + _flash_attn_func = None + if not hasattr(flash_attn, '__version__'): + from flash_attn.flash_attn_interface import flash_attn_unpadded_func as __flash_attn_unpadded_func + else: + if int(flash_attn.__version__.split(".")[0]) >= 2: + if int(flash_attn.__version__.split(".")[1]) >= 1: + from flash_attn.flash_attn_interface import flash_attn_func as _flash_attn_func + from flash_attn.flash_attn_interface import flash_attn_varlen_func as __flash_attn_unpadded_func + else: + from flash_attn.flash_attn_interface import flash_attn_unpadded_func as __flash_attn_unpadded_func + flash_attn_unpadded_func = __flash_attn_unpadded_func + flash_attn_func = _flash_attn_func + except ImportError: + logger.warn( + "Warning: import flash_attn fail, please install FlashAttention to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention" + ) + +def quantize_cache_v(fdata, bits, qmax, qmin): + # b, s, head, h-dim->b, head, s, h-dim + qtype = torch.uint8 + device = fdata.device + shape = fdata.shape + + fdata_cal = torch.flatten(fdata, 2) + fmax = torch.amax(fdata_cal, dim=-1, keepdim=True) + fmin = torch.amin(fdata_cal, dim=-1, keepdim=True) + # Compute params + if qmax.device != fmax.device: + qmax = qmax.to(device) + qmin = qmin.to(device) + scale = (fmax - fmin) / (qmax - qmin) + zero = qmin - fmin / scale + scale = scale.unsqueeze(-1).repeat(1,1,shape[2],1).contiguous() + zero = zero.unsqueeze(-1).repeat(1,1,shape[2],1).contiguous() + # Quantize + res_data = fdata / scale + zero + qdata = torch.clamp(res_data, qmin, qmax).to(qtype) + return qdata.contiguous(), scale, zero + +def dequantize_cache_torch(qdata, scale, zero): + data = scale * (qdata - zero) + return data + +class FlashSelfAttention(torch.nn.Module): + def __init__( + self, + causal=False, + softmax_scale=None, + attention_dropout=0.0, + ): + super().__init__() + assert flash_attn_unpadded_func is not None, ( + "Please install FlashAttention first, " "e.g., with pip install flash-attn" + ) + assert ( + rearrange is not None + ), "Please install einops first, e.g., with pip install einops" + self.causal = causal + self.softmax_scale = softmax_scale + self.dropout_p = attention_dropout + + def unpad_input(self, hidden_states, attention_mask): + valid_mask = attention_mask.squeeze(1).squeeze(1).eq(0) + seqlens_in_batch = valid_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(valid_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0)) + hidden_states = hidden_states[indices] + return hidden_states, indices, cu_seqlens, max_seqlen_in_batch + + def pad_input(self, hidden_states, indices, batch, seqlen): + output = torch.zeros(batch * seqlen, *hidden_states.shape[1:], device=hidden_states.device, + dtype=hidden_states.dtype) + output[indices] = hidden_states + return rearrange(output, '(b s) ... -> b s ...', b=batch) + + def forward(self, q, k, v, attention_mask=None): + assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v))) + assert all((i.is_cuda for i in (q, k, v))) + batch_size, seqlen_q = q.shape[0], q.shape[1] + seqlen_k = k.shape[1] + seqlen_out = seqlen_q + + if flash_attn_func is not None and batch_size == 1: + dropout_p = self.dropout_p if self.training else 0 + output = flash_attn_func(q, k, v, dropout_p, softmax_scale=self.softmax_scale, causal=self.causal) + return output + + q, k, v = [rearrange(x, "b s ... -> (b s) ...") for x in [q, k, v]] + cu_seqlens_q = torch.arange( + 0, + (batch_size + 1) * seqlen_q, + step=seqlen_q, + dtype=torch.int32, + device=q.device, + ) + + if batch_size > 1 and attention_mask is not None: + k, indices_k, cu_seqlens_k, seqlen_k = self.unpad_input(k, attention_mask) + if q.size(0) == v.size(0): + q = q[indices_k] + cu_seqlens_q = cu_seqlens_k + seqlen_q = seqlen_k + v = v[indices_k] + else: + cu_seqlens_k = torch.arange( + 0, + (batch_size + 1) * seqlen_k, + step=seqlen_k, + dtype=torch.int32, + device=q.device, + ) + + if self.training: + assert seqlen_k == seqlen_q + is_causal = self.causal + dropout_p = self.dropout_p + else: + is_causal = seqlen_q == seqlen_k + dropout_p = 0 + + output = flash_attn_unpadded_func( + q, + k, + v, + cu_seqlens_q, + cu_seqlens_k, + seqlen_q, + seqlen_k, + dropout_p, + softmax_scale=self.softmax_scale, + causal=is_causal, + ) + if batch_size > 1 and attention_mask is not None and seqlen_q == seqlen_k: + output = self.pad_input(output, indices_k, batch_size, seqlen_out) + else: + new_shape = (batch_size, output.shape[0] // batch_size) + output.shape[1:] + output = output.view(new_shape) + return output + + +class QWenAttention(nn.Module): + def __init__(self, config): + super().__init__() + + self.register_buffer("masked_bias", torch.tensor(-1e4), persistent=False) + self.seq_length = config.seq_length + + self.hidden_size = config.hidden_size + self.split_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + + self.use_flash_attn = config.use_flash_attn + self.scale_attn_weights = True + + self.projection_size = config.kv_channels * config.num_attention_heads + + assert self.projection_size % config.num_attention_heads == 0 + self.hidden_size_per_attention_head = ( + self.projection_size // config.num_attention_heads + ) + + self.c_attn = nn.Linear(config.hidden_size, 3 * self.projection_size) + + self.c_proj = nn.Linear( + config.hidden_size, self.projection_size, bias=not config.no_bias + ) + + self.is_fp32 = not (config.bf16 or config.fp16) + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + ): + self.core_attention_flash = FlashSelfAttention( + causal=True, attention_dropout=config.attn_dropout_prob + ) + self.bf16 = config.bf16 + + self.use_dynamic_ntk = config.use_dynamic_ntk + self.use_logn_attn = config.use_logn_attn + + logn_list = [ + math.log(i, self.seq_length) if i > self.seq_length else 1 + for i in range(1, 32768) + ] + logn_tensor = torch.tensor(logn_list)[None, :, None, None] + self.register_buffer("logn_tensor", logn_tensor, persistent=False) + + self.attn_dropout = nn.Dropout(config.attn_dropout_prob) + self.softmax_in_fp32 = config.softmax_in_fp32 if hasattr(config, 'softmax_in_fp32') else False + self.use_cache_quantization = config.use_cache_quantization if hasattr(config, 'use_cache_quantization') else False + self.use_cache_kernel = config.use_cache_kernel if hasattr(config,'use_cache_kernel') else False + cache_dtype = torch.float + if self.bf16: + cache_dtype=torch.bfloat16 + elif config.fp16: + cache_dtype = torch.float16 + self.cache_qmax = torch.tensor(torch.iinfo(torch.uint8).max, dtype=cache_dtype) + self.cache_qmin = torch.tensor(torch.iinfo(torch.uint8).min, dtype=cache_dtype) + + if config.use_cache_quantization and config.use_cache_kernel: + # pre check if the support files existing + module_root = pathlib.Path(__file__).parent + src_files = ("cache_autogptq_cuda_256.cpp", "cache_autogptq_cuda_kernel_256.cu") + if any(not (module_root/src).is_file() for src in src_files): + warnings.warn("KV cache kernel source files (.cpp and .cu) not found.") + self.cache_kernels = None + else: + try: + from .cpp_kernels import cache_autogptq_cuda_256 + self.cache_kernels = cache_autogptq_cuda_256 + except ImportError: + warnings.warn("Failed to import KV cache kernels.") + self.cache_kernels = None + + def _attn(self, query, key, value, no_use_mask, attention_mask=None, head_mask=None): + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + if self.scale_attn_weights: + attn_weights = attn_weights / torch.full( + [], + value.size(-1) ** 0.5, + dtype=attn_weights.dtype, + device=attn_weights.device, + ) + + query_length, key_length = query.size(-2), key.size(-2) + if attention_mask is None: + causal_mask = self.bias[ + :, :, key_length - query_length : key_length, :key_length + ] + else: + causal_mask = attention_mask + mask_value = torch.finfo(attn_weights.dtype).min + mask_value = torch.full([], mask_value, dtype=attn_weights.dtype).to( + attn_weights.device + ) + attn_weights = torch.where( + causal_mask, attn_weights.to(attn_weights.dtype), mask_value + ) + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + attn_weights = attn_weights.type(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + attn_output = attn_output.transpose(1, 2) + + return attn_output, attn_weights + + def __attn(self, query, key, value, causal_mask=None, attention_mask=None, head_mask=None): + device = query.device + if self.use_cache_quantization: + qk, qk_scale, qk_zero = key + if self.use_cache_kernel and self.cache_kernels is not None: + shape = query.shape[:-1] + (qk.shape[-2],) + attn_weights = torch.zeros(shape, dtype=torch.float16, device=device) + self.cache_kernels.vecquant8matmul_batched_faster_old( + query.contiguous() if query.dtype == torch.float16 else query.to(torch.float16).contiguous(), + qk.transpose(-1, -2).contiguous(), + attn_weights, + qk_scale.contiguous() if qk_scale.dtype == torch.float16 else qk_scale.to(torch.float16).contiguous(), + qk_zero.contiguous()if qk_zero.dtype == torch.float16 else qk_zero.to(torch.float16).contiguous()) + # attn_weights = attn_weights.to(query.dtype).contiguous() + else: + key = dequantize_cache_torch(qk, qk_scale, qk_zero) + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + else: + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + if self.scale_attn_weights: + if self.use_cache_quantization: + size_temp = value[0].size(-1) + else: + size_temp = value.size(-1) + attn_weights = attn_weights / (size_temp ** 0.5) + + mask_value = torch.finfo(attn_weights.dtype).min + if causal_mask is not None: + attn_weights = torch.where( + causal_mask, attn_weights.to(attn_weights.dtype), mask_value + ) + + if attention_mask is not None: + attn_weights = attn_weights + attention_mask + + if self.softmax_in_fp32: + attn_weights = nn.functional.softmax(attn_weights.float(), dim=-1) + else: + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + attn_weights = attn_weights.type(query.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + if self.use_cache_quantization: + qv, qv_scale, qv_zero = value + if self.use_cache_kernel and self.cache_kernels is not None: + shape = attn_weights.shape[:-1] + (query.shape[-1],) + attn_output = torch.zeros(shape, dtype=torch.float16, device=device) + self.cache_kernels.vecquant8matmul_batched_column_compression_faster_old( + attn_weights.contiguous() if attn_weights.dtype == torch.float16 else attn_weights.to(torch.float16).contiguous(), + qv.contiguous(), # dtype: int32 + attn_output, + qv_scale.contiguous() if qv_scale.dtype == torch.float16 else qv_scale.to(torch.float16).contiguous(), + qv_zero.contiguous() if qv_zero.dtype == torch.float16 else qv_zero.to(torch.float16).contiguous()) + if attn_output.dtype != query.dtype: + attn_output = attn_output.to(query.dtype) + attn_weights = attn_weights.to(query.dtype) + else: + value = dequantize_cache_torch(qv, qv_scale, qv_zero) + attn_output = torch.matmul(attn_weights, value) + else: + attn_output = torch.matmul(attn_weights, value) + + attn_output = attn_output.transpose(1, 2) + + return attn_output, attn_weights + + def _split_heads(self, tensor, num_heads, attn_head_size): + new_shape = tensor.size()[:-1] + (num_heads, attn_head_size) + tensor = tensor.view(new_shape) + return tensor + + def _merge_heads(self, tensor, num_heads, attn_head_size): + tensor = tensor.contiguous() + new_shape = tensor.size()[:-2] + (num_heads * attn_head_size,) + return tensor.view(new_shape) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + rotary_pos_emb_list: Optional[List[torch.Tensor]] = None, + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ): + mixed_x_layer = self.c_attn(hidden_states) + + query, key, value = mixed_x_layer.split(self.split_size, dim=2) + + query = self._split_heads(query, self.num_heads, self.head_dim) + key = self._split_heads(key, self.num_heads, self.head_dim) + value = self._split_heads(value, self.num_heads, self.head_dim) + + if rotary_pos_emb_list is not None: + cur_len = query.shape[1] + if True: + rotary_pos_emb = rotary_pos_emb_list + rotary_pos_emb = [i[:, -cur_len:, :, :] for i in rotary_pos_emb] + rotary_pos_emb = (rotary_pos_emb,) * 2 + q_pos_emb, k_pos_emb = rotary_pos_emb + # Slice the pos emb for current inference + query = apply_rotary_pos_emb(query, q_pos_emb) + key = apply_rotary_pos_emb(key, k_pos_emb) + else: + query_list = [] + key_list = [] + for i, rotary_pos_emb in enumerate(rotary_pos_emb_list): + rotary_pos_emb = [i[:, -cur_len:, :, :] for i in rotary_pos_emb] + rotary_pos_emb = (rotary_pos_emb,) * 2 + q_pos_emb, k_pos_emb = rotary_pos_emb + # Slice the pos emb for current inference + query_list += [apply_rotary_pos_emb(query[i:i+1, :, :], q_pos_emb)] + key_list += [apply_rotary_pos_emb(key[i:i+1, :, :], k_pos_emb)] + query = torch.cat(query_list, dim=0) + key = torch.cat(key_list, dim=0) + + if self.use_cache_quantization: + key = quantize_cache_v(key.permute(0, 2, 1, 3), + bits=8, + qmin=self.cache_qmin, + qmax=self.cache_qmax) + value = quantize_cache_v(value.permute(0, 2, 1, 3), + bits=8, + qmin=self.cache_qmin, + qmax=self.cache_qmax) + + + if layer_past is not None: + past_key, past_value = layer_past[0], layer_past[1] + if self.use_cache_quantization: + # use_cache_quantization: + # present=((q_key,key_scale,key_zero_point), + # (q_value,value_scale,value_zero_point)) + key = (torch.cat((past_key[0], key[0]), dim=2), + torch.cat((past_key[1], key[1]), dim=2), + torch.cat((past_key[2], key[2]), dim=2)) + value = (torch.cat((past_value[0], value[0]), dim=2), + torch.cat((past_value[1], value[1]), dim=2), + torch.cat((past_value[2], value[2]), dim=2)) + else: + # not use_cache_quantization: + # present=(key,value) + key = torch.cat((past_key, key), dim=1) + value = torch.cat((past_value, value), dim=1) + + if use_cache: + present = (key, value) + else: + present = None + + key_size = key[0].size(2) if self.use_cache_quantization else key.size(1) + if key_size > self.seq_length and self.use_logn_attn and not self.training: + if self.use_cache_quantization: + seq_start = key[0].size(2) - query.size(1) + seq_end = key[0].size(2) + else: + seq_start = key.size(1) - query.size(1) + seq_end = key.size(1) + logn_tensor = self.logn_tensor[:, seq_start:seq_end, :, :].type_as(query) + query = query * logn_tensor.expand_as(query) + + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + and query.is_cuda + ): + q, k, v = query, key, value + attn_output = self.core_attention_flash(q, k, v, attention_mask=attention_mask) + else: + key_size = key[0].size(2) if self.use_cache_quantization else key.size(1) + if query.size(1) == key_size: + causal_mask = torch.tril( + torch.ones((key_size, key_size), dtype=torch.bool, device=query.device) + ).view(1, 1, key_size, key_size) + else: + causal_mask = None + query = query.permute(0, 2, 1, 3) + if not self.use_cache_quantization: + key = key.permute(0, 2, 1, 3) + value = value.permute(0, 2, 1, 3) + if ( + causal_mask is None + and self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + and not query.is_cuda + ): + raise Exception(_ERROR_INPUT_CPU_QUERY_WITH_FLASH_ATTN_ACTIVATED) + + if not self.use_cache_quantization and SUPPORT_TORCH2 and False: + if attention_mask is not None: + # attention_mask = attention_mask.expand( + # -1, -1, causal_mask.size(2), -1 + # ) + # if causal_mask is not None: + # attention_mask.masked_fill(~causal_mask, torch.finfo(query.dtype).min) + causal_mask = attention_mask + else: + attention_mask = causal_mask + attn_output = F.scaled_dot_product_attention( + query, key, value, attn_mask=attention_mask + ).transpose(1, 2) + attn_weight = None + else: + attn_output, attn_weight = self._attn( + # query, key, value, causal_mask, attention_mask, head_mask + query, key, value, attention_mask, attention_mask, head_mask + ) + context_layer = self._merge_heads( + attn_output, self.num_heads, self.head_dim + ) + + attn_output = self.c_proj(context_layer) + + outputs = (attn_output, present) + if output_attentions: + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + ): + raise ValueError("Cannot output attentions while using flash-attn") + elif not self.use_cache_quantization and SUPPORT_TORCH2: + raise ValueError("Cannot output attentions while using scaled_dot_product_attention") + else: + outputs += (attn_weight,) + + return outputs + + +class QWenMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.w1 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + self.w2 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + ff_dim_in = config.intermediate_size // 2 + self.c_proj = nn.Linear(ff_dim_in, config.hidden_size, bias=not config.no_bias) + + def forward(self, hidden_states): + a1 = self.w1(hidden_states) + a2 = self.w2(hidden_states) + intermediate_parallel = a1 * F.silu(a2) + output = self.c_proj(intermediate_parallel) + return output + + +class QWenBlock(nn.Module): + def __init__(self, config): + super().__init__() + hidden_size = config.hidden_size + self.bf16 = config.bf16 + + self.ln_1 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + self.attn = QWenAttention(config) + self.ln_2 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + + self.mlp = QWenMLP(config) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + rotary_pos_emb: Optional[List[List[torch.Tensor]]] = None, + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + ): + layernorm_output = self.ln_1(hidden_states) + + attn_outputs = self.attn( + layernorm_output, + rotary_pos_emb, + layer_past=layer_past, + attention_mask=attention_mask, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + attn_output = attn_outputs[0] + + outputs = attn_outputs[1:] + + residual = hidden_states + layernorm_input = attn_output + residual + + layernorm_output = self.ln_2(layernorm_input) + + residual = layernorm_input + mlp_output = self.mlp(layernorm_output) + hidden_states = residual + mlp_output + + if use_cache: + outputs = (hidden_states,) + outputs + else: + outputs = (hidden_states,) + outputs[1:] + + return outputs + + +class QWenPreTrainedModel(PreTrainedModel): + config_class = QWenConfig + base_model_prefix = "transformer" + is_parallelizable = False + supports_gradient_checkpointing = True + _no_split_modules = ["QWenBlock"] + _skip_keys_device_placement = "past_key_values" + + def __init__(self, *inputs, **kwargs): + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module): + """Initialize the weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, RMSNorm): + module.weight.data.fill_(1.0) + + for name, p in module.named_parameters(): + if name == "c_proj.weight": + p.data.normal_( + mean=0.0, + std=( + self.config.initializer_range + / math.sqrt(2 * self.config.num_hidden_layers) + ), + ) + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, QWenModel): + module.gradient_checkpointing = value + + +class QWenModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = ["attn.masked_bias"] + + def __init__(self, config): + super().__init__(config) + self.vocab_size = config.vocab_size + self.num_hidden_layers = config.num_hidden_layers + self.embed_dim = config.hidden_size + self.use_cache_quantization = self.config.use_cache_quantization if hasattr(self.config, 'use_cache_quantization') else False + + self.gradient_checkpointing = False + self.use_dynamic_ntk = config.use_dynamic_ntk + self.seq_length = config.seq_length + + self.wte = nn.Embedding(self.vocab_size, self.embed_dim) + + self.drop = nn.Dropout(config.emb_dropout_prob) + + if config.rotary_pct == 1.0: + self.rotary_ndims = None + else: + assert config.rotary_pct < 1 + self.rotary_ndims = int( + config.kv_channels * config.rotary_pct + ) + dim = ( + self.rotary_ndims + if self.rotary_ndims is not None + else config.kv_channels + ) + self.rotary_emb = RotaryEmbedding(dim, base=config.rotary_emb_base) + + self.use_flash_attn = config.use_flash_attn + self.is_fp32 = not (config.bf16 or config.fp16) + + self.h = nn.ModuleList( + [ + QWenBlock( + config + ) + for i in range(config.num_hidden_layers) + ] + ) + self.ln_f = RMSNorm( + self.embed_dim, + eps=config.layer_norm_epsilon, + ) + + self.post_init() + + def get_input_embeddings(self): + return self.wte + + def set_input_embeddings(self, new_embeddings): + self.wte = new_embeddings + + def get_ntk_alpha(self, true_seq_len): + context_value = math.log(true_seq_len / self.seq_length, 2) + 1 + ntk_alpha = 2 ** math.ceil(context_value) - 1 + ntk_alpha = max(ntk_alpha, 1) + return ntk_alpha + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) + batch_size = input_ids.shape[0] + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + batch_size = inputs_embeds.shape[0] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + device = input_ids.device if input_ids is not None else inputs_embeds.device + + if token_type_ids is not None: + token_type_ids = token_type_ids.view(-1, input_shape[-1]) + if position_ids is not None: + position_ids = position_ids.view(-1, input_shape[-1]) + + if past_key_values is None: + past_length = 0 + past_key_values = tuple([None] * len(self.h)) + else: + if self.use_cache_quantization: + past_length = past_key_values[0][0][0].size(2) + else: + past_length = past_key_values[0][0].size(-2) + if position_ids is None: + position_ids = torch.arange( + past_length, + input_shape[-1] + past_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1]) + + if attention_mask is not None: + if batch_size <= 0: + raise ValueError("batch_size has to be defined and > 0") + attention_mask = attention_mask.view(batch_size, -1) + attention_mask = attention_mask[:, None, None, :] + attention_mask = attention_mask.to(dtype=self.dtype) + attention_mask = (1.0 - attention_mask) * torch.finfo(self.dtype).min + + encoder_attention_mask = None + head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers) + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + hidden_states = inputs_embeds + + kv_seq_len = hidden_states.size()[1] + if past_key_values[0] is not None: + # past key values[0][0] shape: bs * seq_len * head_num * dim + if self.use_cache_quantization: + kv_seq_len += past_key_values[0][0][0].shape[2] + else: + kv_seq_len += past_key_values[0][0].shape[1] + + if self.training or not self.use_dynamic_ntk: + ntk_alpha_list = [1.0] + elif kv_seq_len != hidden_states.size()[1]: + ntk_alpha_list = self.rotary_emb._ntk_alpha_cached_list + else: + ntk_alpha_list = [] + if attention_mask is not None and kv_seq_len > self.seq_length: + true_seq_lens = attention_mask.squeeze(1).squeeze(1).eq(0).sum(dim=-1, dtype=torch.int32) + for i in range(hidden_states.size()[0]): + true_seq_len = true_seq_lens[i].item() + ntk_alpha = self.get_ntk_alpha(true_seq_len) + ntk_alpha_list.append(ntk_alpha) + else: + ntk_alpha = self.get_ntk_alpha(kv_seq_len) + ntk_alpha_list.append(ntk_alpha) + self.rotary_emb._ntk_alpha_cached_list = ntk_alpha_list + rotary_pos_emb_list = [ + self.rotary_emb(kv_seq_len, ntk_alpha=ntk_alpha) for ntk_alpha in ntk_alpha_list + ] + + hidden_states = self.drop(hidden_states) + output_shape = input_shape + (hidden_states.size(-1),) + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, use_cache, output_attentions) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + rotary_pos_emb_list, + None, + attention_mask, + head_mask[i], + encoder_hidden_states, + encoder_attention_mask, + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + rotary_pos_emb=rotary_pos_emb_list, + attention_mask=attention_mask, + head_mask=head_mask[i], + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) + + if output_attentions: + all_self_attentions = all_self_attentions + (outputs[2 if use_cache else 1],) + + hidden_states = self.ln_f(hidden_states) + hidden_states = hidden_states.view(output_shape) + # Add last hidden state + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if not return_dict: + return tuple( + v for v in [hidden_states, presents, all_hidden_states] if v is not None + ) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class QWenLMHeadModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = [r"h\.\d+\.attn\.rotary_emb\.inv_freq"] + _keys_to_ignore_on_load_unexpected = [r"h\.\d+\.attn\.masked_bias"] + + def __init__(self, config): + super().__init__(config) + assert ( + config.bf16 + config.fp16 + config.fp32 <= 1 + ), "Only one of \"bf16\", \"fp16\", \"fp32\" can be true" + + autoset_precision = config.bf16 + config.fp16 + config.fp32 == 0 + + if autoset_precision: + if SUPPORT_BF16: + logger.warn( + "The model is automatically converting to bf16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.bf16 = True + elif SUPPORT_FP16: + logger.warn( + "The model is automatically converting to fp16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.fp16 = True + else: + config.fp32 = True + + if config.bf16 and SUPPORT_CUDA and not SUPPORT_BF16: + logger.warn("Your device does NOT seem to support bf16, you can switch to fp16 or fp32 by by passing fp16/fp32=True in \"AutoModelForCausalLM.from_pretrained\".") + if config.fp16 and SUPPORT_CUDA and not SUPPORT_FP16: + logger.warn("Your device does NOT support faster inference with fp16, please switch to fp32 which is likely to be faster") + if config.fp32: + if SUPPORT_BF16: + logger.warn("Your device support faster inference by passing bf16=True in \"AutoModelForCausalLM.from_pretrained\".") + elif SUPPORT_FP16: + logger.warn("Your device support faster inference by passing fp16=True in \"AutoModelForCausalLM.from_pretrained\".") + + if config.use_flash_attn == "auto": + if config.bf16 or config.fp16: + logger.warn("Try importing flash-attention for faster inference...") + config.use_flash_attn = True + else: + config.use_flash_attn = False + if config.use_flash_attn and config.fp32: + logger.warn("Flash attention will be disabled because it does NOT support fp32.") + + if config.use_flash_attn: + _import_flash_attn() + + self.transformer = QWenModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + if config.bf16: + self.transformer.bfloat16() + self.lm_head.bfloat16() + if config.fp16: + self.transformer.half() + self.lm_head.half() + self.post_init() + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1].unsqueeze(-1) + + if input_ids.size(0) == 1: + attention_mask = None + else: + attention_mask = kwargs.get("attention_mask", None) + + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + token_type_ids=token_type_ids, + position_ids=position_ids, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + labels = labels.to(lm_logits.device) + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + loss_fct = CrossEntropyLoss() + loss = loss_fct( + shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1) + ) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past_key_values: Tuple[Tuple[torch.Tensor]], beam_idx: torch.Tensor + ) -> Tuple[Tuple[torch.Tensor]]: + + return tuple( + tuple( + past_state.index_select(0, beam_idx.to(past_state.device)) + for past_state in layer_past + ) + for layer_past in past_key_values + ) + + def chat( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + stream: Optional[bool] = _SENTINEL, + stop_words_ids: Optional[List[List[int]]] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Tuple[str, HistoryType]: + generation_config = generation_config if generation_config is not None else self.generation_config + + assert stream is _SENTINEL, _ERROR_STREAM_IN_CHAT + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + else: + # make a copy of the user's input such that is is left untouched + history = copy.deepcopy(history) + + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + input_ids = torch.tensor([context_tokens]).to(self.device) + outputs = self.generate( + input_ids, + stop_words_ids=stop_words_ids, + return_dict_in_generate=False, + generation_config=generation_config, + **kwargs, + ) + + response = decode_tokens( + outputs[0], + tokenizer, + raw_text_len=len(raw_text), + context_length=len(context_tokens), + chat_format=generation_config.chat_format, + verbose=False, + errors='replace' + ) + + # as history is a copy of the user inputs, + # we can always return the new turn to the user. + # separating input history and output history also enables the user + # to implement more complex history management + history.append((query, response)) + + return response, history + + def chat_stream( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + stop_words_ids: Optional[List[List[int]]] = None, + logits_processor: Optional[LogitsProcessorList] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Generator[str, Any, None]: + generation_config = generation_config if generation_config is not None else self.generation_config + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + input_ids = torch.tensor([context_tokens]).to(self.device) + + from transformers_stream_generator.main import NewGenerationMixin, StreamGenerationConfig + self.__class__.generate_stream = NewGenerationMixin.generate + self.__class__.sample_stream = NewGenerationMixin.sample_stream + stream_config = StreamGenerationConfig(**generation_config.to_dict(), do_stream=True) + + def stream_generator(): + outputs = [] + for token in self.generate_stream( + input_ids, + return_dict_in_generate=False, + generation_config=stream_config, + logits_processor=logits_processor, + seed=-1, + **kwargs): + outputs.append(token.item()) + yield tokenizer.decode(outputs, skip_special_tokens=True, errors='ignore') + + return stream_generator() + + def generate( + self, + inputs: Optional[torch.Tensor] = None, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[ + Callable[[int, torch.Tensor], List[int]] + ] = None, + synced_gpus: Optional[bool] = None, + assistant_model: Optional["PreTrainedModel"] = None, + streamer: Optional["BaseStreamer"] = None, + **kwargs, + ) -> Union[GenerateOutput, torch.LongTensor]: + generation_config = generation_config if generation_config is not None else self.generation_config + + # Process stop_words_ids. + stop_words_ids = kwargs.pop("stop_words_ids", None) + if stop_words_ids is None and generation_config is not None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + if stop_words_ids is None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + + return super().generate( + inputs, + generation_config=generation_config, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + synced_gpus=synced_gpus, + assistant_model=assistant_model, + streamer=streamer, + **kwargs, + ) + + +class RotaryEmbedding(torch.nn.Module): + def __init__(self, dim, base=10000): + super().__init__() + self.dim = dim + self.base = base + inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + if importlib.util.find_spec("einops") is None: + raise RuntimeError("einops is required for Rotary Embedding") + + self._rotary_pos_emb_cache = None + self._seq_len_cached = 0 + self._ntk_alpha_cached = 1.0 + self._ntk_alpha_cached_list = [1.0] + + def update_rotary_pos_emb_cache(self, seqlen, ntk_alpha=1.0): + if seqlen > self._seq_len_cached or ntk_alpha != self._ntk_alpha_cached: + base = self.base * ntk_alpha ** (self.dim / (self.dim - 2)) + self.inv_freq = 1.0 / ( + base + ** ( + torch.arange(0, self.dim, 2, device=self.inv_freq.device).float() + / self.dim + ) + ) + self._seq_len_cached = max(2 * seqlen, 16) + self._ntk_alpha_cached = ntk_alpha + seq = torch.arange(self._seq_len_cached, device=self.inv_freq.device) + freqs = torch.outer(seq.type_as(self.inv_freq), self.inv_freq) + + emb = torch.cat((freqs, freqs), dim=-1) + from einops import rearrange + + emb = rearrange(emb, "n d -> 1 n 1 d") + + cos, sin = emb.cos(), emb.sin() + self._rotary_pos_emb_cache = [cos, sin] + + def forward(self, max_seq_len, ntk_alpha=1.0): + self.update_rotary_pos_emb_cache(max_seq_len, ntk_alpha) + cos, sin = self._rotary_pos_emb_cache + return [cos[:, :max_seq_len], sin[:, :max_seq_len]] + + +def _rotate_half(x): + from einops import rearrange + + x = rearrange(x, "... (j d) -> ... j d", j=2) + x1, x2 = x.unbind(dim=-2) + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(t, freqs): + """ Apply rotary embedding to the first rotary_dim of the iput + + Arguments: + t (tensor(batch_size, seq_len, n_head, head_dim)): + the input embedding/hidden states + freqs (list[tensor(1, seq_len, 1, rotary_dim), tensor(1, seq_len, 1, rotary_dim)]): + the cached cos/sin position embeddings + """ + rot_dim = freqs[0].shape[-1] + cos, sin = freqs + t_float = t.float() + if apply_rotary_emb_func is not None and t.is_cuda: + # apply_rotary_emb in flash_attn requires cos/sin to be of + # shape (seqlen, rotary_dim / 2) and apply rotary embedding + # to the first rotary_dim of the input + cos = cos.squeeze(0).squeeze(1)[:, : rot_dim // 2] + sin = sin.squeeze(0).squeeze(1)[:, : rot_dim // 2] + return apply_rotary_emb_func(t_float, cos, sin).type_as(t) + else: + t_rot, t_pass = t_float[..., :rot_dim], t_float[..., rot_dim:] + t_rot = (t_rot * cos) + (_rotate_half(t_rot) * sin) + return torch.cat((t_rot, t_pass), dim=-1).type_as(t) + + +class RMSNorm(torch.nn.Module): + def __init__(self, dim: int, eps: float = 1e-6): + super().__init__() + self.eps = eps + self.weight = nn.Parameter(torch.ones(dim)) + + def _norm(self, x): + return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) + + def forward(self, x): + if rms_norm is not None and x.is_cuda: + return rms_norm(x, self.weight, self.eps) + else: + output = self._norm(x.float()).type_as(x) + return output * self.weight diff --git a/transformers/llm/export/llm_models/Qwen-7B-Chat/config.json b/transformers/llm/export/llm_models/Qwen-7B-Chat/config.json new file mode 100644 index 000000000..2a794d958 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen-7B-Chat/config.json @@ -0,0 +1,37 @@ +{ + "architectures": [ + "QWenLMHeadModel" + ], + "auto_map": { + "AutoConfig": "configuration_qwen.QWenConfig", + "AutoModelForCausalLM": "modeling_qwen.QWenLMHeadModel" + }, + "attn_dropout_prob": 0.0, + "bf16": false, + "fp16": false, + "fp32": false, + "emb_dropout_prob": 0.0, + "intermediate_size": 22016, + "initializer_range": 0.02, + "kv_channels": 128, + "layer_norm_epsilon": 1e-06, + "model_type": "qwen", + "hidden_size": 4096, + "num_attention_heads": 32, + "num_hidden_layers": 32, + "max_position_embeddings": 8192, + "no_bias": true, + "onnx_safe": null, + "rotary_emb_base": 10000, + "rotary_pct": 1.0, + "scale_attn_weights": true, + "seq_length": 2048, + "tie_word_embeddings": false, + "tokenizer_type": "QWenTokenizer", + "transformers_version": "4.31.0", + "use_cache": true, + "use_flash_attn": "auto", + "vocab_size": 151936, + "use_dynamic_ntk": true, + "use_logn_attn": false +} diff --git a/transformers/llm/export/llm_models/Qwen-7B-Chat/modeling_qwen.py b/transformers/llm/export/llm_models/Qwen-7B-Chat/modeling_qwen.py new file mode 100644 index 000000000..94437bcd2 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen-7B-Chat/modeling_qwen.py @@ -0,0 +1,1204 @@ +# Copyright (c) Alibaba Cloud. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import math +from typing import TYPE_CHECKING, Optional, Tuple, Union, Callable, List, Any, Generator + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch.cuda.amp import autocast + +from torch.nn import CrossEntropyLoss +from transformers import PreTrainedTokenizer, GenerationConfig, StoppingCriteriaList +from transformers.generation.logits_process import LogitsProcessorList + +if TYPE_CHECKING: + from transformers.generation.streamers import BaseStreamer +from transformers.generation.utils import GenerateOutput +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging + +try: + from einops import rearrange +except ImportError: + rearrange = None +from torch import nn + +SUPPORT_CUDA = torch.cuda.is_available() +SUPPORT_BF16 = SUPPORT_CUDA and torch.cuda.is_bf16_supported() +SUPPORT_FP16 = SUPPORT_CUDA and torch.cuda.get_device_capability(0)[0] >= 7 + +from .configuration_qwen import QWenConfig +from .qwen_generation_utils import ( + HistoryType, + make_context, + decode_tokens, + get_stop_words_ids, + StopWordsLogitsProcessor, +) + + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "qwen" +_CONFIG_FOR_DOC = "QWenConfig" + +QWen_PRETRAINED_MODEL_ARCHIVE_LIST = ["qwen-7b"] + +_ERROR_BAD_CHAT_FORMAT = """\ +We detect you are probably using the pretrained model (rather than chat model) for chatting, since the chat_format in generation_config is not "chatml". +If you are directly using the model downloaded from Huggingface, please make sure you are using our "Qwen/Qwen-7B-Chat" Huggingface model (rather than "Qwen/Qwen-7B") when you call model.chat(). +我们检测到您可能在使用预训练模型(而非chat模型)进行多轮chat,因为您当前在generation_config指定的chat_format,并未设置为我们在对话中所支持的"chatml"格式。 +如果您在直接使用我们从Huggingface提供的模型,请确保您在调用model.chat()时,使用的是"Qwen/Qwen-7B-Chat"模型(而非"Qwen/Qwen-7B"预训练模型)。 +""" + +_SENTINEL = object() +_ERROR_STREAM_IN_CHAT = """\ +Pass argument `stream` to model.chat() is buggy, deprecated, and marked for removal. Please use model.chat_stream(...) instead of model.chat(..., stream=True). +向model.chat()传入参数stream的用法可能存在Bug,该用法已被废弃,将在未来被移除。请使用model.chat_stream(...)代替model.chat(..., stream=True)。 +""" + +apply_rotary_emb_func = None +rms_norm = None +flash_attn_unpadded_func = None + + +def _import_flash_attn(): + global apply_rotary_emb_func, rms_norm, flash_attn_unpadded_func + try: + from flash_attn.layers.rotary import apply_rotary_emb_func as __apply_rotary_emb_func + apply_rotary_emb_func = __apply_rotary_emb_func + except ImportError: + logger.warn( + "Warning: import flash_attn rotary fail, please install FlashAttention rotary to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention/tree/main/csrc/rotary" + ) + + try: + from flash_attn.ops.rms_norm import rms_norm as __rms_norm + rms_norm = __rms_norm + except ImportError: + logger.warn( + "Warning: import flash_attn rms_norm fail, please install FlashAttention layer_norm to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention/tree/main/csrc/layer_norm" + ) + + try: + import flash_attn + if not hasattr(flash_attn, '__version__'): + from flash_attn.flash_attn_interface import flash_attn_unpadded_func as __flash_attn_unpadded_func + else: + if int(flash_attn.__version__.split(".")[0]) >= 2: + from flash_attn.flash_attn_interface import flash_attn_varlen_func as __flash_attn_unpadded_func + else: + from flash_attn.flash_attn_interface import flash_attn_unpadded_func as __flash_attn_unpadded_func + flash_attn_unpadded_func = __flash_attn_unpadded_func + except ImportError: + logger.warn( + "Warning: import flash_attn fail, please install FlashAttention to get higher efficiency " + "https://github.com/Dao-AILab/flash-attention" + ) + + +class FlashSelfAttention(torch.nn.Module): + def __init__( + self, + causal=False, + softmax_scale=None, + attention_dropout=0.0, + ): + super().__init__() + assert flash_attn_unpadded_func is not None, ( + "Please install FlashAttention first, " "e.g., with pip install flash-attn" + ) + assert ( + rearrange is not None + ), "Please install einops first, e.g., with pip install einops" + self.causal = causal + self.softmax_scale = softmax_scale + self.dropout_p = attention_dropout + + def forward(self, q, k, v): + assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v))) + assert all((i.is_cuda for i in (q, k, v))) + batch_size, seqlen_q = q.shape[0], q.shape[1] + seqlen_k = k.shape[1] + q, k, v = [rearrange(x, "b s ... -> (b s) ...") for x in [q, k, v]] + cu_seqlens_q = torch.arange( + 0, + (batch_size + 1) * seqlen_q, + step=seqlen_q, + dtype=torch.int32, + device=q.device, + ) + + if self.training: + assert seqlen_k == seqlen_q + + is_causal = self.causal + cu_seqlens_k = cu_seqlens_q + else: + is_causal = seqlen_q == seqlen_k + cu_seqlens_k = torch.arange( + 0, + (batch_size + 1) * seqlen_k, + step=seqlen_k, + dtype=torch.int32, + device=q.device, + ) + self.dropout_p = 0 + output = flash_attn_unpadded_func( + q, + k, + v, + cu_seqlens_q, + cu_seqlens_k, + seqlen_q, + seqlen_k, + self.dropout_p, + softmax_scale=self.softmax_scale, + causal=is_causal, + ) + + output = rearrange(output, "(b s) ... -> b s ...", b=batch_size) + return output + + +class QWenAttention(nn.Module): + def __init__(self, config): + super().__init__() + + max_positions = config.max_position_embeddings + self.register_buffer( + "bias", + torch.tril( + torch.ones((max_positions, max_positions), dtype=torch.bool) + ).view(1, 1, max_positions, max_positions), + persistent=False, + ) + self.register_buffer("masked_bias", torch.tensor(-1e4), persistent=False) + self.seq_length = config.seq_length + + self.hidden_size = config.hidden_size + self.split_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + + self.use_flash_attn = config.use_flash_attn + self.scale_attn_weights = True + + self.projection_size = config.kv_channels * config.num_attention_heads + + assert self.projection_size % config.num_attention_heads == 0 + self.hidden_size_per_attention_head = ( + self.projection_size // config.num_attention_heads + ) + + self.c_attn = nn.Linear(config.hidden_size, 3 * self.projection_size) + + self.c_proj = nn.Linear( + config.hidden_size, self.projection_size, bias=not config.no_bias + ) + + self.is_fp32 = not (config.bf16 or config.fp16) + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + ): + self.core_attention_flash = FlashSelfAttention( + causal=True, attention_dropout=config.attn_dropout_prob + ) + + self.bf16 = config.bf16 + + if config.rotary_pct == 1.0: + self.rotary_ndims = None + else: + assert config.rotary_pct < 1 + self.rotary_ndims = int( + self.hidden_size_per_attention_head * config.rotary_pct + ) + dim = ( + self.rotary_ndims + if self.rotary_ndims is not None + else self.hidden_size_per_attention_head + ) + self.rotary_emb = RotaryEmbedding(dim, base=config.rotary_emb_base) + + self.use_dynamic_ntk = config.use_dynamic_ntk + self.use_logn_attn = config.use_logn_attn + + logn_list = [ + math.log(i, self.seq_length) if i > self.seq_length else 1 + for i in range(1, 32768) + ] + self.logn_tensor = torch.tensor(logn_list)[None, :, None, None] + self._ntk_cached = 1.0 + + self.attn_dropout = nn.Dropout(config.attn_dropout_prob) + + def _attn(self, query, key, value, attention_mask=None, head_mask=None): + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + if self.scale_attn_weights: + attn_weights = attn_weights / torch.full( + [], + value.size(-1) ** 0.5, + dtype=attn_weights.dtype, + device=attn_weights.device, + ) + + query_length, key_length = query.size(-2), key.size(-2) + if attention_mask is None: + causal_mask = self.bias[ + :, :, key_length - query_length : key_length, :key_length + ] + else: + causal_mask = attention_mask + mask_value = torch.finfo(attn_weights.dtype).min + mask_value = torch.full([], mask_value, dtype=attn_weights.dtype).to( + attn_weights.device + ) + attn_weights = torch.where( + causal_mask, attn_weights.to(attn_weights.dtype), mask_value + ) + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + attn_weights = attn_weights.type(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + attn_output = attn_output.transpose(1, 2) + + return attn_output, attn_weights + + def _upcast_and_reordered_attn( + self, query, key, value, attention_mask=None, head_mask=None + ): + bsz, num_heads, q_seq_len, dk = query.size() + _, _, k_seq_len, _ = key.size() + + attn_weights = torch.empty( + bsz * num_heads, + q_seq_len, + k_seq_len, + dtype=torch.float32, + device=query.device, + ) + + scale_factor = 1.0 + if self.scale_attn_weights: + scale_factor /= float(value.size(-1)) ** 0.5 + + with autocast(enabled=False): + q, k = query.reshape(-1, q_seq_len, dk), key.transpose(-1, -2).reshape( + -1, dk, k_seq_len + ) + attn_weights = torch.baddbmm( + attn_weights, q.float(), k.float(), beta=0, alpha=scale_factor + ) + attn_weights = attn_weights.reshape(bsz, num_heads, q_seq_len, k_seq_len) + + query_length, key_length = query.size(-2), key.size(-2) + causal_mask = self.bias[ + :, :, key_length - query_length : key_length, :key_length + ] + mask_value = torch.finfo(attn_weights.dtype).min + mask_value = torch.tensor(mask_value, dtype=attn_weights.dtype).to( + attn_weights.device + ) + attn_weights = torch.where(causal_mask, attn_weights, mask_value) + + if attention_mask is not None: + attn_weights = attn_weights + attention_mask + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + if attn_weights.dtype != torch.float32: + raise RuntimeError( + "Error with upcasting, attn_weights does not have dtype torch.float32" + ) + attn_weights = attn_weights.type(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + + return attn_output, attn_weights + + def _split_heads(self, tensor, num_heads, attn_head_size): + new_shape = tensor.size()[:-1] + (num_heads, attn_head_size) + tensor = tensor.view(new_shape) + return tensor + + def _merge_heads(self, tensor, num_heads, attn_head_size): + tensor = tensor.contiguous() + new_shape = tensor.size()[:-2] + (num_heads * attn_head_size,) + return tensor.view(new_shape) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + layer_past: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ): + mixed_x_layer = self.c_attn(hidden_states) + query, key, value = mixed_x_layer.split(self.split_size, dim=2) + + query = self._split_heads(query, self.num_heads, self.head_dim) + key = self._split_heads(key, self.num_heads, self.head_dim) + value = self._split_heads(value, self.num_heads, self.head_dim) + + kv_seq_len = hidden_states.size()[1] + if layer_past is not None: + # layer past[0] shape: bs * seq_len * head_num * dim + kv_seq_len += layer_past[0].shape[1] + if ( + self.use_dynamic_ntk + and kv_seq_len == hidden_states.size()[1] + and not self.training + ): + context_value = math.log(kv_seq_len / self.seq_length, 2) + 1 + ntk_alpha = 2 ** math.ceil(context_value) - 1 + ntk_alpha = max(ntk_alpha, 1) + self._ntk_cached = ntk_alpha + else: + ntk_alpha = self._ntk_cached + if rotary_pos_emb is None: + rotary_pos_emb = self.rotary_emb(kv_seq_len, ntk_alpha=ntk_alpha).to( + hidden_states.device + ) + cur_len = query.shape[1] + rotary_pos_emb = rotary_pos_emb[:, -cur_len:, :, :] + + if rotary_pos_emb is not None and False: + if isinstance(rotary_pos_emb, tuple): + rotary_pos_emb = rotary_pos_emb + else: + rotary_pos_emb = (rotary_pos_emb,) * 2 + + if rotary_pos_emb is not None: + ''' + q_pos_emb, k_pos_emb = rotary_pos_emb + # Slice the pos emb for current inference + cur_len = query.shape[1] + q_pos_emb = q_pos_emb[:, -cur_len:, :, :] + k_pos_emb = k_pos_emb[:, -cur_len:, :, :] + ''' + query = apply_rotary_pos_emb(query, rotary_pos_emb) + key = apply_rotary_pos_emb(key, rotary_pos_emb) + + if layer_past is not None: + past_key, past_value = layer_past[0], layer_past[1] + key = torch.cat((past_key, key), dim=1) + value = torch.cat((past_value, value), dim=1) + + if use_cache: + present = torch.stack((key, value)) + else: + present = None + + if self.use_logn_attn and not self.training: + if self.logn_tensor.device != query.device or self.logn_tensor.dtype != query.dtype: + self.logn_tensor = self.logn_tensor.to(query.device).type_as(query) + seq_start = key.size(1) - query.size(1) + seq_end = key.size(1) + logn_tensor = self.logn_tensor[:, seq_start:seq_end, :, :] + query = query * logn_tensor.expand_as(query) + + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + and query.is_cuda + ): + q, k, v = query, key, value + context_layer = self.core_attention_flash(q, k, v) + + context_layer = rearrange( + context_layer, "b s h d -> b s (h d)" + ).contiguous() + else: + query = query.permute(0, 2, 1, 3) + key = key.permute(0, 2, 1, 3) + value = value.permute(0, 2, 1, 3) + attn_output, attn_weight = self._attn( + query, key, value, attention_mask, head_mask + ) + context_layer = self._merge_heads( + attn_output, self.num_heads, self.head_dim + ) + + attn_output = self.c_proj(context_layer) + outputs = (attn_output, present) + if output_attentions: + if ( + self.use_flash_attn + and flash_attn_unpadded_func is not None + and not self.is_fp32 + ): + raise ValueError("Cannot output attentions while using flash-attn") + else: + outputs += (attn_weight,) + + return outputs + + +class QWenMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.w1 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + self.w2 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + ff_dim_in = config.intermediate_size // 2 + self.c_proj = nn.Linear(ff_dim_in, config.hidden_size, bias=not config.no_bias) + + def forward(self, hidden_states): + a1 = self.w1(hidden_states) + a2 = self.w2(hidden_states) + intermediate_parallel = a1 * F.silu(a2) + output = self.c_proj(intermediate_parallel) + return output + + +class QWenBlock(nn.Module): + def __init__(self, config): + super().__init__() + hidden_size = config.hidden_size + self.bf16 = config.bf16 + + self.ln_1 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + self.attn = QWenAttention(config) + self.ln_2 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + + self.mlp = QWenMLP(config) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + ): + layernorm_output = self.ln_1(hidden_states) + + attn_outputs = self.attn( + layernorm_output, + layer_past=layer_past, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + attn_output = attn_outputs[0] + + outputs = attn_outputs[1:] + + residual = hidden_states + layernorm_input = attn_output + residual + + layernorm_output = self.ln_2(layernorm_input) + + residual = layernorm_input + mlp_output = self.mlp(layernorm_output) + hidden_states = residual + mlp_output + + if use_cache: + outputs = (hidden_states,) + outputs + else: + outputs = (hidden_states,) + outputs[1:] + + return outputs + + +class QWenPreTrainedModel(PreTrainedModel): + config_class = QWenConfig + base_model_prefix = "transformer" + is_parallelizable = False + supports_gradient_checkpointing = True + _no_split_modules = ["QWenBlock"] + + def __init__(self, *inputs, **kwargs): + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module): + """Initialize the weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, RMSNorm): + module.weight.data.fill_(1.0) + + for name, p in module.named_parameters(): + if name == "c_proj.weight": + p.data.normal_( + mean=0.0, + std=( + self.config.initializer_range + / math.sqrt(2 * self.config.num_hidden_layers) + ), + ) + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, QWenModel): + module.gradient_checkpointing = value + + +class QWenModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = ["attn.masked_bias"] + + def __init__(self, config): + super().__init__(config) + self.vocab_size = config.vocab_size + self.num_hidden_layers = config.num_hidden_layers + self.embed_dim = config.hidden_size + + self.gradient_checkpointing = False + + self.wte = nn.Embedding(self.vocab_size, self.embed_dim) + + self.drop = nn.Dropout(config.emb_dropout_prob) + self.h = nn.ModuleList( + [ + QWenBlock( + config, + ) + for i in range(config.num_hidden_layers) + ] + ) + self.ln_f = RMSNorm( + self.embed_dim, + eps=config.layer_norm_epsilon, + ) + + self.post_init() + + def get_input_embeddings(self): + return self.wte + + def set_input_embeddings(self, new_embeddings): + self.wte = new_embeddings + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) + batch_size = input_ids.shape[0] + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + batch_size = inputs_embeds.shape[0] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + device = input_ids.device if input_ids is not None else inputs_embeds.device + + if token_type_ids is not None: + token_type_ids = token_type_ids.view(-1, input_shape[-1]) + if position_ids is not None: + position_ids = position_ids.view(-1, input_shape[-1]) + + if past_key_values is None: + past_length = 0 + past_key_values = tuple([None] * len(self.h)) + else: + past_length = past_key_values[0][0].size(-2) + + if position_ids is None: + position_ids = torch.arange( + past_length, + input_shape[-1] + past_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1]) + + if attention_mask is not None: + if batch_size <= 0: + raise ValueError("batch_size has to be defined and > 0") + attention_mask = attention_mask.view(batch_size, -1) + attention_mask = attention_mask[:, None, None, :] + attention_mask = attention_mask.to(dtype=self.dtype) + attention_mask = (1.0 - attention_mask) * torch.finfo(self.dtype).min + + encoder_attention_mask = None + head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers) + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + hidden_states = inputs_embeds + + hidden_states = self.drop(hidden_states) + output_shape = input_shape + (hidden_states.size(-1),) + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, use_cache, output_attentions) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + None, + attention_mask, + head_mask[i], + encoder_hidden_states, + encoder_attention_mask, + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + attention_mask=attention_mask, + head_mask=head_mask[i], + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attentions = all_self_attentions + (outputs[1],) + + hidden_states = self.ln_f(hidden_states) + hidden_states = hidden_states.view(output_shape) + # Add last hidden state + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if not return_dict: + return tuple( + v for v in [hidden_states, presents, all_hidden_states] if v is not None + ) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class QWenLMHeadModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = [r"h\.\d+\.attn\.rotary_emb\.inv_freq"] + _keys_to_ignore_on_load_unexpected = [r"h\.\d+\.attn\.masked_bias"] + + def __init__(self, config): + super().__init__(config) + assert ( + config.bf16 + config.fp16 + config.fp32 <= 1 + ), "Only one of \"bf16\", \"fp16\", \"fp32\" can be true" + + autoset_precision = config.bf16 + config.fp16 + config.fp32 == 0 + + if autoset_precision: + if SUPPORT_BF16: + logger.warn( + "The model is automatically converting to bf16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.bf16 = True + elif SUPPORT_FP16: + logger.warn( + "The model is automatically converting to fp16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.fp16 = True + else: + config.fp32 = True + + if config.bf16 and SUPPORT_CUDA and not SUPPORT_BF16: + logger.warn("Your device does NOT seem to support bf16, you can switch to fp16 or fp32 by by passing fp16/fp32=True in \"AutoModelForCausalLM.from_pretrained\".") + if config.fp16 and SUPPORT_CUDA and not SUPPORT_FP16: + logger.warn("Your device does NOT support faster inference with fp16, please switch to fp32 which is likely to be faster") + if config.fp32: + if SUPPORT_BF16: + logger.warn("Your device support faster inference by passing bf16=True in \"AutoModelForCausalLM.from_pretrained\".") + elif SUPPORT_FP16: + logger.warn("Your device support faster inference by passing fp16=True in \"AutoModelForCausalLM.from_pretrained\".") + + if config.use_flash_attn == "auto": + if config.bf16 or config.fp16: + logger.warn("Try importing flash-attention for faster inference...") + config.use_flash_attn = True + else: + config.use_flash_attn = False + if config.use_flash_attn and config.fp32: + logger.warn("Flash attention will be disabled because it does NOT support fp32.") + + if config.use_flash_attn: + _import_flash_attn() + + self.transformer = QWenModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + if config.bf16: + self.transformer.bfloat16() + self.lm_head.bfloat16() + if config.fp16: + self.transformer.half() + self.lm_head.half() + self.post_init() + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, inputs_embeds=None, **kwargs + ): + token_type_ids = kwargs.get("token_type_ids", None) + if past_key_values: + input_ids = input_ids[:, -1].unsqueeze(-1) + if token_type_ids is not None: + token_type_ids = token_type_ids[:, -1].unsqueeze(-1) + + attention_mask = kwargs.get("attention_mask", None) + position_ids = kwargs.get("position_ids", None) + + if attention_mask is not None and position_ids is None: + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + else: + position_ids = None + + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "position_ids": position_ids, + "attention_mask": attention_mask, + "token_type_ids": token_type_ids, + } + ) + return model_inputs + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + token_type_ids=token_type_ids, + position_ids=position_ids, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + labels = labels.to(lm_logits.device) + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + loss_fct = CrossEntropyLoss() + loss = loss_fct( + shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1) + ) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past_key_values: Tuple[Tuple[torch.Tensor]], beam_idx: torch.Tensor + ) -> Tuple[Tuple[torch.Tensor]]: + + return tuple( + tuple( + past_state.index_select(0, beam_idx.to(past_state.device)) + for past_state in layer_past + ) + for layer_past in past_key_values + ) + + def chat( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + append_history: bool = True, + stream: Optional[bool] = _SENTINEL, + stop_words_ids: Optional[List[List[int]]] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Tuple[str, HistoryType]: + generation_config = generation_config if generation_config is not None else self.generation_config + + assert stream is _SENTINEL, _ERROR_STREAM_IN_CHAT + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + input_ids = torch.tensor([context_tokens]).to(self.device) + outputs = self.generate( + input_ids, + stop_words_ids=stop_words_ids, + return_dict_in_generate=False, + generation_config=generation_config, + **kwargs, + ) + + response = decode_tokens( + outputs[0], + tokenizer, + raw_text_len=len(raw_text), + context_length=len(context_tokens), + chat_format=generation_config.chat_format, + verbose=False, + errors='replace' + ) + + if append_history: + history.append((query, response)) + + return response, history + + def chat_stream( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + stop_words_ids: Optional[List[List[int]]] = None, + logits_processor: Optional[LogitsProcessorList] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Generator[str, Any, None]: + generation_config = generation_config if generation_config is not None else self.generation_config + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + input_ids = torch.tensor([context_tokens]).to(self.device) + + from transformers_stream_generator.main import NewGenerationMixin, StreamGenerationConfig + self.__class__.generate_stream = NewGenerationMixin.generate + self.__class__.sample_stream = NewGenerationMixin.sample_stream + stream_config = StreamGenerationConfig(**generation_config.to_dict(), do_stream=True) + + def stream_generator(): + outputs = [] + for token in self.generate_stream( + input_ids, + return_dict_in_generate=False, + generation_config=stream_config, + logits_processor=logits_processor, + seed=-1, + **kwargs): + outputs.append(token.item()) + yield tokenizer.decode(outputs, skip_special_tokens=True, errors='ignore') + + return stream_generator() + + def generate( + self, + inputs: Optional[torch.Tensor] = None, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[ + Callable[[int, torch.Tensor], List[int]] + ] = None, + synced_gpus: Optional[bool] = None, + assistant_model: Optional["PreTrainedModel"] = None, + streamer: Optional["BaseStreamer"] = None, + **kwargs, + ) -> Union[GenerateOutput, torch.LongTensor]: + generation_config = generation_config if generation_config is not None else self.generation_config + + # Process stop_words_ids. + stop_words_ids = kwargs.pop("stop_words_ids", None) + if stop_words_ids is None and generation_config is not None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + if stop_words_ids is None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + + return super().generate( + inputs, + generation_config=generation_config, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + synced_gpus=synced_gpus, + assistant_model=assistant_model, + streamer=streamer, + **kwargs, + ) + + +class RotaryEmbedding(torch.nn.Module): + def __init__(self, dim, base=10000): + super().__init__() + self.dim = dim + self.base = base + self.inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim)) + if importlib.util.find_spec("einops") is None: + raise RuntimeError("einops is required for Rotary Embedding") + + self._rotary_pos_emb_cache = None + self._seq_len_cached = 0 + self._ntk_alpha_cached = 1.0 + + def update_rotary_pos_emb_cache(self, max_seq_len, offset=0, ntk_alpha=1.0): + seqlen = max_seq_len + offset + if seqlen > self._seq_len_cached or ntk_alpha != self._ntk_alpha_cached: + base = self.base * ntk_alpha ** (self.dim / (self.dim - 2)) + self.inv_freq = 1.0 / ( + base + ** ( + torch.arange(0, self.dim, 2, device=self.inv_freq.device).float() + / self.dim + ) + ) + self._seq_len_cached = max(2 * seqlen, 16) + self._ntk_alpha_cached = ntk_alpha + seq = torch.arange(self._seq_len_cached, device=self.inv_freq.device) + freqs = torch.outer(seq.type_as(self.inv_freq), self.inv_freq) + emb = torch.cat((freqs, freqs), dim=-1) + from einops import rearrange + + self._rotary_pos_emb_cache = rearrange(emb, "n d -> 1 n 1 d") + + def forward(self, max_seq_len, offset=0, ntk_alpha=1.0): + self.update_rotary_pos_emb_cache(max_seq_len, offset, ntk_alpha) + return self._rotary_pos_emb_cache[:, offset : offset + max_seq_len] + + +def _rotate_half(x): + from einops import rearrange + + x = rearrange(x, "... (j d) -> ... j d", j=2) + x1, x2 = x.unbind(dim=-2) + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(t, freqs): + if apply_rotary_emb_func is not None and t.is_cuda: + t_ = t.float() + freqs = freqs.squeeze(0).squeeze(1) + cos = freqs[:, : freqs.shape[-1] // 2].cos() + sin = freqs[:, : freqs.shape[-1] // 2].sin() + output = apply_rotary_emb_func(t_, cos, sin).type_as(t) + return output + else: + rot_dim = freqs.shape[-1] + t_, t_pass_ = t[..., :rot_dim], t[..., rot_dim:] + t_ = t_.float() + t_pass_ = t_pass_.float() + t_ = (t_ * freqs.cos()) + (_rotate_half(t_) * freqs.sin()) + return torch.cat((t_, t_pass_), dim=-1).type_as(t) + + +class RMSNorm(torch.nn.Module): + def __init__(self, dim: int, eps: float = 1e-6): + super().__init__() + self.eps = eps + self.weight = nn.Parameter(torch.ones(dim)) + + def _norm(self, x): + return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) + + def forward(self, x): + if rms_norm is not None and x.is_cuda: + return rms_norm(x, self.weight, self.eps) + else: + output = self._norm(x.float()).type_as(x) + return output * self.weight diff --git a/transformers/llm/export/llm_models/Qwen-VL-Chat/modeling_qwen.py b/transformers/llm/export/llm_models/Qwen-VL-Chat/modeling_qwen.py new file mode 100755 index 000000000..94c7453b1 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen-VL-Chat/modeling_qwen.py @@ -0,0 +1,1168 @@ +# Copyright (c) Alibaba Cloud. +# +# This source code is licensed under the license found in the +# LICENSE file in the root directory of this source tree. + +import importlib +import math +from typing import TYPE_CHECKING, Optional, Tuple, Union, Callable, List, Any, Generator + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch.cuda.amp import autocast + +from torch.nn import CrossEntropyLoss +from transformers import PreTrainedTokenizer, GenerationConfig, StoppingCriteriaList +from transformers.generation.logits_process import LogitsProcessorList + +if TYPE_CHECKING: + from transformers.generation.streamers import BaseStreamer +from transformers.generation.utils import GenerateOutput +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging + +try: + from einops import rearrange +except ImportError: + rearrange = None +from torch import nn + +SUPPORT_CUDA = torch.cuda.is_available() +SUPPORT_BF16 = SUPPORT_CUDA and torch.cuda.is_bf16_supported() +SUPPORT_FP16 = SUPPORT_CUDA and torch.cuda.get_device_capability(0)[0] >= 7 + +from .configuration_qwen import QWenConfig +from .qwen_generation_utils import ( + HistoryType, + make_context, + decode_tokens, + get_stop_words_ids, + StopWordsLogitsProcessor, +) +from .visual import VisionTransformer + + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "qwen" +_CONFIG_FOR_DOC = "QWenConfig" + +QWen_PRETRAINED_MODEL_ARCHIVE_LIST = ["qwen-7b"] + +_ERROR_BAD_CHAT_FORMAT = """\ +We detect you are probably using the pretrained model (rather than chat model) for chatting, since the chat_format in generation_config is not "chatml". +If you are directly using the model downloaded from Huggingface, please make sure you are using our "Qwen/Qwen-7B-Chat" Huggingface model (rather than "Qwen/Qwen-7B") when you call model.chat(). +我们检测到您可能在使用预训练模型(而非chat模型)进行多轮chat,因为您当前在generation_config指定的chat_format,并未设置为我们在对话中所支持的"chatml"格式。 +如果您在直接使用我们从Huggingface提供的模型,请确保您在调用model.chat()时,使用的是"Qwen/Qwen-7B-Chat"模型(而非"Qwen/Qwen-7B"预训练模型)。 +""" + +_SENTINEL = object() +_ERROR_STREAM_IN_CHAT = """\ +Pass argument `stream` to model.chat() is buggy, deprecated, and marked for removal. Please use model.chat_stream(...) instead of model.chat(..., stream=True). +向model.chat()传入参数stream的用法可能存在Bug,该用法已被废弃,将在未来被移除。请使用model.chat_stream(...)代替model.chat(..., stream=True)。 +""" + +apply_rotary_emb_func = None +rms_norm = None + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.finfo(dtype).min, device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class QWenAttention(nn.Module): + def __init__(self, config): + super().__init__() + + self.register_buffer("masked_bias", torch.tensor(-1e4), persistent=False) + self.seq_length = config.seq_length + + self.hidden_size = config.hidden_size + self.split_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + + self.scale_attn_weights = True + + self.projection_size = config.kv_channels * config.num_attention_heads + + assert self.projection_size % config.num_attention_heads == 0 + self.hidden_size_per_attention_head = ( + self.projection_size // config.num_attention_heads + ) + + self.c_attn = nn.Linear(config.hidden_size, 3 * self.projection_size) + + self.c_proj = nn.Linear( + config.hidden_size, self.projection_size, bias=not config.no_bias + ) + + self.is_fp32 = not (config.bf16 or config.fp16) + self.bf16 = config.bf16 + + self.use_dynamic_ntk = config.use_dynamic_ntk + self.use_logn_attn = config.use_logn_attn + + logn_list = [ + math.log(i, self.seq_length) if i > self.seq_length else 1 + for i in range(1, 32768) + ] + self.logn_tensor = torch.tensor(logn_list)[None, :, None, None] + + self.attn_dropout = nn.Dropout(config.attn_dropout_prob) + + def _attn(self, query, key, value, registered_causal_mask, attention_mask=None, head_mask=None): + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + if self.scale_attn_weights: + attn_weights = attn_weights / torch.full( + [], + value.size(-1) ** 0.5, + dtype=attn_weights.dtype, + device=attn_weights.device, + ) + + query_length, key_length = query.size(-2), key.size(-2) + # causal_mask = self.bias[ + # :, :, key_length - query_length : key_length, :key_length + # ] + # mask_value = torch.finfo(attn_weights.dtype).min + # mask_value = torch.full([], mask_value, dtype=attn_weights.dtype).to( + # attn_weights.device + # ) + # attn_weights = torch.where( + # causal_mask, attn_weights.to(attn_weights.dtype), mask_value + # ) + attn_weights = attn_weights + attention_mask + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + attn_weights = attn_weights.type(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + attn_output = attn_output.transpose(1, 2) + + return attn_output, attn_weights + + def _upcast_and_reordered_attn( + self, query, key, value, registered_causal_mask, attention_mask=None, head_mask=None + ): + bsz, num_heads, q_seq_len, dk = query.size() + _, _, k_seq_len, _ = key.size() + + attn_weights = torch.empty( + bsz * num_heads, + q_seq_len, + k_seq_len, + dtype=torch.float32, + device=query.device, + ) + + scale_factor = 1.0 + if self.scale_attn_weights: + scale_factor /= float(value.size(-1)) ** 0.5 + + with autocast(enabled=False): + q, k = query.reshape(-1, q_seq_len, dk), key.transpose(-1, -2).reshape( + -1, dk, k_seq_len + ) + attn_weights = torch.baddbmm( + attn_weights, q.float(), k.float(), beta=0, alpha=scale_factor + ) + attn_weights = attn_weights.reshape(bsz, num_heads, q_seq_len, k_seq_len) + + query_length, key_length = query.size(-2), key.size(-2) + causal_mask = registered_causal_mask[ + :, :, key_length - query_length : key_length, :key_length + ] + mask_value = torch.finfo(attn_weights.dtype).min + mask_value = torch.tensor(mask_value, dtype=attn_weights.dtype).to( + attn_weights.device + ) + attn_weights = torch.where(causal_mask, attn_weights, mask_value) + + if attention_mask is not None: + attn_weights = attn_weights + attention_mask + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + + if attn_weights.dtype != torch.float32: + raise RuntimeError( + "Error with upcasting, attn_weights does not have dtype torch.float32" + ) + attn_weights = attn_weights.type(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + + return attn_output, attn_weights + + def _split_heads(self, tensor, num_heads, attn_head_size): + new_shape = tensor.size()[:-1] + (num_heads, attn_head_size) + tensor = tensor.view(new_shape) + return tensor + + def _merge_heads(self, tensor, num_heads, attn_head_size): + tensor = tensor.contiguous() + new_shape = tensor.size()[:-2] + (num_heads * attn_head_size,) + return tensor.view(new_shape) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + rotary_pos_emb: Optional[List[torch.Tensor]] = None, + registered_causal_mask: Optional[torch.Tensor] = None, + layer_past: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ): + + mixed_x_layer = self.c_attn(hidden_states) + + query, key, value = mixed_x_layer.split(self.split_size, dim=2) + + query = self._split_heads(query, self.num_heads, self.head_dim) + key = self._split_heads(key, self.num_heads, self.head_dim) + value = self._split_heads(value, self.num_heads, self.head_dim) + + if rotary_pos_emb is not None: + ''' + cur_len = query.shape[1] + rotary_pos_emb = [i[:, -cur_len:, :, :] for i in rotary_pos_emb] + rotary_pos_emb = (rotary_pos_emb,) * 2 + q_pos_emb, k_pos_emb = rotary_pos_emb + # Slice the pos emb for current inference + print('len(q_pos_emb) = ', len(q_pos_emb)) # 2 + print('q_pos_emb[0].shape = ', q_pos_emb[0].shape) # 1, 20, 1, 128 + query = apply_rotary_pos_emb(query, q_pos_emb) + key = apply_rotary_pos_emb(key, k_pos_emb) + ''' + query = apply_rotary_pos_emb(query, rotary_pos_emb) + key = apply_rotary_pos_emb(key, rotary_pos_emb) + + if layer_past is not None: + past_key, past_value = layer_past[0], layer_past[1] + key = torch.cat((past_key, key), dim=1) + value = torch.cat((past_value, value), dim=1) + + if use_cache: + present = torch.stack([key, value]) + else: + present = None + + if self.use_logn_attn and not self.training: + if self.logn_tensor.device != query.device or self.logn_tensor.dtype != query.dtype: + self.logn_tensor = self.logn_tensor.to(query.device).type_as(query) + seq_start = key.size(1) - query.size(1) + seq_end = key.size(1) + logn_tensor = self.logn_tensor[:, seq_start:seq_end, :, :] + query = query * logn_tensor.expand_as(query) + + query = query.permute(0, 2, 1, 3) + key = key.permute(0, 2, 1, 3) + value = value.permute(0, 2, 1, 3) + attn_output, attn_weight = self._attn( + query, key, value, registered_causal_mask, attention_mask, head_mask + ) + context_layer = self._merge_heads( + attn_output, self.num_heads, self.head_dim + ) + + attn_output = self.c_proj(context_layer) + + outputs = (attn_output, present) + if output_attentions: + outputs += (attn_weight,) + + return outputs + + +class QWenMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.w1 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + self.w2 = nn.Linear( + config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias + ) + ff_dim_in = config.intermediate_size // 2 + self.c_proj = nn.Linear(ff_dim_in, config.hidden_size, bias=not config.no_bias) + + def forward(self, hidden_states): + a1 = self.w1(hidden_states) + a2 = self.w2(hidden_states) + intermediate_parallel = a1 * F.silu(a2) + output = self.c_proj(intermediate_parallel) + return output + +class QWenBlock(nn.Module): + def __init__(self, config): + super().__init__() + hidden_size = config.hidden_size + self.bf16 = config.bf16 + + self.ln_1 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + self.attn = QWenAttention(config) + self.ln_2 = RMSNorm( + hidden_size, + eps=config.layer_norm_epsilon, + ) + + self.mlp = QWenMLP(config) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + rotary_pos_emb: Optional[List[torch.Tensor]] = None, + registered_causal_mask: Optional[torch.Tensor] = None, + layer_past: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + ): + layernorm_output = self.ln_1(hidden_states) + + attn_outputs = self.attn( + layernorm_output, + rotary_pos_emb, + registered_causal_mask=registered_causal_mask, + layer_past=layer_past, + attention_mask=attention_mask, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + attn_output = attn_outputs[0] + + outputs = attn_outputs[1:] + + residual = hidden_states + layernorm_input = attn_output + residual + + layernorm_output = self.ln_2(layernorm_input) + + residual = layernorm_input + mlp_output = self.mlp(layernorm_output) + hidden_states = residual + mlp_output + + if use_cache: + outputs = (hidden_states,) + outputs + else: + outputs = (hidden_states,) + outputs[1:] + + return outputs + + +class QWenPreTrainedModel(PreTrainedModel): + config_class = QWenConfig + base_model_prefix = "transformer" + is_parallelizable = False + supports_gradient_checkpointing = True + _no_split_modules = ["QWenBlock"] + + def __init__(self, *inputs, **kwargs): + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module): + """Initialize the weights.""" + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, RMSNorm): + module.weight.data.fill_(1.0) + + for name, p in module.named_parameters(): + if name == "c_proj.weight": + p.data.normal_( + mean=0.0, + std=( + self.config.initializer_range + / math.sqrt(2 * self.config.num_hidden_layers) + ), + ) + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, QWenModel): + module.gradient_checkpointing = value + + +class QWenModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = ["attn.masked_bias"] + + def __init__(self, config): + super().__init__(config) + self.vocab_size = config.vocab_size + self.num_hidden_layers = config.num_hidden_layers + self.embed_dim = config.hidden_size + + self.gradient_checkpointing = False + self.use_dynamic_ntk = config.use_dynamic_ntk + self.seq_length = config.seq_length + + self.wte = nn.Embedding(self.vocab_size, self.embed_dim) + + self.drop = nn.Dropout(config.emb_dropout_prob) + + if config.rotary_pct == 1.0: + self.rotary_ndims = None + else: + assert config.rotary_pct < 1 + self.rotary_ndims = int( + config.kv_channels * config.rotary_pct + ) + dim = ( + self.rotary_ndims + if self.rotary_ndims is not None + else config.kv_channels + ) + self.rotary_emb = RotaryEmbedding(dim, base=config.rotary_emb_base) + + self.use_flash_attn = config.use_flash_attn + self.is_fp32 = not (config.bf16 or config.fp16) + self.registered_causal_mask = None + # if ( + # self.use_flash_attn + # and flash_attn_unpadded_func is not None + # and not self.is_fp32 + # ): + # self.registered_causal_mask = None + # else: + # max_positions = config.max_position_embeddings + # self.register_buffer( + # "registered_causal_mask", + # torch.tril( + # torch.ones((max_positions, max_positions), dtype=torch.bool) + # ).view(1, 1, max_positions, max_positions), + # persistent=False, + # ) + + self.h = nn.ModuleList( + [ + QWenBlock( + config + ) + for i in range(config.num_hidden_layers) + ] + ) + self.ln_f = RMSNorm( + self.embed_dim, + eps=config.layer_norm_epsilon, + ) + + self.visual = VisionTransformer(**config.visual) + + self.post_init() + + def get_input_embeddings(self): + return self.wte + + def set_input_embeddings(self, new_embeddings): + self.wte = new_embeddings + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + if past_key_values is None and torch.any(input_ids == self.config.visual['image_start_id']): + bos_pos = torch.where(input_ids == self.config.visual['image_start_id']) + eos_pos = torch.where(input_ids == self.config.visual['image_start_id'] + 1) + assert (bos_pos[0] == eos_pos[0]).all() + img_pos = torch.stack((bos_pos[0], bos_pos[1], eos_pos[1]), dim=1) + images = [] + for i, a, b in img_pos: + image = input_ids[i][a + 1 : b - 1].tolist() + image = image[ : image.index(self.config.visual['image_start_id'] + 2)] + images.append(bytes(image).decode('utf-8')) + + images = self.visual.encode(images) + assert images.shape[0] == len(images) + fake_images = None + elif self.training: + fake_images=torch.zeros(1,3,224,224).to( + dtype=self.visual.conv1.weight.dtype, device=self.visual.conv1.weight.device) + images = self.visual(fake_images) + else: + fake_images = None + images = None + + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) + batch_size = input_ids.shape[0] + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + batch_size = inputs_embeds.shape[0] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + device = input_ids.device if input_ids is not None else inputs_embeds.device + + if token_type_ids is not None: + token_type_ids = token_type_ids.view(-1, input_shape[-1]) + if position_ids is not None: + position_ids = position_ids.view(-1, input_shape[-1]) + + if past_key_values is None: + past_length = 0 + past_key_values = tuple([None] * len(self.h)) + else: + past_length = past_key_values[0][0].size(-2) + + if position_ids is None: + position_ids = torch.arange( + past_length, + input_shape[-1] + past_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1]) + + encoder_attention_mask = None + head_mask = self.get_head_mask(head_mask, self.config.num_hidden_layers) + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + + if batch_size <= 0: + raise ValueError("batch_size has to be defined and > 0") + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, input_shape, inputs_embeds, past_length + ) + + hidden_states = inputs_embeds + + kv_seq_len = hidden_states.size()[1] + if past_key_values[0] is not None: + # past key values[0][0] shape: bs * seq_len * head_num * dim + kv_seq_len += past_key_values[0][0].shape[1] + if ( + self.use_dynamic_ntk + and kv_seq_len == hidden_states.size()[1] + and not self.training + ): + context_value = math.log(kv_seq_len / self.seq_length, 2) + 1 + ntk_alpha = 2 ** math.ceil(context_value) - 1 + ntk_alpha = max(ntk_alpha, 1) + else: + ntk_alpha = self.rotary_emb._ntk_alpha_cached + + rotary_pos_emb = self.rotary_emb(kv_seq_len, ntk_alpha=ntk_alpha) + for idx in range(len(rotary_pos_emb)): + rotary_pos_emb[idx] = rotary_pos_emb[idx].to(hidden_states.device) + + hidden_states = self.drop(hidden_states).clone() + if fake_images is not None: + hidden_states = hidden_states + images.mean()*0 + elif images is not None: + for idx, (i, a, b) in enumerate(img_pos): + hidden_states[i][a + 1 : b] = images[idx] + output_shape = input_shape + (hidden_states.size(-1),) + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, use_cache, output_attentions) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + rotary_pos_emb, + self.registered_causal_mask, + None, + attention_mask, + head_mask[i], + encoder_hidden_states, + encoder_attention_mask, + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + rotary_pos_emb=rotary_pos_emb, + registered_causal_mask=self.registered_causal_mask, + attention_mask=attention_mask, + head_mask=head_mask[i], + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) + + if output_attentions: + all_self_attentions = all_self_attentions + (outputs[2 if use_cache else 1],) + + hidden_states = self.ln_f(hidden_states) + hidden_states = hidden_states.view(output_shape) + # Add last hidden state + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if not return_dict: + return tuple( + v for v in [hidden_states, presents, all_hidden_states] if v is not None + ) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class QWenLMHeadModel(QWenPreTrainedModel): + _keys_to_ignore_on_load_missing = [r"h\.\d+\.attn\.rotary_emb\.inv_freq"] + _keys_to_ignore_on_load_unexpected = [r"h\.\d+\.attn\.masked_bias"] + + def __init__(self, config): + super().__init__(config) + assert ( + config.bf16 + config.fp16 + config.fp32 <= 1 + ), "Only one of \"bf16\", \"fp16\", \"fp32\" can be true" + + autoset_precision = config.bf16 + config.fp16 + config.fp32 == 0 + + if autoset_precision: + if SUPPORT_BF16: + logger.warn( + "The model is automatically converting to bf16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.bf16 = True + elif SUPPORT_FP16: + logger.warn( + "The model is automatically converting to fp16 for faster inference. " + "If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to \"AutoModelForCausalLM.from_pretrained\"." + ) + config.fp16 = True + else: + config.fp32 = True + + if config.bf16 and SUPPORT_CUDA and not SUPPORT_BF16: + logger.warn("Your device does NOT seem to support bf16, you can switch to fp16 or fp32 by by passing fp16/fp32=True in \"AutoModelForCausalLM.from_pretrained\".") + if config.fp16 and SUPPORT_CUDA and not SUPPORT_FP16: + logger.warn("Your device does NOT support faster inference with fp16, please switch to fp32 which is likely to be faster") + if config.fp32: + if SUPPORT_BF16: + logger.warn("Your device support faster inference by passing bf16=True in \"AutoModelForCausalLM.from_pretrained\".") + elif SUPPORT_FP16: + logger.warn("Your device support faster inference by passing fp16=True in \"AutoModelForCausalLM.from_pretrained\".") + + self.transformer = QWenModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + if config.bf16: + self.transformer.bfloat16() + self.lm_head.bfloat16() + if config.fp16: + self.transformer.half() + self.lm_head.half() + self.post_init() + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, inputs_embeds=None, **kwargs + ): + token_type_ids = kwargs.get("token_type_ids", None) + if past_key_values: + input_ids = input_ids[:, -1].unsqueeze(-1) + if token_type_ids is not None: + token_type_ids = token_type_ids[:, -1].unsqueeze(-1) + + attention_mask = kwargs.get("attention_mask", None) + position_ids = kwargs.get("position_ids", None) + + if attention_mask is not None and position_ids is None: + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + else: + position_ids = None + + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "position_ids": position_ids, + "attention_mask": attention_mask, + "token_type_ids": token_type_ids, + } + ) + return model_inputs + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + token_type_ids=token_type_ids, + position_ids=position_ids, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + labels = labels.to(lm_logits.device) + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + loss_fct = CrossEntropyLoss() + loss = loss_fct( + shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1) + ) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past_key_values: Tuple[Tuple[torch.Tensor]], beam_idx: torch.Tensor + ) -> Tuple[Tuple[torch.Tensor]]: + + return tuple( + tuple( + past_state.index_select(0, beam_idx.to(past_state.device)) + for past_state in layer_past + ) + for layer_past in past_key_values + ) + + def chat( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + append_history: bool = True, + stream: Optional[bool] = _SENTINEL, + stop_words_ids: Optional[List[List[int]]] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Tuple[str, HistoryType]: + generation_config = generation_config if generation_config is not None else self.generation_config + + assert stream is _SENTINEL, _ERROR_STREAM_IN_CHAT + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + input_ids = torch.tensor([context_tokens]).to(self.device) + outputs = self.generate( + input_ids, + stop_words_ids=stop_words_ids, + return_dict_in_generate=False, + generation_config=generation_config, + **kwargs, + ) + + response = decode_tokens( + outputs[0], + tokenizer, + raw_text_len=len(raw_text), + context_length=len(context_tokens), + chat_format=generation_config.chat_format, + verbose=False, + errors='replace' + ) + + if append_history: + history.append((query, response)) + + return response, history + + def chat_stream( + self, + tokenizer: PreTrainedTokenizer, + query: str, + history: Optional[HistoryType], + system: str = "You are a helpful assistant.", + stop_words_ids: Optional[List[List[int]]] = None, + logits_processor: Optional[LogitsProcessorList] = None, + generation_config: Optional[GenerationConfig] = None, + **kwargs, + ) -> Generator[str, Any, None]: + generation_config = generation_config if generation_config is not None else self.generation_config + assert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMAT + if history is None: + history = [] + if stop_words_ids is None: + stop_words_ids = [] + + max_window_size = kwargs.get('max_window_size', None) + if max_window_size is None: + max_window_size = generation_config.max_window_size + raw_text, context_tokens = make_context( + tokenizer, + query, + history=history, + system=system, + max_window_size=max_window_size, + chat_format=generation_config.chat_format, + ) + + stop_words_ids.extend(get_stop_words_ids( + generation_config.chat_format, tokenizer + )) + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + input_ids = torch.tensor([context_tokens]).to(self.device) + + from transformers_stream_generator.main import NewGenerationMixin, StreamGenerationConfig + self.__class__.generate_stream = NewGenerationMixin.generate + self.__class__.sample_stream = NewGenerationMixin.sample_stream + stream_config = StreamGenerationConfig(**generation_config.to_dict(), do_stream=True) + + def stream_generator(): + outputs = [] + for token in self.generate_stream( + input_ids, + return_dict_in_generate=False, + generation_config=stream_config, + logits_processor=logits_processor, + seed=-1, + **kwargs): + outputs.append(token.item()) + yield tokenizer.decode(outputs, skip_special_tokens=True, errors='ignore', keep_image_special=True) + + return stream_generator() + + def generate( + self, + inputs: Optional[torch.Tensor] = None, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[ + Callable[[int, torch.Tensor], List[int]] + ] = None, + synced_gpus: Optional[bool] = None, + assistant_model: Optional["PreTrainedModel"] = None, + streamer: Optional["BaseStreamer"] = None, + **kwargs, + ) -> Union[GenerateOutput, torch.LongTensor]: + generation_config = generation_config if generation_config is not None else self.generation_config + + # Process stop_words_ids. + stop_words_ids = kwargs.pop("stop_words_ids", None) + if stop_words_ids is None and generation_config is not None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + if stop_words_ids is None: + stop_words_ids = getattr(generation_config, "stop_words_ids", None) + + if stop_words_ids is not None: + stop_words_logits_processor = StopWordsLogitsProcessor( + stop_words_ids=stop_words_ids, + eos_token_id=generation_config.eos_token_id, + ) + if logits_processor is None: + logits_processor = LogitsProcessorList([stop_words_logits_processor]) + else: + logits_processor.append(stop_words_logits_processor) + + return super().generate( + inputs, + generation_config=generation_config, + logits_processor=logits_processor, + stopping_criteria=stopping_criteria, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + synced_gpus=synced_gpus, + assistant_model=assistant_model, + streamer=streamer, + **kwargs, + ) + + +class RotaryEmbedding(torch.nn.Module): + def __init__(self, dim, base=10000): + super().__init__() + self.dim = dim + self.base = base + self.inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float() / dim)) + if importlib.util.find_spec("einops") is None: + raise RuntimeError("einops is required for Rotary Embedding") + + self._rotary_pos_emb_cache = None + self._seq_len_cached = 0 + self._ntk_alpha_cached = 1.0 + + def update_rotary_pos_emb_cache(self, max_seq_len, offset=0, ntk_alpha=1.0): + seqlen = max_seq_len + offset + if seqlen > self._seq_len_cached or ntk_alpha != self._ntk_alpha_cached: + base = self.base * ntk_alpha ** (self.dim / (self.dim - 2)) + self.inv_freq = 1.0 / ( + base + ** ( + torch.arange(0, self.dim, 2, device=self.inv_freq.device).float() + / self.dim + ) + ) + self._seq_len_cached = max(2 * seqlen, 16) + self._ntk_alpha_cached = ntk_alpha + seq = torch.arange(self._seq_len_cached, device=self.inv_freq.device) + freqs = torch.outer(seq.type_as(self.inv_freq), self.inv_freq) + + emb = torch.cat((freqs, freqs), dim=-1) + from einops import rearrange + + emb = rearrange(emb, "n d -> 1 n 1 d") + + cos, sin = emb.cos(), emb.sin() + self._rotary_pos_emb_cache = [cos, sin] + + def forward(self, max_seq_len, offset=0, ntk_alpha=1.0): + self.update_rotary_pos_emb_cache(max_seq_len, offset, ntk_alpha) + cos, sin = self._rotary_pos_emb_cache + return [cos[:, offset : offset + max_seq_len], sin[:, offset : offset + max_seq_len]] + + +def _rotate_half(x): + from einops import rearrange + + x = rearrange(x, "... (j d) -> ... j d", j=2) + x1, x2 = x.unbind(dim=-2) + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(t, freqs): + cos, sin = freqs + if apply_rotary_emb_func is not None and t.is_cuda: + t_ = t.float() + cos = cos.squeeze(0).squeeze(1)[:, : cos.shape[-1] // 2] + sin = sin.squeeze(0).squeeze(1)[:, : sin.shape[-1] // 2] + output = apply_rotary_emb_func(t_, cos, sin).type_as(t) + return output + else: + rot_dim = freqs[0].shape[-1] + cos, sin = freqs + t_, t_pass_ = t[..., :rot_dim], t[..., rot_dim:] + t_ = t_.float() + t_pass_ = t_pass_.float() + t_ = (t_ * cos) + (_rotate_half(t_) * sin) + return torch.cat((t_, t_pass_), dim=-1).type_as(t) + + +class RMSNorm(torch.nn.Module): + def __init__(self, dim: int, eps: float = 1e-6): + super().__init__() + self.eps = eps + self.weight = nn.Parameter(torch.ones(dim)) + + def _norm(self, x): + return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) + + def forward(self, x): + if rms_norm is not None and x.is_cuda: + return rms_norm(x, self.weight, self.eps) + else: + output = self._norm(x.float()).type_as(x) + return output * self.weight diff --git a/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/config.json b/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/config.json new file mode 100755 index 000000000..ea93bc66a --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/config.json @@ -0,0 +1,32 @@ +{ + "architectures": [ + "Qwen2ForCausalLM" + ], + "auto_map": { + "AutoConfig": "configuration_qwen2.Qwen2Config", + "AutoModelForCausalLM": "modeling_qwen2.Qwen2ForCausalLM" + }, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "eos_token_id": 151645, + "hidden_act": "silu", + "hidden_size": 1024, + "initializer_range": 0.02, + "intermediate_size": 2816, + "max_position_embeddings": 32768, + "max_window_layers": 21, + "model_type": "qwen2", + "num_attention_heads": 16, + "num_hidden_layers": 24, + "num_key_value_heads": 16, + "rms_norm_eps": 1e-06, + "rope_theta": 1000000.0, + "sliding_window": 32768, + "tie_word_embeddings": true, + "torch_dtype": "bfloat16", + "transformers_version": "4.37.0", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} + diff --git a/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/configuration_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/configuration_qwen2.py new file mode 100644 index 000000000..b6ca1ed43 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/configuration_qwen2.py @@ -0,0 +1,144 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Qwen2 model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +QWEN2_PRETRAINED_CONFIG_ARCHIVE_MAP = { + "Qwen/Qwen2-7B-beta": "https://huggingface.co/Qwen/Qwen2-7B-beta/resolve/main/config.json", +} + + +class Qwen2Config(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`Qwen2Model`]. It is used to instantiate a + Qwen2 model according to the specified arguments, defining the model architecture. Instantiating a configuration + with the defaults will yield a similar configuration to that of + Qwen2-7B-beta [Qwen/Qwen2-7B-beta](https://huggingface.co/Qwen/Qwen2-7B-beta). + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 151936): + Vocabulary size of the Qwen2 model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`Qwen2Model`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 22016): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*, defaults to 32): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to `32`. + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 32768): + The maximum sequence length that this model might ever be used with. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-06): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings (`bool`, *optional*, defaults to `False`): + Whether the model's input and output word embeddings should be tied. + rope_theta (`float`, *optional*, defaults to 10000.0): + The base period of the RoPE embeddings. + use_sliding_window (`bool`, *optional*, defaults to `False`): + Whether to use sliding window attention. + sliding_window (`int`, *optional*, defaults to 4096): + Sliding window attention (SWA) window size. If not specified, will default to `4096`. + max_window_layers (`int`, *optional*, defaults to 28): + The number of layers that use SWA (Sliding Window Attention). The bottom layers use SWA while the top use full attention. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio for the attention probabilities. + + ```python + >>> from transformers import Qwen2Model, Qwen2Config + + >>> # Initializing a Qwen2 style configuration + >>> configuration = Qwen2Config() + + >>> # Initializing a model from the Qwen2-7B style configuration + >>> model = Qwen2Model(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + + model_type = "qwen2" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=151936, + hidden_size=4096, + intermediate_size=22016, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=32, + hidden_act="silu", + max_position_embeddings=32768, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + tie_word_embeddings=False, + rope_theta=10000.0, + use_sliding_window=False, + sliding_window=4096, + max_window_layers=28, + attention_dropout=0.0, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.use_sliding_window = use_sliding_window + self.sliding_window = sliding_window + self.max_window_layers = max_window_layers + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.use_cache = use_cache + self.rope_theta = rope_theta + self.attention_dropout = attention_dropout + + super().__init__( + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/modeling_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/modeling_qwen2.py new file mode 100644 index 000000000..23b740356 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-0_5B-Chat/modeling_qwen2.py @@ -0,0 +1,1412 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch Qwen2 model.""" +import inspect +import math +import warnings +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.cache_utils import Cache, DynamicCache +from transformers.modeling_attn_mask_utils import _prepare_4d_causal_attention_mask, _prepare_4d_causal_attention_mask_for_sdpa +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import ( + add_start_docstrings, + add_start_docstrings_to_model_forward, + is_flash_attn_2_available, + is_flash_attn_greater_or_equal_2_10, + logging, + replace_return_docstrings, +) +from .configuration_qwen2 import Qwen2Config + + +# if is_flash_attn_2_available(): + #from flash_attn import flash_attn_func, flash_attn_varlen_func + #from flash_attn.bert_padding import index_first_axis, pad_input, unpad_input # noqa + + #_flash_supports_window_size = "window_size" in list(inspect.signature(flash_attn_func).parameters) + + +logger = logging.get_logger(__name__) + + +_CHECKPOINT_FOR_DOC = "Qwen/Qwen2-7B-beta" +_CONFIG_FOR_DOC = "Qwen2Config" + +QWEN2_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "Qwen/Qwen2-7B-beta", + # See all Qwen2 models at https://huggingface.co/models?filter=qwen2 +] + + +# Copied from transformers.models.llama.modeling_llama._get_unpad_data +def _get_unpad_data(attention_mask): + seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0)) + return ( + indices, + cu_seqlens, + max_seqlen_in_batch, + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRMSNorm with Llama->Qwen2 +class Qwen2RMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + Qwen2RMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRotaryEmbedding with Llama->Qwen2 +class Qwen2RotaryEmbedding(nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.outer(t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:seq_len].to(dtype=x.dtype), + self.sin_cached[:seq_len].to(dtype=x.dtype), + ) + + +# Copied from transformers.models.llama.modeling_llama.rotate_half +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +# Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb +def apply_rotary_pos_emb(q, k, cos, sin, position_ids, unsqueeze_dim=1): + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + q (`torch.Tensor`): The query tensor. + k (`torch.Tensor`): The key tensor. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + position_ids (`torch.Tensor`): + The position indices of the tokens corresponding to the query and key tensors. For example, this can be + used to pass offsetted position ids when working with a KV-cache. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and + sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + Returns: + `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + cos = cos[position_ids].unsqueeze(unsqueeze_dim) + sin = sin[position_ids].unsqueeze(unsqueeze_dim) + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +# Copied from transformers.models.mistral.modeling_mistral.MistralMLP with Mistral->Qwen2 +class Qwen2MLP(nn.Module): + def __init__(self, config): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +# Copied from transformers.models.llama.modeling_llama.repeat_kv +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class Qwen2Attention(nn.Module): + """ + Multi-headed attention from 'Attention Is All You Need' paper. Modified to use sliding window attention: Longformer + and "Generating Long Sequences with Sparse Transformers". + """ + + def __init__(self, config: Qwen2Config, layer_idx: Optional[int] = None): + super().__init__() + self.config = config + self.layer_idx = layer_idx + if layer_idx is None: + logger.warning_once( + f"Instantiating {self.__class__.__name__} without passing `layer_idx` is not recommended and will " + "to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` " + "when creating this class." + ) + + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.max_position_embeddings = config.max_position_embeddings + self.rope_theta = config.rope_theta + self.is_causal = True + self.attention_dropout = config.attention_dropout + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=True) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + + self.rotary_emb = Qwen2RotaryEmbedding( + self.head_dim, + max_position_embeddings=self.max_position_embeddings, + base=self.rope_theta, + ) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[torch.Tensor] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + # kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + kv_seq_len += past_key_value[0].shape[2] + if rotary_pos_emb is None: + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + else: + cos, sin = rotary_pos_emb + query_states = (query_states * cos) + (rotate_half(query_states) * sin) + key_states = (key_states * cos) + (rotate_half(key_states) * sin) + + if past_key_value is not None: + past_key, past_value = past_key_value[0], past_key_value[1] + key_states = torch.cat((past_key, key_states), dim=2) + value_states = torch.cat((past_value, value_states), dim=2) + # key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + past_key_value = torch.stack((key_states, value_states)) + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class Qwen2FlashAttention2(Qwen2Attention): + """ + Qwen2 flash attention module, following Qwen2 attention module. This module inherits from `Qwen2Attention` + as the weights of the module stays untouched. The only required change would be on the forward pass + where it needs to correctly call the public API of flash attention and deal with padding tokens + in case the input contains any of them. Additionally, for sliding window attention, we apply SWA only to the bottom + config.max_window_layers layers. + """ + + # Copied from transformers.models.llama.modeling_llama.LlamaFlashAttention2.__init__ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1. + # flash_attn<2.1 generates top-left aligned causal mask, while what is needed here is bottom-right alignement, that was made default for flash_attn>=2.1. This attribute is used to handle this difference. Reference: https://github.com/Dao-AILab/flash-attention/releases/tag/v2.1.0. + # Beware that with flash_attn<2.1, using q_seqlen != k_seqlen (except for the case q_seqlen == 1) produces a wrong mask (top-left). + self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ): + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + + # overwrite attention_mask with padding_mask + attention_mask = kwargs.pop("padding_mask") + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + + # Because the input can be padded, the absolute sequence length depends on the max position id. + rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item()) + 1 + cos, sin = self.rotary_emb(value_states, seq_len=rotary_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + use_sliding_windows = ( + _flash_supports_window_size + and getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and self.config.use_sliding_window + ) + + if not _flash_supports_window_size: + logger.warning_once( + "The current flash attention version does not support sliding window attention, for a more memory efficient implementation" + " make sure to upgrade flash-attn library." + ) + + if past_key_value is not None: + # Activate slicing cache only if the config has a value `sliding_windows` attribute + cache_has_contents = past_key_value.get_seq_length(self.layer_idx) > 0 + if ( + getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and cache_has_contents + ): + slicing_tokens = 1 - self.config.sliding_window + + past_key = past_key_value[self.layer_idx][0] + past_value = past_key_value[self.layer_idx][1] + + past_key = past_key[:, :, slicing_tokens:, :].contiguous() + past_value = past_value[:, :, slicing_tokens:, :].contiguous() + + if past_key.shape[-2] != self.config.sliding_window - 1: + raise ValueError( + f"past key must have a shape of (`batch_size, num_heads, self.config.sliding_window-1, head_dim`), got" + f" {past_key.shape}" + ) + + if attention_mask is not None: + attention_mask = attention_mask[:, slicing_tokens:] + attention_mask = torch.cat([attention_mask, torch.ones_like(attention_mask[:, -1:])], dim=-1) + + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + dropout_rate = 0.0 if not self.training else self.attention_dropout + + # In PEFT, usually we cast the layer norms in float32 for training stability reasons + # therefore the input hidden states gets silently casted in float32. Hence, we need + # cast them back in float16 just to be sure everything works as expected. + input_dtype = query_states.dtype + if input_dtype == torch.float32: + if torch.is_autocast_enabled(): + target_dtype = torch.get_autocast_gpu_dtype() + # Handle the case where the model is quantized + elif hasattr(self.config, "_pre_quantization_dtype"): + target_dtype = self.config._pre_quantization_dtype + else: + target_dtype = self.q_proj.weight.dtype + + logger.warning_once( + f"The input hidden states seems to be silently casted in float32, this might be related to" + f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in" + f" {target_dtype}." + ) + + query_states = query_states.to(target_dtype) + key_states = key_states.to(target_dtype) + value_states = value_states.to(target_dtype) + + # Reashape to the expected shape for Flash Attention + query_states = query_states.transpose(1, 2) + key_states = key_states.transpose(1, 2) + value_states = value_states.transpose(1, 2) + + attn_output = self._flash_attention_forward( + query_states, + key_states, + value_states, + attention_mask, + q_len, + dropout=dropout_rate, + use_sliding_windows=use_sliding_windows, + ) + + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous() + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + def _flash_attention_forward( + self, + query_states, + key_states, + value_states, + attention_mask, + query_length, + dropout=0.0, + softmax_scale=None, + use_sliding_windows=False, + ): + """ + Calls the forward method of Flash Attention - if the input hidden states contain at least one padding token + first unpad the input, then computes the attention scores and pad the final attention scores. + + Args: + query_states (`torch.Tensor`): + Input query states to be passed to Flash Attention API + key_states (`torch.Tensor`): + Input key states to be passed to Flash Attention API + value_states (`torch.Tensor`): + Input value states to be passed to Flash Attention API + attention_mask (`torch.Tensor`): + The padding mask - corresponds to a tensor of size `(batch_size, seq_len)` where 0 stands for the + position of padding tokens and 1 for the position of non-padding tokens. + dropout (`int`, *optional*): + Attention dropout + softmax_scale (`float`, *optional*): + The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim) + use_sliding_windows (`bool`, *optional*): + Whether to activate sliding window attention. + """ + if not self._flash_attn_uses_top_left_mask: + causal = self.is_causal + else: + # TODO: Remove the `query_length != 1` check once Flash Attention for RoCm is bumped to 2.1. For details, please see the comment in LlamaFlashAttention2 __init__. + causal = self.is_causal and query_length != 1 + + # Decide whether to use SWA or not by layer index. + if use_sliding_windows and self.layer_idx >= self.config.max_window_layers: + use_sliding_windows = False + + # Contains at least one padding token in the sequence + if attention_mask is not None: + batch_size = query_states.shape[0] + query_states, key_states, value_states, indices_q, cu_seq_lens, max_seq_lens = self._upad_input( + query_states, key_states, value_states, attention_mask, query_length + ) + + cu_seqlens_q, cu_seqlens_k = cu_seq_lens + max_seqlen_in_batch_q, max_seqlen_in_batch_k = max_seq_lens + + if not use_sliding_windows: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + attn_output = pad_input(attn_output_unpad, indices_q, batch_size, query_length) + else: + if not use_sliding_windows: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + return attn_output + + # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._upad_input + def _upad_input(self, query_layer, key_layer, value_layer, attention_mask, query_length): + batch_size, kv_seq_len, num_heads, head_dim = key_layer.shape + + # On the first iteration we need to properly re-create the padding mask + # by slicing it on the proper place + if kv_seq_len != attention_mask.shape[-1]: + attention_mask_num_tokens = attention_mask.shape[-1] + attention_mask = attention_mask[:, attention_mask_num_tokens - kv_seq_len :] + + indices_k, cu_seqlens_k, max_seqlen_in_batch_k = _get_unpad_data(attention_mask) + + key_layer = index_first_axis(key_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + value_layer = index_first_axis(value_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + + if query_length == kv_seq_len: + query_layer = index_first_axis( + query_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k + ) + cu_seqlens_q = cu_seqlens_k + max_seqlen_in_batch_q = max_seqlen_in_batch_k + indices_q = indices_k + elif query_length == 1: + max_seqlen_in_batch_q = 1 + cu_seqlens_q = torch.arange( + batch_size + 1, dtype=torch.int32, device=query_layer.device + ) # There is a memcpy here, that is very bad. + indices_q = cu_seqlens_q[:-1] + query_layer = query_layer.squeeze(1) + else: + # The -q_len: slice assumes left padding. + attention_mask = attention_mask[:, -query_length:] + query_layer, indices_q, cu_seqlens_q, max_seqlen_in_batch_q = unpad_input(query_layer, attention_mask) + + return ( + query_layer, + key_layer, + value_layer, + indices_q, + (cu_seqlens_q, cu_seqlens_k), + (max_seqlen_in_batch_q, max_seqlen_in_batch_k), + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaSdpaAttention with Llama->Qwen2 +class Qwen2SdpaAttention(Qwen2Attention): + """ + Qwen2 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from + `Qwen2Attention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to + SDPA API. + """ + + # Adapted from Qwen2Attention.forward + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if output_attentions: + # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented. + logger.warning_once( + "Qwen2Model is using Qwen2SdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, " + 'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.' + ) + return super().forward( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask, + # Reference: https://github.com/pytorch/pytorch/issues/112577. + if query_states.device.type == "cuda" and attention_mask is not None: + query_states = query_states.contiguous() + key_states = key_states.contiguous() + value_states = value_states.contiguous() + + attn_output = torch.nn.functional.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=attention_mask, + dropout_p=self.attention_dropout if self.training else 0.0, + # The q_len > 1 is necessary to match with AttentionMaskConverter.to_causal_4d that does not create a causal mask in case q_len == 1. + is_causal=self.is_causal and attention_mask is None and q_len > 1, + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + return attn_output, None, past_key_value + + +QWEN2_ATTENTION_CLASSES = { + "eager": Qwen2Attention, + "flash_attention_2": Qwen2FlashAttention2, + "sdpa": Qwen2SdpaAttention, +} + + +class Qwen2DecoderLayer(nn.Module): + def __init__(self, config: Qwen2Config, layer_idx: int): + super().__init__() + self.hidden_size = config.hidden_size + + if config.use_sliding_window and config._attn_implementation != "flash_attention_2": + logger.warning_once( + f"Sliding Window Attention is enabled but not implemented for `{config._attn_implementation}`; " + "unexpected results may be encountered." + ) + # self.self_attn = QWEN2_ATTENTION_CLASSES[config._attn_implementation](config, layer_idx) + self.self_attn = Qwen2Attention(config, layer_idx) + + self.mlp = Qwen2MLP(config) + self.input_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + **kwargs, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. " + "Please make sure use `attention_mask` instead.`" + ) + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, sequence_length)` where padding elements are indicated by 0. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +QWEN2_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`Qwen2Config`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2PreTrainedModel(PreTrainedModel): + config_class = Qwen2Config + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["Qwen2DecoderLayer"] + _skip_keys_device_placement = "past_key_values" + _supports_flash_attn_2 = True + _supports_sdpa = True + _supports_cache_class = True + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + +QWEN2_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*): + Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values` + returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`. + + Two formats are allowed: + - a [`~cache_utils.Cache`] instance; + - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of + shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy + cache format. + + The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the + legacy cache format will be returned. + + If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't + have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids` + of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2Model(Qwen2PreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Qwen2DecoderLayer`] + + Args: + config: Qwen2Config + """ + + def __init__(self, config: Qwen2Config): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList( + [Qwen2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + self._attn_implementation = config._attn_implementation + self.norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + past_key_values_length = 0 + + if use_cache: + use_legacy_cache = not isinstance(past_key_values, Cache) + if use_legacy_cache: + past_key_values = DynamicCache.from_legacy_cache(past_key_values) + past_key_values_length = past_key_values.get_usable_length(seq_length) + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + + if attention_mask is not None and self._attn_implementation == "flash_attention_2" and use_cache: + is_padding_right = attention_mask[:, -1].sum().item() != batch_size + if is_padding_right: + raise ValueError( + "You are attempting to perform batched generation with padding_side='right'" + " this may lead to unexpected behaviour for Flash Attention version of Qwen2. Make sure to " + " call `tokenizer.padding_side = 'left'` before tokenizing the input. " + ) + + if self._attn_implementation == "flash_attention_2": + # 2d mask is passed through the layers + attention_mask = attention_mask if (attention_mask is not None and 0 in attention_mask) else None + elif self._attn_implementation == "sdpa" and not output_attentions: + # output_attentions=True can not be supported when using SDPA, and we fall back on + # the manual implementation that requires a 4D causal mask in all cases. + attention_mask = _prepare_4d_causal_attention_mask_for_sdpa( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + ) + else: + # 4d mask is passed through the layers + attention_mask = _prepare_4d_causal_attention_mask( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + sliding_window=self.config.sliding_window, + ) + + hidden_states = inputs_embeds + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = None + + for decoder_layer in self.layers: + if output_hidden_states: + all_hidden_states += (hidden_states,) + + if self.gradient_checkpointing and self.training: + layer_outputs = self._gradient_checkpointing_func( + decoder_layer.__call__, + hidden_states, + attention_mask, + position_ids, + past_key_values, + output_attentions, + use_cache, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_values, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache = layer_outputs[2 if output_attentions else 1] + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = None + if use_cache: + next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache + + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class Qwen2ForCausalLM(Qwen2PreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = Qwen2Model(config) + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, Qwen2ForCausalLM + + >>> model = Qwen2ForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + # Omit tokens covered by past_key_values + if past_key_values is not None: + if isinstance(past_key_values, Cache): + cache_length = past_key_values.get_seq_length() + past_length = past_key_values.seen_tokens + max_cache_length = past_key_values.get_max_length() + else: + cache_length = past_length = past_key_values[0][0].shape[2] + max_cache_length = None + + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif past_length < input_ids.shape[1]: + input_ids = input_ids[:, past_length:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. + + # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. + if ( + max_cache_length is not None + and attention_mask is not None + and cache_length + input_ids.shape[1] > max_cache_length + ): + attention_mask = attention_mask[:, -max_cache_length:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The Qwen2 Model transformer with a sequence classification head on top (linear layer). + + [`Qwen2ForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + QWEN2_START_DOCSTRING, +) +class Qwen2ForSequenceClassification(Qwen2PreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = Qwen2Model(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + # if no pad token found, use modulo instead of reverse indexing for ONNX compatibility + sequence_lengths = torch.eq(input_ids, self.config.pad_token_id).int().argmax(-1) - 1 + sequence_lengths = sequence_lengths % input_ids.shape[-1] + sequence_lengths = sequence_lengths.to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/config.json b/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/config.json new file mode 100755 index 000000000..26ce493f6 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/config.json @@ -0,0 +1,31 @@ +{ + "architectures": [ + "Qwen2ForCausalLM" + ], + "auto_map": { + "AutoConfig": "configuration_qwen2.Qwen2Config", + "AutoModelForCausalLM": "modeling_qwen2.Qwen2ForCausalLM" + }, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "eos_token_id": 151645, + "hidden_act": "silu", + "hidden_size": 2048, + "initializer_range": 0.02, + "intermediate_size": 5504, + "max_position_embeddings": 32768, + "max_window_layers": 21, + "model_type": "qwen2", + "num_attention_heads": 16, + "num_hidden_layers": 24, + "num_key_value_heads": 16, + "rms_norm_eps": 1e-06, + "rope_theta": 1000000.0, + "sliding_window": 32768, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.37.0", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/configuration_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/configuration_qwen2.py new file mode 100644 index 000000000..b6ca1ed43 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/configuration_qwen2.py @@ -0,0 +1,144 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Qwen2 model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +QWEN2_PRETRAINED_CONFIG_ARCHIVE_MAP = { + "Qwen/Qwen2-7B-beta": "https://huggingface.co/Qwen/Qwen2-7B-beta/resolve/main/config.json", +} + + +class Qwen2Config(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`Qwen2Model`]. It is used to instantiate a + Qwen2 model according to the specified arguments, defining the model architecture. Instantiating a configuration + with the defaults will yield a similar configuration to that of + Qwen2-7B-beta [Qwen/Qwen2-7B-beta](https://huggingface.co/Qwen/Qwen2-7B-beta). + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 151936): + Vocabulary size of the Qwen2 model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`Qwen2Model`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 22016): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*, defaults to 32): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to `32`. + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 32768): + The maximum sequence length that this model might ever be used with. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-06): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings (`bool`, *optional*, defaults to `False`): + Whether the model's input and output word embeddings should be tied. + rope_theta (`float`, *optional*, defaults to 10000.0): + The base period of the RoPE embeddings. + use_sliding_window (`bool`, *optional*, defaults to `False`): + Whether to use sliding window attention. + sliding_window (`int`, *optional*, defaults to 4096): + Sliding window attention (SWA) window size. If not specified, will default to `4096`. + max_window_layers (`int`, *optional*, defaults to 28): + The number of layers that use SWA (Sliding Window Attention). The bottom layers use SWA while the top use full attention. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio for the attention probabilities. + + ```python + >>> from transformers import Qwen2Model, Qwen2Config + + >>> # Initializing a Qwen2 style configuration + >>> configuration = Qwen2Config() + + >>> # Initializing a model from the Qwen2-7B style configuration + >>> model = Qwen2Model(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + + model_type = "qwen2" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=151936, + hidden_size=4096, + intermediate_size=22016, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=32, + hidden_act="silu", + max_position_embeddings=32768, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + tie_word_embeddings=False, + rope_theta=10000.0, + use_sliding_window=False, + sliding_window=4096, + max_window_layers=28, + attention_dropout=0.0, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.use_sliding_window = use_sliding_window + self.sliding_window = sliding_window + self.max_window_layers = max_window_layers + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.use_cache = use_cache + self.rope_theta = rope_theta + self.attention_dropout = attention_dropout + + super().__init__( + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/modeling_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/modeling_qwen2.py new file mode 100644 index 000000000..23b740356 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-1_8B-Chat/modeling_qwen2.py @@ -0,0 +1,1412 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch Qwen2 model.""" +import inspect +import math +import warnings +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.cache_utils import Cache, DynamicCache +from transformers.modeling_attn_mask_utils import _prepare_4d_causal_attention_mask, _prepare_4d_causal_attention_mask_for_sdpa +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import ( + add_start_docstrings, + add_start_docstrings_to_model_forward, + is_flash_attn_2_available, + is_flash_attn_greater_or_equal_2_10, + logging, + replace_return_docstrings, +) +from .configuration_qwen2 import Qwen2Config + + +# if is_flash_attn_2_available(): + #from flash_attn import flash_attn_func, flash_attn_varlen_func + #from flash_attn.bert_padding import index_first_axis, pad_input, unpad_input # noqa + + #_flash_supports_window_size = "window_size" in list(inspect.signature(flash_attn_func).parameters) + + +logger = logging.get_logger(__name__) + + +_CHECKPOINT_FOR_DOC = "Qwen/Qwen2-7B-beta" +_CONFIG_FOR_DOC = "Qwen2Config" + +QWEN2_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "Qwen/Qwen2-7B-beta", + # See all Qwen2 models at https://huggingface.co/models?filter=qwen2 +] + + +# Copied from transformers.models.llama.modeling_llama._get_unpad_data +def _get_unpad_data(attention_mask): + seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0)) + return ( + indices, + cu_seqlens, + max_seqlen_in_batch, + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRMSNorm with Llama->Qwen2 +class Qwen2RMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + Qwen2RMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRotaryEmbedding with Llama->Qwen2 +class Qwen2RotaryEmbedding(nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.outer(t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:seq_len].to(dtype=x.dtype), + self.sin_cached[:seq_len].to(dtype=x.dtype), + ) + + +# Copied from transformers.models.llama.modeling_llama.rotate_half +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +# Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb +def apply_rotary_pos_emb(q, k, cos, sin, position_ids, unsqueeze_dim=1): + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + q (`torch.Tensor`): The query tensor. + k (`torch.Tensor`): The key tensor. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + position_ids (`torch.Tensor`): + The position indices of the tokens corresponding to the query and key tensors. For example, this can be + used to pass offsetted position ids when working with a KV-cache. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and + sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + Returns: + `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + cos = cos[position_ids].unsqueeze(unsqueeze_dim) + sin = sin[position_ids].unsqueeze(unsqueeze_dim) + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +# Copied from transformers.models.mistral.modeling_mistral.MistralMLP with Mistral->Qwen2 +class Qwen2MLP(nn.Module): + def __init__(self, config): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +# Copied from transformers.models.llama.modeling_llama.repeat_kv +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class Qwen2Attention(nn.Module): + """ + Multi-headed attention from 'Attention Is All You Need' paper. Modified to use sliding window attention: Longformer + and "Generating Long Sequences with Sparse Transformers". + """ + + def __init__(self, config: Qwen2Config, layer_idx: Optional[int] = None): + super().__init__() + self.config = config + self.layer_idx = layer_idx + if layer_idx is None: + logger.warning_once( + f"Instantiating {self.__class__.__name__} without passing `layer_idx` is not recommended and will " + "to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` " + "when creating this class." + ) + + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.max_position_embeddings = config.max_position_embeddings + self.rope_theta = config.rope_theta + self.is_causal = True + self.attention_dropout = config.attention_dropout + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=True) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + + self.rotary_emb = Qwen2RotaryEmbedding( + self.head_dim, + max_position_embeddings=self.max_position_embeddings, + base=self.rope_theta, + ) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[torch.Tensor] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + # kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + kv_seq_len += past_key_value[0].shape[2] + if rotary_pos_emb is None: + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + else: + cos, sin = rotary_pos_emb + query_states = (query_states * cos) + (rotate_half(query_states) * sin) + key_states = (key_states * cos) + (rotate_half(key_states) * sin) + + if past_key_value is not None: + past_key, past_value = past_key_value[0], past_key_value[1] + key_states = torch.cat((past_key, key_states), dim=2) + value_states = torch.cat((past_value, value_states), dim=2) + # key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + past_key_value = torch.stack((key_states, value_states)) + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class Qwen2FlashAttention2(Qwen2Attention): + """ + Qwen2 flash attention module, following Qwen2 attention module. This module inherits from `Qwen2Attention` + as the weights of the module stays untouched. The only required change would be on the forward pass + where it needs to correctly call the public API of flash attention and deal with padding tokens + in case the input contains any of them. Additionally, for sliding window attention, we apply SWA only to the bottom + config.max_window_layers layers. + """ + + # Copied from transformers.models.llama.modeling_llama.LlamaFlashAttention2.__init__ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1. + # flash_attn<2.1 generates top-left aligned causal mask, while what is needed here is bottom-right alignement, that was made default for flash_attn>=2.1. This attribute is used to handle this difference. Reference: https://github.com/Dao-AILab/flash-attention/releases/tag/v2.1.0. + # Beware that with flash_attn<2.1, using q_seqlen != k_seqlen (except for the case q_seqlen == 1) produces a wrong mask (top-left). + self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ): + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + + # overwrite attention_mask with padding_mask + attention_mask = kwargs.pop("padding_mask") + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + + # Because the input can be padded, the absolute sequence length depends on the max position id. + rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item()) + 1 + cos, sin = self.rotary_emb(value_states, seq_len=rotary_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + use_sliding_windows = ( + _flash_supports_window_size + and getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and self.config.use_sliding_window + ) + + if not _flash_supports_window_size: + logger.warning_once( + "The current flash attention version does not support sliding window attention, for a more memory efficient implementation" + " make sure to upgrade flash-attn library." + ) + + if past_key_value is not None: + # Activate slicing cache only if the config has a value `sliding_windows` attribute + cache_has_contents = past_key_value.get_seq_length(self.layer_idx) > 0 + if ( + getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and cache_has_contents + ): + slicing_tokens = 1 - self.config.sliding_window + + past_key = past_key_value[self.layer_idx][0] + past_value = past_key_value[self.layer_idx][1] + + past_key = past_key[:, :, slicing_tokens:, :].contiguous() + past_value = past_value[:, :, slicing_tokens:, :].contiguous() + + if past_key.shape[-2] != self.config.sliding_window - 1: + raise ValueError( + f"past key must have a shape of (`batch_size, num_heads, self.config.sliding_window-1, head_dim`), got" + f" {past_key.shape}" + ) + + if attention_mask is not None: + attention_mask = attention_mask[:, slicing_tokens:] + attention_mask = torch.cat([attention_mask, torch.ones_like(attention_mask[:, -1:])], dim=-1) + + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + dropout_rate = 0.0 if not self.training else self.attention_dropout + + # In PEFT, usually we cast the layer norms in float32 for training stability reasons + # therefore the input hidden states gets silently casted in float32. Hence, we need + # cast them back in float16 just to be sure everything works as expected. + input_dtype = query_states.dtype + if input_dtype == torch.float32: + if torch.is_autocast_enabled(): + target_dtype = torch.get_autocast_gpu_dtype() + # Handle the case where the model is quantized + elif hasattr(self.config, "_pre_quantization_dtype"): + target_dtype = self.config._pre_quantization_dtype + else: + target_dtype = self.q_proj.weight.dtype + + logger.warning_once( + f"The input hidden states seems to be silently casted in float32, this might be related to" + f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in" + f" {target_dtype}." + ) + + query_states = query_states.to(target_dtype) + key_states = key_states.to(target_dtype) + value_states = value_states.to(target_dtype) + + # Reashape to the expected shape for Flash Attention + query_states = query_states.transpose(1, 2) + key_states = key_states.transpose(1, 2) + value_states = value_states.transpose(1, 2) + + attn_output = self._flash_attention_forward( + query_states, + key_states, + value_states, + attention_mask, + q_len, + dropout=dropout_rate, + use_sliding_windows=use_sliding_windows, + ) + + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous() + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + def _flash_attention_forward( + self, + query_states, + key_states, + value_states, + attention_mask, + query_length, + dropout=0.0, + softmax_scale=None, + use_sliding_windows=False, + ): + """ + Calls the forward method of Flash Attention - if the input hidden states contain at least one padding token + first unpad the input, then computes the attention scores and pad the final attention scores. + + Args: + query_states (`torch.Tensor`): + Input query states to be passed to Flash Attention API + key_states (`torch.Tensor`): + Input key states to be passed to Flash Attention API + value_states (`torch.Tensor`): + Input value states to be passed to Flash Attention API + attention_mask (`torch.Tensor`): + The padding mask - corresponds to a tensor of size `(batch_size, seq_len)` where 0 stands for the + position of padding tokens and 1 for the position of non-padding tokens. + dropout (`int`, *optional*): + Attention dropout + softmax_scale (`float`, *optional*): + The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim) + use_sliding_windows (`bool`, *optional*): + Whether to activate sliding window attention. + """ + if not self._flash_attn_uses_top_left_mask: + causal = self.is_causal + else: + # TODO: Remove the `query_length != 1` check once Flash Attention for RoCm is bumped to 2.1. For details, please see the comment in LlamaFlashAttention2 __init__. + causal = self.is_causal and query_length != 1 + + # Decide whether to use SWA or not by layer index. + if use_sliding_windows and self.layer_idx >= self.config.max_window_layers: + use_sliding_windows = False + + # Contains at least one padding token in the sequence + if attention_mask is not None: + batch_size = query_states.shape[0] + query_states, key_states, value_states, indices_q, cu_seq_lens, max_seq_lens = self._upad_input( + query_states, key_states, value_states, attention_mask, query_length + ) + + cu_seqlens_q, cu_seqlens_k = cu_seq_lens + max_seqlen_in_batch_q, max_seqlen_in_batch_k = max_seq_lens + + if not use_sliding_windows: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + attn_output = pad_input(attn_output_unpad, indices_q, batch_size, query_length) + else: + if not use_sliding_windows: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + return attn_output + + # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._upad_input + def _upad_input(self, query_layer, key_layer, value_layer, attention_mask, query_length): + batch_size, kv_seq_len, num_heads, head_dim = key_layer.shape + + # On the first iteration we need to properly re-create the padding mask + # by slicing it on the proper place + if kv_seq_len != attention_mask.shape[-1]: + attention_mask_num_tokens = attention_mask.shape[-1] + attention_mask = attention_mask[:, attention_mask_num_tokens - kv_seq_len :] + + indices_k, cu_seqlens_k, max_seqlen_in_batch_k = _get_unpad_data(attention_mask) + + key_layer = index_first_axis(key_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + value_layer = index_first_axis(value_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + + if query_length == kv_seq_len: + query_layer = index_first_axis( + query_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k + ) + cu_seqlens_q = cu_seqlens_k + max_seqlen_in_batch_q = max_seqlen_in_batch_k + indices_q = indices_k + elif query_length == 1: + max_seqlen_in_batch_q = 1 + cu_seqlens_q = torch.arange( + batch_size + 1, dtype=torch.int32, device=query_layer.device + ) # There is a memcpy here, that is very bad. + indices_q = cu_seqlens_q[:-1] + query_layer = query_layer.squeeze(1) + else: + # The -q_len: slice assumes left padding. + attention_mask = attention_mask[:, -query_length:] + query_layer, indices_q, cu_seqlens_q, max_seqlen_in_batch_q = unpad_input(query_layer, attention_mask) + + return ( + query_layer, + key_layer, + value_layer, + indices_q, + (cu_seqlens_q, cu_seqlens_k), + (max_seqlen_in_batch_q, max_seqlen_in_batch_k), + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaSdpaAttention with Llama->Qwen2 +class Qwen2SdpaAttention(Qwen2Attention): + """ + Qwen2 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from + `Qwen2Attention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to + SDPA API. + """ + + # Adapted from Qwen2Attention.forward + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if output_attentions: + # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented. + logger.warning_once( + "Qwen2Model is using Qwen2SdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, " + 'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.' + ) + return super().forward( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask, + # Reference: https://github.com/pytorch/pytorch/issues/112577. + if query_states.device.type == "cuda" and attention_mask is not None: + query_states = query_states.contiguous() + key_states = key_states.contiguous() + value_states = value_states.contiguous() + + attn_output = torch.nn.functional.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=attention_mask, + dropout_p=self.attention_dropout if self.training else 0.0, + # The q_len > 1 is necessary to match with AttentionMaskConverter.to_causal_4d that does not create a causal mask in case q_len == 1. + is_causal=self.is_causal and attention_mask is None and q_len > 1, + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + return attn_output, None, past_key_value + + +QWEN2_ATTENTION_CLASSES = { + "eager": Qwen2Attention, + "flash_attention_2": Qwen2FlashAttention2, + "sdpa": Qwen2SdpaAttention, +} + + +class Qwen2DecoderLayer(nn.Module): + def __init__(self, config: Qwen2Config, layer_idx: int): + super().__init__() + self.hidden_size = config.hidden_size + + if config.use_sliding_window and config._attn_implementation != "flash_attention_2": + logger.warning_once( + f"Sliding Window Attention is enabled but not implemented for `{config._attn_implementation}`; " + "unexpected results may be encountered." + ) + # self.self_attn = QWEN2_ATTENTION_CLASSES[config._attn_implementation](config, layer_idx) + self.self_attn = Qwen2Attention(config, layer_idx) + + self.mlp = Qwen2MLP(config) + self.input_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + **kwargs, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. " + "Please make sure use `attention_mask` instead.`" + ) + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, sequence_length)` where padding elements are indicated by 0. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +QWEN2_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`Qwen2Config`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2PreTrainedModel(PreTrainedModel): + config_class = Qwen2Config + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["Qwen2DecoderLayer"] + _skip_keys_device_placement = "past_key_values" + _supports_flash_attn_2 = True + _supports_sdpa = True + _supports_cache_class = True + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + +QWEN2_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*): + Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values` + returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`. + + Two formats are allowed: + - a [`~cache_utils.Cache`] instance; + - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of + shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy + cache format. + + The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the + legacy cache format will be returned. + + If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't + have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids` + of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2Model(Qwen2PreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Qwen2DecoderLayer`] + + Args: + config: Qwen2Config + """ + + def __init__(self, config: Qwen2Config): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList( + [Qwen2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + self._attn_implementation = config._attn_implementation + self.norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + past_key_values_length = 0 + + if use_cache: + use_legacy_cache = not isinstance(past_key_values, Cache) + if use_legacy_cache: + past_key_values = DynamicCache.from_legacy_cache(past_key_values) + past_key_values_length = past_key_values.get_usable_length(seq_length) + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + + if attention_mask is not None and self._attn_implementation == "flash_attention_2" and use_cache: + is_padding_right = attention_mask[:, -1].sum().item() != batch_size + if is_padding_right: + raise ValueError( + "You are attempting to perform batched generation with padding_side='right'" + " this may lead to unexpected behaviour for Flash Attention version of Qwen2. Make sure to " + " call `tokenizer.padding_side = 'left'` before tokenizing the input. " + ) + + if self._attn_implementation == "flash_attention_2": + # 2d mask is passed through the layers + attention_mask = attention_mask if (attention_mask is not None and 0 in attention_mask) else None + elif self._attn_implementation == "sdpa" and not output_attentions: + # output_attentions=True can not be supported when using SDPA, and we fall back on + # the manual implementation that requires a 4D causal mask in all cases. + attention_mask = _prepare_4d_causal_attention_mask_for_sdpa( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + ) + else: + # 4d mask is passed through the layers + attention_mask = _prepare_4d_causal_attention_mask( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + sliding_window=self.config.sliding_window, + ) + + hidden_states = inputs_embeds + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = None + + for decoder_layer in self.layers: + if output_hidden_states: + all_hidden_states += (hidden_states,) + + if self.gradient_checkpointing and self.training: + layer_outputs = self._gradient_checkpointing_func( + decoder_layer.__call__, + hidden_states, + attention_mask, + position_ids, + past_key_values, + output_attentions, + use_cache, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_values, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache = layer_outputs[2 if output_attentions else 1] + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = None + if use_cache: + next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache + + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class Qwen2ForCausalLM(Qwen2PreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = Qwen2Model(config) + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, Qwen2ForCausalLM + + >>> model = Qwen2ForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + # Omit tokens covered by past_key_values + if past_key_values is not None: + if isinstance(past_key_values, Cache): + cache_length = past_key_values.get_seq_length() + past_length = past_key_values.seen_tokens + max_cache_length = past_key_values.get_max_length() + else: + cache_length = past_length = past_key_values[0][0].shape[2] + max_cache_length = None + + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif past_length < input_ids.shape[1]: + input_ids = input_ids[:, past_length:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. + + # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. + if ( + max_cache_length is not None + and attention_mask is not None + and cache_length + input_ids.shape[1] > max_cache_length + ): + attention_mask = attention_mask[:, -max_cache_length:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The Qwen2 Model transformer with a sequence classification head on top (linear layer). + + [`Qwen2ForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + QWEN2_START_DOCSTRING, +) +class Qwen2ForSequenceClassification(Qwen2PreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = Qwen2Model(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + # if no pad token found, use modulo instead of reverse indexing for ONNX compatibility + sequence_lengths = torch.eq(input_ids, self.config.pad_token_id).int().argmax(-1) - 1 + sequence_lengths = sequence_lengths % input_ids.shape[-1] + sequence_lengths = sequence_lengths.to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/config.json b/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/config.json new file mode 100755 index 000000000..9f2be4f60 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/config.json @@ -0,0 +1,31 @@ +{ + "architectures": [ + "Qwen2ForCausalLM" + ], + "auto_map": { + "AutoConfig": "configuration_qwen2.Qwen2Config", + "AutoModelForCausalLM": "modeling_qwen2.Qwen2ForCausalLM" + }, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "eos_token_id": 151645, + "hidden_act": "silu", + "hidden_size": 2560, + "initializer_range": 0.02, + "intermediate_size": 6912, + "max_position_embeddings": 32768, + "max_window_layers": 21, + "model_type": "qwen2", + "num_attention_heads": 20, + "num_hidden_layers": 40, + "num_key_value_heads": 20, + "rms_norm_eps": 1e-06, + "rope_theta": 5000000.0, + "sliding_window": 32768, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.37.0", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/configuration_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/configuration_qwen2.py new file mode 100644 index 000000000..b6ca1ed43 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/configuration_qwen2.py @@ -0,0 +1,144 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Qwen2 model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +QWEN2_PRETRAINED_CONFIG_ARCHIVE_MAP = { + "Qwen/Qwen2-7B-beta": "https://huggingface.co/Qwen/Qwen2-7B-beta/resolve/main/config.json", +} + + +class Qwen2Config(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`Qwen2Model`]. It is used to instantiate a + Qwen2 model according to the specified arguments, defining the model architecture. Instantiating a configuration + with the defaults will yield a similar configuration to that of + Qwen2-7B-beta [Qwen/Qwen2-7B-beta](https://huggingface.co/Qwen/Qwen2-7B-beta). + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 151936): + Vocabulary size of the Qwen2 model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`Qwen2Model`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 22016): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*, defaults to 32): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to `32`. + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 32768): + The maximum sequence length that this model might ever be used with. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-06): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings (`bool`, *optional*, defaults to `False`): + Whether the model's input and output word embeddings should be tied. + rope_theta (`float`, *optional*, defaults to 10000.0): + The base period of the RoPE embeddings. + use_sliding_window (`bool`, *optional*, defaults to `False`): + Whether to use sliding window attention. + sliding_window (`int`, *optional*, defaults to 4096): + Sliding window attention (SWA) window size. If not specified, will default to `4096`. + max_window_layers (`int`, *optional*, defaults to 28): + The number of layers that use SWA (Sliding Window Attention). The bottom layers use SWA while the top use full attention. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio for the attention probabilities. + + ```python + >>> from transformers import Qwen2Model, Qwen2Config + + >>> # Initializing a Qwen2 style configuration + >>> configuration = Qwen2Config() + + >>> # Initializing a model from the Qwen2-7B style configuration + >>> model = Qwen2Model(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + + model_type = "qwen2" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=151936, + hidden_size=4096, + intermediate_size=22016, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=32, + hidden_act="silu", + max_position_embeddings=32768, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + tie_word_embeddings=False, + rope_theta=10000.0, + use_sliding_window=False, + sliding_window=4096, + max_window_layers=28, + attention_dropout=0.0, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.use_sliding_window = use_sliding_window + self.sliding_window = sliding_window + self.max_window_layers = max_window_layers + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.use_cache = use_cache + self.rope_theta = rope_theta + self.attention_dropout = attention_dropout + + super().__init__( + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/modeling_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/modeling_qwen2.py new file mode 100644 index 000000000..23b740356 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-4B-Chat/modeling_qwen2.py @@ -0,0 +1,1412 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch Qwen2 model.""" +import inspect +import math +import warnings +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.cache_utils import Cache, DynamicCache +from transformers.modeling_attn_mask_utils import _prepare_4d_causal_attention_mask, _prepare_4d_causal_attention_mask_for_sdpa +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import ( + add_start_docstrings, + add_start_docstrings_to_model_forward, + is_flash_attn_2_available, + is_flash_attn_greater_or_equal_2_10, + logging, + replace_return_docstrings, +) +from .configuration_qwen2 import Qwen2Config + + +# if is_flash_attn_2_available(): + #from flash_attn import flash_attn_func, flash_attn_varlen_func + #from flash_attn.bert_padding import index_first_axis, pad_input, unpad_input # noqa + + #_flash_supports_window_size = "window_size" in list(inspect.signature(flash_attn_func).parameters) + + +logger = logging.get_logger(__name__) + + +_CHECKPOINT_FOR_DOC = "Qwen/Qwen2-7B-beta" +_CONFIG_FOR_DOC = "Qwen2Config" + +QWEN2_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "Qwen/Qwen2-7B-beta", + # See all Qwen2 models at https://huggingface.co/models?filter=qwen2 +] + + +# Copied from transformers.models.llama.modeling_llama._get_unpad_data +def _get_unpad_data(attention_mask): + seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0)) + return ( + indices, + cu_seqlens, + max_seqlen_in_batch, + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRMSNorm with Llama->Qwen2 +class Qwen2RMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + Qwen2RMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRotaryEmbedding with Llama->Qwen2 +class Qwen2RotaryEmbedding(nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.outer(t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:seq_len].to(dtype=x.dtype), + self.sin_cached[:seq_len].to(dtype=x.dtype), + ) + + +# Copied from transformers.models.llama.modeling_llama.rotate_half +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +# Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb +def apply_rotary_pos_emb(q, k, cos, sin, position_ids, unsqueeze_dim=1): + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + q (`torch.Tensor`): The query tensor. + k (`torch.Tensor`): The key tensor. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + position_ids (`torch.Tensor`): + The position indices of the tokens corresponding to the query and key tensors. For example, this can be + used to pass offsetted position ids when working with a KV-cache. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and + sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + Returns: + `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + cos = cos[position_ids].unsqueeze(unsqueeze_dim) + sin = sin[position_ids].unsqueeze(unsqueeze_dim) + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +# Copied from transformers.models.mistral.modeling_mistral.MistralMLP with Mistral->Qwen2 +class Qwen2MLP(nn.Module): + def __init__(self, config): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +# Copied from transformers.models.llama.modeling_llama.repeat_kv +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class Qwen2Attention(nn.Module): + """ + Multi-headed attention from 'Attention Is All You Need' paper. Modified to use sliding window attention: Longformer + and "Generating Long Sequences with Sparse Transformers". + """ + + def __init__(self, config: Qwen2Config, layer_idx: Optional[int] = None): + super().__init__() + self.config = config + self.layer_idx = layer_idx + if layer_idx is None: + logger.warning_once( + f"Instantiating {self.__class__.__name__} without passing `layer_idx` is not recommended and will " + "to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` " + "when creating this class." + ) + + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.max_position_embeddings = config.max_position_embeddings + self.rope_theta = config.rope_theta + self.is_causal = True + self.attention_dropout = config.attention_dropout + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=True) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + + self.rotary_emb = Qwen2RotaryEmbedding( + self.head_dim, + max_position_embeddings=self.max_position_embeddings, + base=self.rope_theta, + ) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[torch.Tensor] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + # kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + kv_seq_len += past_key_value[0].shape[2] + if rotary_pos_emb is None: + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + else: + cos, sin = rotary_pos_emb + query_states = (query_states * cos) + (rotate_half(query_states) * sin) + key_states = (key_states * cos) + (rotate_half(key_states) * sin) + + if past_key_value is not None: + past_key, past_value = past_key_value[0], past_key_value[1] + key_states = torch.cat((past_key, key_states), dim=2) + value_states = torch.cat((past_value, value_states), dim=2) + # key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + past_key_value = torch.stack((key_states, value_states)) + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class Qwen2FlashAttention2(Qwen2Attention): + """ + Qwen2 flash attention module, following Qwen2 attention module. This module inherits from `Qwen2Attention` + as the weights of the module stays untouched. The only required change would be on the forward pass + where it needs to correctly call the public API of flash attention and deal with padding tokens + in case the input contains any of them. Additionally, for sliding window attention, we apply SWA only to the bottom + config.max_window_layers layers. + """ + + # Copied from transformers.models.llama.modeling_llama.LlamaFlashAttention2.__init__ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1. + # flash_attn<2.1 generates top-left aligned causal mask, while what is needed here is bottom-right alignement, that was made default for flash_attn>=2.1. This attribute is used to handle this difference. Reference: https://github.com/Dao-AILab/flash-attention/releases/tag/v2.1.0. + # Beware that with flash_attn<2.1, using q_seqlen != k_seqlen (except for the case q_seqlen == 1) produces a wrong mask (top-left). + self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ): + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + + # overwrite attention_mask with padding_mask + attention_mask = kwargs.pop("padding_mask") + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + + # Because the input can be padded, the absolute sequence length depends on the max position id. + rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item()) + 1 + cos, sin = self.rotary_emb(value_states, seq_len=rotary_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + use_sliding_windows = ( + _flash_supports_window_size + and getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and self.config.use_sliding_window + ) + + if not _flash_supports_window_size: + logger.warning_once( + "The current flash attention version does not support sliding window attention, for a more memory efficient implementation" + " make sure to upgrade flash-attn library." + ) + + if past_key_value is not None: + # Activate slicing cache only if the config has a value `sliding_windows` attribute + cache_has_contents = past_key_value.get_seq_length(self.layer_idx) > 0 + if ( + getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and cache_has_contents + ): + slicing_tokens = 1 - self.config.sliding_window + + past_key = past_key_value[self.layer_idx][0] + past_value = past_key_value[self.layer_idx][1] + + past_key = past_key[:, :, slicing_tokens:, :].contiguous() + past_value = past_value[:, :, slicing_tokens:, :].contiguous() + + if past_key.shape[-2] != self.config.sliding_window - 1: + raise ValueError( + f"past key must have a shape of (`batch_size, num_heads, self.config.sliding_window-1, head_dim`), got" + f" {past_key.shape}" + ) + + if attention_mask is not None: + attention_mask = attention_mask[:, slicing_tokens:] + attention_mask = torch.cat([attention_mask, torch.ones_like(attention_mask[:, -1:])], dim=-1) + + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + dropout_rate = 0.0 if not self.training else self.attention_dropout + + # In PEFT, usually we cast the layer norms in float32 for training stability reasons + # therefore the input hidden states gets silently casted in float32. Hence, we need + # cast them back in float16 just to be sure everything works as expected. + input_dtype = query_states.dtype + if input_dtype == torch.float32: + if torch.is_autocast_enabled(): + target_dtype = torch.get_autocast_gpu_dtype() + # Handle the case where the model is quantized + elif hasattr(self.config, "_pre_quantization_dtype"): + target_dtype = self.config._pre_quantization_dtype + else: + target_dtype = self.q_proj.weight.dtype + + logger.warning_once( + f"The input hidden states seems to be silently casted in float32, this might be related to" + f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in" + f" {target_dtype}." + ) + + query_states = query_states.to(target_dtype) + key_states = key_states.to(target_dtype) + value_states = value_states.to(target_dtype) + + # Reashape to the expected shape for Flash Attention + query_states = query_states.transpose(1, 2) + key_states = key_states.transpose(1, 2) + value_states = value_states.transpose(1, 2) + + attn_output = self._flash_attention_forward( + query_states, + key_states, + value_states, + attention_mask, + q_len, + dropout=dropout_rate, + use_sliding_windows=use_sliding_windows, + ) + + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous() + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + def _flash_attention_forward( + self, + query_states, + key_states, + value_states, + attention_mask, + query_length, + dropout=0.0, + softmax_scale=None, + use_sliding_windows=False, + ): + """ + Calls the forward method of Flash Attention - if the input hidden states contain at least one padding token + first unpad the input, then computes the attention scores and pad the final attention scores. + + Args: + query_states (`torch.Tensor`): + Input query states to be passed to Flash Attention API + key_states (`torch.Tensor`): + Input key states to be passed to Flash Attention API + value_states (`torch.Tensor`): + Input value states to be passed to Flash Attention API + attention_mask (`torch.Tensor`): + The padding mask - corresponds to a tensor of size `(batch_size, seq_len)` where 0 stands for the + position of padding tokens and 1 for the position of non-padding tokens. + dropout (`int`, *optional*): + Attention dropout + softmax_scale (`float`, *optional*): + The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim) + use_sliding_windows (`bool`, *optional*): + Whether to activate sliding window attention. + """ + if not self._flash_attn_uses_top_left_mask: + causal = self.is_causal + else: + # TODO: Remove the `query_length != 1` check once Flash Attention for RoCm is bumped to 2.1. For details, please see the comment in LlamaFlashAttention2 __init__. + causal = self.is_causal and query_length != 1 + + # Decide whether to use SWA or not by layer index. + if use_sliding_windows and self.layer_idx >= self.config.max_window_layers: + use_sliding_windows = False + + # Contains at least one padding token in the sequence + if attention_mask is not None: + batch_size = query_states.shape[0] + query_states, key_states, value_states, indices_q, cu_seq_lens, max_seq_lens = self._upad_input( + query_states, key_states, value_states, attention_mask, query_length + ) + + cu_seqlens_q, cu_seqlens_k = cu_seq_lens + max_seqlen_in_batch_q, max_seqlen_in_batch_k = max_seq_lens + + if not use_sliding_windows: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + attn_output = pad_input(attn_output_unpad, indices_q, batch_size, query_length) + else: + if not use_sliding_windows: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + return attn_output + + # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._upad_input + def _upad_input(self, query_layer, key_layer, value_layer, attention_mask, query_length): + batch_size, kv_seq_len, num_heads, head_dim = key_layer.shape + + # On the first iteration we need to properly re-create the padding mask + # by slicing it on the proper place + if kv_seq_len != attention_mask.shape[-1]: + attention_mask_num_tokens = attention_mask.shape[-1] + attention_mask = attention_mask[:, attention_mask_num_tokens - kv_seq_len :] + + indices_k, cu_seqlens_k, max_seqlen_in_batch_k = _get_unpad_data(attention_mask) + + key_layer = index_first_axis(key_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + value_layer = index_first_axis(value_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + + if query_length == kv_seq_len: + query_layer = index_first_axis( + query_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k + ) + cu_seqlens_q = cu_seqlens_k + max_seqlen_in_batch_q = max_seqlen_in_batch_k + indices_q = indices_k + elif query_length == 1: + max_seqlen_in_batch_q = 1 + cu_seqlens_q = torch.arange( + batch_size + 1, dtype=torch.int32, device=query_layer.device + ) # There is a memcpy here, that is very bad. + indices_q = cu_seqlens_q[:-1] + query_layer = query_layer.squeeze(1) + else: + # The -q_len: slice assumes left padding. + attention_mask = attention_mask[:, -query_length:] + query_layer, indices_q, cu_seqlens_q, max_seqlen_in_batch_q = unpad_input(query_layer, attention_mask) + + return ( + query_layer, + key_layer, + value_layer, + indices_q, + (cu_seqlens_q, cu_seqlens_k), + (max_seqlen_in_batch_q, max_seqlen_in_batch_k), + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaSdpaAttention with Llama->Qwen2 +class Qwen2SdpaAttention(Qwen2Attention): + """ + Qwen2 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from + `Qwen2Attention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to + SDPA API. + """ + + # Adapted from Qwen2Attention.forward + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if output_attentions: + # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented. + logger.warning_once( + "Qwen2Model is using Qwen2SdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, " + 'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.' + ) + return super().forward( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask, + # Reference: https://github.com/pytorch/pytorch/issues/112577. + if query_states.device.type == "cuda" and attention_mask is not None: + query_states = query_states.contiguous() + key_states = key_states.contiguous() + value_states = value_states.contiguous() + + attn_output = torch.nn.functional.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=attention_mask, + dropout_p=self.attention_dropout if self.training else 0.0, + # The q_len > 1 is necessary to match with AttentionMaskConverter.to_causal_4d that does not create a causal mask in case q_len == 1. + is_causal=self.is_causal and attention_mask is None and q_len > 1, + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + return attn_output, None, past_key_value + + +QWEN2_ATTENTION_CLASSES = { + "eager": Qwen2Attention, + "flash_attention_2": Qwen2FlashAttention2, + "sdpa": Qwen2SdpaAttention, +} + + +class Qwen2DecoderLayer(nn.Module): + def __init__(self, config: Qwen2Config, layer_idx: int): + super().__init__() + self.hidden_size = config.hidden_size + + if config.use_sliding_window and config._attn_implementation != "flash_attention_2": + logger.warning_once( + f"Sliding Window Attention is enabled but not implemented for `{config._attn_implementation}`; " + "unexpected results may be encountered." + ) + # self.self_attn = QWEN2_ATTENTION_CLASSES[config._attn_implementation](config, layer_idx) + self.self_attn = Qwen2Attention(config, layer_idx) + + self.mlp = Qwen2MLP(config) + self.input_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + **kwargs, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. " + "Please make sure use `attention_mask` instead.`" + ) + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, sequence_length)` where padding elements are indicated by 0. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +QWEN2_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`Qwen2Config`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2PreTrainedModel(PreTrainedModel): + config_class = Qwen2Config + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["Qwen2DecoderLayer"] + _skip_keys_device_placement = "past_key_values" + _supports_flash_attn_2 = True + _supports_sdpa = True + _supports_cache_class = True + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + +QWEN2_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*): + Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values` + returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`. + + Two formats are allowed: + - a [`~cache_utils.Cache`] instance; + - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of + shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy + cache format. + + The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the + legacy cache format will be returned. + + If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't + have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids` + of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2Model(Qwen2PreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Qwen2DecoderLayer`] + + Args: + config: Qwen2Config + """ + + def __init__(self, config: Qwen2Config): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList( + [Qwen2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + self._attn_implementation = config._attn_implementation + self.norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + past_key_values_length = 0 + + if use_cache: + use_legacy_cache = not isinstance(past_key_values, Cache) + if use_legacy_cache: + past_key_values = DynamicCache.from_legacy_cache(past_key_values) + past_key_values_length = past_key_values.get_usable_length(seq_length) + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + + if attention_mask is not None and self._attn_implementation == "flash_attention_2" and use_cache: + is_padding_right = attention_mask[:, -1].sum().item() != batch_size + if is_padding_right: + raise ValueError( + "You are attempting to perform batched generation with padding_side='right'" + " this may lead to unexpected behaviour for Flash Attention version of Qwen2. Make sure to " + " call `tokenizer.padding_side = 'left'` before tokenizing the input. " + ) + + if self._attn_implementation == "flash_attention_2": + # 2d mask is passed through the layers + attention_mask = attention_mask if (attention_mask is not None and 0 in attention_mask) else None + elif self._attn_implementation == "sdpa" and not output_attentions: + # output_attentions=True can not be supported when using SDPA, and we fall back on + # the manual implementation that requires a 4D causal mask in all cases. + attention_mask = _prepare_4d_causal_attention_mask_for_sdpa( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + ) + else: + # 4d mask is passed through the layers + attention_mask = _prepare_4d_causal_attention_mask( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + sliding_window=self.config.sliding_window, + ) + + hidden_states = inputs_embeds + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = None + + for decoder_layer in self.layers: + if output_hidden_states: + all_hidden_states += (hidden_states,) + + if self.gradient_checkpointing and self.training: + layer_outputs = self._gradient_checkpointing_func( + decoder_layer.__call__, + hidden_states, + attention_mask, + position_ids, + past_key_values, + output_attentions, + use_cache, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_values, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache = layer_outputs[2 if output_attentions else 1] + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = None + if use_cache: + next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache + + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class Qwen2ForCausalLM(Qwen2PreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = Qwen2Model(config) + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, Qwen2ForCausalLM + + >>> model = Qwen2ForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + # Omit tokens covered by past_key_values + if past_key_values is not None: + if isinstance(past_key_values, Cache): + cache_length = past_key_values.get_seq_length() + past_length = past_key_values.seen_tokens + max_cache_length = past_key_values.get_max_length() + else: + cache_length = past_length = past_key_values[0][0].shape[2] + max_cache_length = None + + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif past_length < input_ids.shape[1]: + input_ids = input_ids[:, past_length:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. + + # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. + if ( + max_cache_length is not None + and attention_mask is not None + and cache_length + input_ids.shape[1] > max_cache_length + ): + attention_mask = attention_mask[:, -max_cache_length:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The Qwen2 Model transformer with a sequence classification head on top (linear layer). + + [`Qwen2ForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + QWEN2_START_DOCSTRING, +) +class Qwen2ForSequenceClassification(Qwen2PreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = Qwen2Model(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + # if no pad token found, use modulo instead of reverse indexing for ONNX compatibility + sequence_lengths = torch.eq(input_ids, self.config.pad_token_id).int().argmax(-1) - 1 + sequence_lengths = sequence_lengths % input_ids.shape[-1] + sequence_lengths = sequence_lengths.to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/config.json b/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/config.json new file mode 100755 index 000000000..6b0cfb9b4 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/config.json @@ -0,0 +1,31 @@ +{ + "architectures": [ + "Qwen2ForCausalLM" + ], + "auto_map": { + "AutoConfig": "configuration_qwen2.Qwen2Config", + "AutoModelForCausalLM": "modeling_qwen2.Qwen2ForCausalLM" + }, + "attention_dropout": 0.0, + "bos_token_id": 151643, + "eos_token_id": 151645, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 11008, + "max_position_embeddings": 32768, + "max_window_layers": 28, + "model_type": "qwen2", + "num_attention_heads": 32, + "num_hidden_layers": 32, + "num_key_value_heads": 32, + "rms_norm_eps": 1e-06, + "rope_theta": 1000000.0, + "sliding_window": 32768, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.37.0", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/configuration_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/configuration_qwen2.py new file mode 100644 index 000000000..b6ca1ed43 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/configuration_qwen2.py @@ -0,0 +1,144 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Qwen2 model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +QWEN2_PRETRAINED_CONFIG_ARCHIVE_MAP = { + "Qwen/Qwen2-7B-beta": "https://huggingface.co/Qwen/Qwen2-7B-beta/resolve/main/config.json", +} + + +class Qwen2Config(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`Qwen2Model`]. It is used to instantiate a + Qwen2 model according to the specified arguments, defining the model architecture. Instantiating a configuration + with the defaults will yield a similar configuration to that of + Qwen2-7B-beta [Qwen/Qwen2-7B-beta](https://huggingface.co/Qwen/Qwen2-7B-beta). + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 151936): + Vocabulary size of the Qwen2 model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`Qwen2Model`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 22016): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*, defaults to 32): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to `32`. + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 32768): + The maximum sequence length that this model might ever be used with. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-06): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings (`bool`, *optional*, defaults to `False`): + Whether the model's input and output word embeddings should be tied. + rope_theta (`float`, *optional*, defaults to 10000.0): + The base period of the RoPE embeddings. + use_sliding_window (`bool`, *optional*, defaults to `False`): + Whether to use sliding window attention. + sliding_window (`int`, *optional*, defaults to 4096): + Sliding window attention (SWA) window size. If not specified, will default to `4096`. + max_window_layers (`int`, *optional*, defaults to 28): + The number of layers that use SWA (Sliding Window Attention). The bottom layers use SWA while the top use full attention. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio for the attention probabilities. + + ```python + >>> from transformers import Qwen2Model, Qwen2Config + + >>> # Initializing a Qwen2 style configuration + >>> configuration = Qwen2Config() + + >>> # Initializing a model from the Qwen2-7B style configuration + >>> model = Qwen2Model(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + + model_type = "qwen2" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=151936, + hidden_size=4096, + intermediate_size=22016, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=32, + hidden_act="silu", + max_position_embeddings=32768, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + tie_word_embeddings=False, + rope_theta=10000.0, + use_sliding_window=False, + sliding_window=4096, + max_window_layers=28, + attention_dropout=0.0, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.use_sliding_window = use_sliding_window + self.sliding_window = sliding_window + self.max_window_layers = max_window_layers + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.use_cache = use_cache + self.rope_theta = rope_theta + self.attention_dropout = attention_dropout + + super().__init__( + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) diff --git a/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/modeling_qwen2.py b/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/modeling_qwen2.py new file mode 100644 index 000000000..23b740356 --- /dev/null +++ b/transformers/llm/export/llm_models/Qwen1_5-7B-Chat/modeling_qwen2.py @@ -0,0 +1,1412 @@ +# coding=utf-8 +# Copyright 2024 The Qwen team, Alibaba Group and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch Qwen2 model.""" +import inspect +import math +import warnings +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.cache_utils import Cache, DynamicCache +from transformers.modeling_attn_mask_utils import _prepare_4d_causal_attention_mask, _prepare_4d_causal_attention_mask_for_sdpa +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import ( + add_start_docstrings, + add_start_docstrings_to_model_forward, + is_flash_attn_2_available, + is_flash_attn_greater_or_equal_2_10, + logging, + replace_return_docstrings, +) +from .configuration_qwen2 import Qwen2Config + + +# if is_flash_attn_2_available(): + #from flash_attn import flash_attn_func, flash_attn_varlen_func + #from flash_attn.bert_padding import index_first_axis, pad_input, unpad_input # noqa + + #_flash_supports_window_size = "window_size" in list(inspect.signature(flash_attn_func).parameters) + + +logger = logging.get_logger(__name__) + + +_CHECKPOINT_FOR_DOC = "Qwen/Qwen2-7B-beta" +_CONFIG_FOR_DOC = "Qwen2Config" + +QWEN2_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "Qwen/Qwen2-7B-beta", + # See all Qwen2 models at https://huggingface.co/models?filter=qwen2 +] + + +# Copied from transformers.models.llama.modeling_llama._get_unpad_data +def _get_unpad_data(attention_mask): + seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0)) + return ( + indices, + cu_seqlens, + max_seqlen_in_batch, + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRMSNorm with Llama->Qwen2 +class Qwen2RMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + Qwen2RMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +# Copied from transformers.models.llama.modeling_llama.LlamaRotaryEmbedding with Llama->Qwen2 +class Qwen2RotaryEmbedding(nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.outer(t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:seq_len].to(dtype=x.dtype), + self.sin_cached[:seq_len].to(dtype=x.dtype), + ) + + +# Copied from transformers.models.llama.modeling_llama.rotate_half +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +# Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb +def apply_rotary_pos_emb(q, k, cos, sin, position_ids, unsqueeze_dim=1): + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + q (`torch.Tensor`): The query tensor. + k (`torch.Tensor`): The key tensor. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + position_ids (`torch.Tensor`): + The position indices of the tokens corresponding to the query and key tensors. For example, this can be + used to pass offsetted position ids when working with a KV-cache. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and + sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + Returns: + `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + cos = cos[position_ids].unsqueeze(unsqueeze_dim) + sin = sin[position_ids].unsqueeze(unsqueeze_dim) + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +# Copied from transformers.models.mistral.modeling_mistral.MistralMLP with Mistral->Qwen2 +class Qwen2MLP(nn.Module): + def __init__(self, config): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +# Copied from transformers.models.llama.modeling_llama.repeat_kv +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class Qwen2Attention(nn.Module): + """ + Multi-headed attention from 'Attention Is All You Need' paper. Modified to use sliding window attention: Longformer + and "Generating Long Sequences with Sparse Transformers". + """ + + def __init__(self, config: Qwen2Config, layer_idx: Optional[int] = None): + super().__init__() + self.config = config + self.layer_idx = layer_idx + if layer_idx is None: + logger.warning_once( + f"Instantiating {self.__class__.__name__} without passing `layer_idx` is not recommended and will " + "to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` " + "when creating this class." + ) + + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.max_position_embeddings = config.max_position_embeddings + self.rope_theta = config.rope_theta + self.is_causal = True + self.attention_dropout = config.attention_dropout + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=True) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=True) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + + self.rotary_emb = Qwen2RotaryEmbedding( + self.head_dim, + max_position_embeddings=self.max_position_embeddings, + base=self.rope_theta, + ) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[torch.Tensor] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + # kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + kv_seq_len += past_key_value[0].shape[2] + if rotary_pos_emb is None: + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + else: + cos, sin = rotary_pos_emb + query_states = (query_states * cos) + (rotate_half(query_states) * sin) + key_states = (key_states * cos) + (rotate_half(key_states) * sin) + + if past_key_value is not None: + past_key, past_value = past_key_value[0], past_key_value[1] + key_states = torch.cat((past_key, key_states), dim=2) + value_states = torch.cat((past_value, value_states), dim=2) + # key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + past_key_value = torch.stack((key_states, value_states)) + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class Qwen2FlashAttention2(Qwen2Attention): + """ + Qwen2 flash attention module, following Qwen2 attention module. This module inherits from `Qwen2Attention` + as the weights of the module stays untouched. The only required change would be on the forward pass + where it needs to correctly call the public API of flash attention and deal with padding tokens + in case the input contains any of them. Additionally, for sliding window attention, we apply SWA only to the bottom + config.max_window_layers layers. + """ + + # Copied from transformers.models.llama.modeling_llama.LlamaFlashAttention2.__init__ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1. + # flash_attn<2.1 generates top-left aligned causal mask, while what is needed here is bottom-right alignement, that was made default for flash_attn>=2.1. This attribute is used to handle this difference. Reference: https://github.com/Dao-AILab/flash-attention/releases/tag/v2.1.0. + # Beware that with flash_attn<2.1, using q_seqlen != k_seqlen (except for the case q_seqlen == 1) produces a wrong mask (top-left). + self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ): + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + + # overwrite attention_mask with padding_mask + attention_mask = kwargs.pop("padding_mask") + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + + # Because the input can be padded, the absolute sequence length depends on the max position id. + rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item()) + 1 + cos, sin = self.rotary_emb(value_states, seq_len=rotary_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + use_sliding_windows = ( + _flash_supports_window_size + and getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and self.config.use_sliding_window + ) + + if not _flash_supports_window_size: + logger.warning_once( + "The current flash attention version does not support sliding window attention, for a more memory efficient implementation" + " make sure to upgrade flash-attn library." + ) + + if past_key_value is not None: + # Activate slicing cache only if the config has a value `sliding_windows` attribute + cache_has_contents = past_key_value.get_seq_length(self.layer_idx) > 0 + if ( + getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and cache_has_contents + ): + slicing_tokens = 1 - self.config.sliding_window + + past_key = past_key_value[self.layer_idx][0] + past_value = past_key_value[self.layer_idx][1] + + past_key = past_key[:, :, slicing_tokens:, :].contiguous() + past_value = past_value[:, :, slicing_tokens:, :].contiguous() + + if past_key.shape[-2] != self.config.sliding_window - 1: + raise ValueError( + f"past key must have a shape of (`batch_size, num_heads, self.config.sliding_window-1, head_dim`), got" + f" {past_key.shape}" + ) + + if attention_mask is not None: + attention_mask = attention_mask[:, slicing_tokens:] + attention_mask = torch.cat([attention_mask, torch.ones_like(attention_mask[:, -1:])], dim=-1) + + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + dropout_rate = 0.0 if not self.training else self.attention_dropout + + # In PEFT, usually we cast the layer norms in float32 for training stability reasons + # therefore the input hidden states gets silently casted in float32. Hence, we need + # cast them back in float16 just to be sure everything works as expected. + input_dtype = query_states.dtype + if input_dtype == torch.float32: + if torch.is_autocast_enabled(): + target_dtype = torch.get_autocast_gpu_dtype() + # Handle the case where the model is quantized + elif hasattr(self.config, "_pre_quantization_dtype"): + target_dtype = self.config._pre_quantization_dtype + else: + target_dtype = self.q_proj.weight.dtype + + logger.warning_once( + f"The input hidden states seems to be silently casted in float32, this might be related to" + f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in" + f" {target_dtype}." + ) + + query_states = query_states.to(target_dtype) + key_states = key_states.to(target_dtype) + value_states = value_states.to(target_dtype) + + # Reashape to the expected shape for Flash Attention + query_states = query_states.transpose(1, 2) + key_states = key_states.transpose(1, 2) + value_states = value_states.transpose(1, 2) + + attn_output = self._flash_attention_forward( + query_states, + key_states, + value_states, + attention_mask, + q_len, + dropout=dropout_rate, + use_sliding_windows=use_sliding_windows, + ) + + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous() + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + def _flash_attention_forward( + self, + query_states, + key_states, + value_states, + attention_mask, + query_length, + dropout=0.0, + softmax_scale=None, + use_sliding_windows=False, + ): + """ + Calls the forward method of Flash Attention - if the input hidden states contain at least one padding token + first unpad the input, then computes the attention scores and pad the final attention scores. + + Args: + query_states (`torch.Tensor`): + Input query states to be passed to Flash Attention API + key_states (`torch.Tensor`): + Input key states to be passed to Flash Attention API + value_states (`torch.Tensor`): + Input value states to be passed to Flash Attention API + attention_mask (`torch.Tensor`): + The padding mask - corresponds to a tensor of size `(batch_size, seq_len)` where 0 stands for the + position of padding tokens and 1 for the position of non-padding tokens. + dropout (`int`, *optional*): + Attention dropout + softmax_scale (`float`, *optional*): + The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim) + use_sliding_windows (`bool`, *optional*): + Whether to activate sliding window attention. + """ + if not self._flash_attn_uses_top_left_mask: + causal = self.is_causal + else: + # TODO: Remove the `query_length != 1` check once Flash Attention for RoCm is bumped to 2.1. For details, please see the comment in LlamaFlashAttention2 __init__. + causal = self.is_causal and query_length != 1 + + # Decide whether to use SWA or not by layer index. + if use_sliding_windows and self.layer_idx >= self.config.max_window_layers: + use_sliding_windows = False + + # Contains at least one padding token in the sequence + if attention_mask is not None: + batch_size = query_states.shape[0] + query_states, key_states, value_states, indices_q, cu_seq_lens, max_seq_lens = self._upad_input( + query_states, key_states, value_states, attention_mask, query_length + ) + + cu_seqlens_q, cu_seqlens_k = cu_seq_lens + max_seqlen_in_batch_q, max_seqlen_in_batch_k = max_seq_lens + + if not use_sliding_windows: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + attn_output = pad_input(attn_output_unpad, indices_q, batch_size, query_length) + else: + if not use_sliding_windows: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + return attn_output + + # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._upad_input + def _upad_input(self, query_layer, key_layer, value_layer, attention_mask, query_length): + batch_size, kv_seq_len, num_heads, head_dim = key_layer.shape + + # On the first iteration we need to properly re-create the padding mask + # by slicing it on the proper place + if kv_seq_len != attention_mask.shape[-1]: + attention_mask_num_tokens = attention_mask.shape[-1] + attention_mask = attention_mask[:, attention_mask_num_tokens - kv_seq_len :] + + indices_k, cu_seqlens_k, max_seqlen_in_batch_k = _get_unpad_data(attention_mask) + + key_layer = index_first_axis(key_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + value_layer = index_first_axis(value_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + + if query_length == kv_seq_len: + query_layer = index_first_axis( + query_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k + ) + cu_seqlens_q = cu_seqlens_k + max_seqlen_in_batch_q = max_seqlen_in_batch_k + indices_q = indices_k + elif query_length == 1: + max_seqlen_in_batch_q = 1 + cu_seqlens_q = torch.arange( + batch_size + 1, dtype=torch.int32, device=query_layer.device + ) # There is a memcpy here, that is very bad. + indices_q = cu_seqlens_q[:-1] + query_layer = query_layer.squeeze(1) + else: + # The -q_len: slice assumes left padding. + attention_mask = attention_mask[:, -query_length:] + query_layer, indices_q, cu_seqlens_q, max_seqlen_in_batch_q = unpad_input(query_layer, attention_mask) + + return ( + query_layer, + key_layer, + value_layer, + indices_q, + (cu_seqlens_q, cu_seqlens_k), + (max_seqlen_in_batch_q, max_seqlen_in_batch_k), + ) + + +# Copied from transformers.models.llama.modeling_llama.LlamaSdpaAttention with Llama->Qwen2 +class Qwen2SdpaAttention(Qwen2Attention): + """ + Qwen2 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from + `Qwen2Attention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to + SDPA API. + """ + + # Adapted from Qwen2Attention.forward + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if output_attentions: + # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented. + logger.warning_once( + "Qwen2Model is using Qwen2SdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, " + 'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.' + ) + return super().forward( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask, + # Reference: https://github.com/pytorch/pytorch/issues/112577. + if query_states.device.type == "cuda" and attention_mask is not None: + query_states = query_states.contiguous() + key_states = key_states.contiguous() + value_states = value_states.contiguous() + + attn_output = torch.nn.functional.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=attention_mask, + dropout_p=self.attention_dropout if self.training else 0.0, + # The q_len > 1 is necessary to match with AttentionMaskConverter.to_causal_4d that does not create a causal mask in case q_len == 1. + is_causal=self.is_causal and attention_mask is None and q_len > 1, + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + return attn_output, None, past_key_value + + +QWEN2_ATTENTION_CLASSES = { + "eager": Qwen2Attention, + "flash_attention_2": Qwen2FlashAttention2, + "sdpa": Qwen2SdpaAttention, +} + + +class Qwen2DecoderLayer(nn.Module): + def __init__(self, config: Qwen2Config, layer_idx: int): + super().__init__() + self.hidden_size = config.hidden_size + + if config.use_sliding_window and config._attn_implementation != "flash_attention_2": + logger.warning_once( + f"Sliding Window Attention is enabled but not implemented for `{config._attn_implementation}`; " + "unexpected results may be encountered." + ) + # self.self_attn = QWEN2_ATTENTION_CLASSES[config._attn_implementation](config, layer_idx) + self.self_attn = Qwen2Attention(config, layer_idx) + + self.mlp = Qwen2MLP(config) + self.input_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + rotary_pos_emb: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + **kwargs, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. " + "Please make sure use `attention_mask` instead.`" + ) + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, sequence_length)` where padding elements are indicated by 0. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +QWEN2_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`Qwen2Config`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2PreTrainedModel(PreTrainedModel): + config_class = Qwen2Config + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["Qwen2DecoderLayer"] + _skip_keys_device_placement = "past_key_values" + _supports_flash_attn_2 = True + _supports_sdpa = True + _supports_cache_class = True + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + +QWEN2_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*): + Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values` + returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`. + + Two formats are allowed: + - a [`~cache_utils.Cache`] instance; + - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of + shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy + cache format. + + The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the + legacy cache format will be returned. + + If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't + have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids` + of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare Qwen2 Model outputting raw hidden-states without any specific head on top.", + QWEN2_START_DOCSTRING, +) +class Qwen2Model(Qwen2PreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Qwen2DecoderLayer`] + + Args: + config: Qwen2Config + """ + + def __init__(self, config: Qwen2Config): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList( + [Qwen2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + self._attn_implementation = config._attn_implementation + self.norm = Qwen2RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + past_key_values_length = 0 + + if use_cache: + use_legacy_cache = not isinstance(past_key_values, Cache) + if use_legacy_cache: + past_key_values = DynamicCache.from_legacy_cache(past_key_values) + past_key_values_length = past_key_values.get_usable_length(seq_length) + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + + if attention_mask is not None and self._attn_implementation == "flash_attention_2" and use_cache: + is_padding_right = attention_mask[:, -1].sum().item() != batch_size + if is_padding_right: + raise ValueError( + "You are attempting to perform batched generation with padding_side='right'" + " this may lead to unexpected behaviour for Flash Attention version of Qwen2. Make sure to " + " call `tokenizer.padding_side = 'left'` before tokenizing the input. " + ) + + if self._attn_implementation == "flash_attention_2": + # 2d mask is passed through the layers + attention_mask = attention_mask if (attention_mask is not None and 0 in attention_mask) else None + elif self._attn_implementation == "sdpa" and not output_attentions: + # output_attentions=True can not be supported when using SDPA, and we fall back on + # the manual implementation that requires a 4D causal mask in all cases. + attention_mask = _prepare_4d_causal_attention_mask_for_sdpa( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + ) + else: + # 4d mask is passed through the layers + attention_mask = _prepare_4d_causal_attention_mask( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + sliding_window=self.config.sliding_window, + ) + + hidden_states = inputs_embeds + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = None + + for decoder_layer in self.layers: + if output_hidden_states: + all_hidden_states += (hidden_states,) + + if self.gradient_checkpointing and self.training: + layer_outputs = self._gradient_checkpointing_func( + decoder_layer.__call__, + hidden_states, + attention_mask, + position_ids, + past_key_values, + output_attentions, + use_cache, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_values, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache = layer_outputs[2 if output_attentions else 1] + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = None + if use_cache: + next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache + + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class Qwen2ForCausalLM(Qwen2PreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = Qwen2Model(config) + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, Qwen2ForCausalLM + + >>> model = Qwen2ForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + # Omit tokens covered by past_key_values + if past_key_values is not None: + if isinstance(past_key_values, Cache): + cache_length = past_key_values.get_seq_length() + past_length = past_key_values.seen_tokens + max_cache_length = past_key_values.get_max_length() + else: + cache_length = past_length = past_key_values[0][0].shape[2] + max_cache_length = None + + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif past_length < input_ids.shape[1]: + input_ids = input_ids[:, past_length:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. + + # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. + if ( + max_cache_length is not None + and attention_mask is not None + and cache_length + input_ids.shape[1] > max_cache_length + ): + attention_mask = attention_mask[:, -max_cache_length:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The Qwen2 Model transformer with a sequence classification head on top (linear layer). + + [`Qwen2ForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + QWEN2_START_DOCSTRING, +) +class Qwen2ForSequenceClassification(Qwen2PreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = Qwen2Model(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(QWEN2_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + # if no pad token found, use modulo instead of reverse indexing for ONNX compatibility + sequence_lengths = torch.eq(input_ids, self.config.pad_token_id).int().argmax(-1) - 1 + sequence_lengths = sequence_lengths % input_ids.shape[-1] + sequence_lengths = sequence_lengths.to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/config.json b/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/config.json new file mode 100755 index 000000000..117c9e5d6 --- /dev/null +++ b/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/config.json @@ -0,0 +1,30 @@ +{ + "_name_or_path": "/mnt/petrelfs/libo1.p/alignment-handbook/data/tinyllama-2T-sft-full", + "architectures": [ + "LlamaForCausalLM" + ], + "auto_map": { + "AutoModelForCausalLM": "modeling_llama.LlamaForCausalLM" + }, + "attention_bias": false, + "bos_token_id": 1, + "eos_token_id": 2, + "hidden_act": "silu", + "hidden_size": 2048, + "initializer_range": 0.02, + "intermediate_size": 5632, + "max_position_embeddings": 2048, + "model_type": "llama", + "num_attention_heads": 32, + "num_hidden_layers": 22, + "num_key_value_heads": 4, + "pretraining_tp": 1, + "rms_norm_eps": 1e-05, + "rope_scaling": null, + "rope_theta": 10000.0, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.35.0", + "use_cache": false, + "vocab_size": 32000 +} diff --git a/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/configuration_llama.py b/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/configuration_llama.py new file mode 100644 index 000000000..1b0e9c357 --- /dev/null +++ b/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/configuration_llama.py @@ -0,0 +1,174 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" LLaMA model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +LLAMA_PRETRAINED_CONFIG_ARCHIVE_MAP = {} + + +class LlamaConfig(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`LlamaModel`]. It is used to instantiate an LLaMA + model according to the specified arguments, defining the model architecture. Instantiating a configuration with the + defaults will yield a similar configuration to that of the LLaMA-7B. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 32000): + Vocabulary size of the LLaMA model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`LlamaModel`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 11008): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + pretraining_tp (`int`, *optional*, defaults to `1`): + Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this + document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is + necessary to ensure exact reproducibility of the pretraining results. Please refer to [this + issue](https://github.com/pytorch/pytorch/issues/76232). + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 2048): + The maximum sequence length that this model might ever be used with. Typically set this to something large + just in case (e.g., 512 or 1024 or 2048). + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-12): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings(`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_scaling (`Dict`, *optional*): + Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports three scaling + strategies: linear and dynamic. Their scaling factor must be an float greater than 1. The expected format + is `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update + `max_position_embeddings` to the expected new maximum. See the following thread for more information on how + these scaling strategies behave: + https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an + experimental feature, subject to breaking API changes in future versions. + + Example: + + ```python + >>> from transformers import LlamaModel, LlamaConfig + + >>> # Initializing a LLaMA llama-7b style configuration + >>> configuration = LlamaConfig() + + >>> # Initializing a model from the llama-7b style configuration + >>> model = LlamaModel(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + model_type = "llama" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=32000, + hidden_size=4096, + intermediate_size=11008, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + hidden_act="silu", + max_position_embeddings=2048, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + pad_token_id=0, + bos_token_id=1, + eos_token_id=2, + pretraining_tp=1, + tie_word_embeddings=False, + rope_scaling=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.pretraining_tp = pretraining_tp + self.use_cache = use_cache + self.rope_scaling = rope_scaling + self._rope_scaling_validation() + + super().__init__( + pad_token_id=pad_token_id, + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + def _rope_scaling_validation(self): + """ + Validate the `rope_scaling` configuration. + """ + if self.rope_scaling is None: + return + + if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 2: + raise ValueError( + "`rope_scaling` must be a dictionary with with two fields, `name` and `factor`, " + f"got {self.rope_scaling}" + ) + rope_scaling_type = self.rope_scaling.get("type", None) + rope_scaling_factor = self.rope_scaling.get("factor", None) + if rope_scaling_type is None or rope_scaling_type not in ["linear", "dynamic"]: + raise ValueError( + f"`rope_scaling`'s name field must be one of ['linear', 'dynamic'], got {rope_scaling_type}" + ) + if rope_scaling_factor is None or not isinstance(rope_scaling_factor, float) or rope_scaling_factor <= 1.0: + raise ValueError(f"`rope_scaling`'s factor field must be an float > 1, got {rope_scaling_factor}") diff --git a/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/modeling_llama.py b/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/modeling_llama.py new file mode 100644 index 000000000..8c562c604 --- /dev/null +++ b/transformers/llm/export/llm_models/TinyLlama-1.1B-Chat/modeling_llama.py @@ -0,0 +1,1010 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch LLaMA model.""" +import math +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings +from .configuration_llama import LlamaConfig + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "LlamaConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.finfo(dtype).min, device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class LlamaRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + LlamaRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +class LlamaRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +class LlamaLinearScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with linear scaling. Credits to the Reddit user /u/kaiokendev""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + t = t / self.scaling_factor + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +class LlamaDynamicNTKScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with Dynamic NTK scaling. Credits to the Reddit users /u/bloc97 and /u/emozilla""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + + if seq_len > self.max_position_embeddings: + base = self.base * ( + (self.scaling_factor * seq_len / self.max_position_embeddings) - (self.scaling_factor - 1) + ) ** (self.dim / (self.dim - 2)) + inv_freq = 1.0 / (base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + # The first two dimensions of cos and sin are always 1, so we can `squeeze` them. + # cos = cos.squeeze(1).squeeze(0) # [seq_len, dim] + # sin = sin.squeeze(1).squeeze(0) # [seq_len, dim] + cos = torch.squeeze(cos) # [seq_len, dim] + sin = torch.squeeze(sin) # [seq_len, dim] + cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class LlamaMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.pretraining_tp = config.pretraining_tp + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + if self.pretraining_tp > 1: + slice = self.intermediate_size // self.pretraining_tp + gate_proj_slices = self.gate_proj.weight.split(slice, dim=0) + up_proj_slices = self.up_proj.weight.split(slice, dim=0) + down_proj_slices = self.down_proj.weight.split(slice, dim=1) + + gate_proj = torch.cat([F.linear(x, gate_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + up_proj = torch.cat([F.linear(x, up_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + + intermediate_states = (self.act_fn(gate_proj) * up_proj).split(slice, dim=2) + down_proj = [F.linear(intermediate_states[i], down_proj_slices[i]) for i in range(self.pretraining_tp)] + down_proj = sum(down_proj) + else: + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + return down_proj + + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class LlamaAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: LlamaConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.pretraining_tp = config.pretraining_tp + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self._init_rope() + + def _init_rope(self): + if self.config.rope_scaling is None: + self.rotary_emb = LlamaRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + else: + scaling_type = self.config.rope_scaling["type"] + scaling_factor = self.config.rope_scaling["factor"] + if scaling_type == "linear": + self.rotary_emb = LlamaLinearScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + elif scaling_type == "dynamic": + self.rotary_emb = LlamaDynamicNTKScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + else: + raise ValueError(f"Unknown RoPE scaling type {scaling_type}") + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + if self.pretraining_tp > 1: + key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.pretraining_tp + query_slices = self.q_proj.weight.split((self.num_heads * self.head_dim) // self.pretraining_tp, dim=0) + key_slices = self.k_proj.weight.split(key_value_slicing, dim=0) + value_slices = self.v_proj.weight.split(key_value_slicing, dim=0) + + query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.pretraining_tp)] + query_states = torch.cat(query_states, dim=-1) + + key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.pretraining_tp)] + key_states = torch.cat(key_states, dim=-1) + + value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.pretraining_tp)] + value_states = torch.cat(value_states, dim=-1) + + else: + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + if self.pretraining_tp > 1: + attn_output = attn_output.split(self.hidden_size // self.pretraining_tp, dim=2) + o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.pretraining_tp, dim=1) + attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.pretraining_tp)]) + else: + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class LlamaDecoderLayer(nn.Module): + def __init__(self, config: LlamaConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = LlamaAttention(config=config) + self.mlp = LlamaMLP(config) + self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +LLAMA_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`LlamaConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaPreTrainedModel(PreTrainedModel): + config_class = LlamaConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["LlamaDecoderLayer"] + _skip_keys_device_placement = "past_key_values" + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, LlamaModel): + module.gradient_checkpointing = value + + +LLAMA_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaModel(LlamaPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`] + + Args: + config: LlamaConfig + """ + + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class LlamaForCausalLM(LlamaPreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = LlamaModel(config) + self.pretraining_tp = config.pretraining_tp + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, LlamaForCausalLM + + >>> model = LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + if self.pretraining_tp > 1: + lm_head_slices = self.lm_head.weight.split(self.vocab_size // self.pretraining_tp, dim=0) + logits = [F.linear(hidden_states, lm_head_slices[i]) for i in range(self.pretraining_tp)] + logits = torch.cat(logits, dim=-1) + else: + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The LLaMa Model transformer with a sequence classification head on top (linear layer). + + [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + LLAMA_START_DOCSTRING, +) +class LlamaForSequenceClassification(LlamaPreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = LlamaModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/Yi-6B-Chat/config.json b/transformers/llm/export/llm_models/Yi-6B-Chat/config.json new file mode 100755 index 000000000..aad6b1d39 --- /dev/null +++ b/transformers/llm/export/llm_models/Yi-6B-Chat/config.json @@ -0,0 +1,29 @@ +{ + "architectures": [ + "LlamaForCausalLM" + ], + "auto_map": { + "AutoModelForCausalLM": "modeling_llama.LlamaForCausalLM" + }, + "attention_bias": false, + "bos_token_id": 1, + "eos_token_id": 2, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 11008, + "max_position_embeddings": 4096, + "model_type": "llama", + "num_attention_heads": 32, + "num_hidden_layers": 32, + "num_key_value_heads": 4, + "pretraining_tp": 1, + "rms_norm_eps": 1e-05, + "rope_scaling": null, + "rope_theta": 5000000.0, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.35.0", + "use_cache": true, + "vocab_size": 64000 +} diff --git a/transformers/llm/export/llm_models/Yi-6B-Chat/configuration_llama.py b/transformers/llm/export/llm_models/Yi-6B-Chat/configuration_llama.py new file mode 100644 index 000000000..1b0e9c357 --- /dev/null +++ b/transformers/llm/export/llm_models/Yi-6B-Chat/configuration_llama.py @@ -0,0 +1,174 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" LLaMA model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +LLAMA_PRETRAINED_CONFIG_ARCHIVE_MAP = {} + + +class LlamaConfig(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`LlamaModel`]. It is used to instantiate an LLaMA + model according to the specified arguments, defining the model architecture. Instantiating a configuration with the + defaults will yield a similar configuration to that of the LLaMA-7B. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 32000): + Vocabulary size of the LLaMA model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`LlamaModel`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 11008): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + pretraining_tp (`int`, *optional*, defaults to `1`): + Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this + document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is + necessary to ensure exact reproducibility of the pretraining results. Please refer to [this + issue](https://github.com/pytorch/pytorch/issues/76232). + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 2048): + The maximum sequence length that this model might ever be used with. Typically set this to something large + just in case (e.g., 512 or 1024 or 2048). + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-12): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings(`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_scaling (`Dict`, *optional*): + Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports three scaling + strategies: linear and dynamic. Their scaling factor must be an float greater than 1. The expected format + is `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update + `max_position_embeddings` to the expected new maximum. See the following thread for more information on how + these scaling strategies behave: + https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an + experimental feature, subject to breaking API changes in future versions. + + Example: + + ```python + >>> from transformers import LlamaModel, LlamaConfig + + >>> # Initializing a LLaMA llama-7b style configuration + >>> configuration = LlamaConfig() + + >>> # Initializing a model from the llama-7b style configuration + >>> model = LlamaModel(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + model_type = "llama" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=32000, + hidden_size=4096, + intermediate_size=11008, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + hidden_act="silu", + max_position_embeddings=2048, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + pad_token_id=0, + bos_token_id=1, + eos_token_id=2, + pretraining_tp=1, + tie_word_embeddings=False, + rope_scaling=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.pretraining_tp = pretraining_tp + self.use_cache = use_cache + self.rope_scaling = rope_scaling + self._rope_scaling_validation() + + super().__init__( + pad_token_id=pad_token_id, + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + def _rope_scaling_validation(self): + """ + Validate the `rope_scaling` configuration. + """ + if self.rope_scaling is None: + return + + if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 2: + raise ValueError( + "`rope_scaling` must be a dictionary with with two fields, `name` and `factor`, " + f"got {self.rope_scaling}" + ) + rope_scaling_type = self.rope_scaling.get("type", None) + rope_scaling_factor = self.rope_scaling.get("factor", None) + if rope_scaling_type is None or rope_scaling_type not in ["linear", "dynamic"]: + raise ValueError( + f"`rope_scaling`'s name field must be one of ['linear', 'dynamic'], got {rope_scaling_type}" + ) + if rope_scaling_factor is None or not isinstance(rope_scaling_factor, float) or rope_scaling_factor <= 1.0: + raise ValueError(f"`rope_scaling`'s factor field must be an float > 1, got {rope_scaling_factor}") diff --git a/transformers/llm/export/llm_models/Yi-6B-Chat/modeling_llama.py b/transformers/llm/export/llm_models/Yi-6B-Chat/modeling_llama.py new file mode 100644 index 000000000..8c562c604 --- /dev/null +++ b/transformers/llm/export/llm_models/Yi-6B-Chat/modeling_llama.py @@ -0,0 +1,1010 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch LLaMA model.""" +import math +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings +from .configuration_llama import LlamaConfig + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "LlamaConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.finfo(dtype).min, device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class LlamaRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + LlamaRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +class LlamaRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +class LlamaLinearScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with linear scaling. Credits to the Reddit user /u/kaiokendev""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + t = t / self.scaling_factor + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +class LlamaDynamicNTKScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with Dynamic NTK scaling. Credits to the Reddit users /u/bloc97 and /u/emozilla""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + + if seq_len > self.max_position_embeddings: + base = self.base * ( + (self.scaling_factor * seq_len / self.max_position_embeddings) - (self.scaling_factor - 1) + ) ** (self.dim / (self.dim - 2)) + inv_freq = 1.0 / (base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + # The first two dimensions of cos and sin are always 1, so we can `squeeze` them. + # cos = cos.squeeze(1).squeeze(0) # [seq_len, dim] + # sin = sin.squeeze(1).squeeze(0) # [seq_len, dim] + cos = torch.squeeze(cos) # [seq_len, dim] + sin = torch.squeeze(sin) # [seq_len, dim] + cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class LlamaMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.pretraining_tp = config.pretraining_tp + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + if self.pretraining_tp > 1: + slice = self.intermediate_size // self.pretraining_tp + gate_proj_slices = self.gate_proj.weight.split(slice, dim=0) + up_proj_slices = self.up_proj.weight.split(slice, dim=0) + down_proj_slices = self.down_proj.weight.split(slice, dim=1) + + gate_proj = torch.cat([F.linear(x, gate_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + up_proj = torch.cat([F.linear(x, up_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + + intermediate_states = (self.act_fn(gate_proj) * up_proj).split(slice, dim=2) + down_proj = [F.linear(intermediate_states[i], down_proj_slices[i]) for i in range(self.pretraining_tp)] + down_proj = sum(down_proj) + else: + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + return down_proj + + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class LlamaAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: LlamaConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.pretraining_tp = config.pretraining_tp + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self._init_rope() + + def _init_rope(self): + if self.config.rope_scaling is None: + self.rotary_emb = LlamaRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + else: + scaling_type = self.config.rope_scaling["type"] + scaling_factor = self.config.rope_scaling["factor"] + if scaling_type == "linear": + self.rotary_emb = LlamaLinearScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + elif scaling_type == "dynamic": + self.rotary_emb = LlamaDynamicNTKScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + else: + raise ValueError(f"Unknown RoPE scaling type {scaling_type}") + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + if self.pretraining_tp > 1: + key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.pretraining_tp + query_slices = self.q_proj.weight.split((self.num_heads * self.head_dim) // self.pretraining_tp, dim=0) + key_slices = self.k_proj.weight.split(key_value_slicing, dim=0) + value_slices = self.v_proj.weight.split(key_value_slicing, dim=0) + + query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.pretraining_tp)] + query_states = torch.cat(query_states, dim=-1) + + key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.pretraining_tp)] + key_states = torch.cat(key_states, dim=-1) + + value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.pretraining_tp)] + value_states = torch.cat(value_states, dim=-1) + + else: + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + if self.pretraining_tp > 1: + attn_output = attn_output.split(self.hidden_size // self.pretraining_tp, dim=2) + o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.pretraining_tp, dim=1) + attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.pretraining_tp)]) + else: + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class LlamaDecoderLayer(nn.Module): + def __init__(self, config: LlamaConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = LlamaAttention(config=config) + self.mlp = LlamaMLP(config) + self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +LLAMA_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`LlamaConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaPreTrainedModel(PreTrainedModel): + config_class = LlamaConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["LlamaDecoderLayer"] + _skip_keys_device_placement = "past_key_values" + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, LlamaModel): + module.gradient_checkpointing = value + + +LLAMA_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaModel(LlamaPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`] + + Args: + config: LlamaConfig + """ + + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class LlamaForCausalLM(LlamaPreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = LlamaModel(config) + self.pretraining_tp = config.pretraining_tp + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, LlamaForCausalLM + + >>> model = LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + if self.pretraining_tp > 1: + lm_head_slices = self.lm_head.weight.split(self.vocab_size // self.pretraining_tp, dim=0) + logits = [F.linear(hidden_states, lm_head_slices[i]) for i in range(self.pretraining_tp)] + logits = torch.cat(logits, dim=-1) + else: + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The LLaMa Model transformer with a sequence classification head on top (linear layer). + + [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + LLAMA_START_DOCSTRING, +) +class LlamaForSequenceClassification(LlamaPreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = LlamaModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/chatglm-6b/modeling_chatglm.py b/transformers/llm/export/llm_models/chatglm-6b/modeling_chatglm.py new file mode 100644 index 000000000..82effe877 --- /dev/null +++ b/transformers/llm/export/llm_models/chatglm-6b/modeling_chatglm.py @@ -0,0 +1,1441 @@ +""" PyTorch ChatGLM model. """ + +import math +import copy +import os +import warnings +import re +import sys + +import torch +import torch.utils.checkpoint +import torch.nn.functional as F +from torch import nn +from torch.nn import CrossEntropyLoss, LayerNorm +from torch.nn.utils import skip_init +from typing import Optional, Tuple, Union, List, Callable, Dict, Any + +from transformers.utils import ( + add_code_sample_docstrings, + add_start_docstrings, + add_start_docstrings_to_model_forward, +) +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, + BaseModelOutputWithPastAndCrossAttentions, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging +from transformers.generation.logits_process import LogitsProcessor +from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput + +from .configuration_chatglm import ChatGLMConfig + +# flags required to enable jit fusion kernels + +if sys.platform != 'darwin': + torch._C._jit_set_profiling_mode(False) + torch._C._jit_set_profiling_executor(False) + torch._C._jit_override_can_fuse_on_cpu(True) + torch._C._jit_override_can_fuse_on_gpu(True) + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "THUDM/ChatGLM-6B" +_CONFIG_FOR_DOC = "ChatGLM6BConfig" + +CHATGLM_6B_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "THUDM/chatglm-6b", + # See all ChatGLM-6B models at https://huggingface.co/models?filter=chatglm +] + + +class InvalidScoreLogitsProcessor(LogitsProcessor): + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if torch.isnan(scores).any() or torch.isinf(scores).any(): + scores.zero_() + scores[..., 5] = 5e4 + return scores + + +def load_tf_weights_in_chatglm_6b(model, config, tf_checkpoint_path): + """Load tf checkpoints in a pytorch model.""" + try: + import re + + import numpy as np + import tensorflow as tf + except ImportError: + logger.error( + "Loading a TensorFlow model in PyTorch, requires TensorFlow to be installed. Please see " + "https://www.tensorflow.org/install/ for installation instructions." + ) + raise + tf_path = os.path.abspath(tf_checkpoint_path) + logger.info(f"Converting TensorFlow checkpoint from {tf_path}") + # Load weights from TF model + init_vars = tf.train.list_variables(tf_path) + names = [] + arrays = [] + for name, shape in init_vars: + logger.info(f"Loading TF weight {name} with shape {shape}") + array = tf.train.load_variable(tf_path, name) + names.append(name) + arrays.append(array) + + for name, array in zip(names, arrays): + name = name.split("/") + # adam_v and adam_m are variables used in AdamWeightDecayOptimizer to calculated m and v + # which are not required for using pretrained model + if any( + n in ["adam_v", "adam_m", "AdamWeightDecayOptimizer", "AdamWeightDecayOptimizer_1", "global_step"] + for n in name + ): + logger.info(f"Skipping {'/'.join(name)}") + continue + pointer = model + for m_name in name: + if re.fullmatch(r"[A-Za-z]+_\d+", m_name): + scope_names = re.split(r"_(\d+)", m_name) + else: + scope_names = [m_name] + if scope_names[0] == "kernel" or scope_names[0] == "gamma": + pointer = getattr(pointer, "weight") + elif scope_names[0] == "output_bias" or scope_names[0] == "beta": + pointer = getattr(pointer, "bias") + elif scope_names[0] == "output_weights": + pointer = getattr(pointer, "weight") + elif scope_names[0] == "squad": + pointer = getattr(pointer, "classifier") + else: + try: + pointer = getattr(pointer, scope_names[0]) + except AttributeError: + logger.info(f"Skipping {'/'.join(name)}") + continue + if len(scope_names) >= 2: + num = int(scope_names[1]) + pointer = pointer[num] + if m_name[-11:] == "_embeddings": + pointer = getattr(pointer, "weight") + elif m_name == "kernel": + array = np.transpose(array) + try: + assert ( + pointer.shape == array.shape + ), f"Pointer shape {pointer.shape} and array shape {array.shape} mismatched" + except AssertionError as e: + e.args += (pointer.shape, array.shape) + raise + logger.info(f"Initialize PyTorch weight {name}") + pointer.data = torch.from_numpy(array) + return model + + +class PrefixEncoder(torch.nn.Module): + """ + The torch.nn model to encode the prefix + Input shape: (batch-size, prefix-length) + Output shape: (batch-size, prefix-length, 2*layers*hidden) + """ + + def __init__(self, config): + super().__init__() + self.prefix_projection = config.prefix_projection + if self.prefix_projection: + # Use a two-layer MLP to encode the prefix + self.embedding = torch.nn.Embedding(config.pre_seq_len, config.hidden_size) + self.trans = torch.nn.Sequential( + torch.nn.Linear(config.hidden_size, config.hidden_size), + torch.nn.Tanh(), + torch.nn.Linear(config.hidden_size, config.num_layers * config.hidden_size * 2) + ) + else: + self.embedding = torch.nn.Embedding(config.pre_seq_len, config.num_layers * config.hidden_size * 2) + + def forward(self, prefix: torch.Tensor): + if self.prefix_projection: + prefix_tokens = self.embedding(prefix) + past_key_values = self.trans(prefix_tokens) + else: + past_key_values = self.embedding(prefix) + return past_key_values + + +@torch.jit.script +def gelu_impl(x): + """OpenAI's gelu implementation.""" + return 0.5 * x * (1.0 + torch.tanh(0.7978845608028654 * x * + (1.0 + 0.044715 * x * x))) + + +def gelu(x): + return gelu_impl(x) + + +class RotaryEmbedding(torch.nn.Module): + def __init__(self, dim, base=10000, precision=torch.half, learnable=False): + super().__init__() + inv_freq = 1. / (base ** (torch.arange(0, dim, 2).float() / dim)) + inv_freq = inv_freq.half() + self.learnable = learnable + if learnable: + self.inv_freq = torch.nn.Parameter(inv_freq) + self.max_seq_len_cached = None + else: + self.register_buffer('inv_freq', inv_freq) + self.max_seq_len_cached = None + self.cos_cached = None + self.sin_cached = None + self.precision = precision + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, + error_msgs): + pass + + def forward(self, x, seq_dim=1, seq_len=None): + if seq_len is None: + seq_len = x.shape[seq_dim] + if self.max_seq_len_cached is None or (seq_len > self.max_seq_len_cached): + self.max_seq_len_cached = None if self.learnable else seq_len + t = torch.arange(seq_len, device=x.device, dtype=self.inv_freq.dtype) + freqs = torch.einsum('i,j->ij', t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1).to(x.device) + if self.precision == torch.bfloat16: + emb = emb.float() + + # [sx, 1 (b * np), hn] + cos_cached = emb.cos()[:, None, :] + sin_cached = emb.sin()[:, None, :] + if self.precision == torch.bfloat16: + cos_cached = cos_cached.bfloat16() + sin_cached = sin_cached.bfloat16() + if self.learnable: + return cos_cached, sin_cached + self.cos_cached, self.sin_cached = cos_cached, sin_cached + return self.cos_cached[:seq_len, ...], self.sin_cached[:seq_len, ...] + + def _apply(self, fn): + if self.cos_cached is not None: + self.cos_cached = fn(self.cos_cached) + if self.sin_cached is not None: + self.sin_cached = fn(self.sin_cached) + return super()._apply(fn) + + +def rotate_half(x): + x1, x2 = x[..., :x.shape[-1] // 2], x[..., x.shape[-1] // 2:] + return torch.cat((-x2, x1), dim=x1.ndim - 1) # dim=-1 triggers a bug in earlier torch versions + + +@torch.jit.script +def apply_rotary_pos_emb_index(q, k, cos, sin, position_id): + # position_id: [sq, b], q, k: [sq, b, np, hn], cos: [sq, 1, hn] -> [sq, b, 1, hn] + cos, sin = F.embedding(position_id, torch.squeeze(cos)).unsqueeze(2), \ + F.embedding(position_id, torch.squeeze(sin)).unsqueeze(2) + q, k = (q * cos) + (rotate_half(q) * sin), (k * cos) + (rotate_half(k) * sin) + return q, k + + +def attention_fn( + self, + query_layer, + key_layer, + value_layer, + attention_mask, + hidden_size_per_partition, + layer_id, + layer_past=None, + scaling_attention_score=True, + use_cache=False, +): + if layer_past is not None: + past_key, past_value = layer_past[0], layer_past[1] + key_layer = torch.cat((past_key, key_layer), dim=0) + value_layer = torch.cat((past_value, value_layer), dim=0) + + # seqlen, batch, num_attention_heads, hidden_size_per_attention_head + seq_len, b, nh, hidden_size = key_layer.shape + + if use_cache: + present = (key_layer, value_layer) + else: + present = None + + query_key_layer_scaling_coeff = float(layer_id + 1) + if scaling_attention_score: + query_layer = query_layer / (math.sqrt(hidden_size) * query_key_layer_scaling_coeff) + + # =================================== + # Raw attention scores. [b, np, s, s] + # =================================== + + # [b, np, sq, sk] + output_size = (query_layer.size(1), query_layer.size(2), query_layer.size(0), key_layer.size(0)) + + # [sq, b, np, hn] -> [sq, b * np, hn] + #query_layer = query_layer.view(output_size[2], output_size[0] * output_size[1], -1) + # [sk, b, np, hn] -> [sk, b * np, hn] + #key_layer = key_layer.view(output_size[3], output_size[0] * output_size[1], -1) + query_layer = query_layer.squeeze(1) + key_layer = key_layer.squeeze(1) + + matmul_result = torch.zeros( + 1, 1, 1, + dtype=query_layer.dtype, + device=query_layer.device, + ) + + matmul_result = torch.baddbmm( + matmul_result, + query_layer.transpose(0, 1), # [b * np, sq, hn] + key_layer.transpose(0, 1).transpose(1, 2), # [b * np, hn, sk] + beta=0.0, + alpha=1.0, + ) + + # change view to [b, np, sq, sk] + # attention_scores = matmul_result.view(*output_size) + attention_scores = matmul_result.unsqueeze(0) + + if self.scale_mask_softmax: + self.scale_mask_softmax.scale = query_key_layer_scaling_coeff + attention_probs = self.scale_mask_softmax(attention_scores, attention_mask.contiguous()) + else: + if not (attention_mask == 0).all(): + # if auto-regressive, skip + attention_scores.masked_fill_(attention_mask, -10000.0) + dtype = attention_scores.dtype + attention_scores = attention_scores.float() + attention_scores = attention_scores * query_key_layer_scaling_coeff + + attention_probs = F.softmax(attention_scores, dim=-1) + + attention_probs = attention_probs.type(dtype) + + # ========================= + # Context layer. [sq, b, hp] + # ========================= + + # value_layer -> context layer. + # [sk, b, np, hn] --> [b, np, sq, hn] + + # context layer shape: [b, np, sq, hn] + output_size = (value_layer.size(1), value_layer.size(2), query_layer.size(0), value_layer.size(3)) + + # change view [sk, b * np, hn] + # value_layer = value_layer.view(value_layer.size(0), output_size[0] * output_size[1], -1) + value_layer = value_layer.squeeze(1) + + # change view [b * np, sq, sk] + # attention_probs = attention_probs.view(output_size[0] * output_size[1], output_size[2], -1) + attention_probs = attention_probs.squeeze(0) + + # matmul: [b * np, sq, hn] + context_layer = torch.bmm(attention_probs, value_layer.transpose(0, 1)) + + # change view [b, np, sq, hn] + # context_layer = context_layer.view(*output_size) + context_layer = context_layer.unsqueeze(0) + + # [b, np, sq, hn] --> [sq, b, np, hn] + context_layer = context_layer.permute(2, 0, 1, 3).contiguous() + + # [sq, b, np, hn] --> [sq, b, hp] + new_context_layer_shape = context_layer.size()[:-2] + (hidden_size_per_partition,) + # context_layer = context_layer.view(*new_context_layer_shape) + context_layer = context_layer.view([-1, 1, hidden_size_per_partition]) + outputs = (context_layer, present, attention_probs) + + return outputs + + +def default_init(cls, *args, **kwargs): + return cls(*args, **kwargs) + + +class SelfAttention(torch.nn.Module): + def __init__(self, hidden_size, num_attention_heads, + layer_id, hidden_size_per_attention_head=None, bias=True, + params_dtype=torch.float, position_encoding_2d=True, empty_init=True): + if empty_init: + init_method = skip_init + else: + init_method = default_init + super(SelfAttention, self).__init__() + + self.layer_id = layer_id + self.hidden_size = hidden_size + self.hidden_size_per_partition = hidden_size + self.num_attention_heads = num_attention_heads + self.num_attention_heads_per_partition = num_attention_heads + self.position_encoding_2d = position_encoding_2d + self.rotary_emb = RotaryEmbedding( + self.hidden_size // (self.num_attention_heads * 2) + if position_encoding_2d + else self.hidden_size // self.num_attention_heads, + base=10000, + precision=torch.half, + learnable=False, + ) + + self.scale_mask_softmax = None + + if hidden_size_per_attention_head is None: + self.hidden_size_per_attention_head = hidden_size // num_attention_heads + else: + self.hidden_size_per_attention_head = hidden_size_per_attention_head + + self.inner_hidden_size = num_attention_heads * self.hidden_size_per_attention_head + + # Strided linear layer. + self.query_key_value = init_method( + torch.nn.Linear, + hidden_size, + 3 * self.inner_hidden_size, + bias=bias, + dtype=params_dtype, + ) + + self.dense = init_method( + torch.nn.Linear, + self.inner_hidden_size, + hidden_size, + bias=bias, + dtype=params_dtype, + ) + + @staticmethod + def attention_mask_func(attention_scores, attention_mask): + attention_scores.masked_fill_(attention_mask, -10000.0) + return attention_scores + + def split_tensor_along_last_dim(self, tensor, num_partitions, + contiguous_split_chunks=False): + """Split a tensor along its last dimension. + Arguments: + tensor: input tensor. + num_partitions: number of partitions to split the tensor + contiguous_split_chunks: If True, make each chunk contiguous + in memory. + """ + # Get the size and dimension. + last_dim = tensor.dim() - 1 + last_dim_size = tensor.size()[last_dim] // num_partitions + # Split. + tensor_list = torch.split(tensor, last_dim_size, dim=last_dim) + # Note: torch.split does not create contiguous tensors by default. + if contiguous_split_chunks: + return tuple(chunk.contiguous() for chunk in tensor_list) + + return tensor_list + + def forward( + self, + hidden_states: torch.Tensor, + position_ids, + attention_mask: torch.Tensor, + layer_id, + layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, + use_cache: bool = False, + output_attentions: bool = False, + ): + """ + hidden_states: [seq_len, batch, hidden_size] + attention_mask: [(1, 1), seq_len, seq_len] + """ + + # [seq_len, batch, 3 * hidden_size] + mixed_raw_layer = self.query_key_value(hidden_states) + + # [seq_len, batch, 3 * hidden_size] --> [seq_len, batch, num_attention_heads, 3 * hidden_size_per_attention_head] + new_tensor_shape = mixed_raw_layer.size()[:-1] + ( + self.num_attention_heads_per_partition, + 3 * self.hidden_size_per_attention_head, + ) + mixed_raw_layer = mixed_raw_layer.view(*new_tensor_shape) + + # [seq_len, batch, num_attention_heads, hidden_size_per_attention_head] + (query_layer, key_layer, value_layer) = self.split_tensor_along_last_dim(mixed_raw_layer, 3) + + if self.position_encoding_2d: + q1, q2 = query_layer.chunk(2, dim=(query_layer.ndim - 1)) + k1, k2 = key_layer.chunk(2, dim=(key_layer.ndim - 1)) + cos, sin = self.rotary_emb(q1, seq_len=position_ids.max() + 1) + position_ids, block_position_ids = position_ids[:, 0, :].transpose(0, 1).contiguous(), \ + position_ids[:, 1, :].transpose(0, 1).contiguous() + q1, k1 = apply_rotary_pos_emb_index(q1, k1, cos, sin, position_ids) + q2, k2 = apply_rotary_pos_emb_index(q2, k2, cos, sin, block_position_ids) + query_layer = torch.concat([q1, q2], dim=(q1.ndim - 1)) + key_layer = torch.concat([k1, k2], dim=(k1.ndim - 1)) + else: + position_ids = position_ids.transpose(0, 1) + cos, sin = self.rotary_emb(value_layer, seq_len=position_ids.max() + 1) + # [seq_len, batch, num_attention_heads, hidden_size_per_attention_head] + query_layer, key_layer = apply_rotary_pos_emb_index(query_layer, key_layer, cos, sin, position_ids) + + # [seq_len, batch, hidden_size] + context_layer, present, attention_probs = attention_fn( + self=self, + query_layer=query_layer, + key_layer=key_layer, + value_layer=value_layer, + attention_mask=attention_mask, + hidden_size_per_partition=self.hidden_size_per_partition, + layer_id=layer_id, + layer_past=layer_past, + use_cache=use_cache + ) + + output = self.dense(context_layer) + + outputs = (output, present) + + if output_attentions: + outputs += (attention_probs,) + + return outputs # output, present, attention_probs + + +class GEGLU(torch.nn.Module): + def __init__(self): + super().__init__() + self.activation_fn = F.gelu + + def forward(self, x): + # dim=-1 breaks in jit for pt<1.10 + x1, x2 = x.chunk(2, dim=(x.ndim - 1)) + return x1 * self.activation_fn(x2) + + +class GLU(torch.nn.Module): + def __init__(self, hidden_size, inner_hidden_size=None, + layer_id=None, bias=True, activation_func=gelu, params_dtype=torch.float, empty_init=True): + super(GLU, self).__init__() + if empty_init: + init_method = skip_init + else: + init_method = default_init + self.layer_id = layer_id + self.activation_func = activation_func + + # Project to 4h. + self.hidden_size = hidden_size + if inner_hidden_size is None: + inner_hidden_size = 4 * hidden_size + self.inner_hidden_size = inner_hidden_size + self.dense_h_to_4h = init_method( + torch.nn.Linear, + self.hidden_size, + self.inner_hidden_size, + bias=bias, + dtype=params_dtype, + ) + # Project back to h. + self.dense_4h_to_h = init_method( + torch.nn.Linear, + self.inner_hidden_size, + self.hidden_size, + bias=bias, + dtype=params_dtype, + ) + + def forward(self, hidden_states): + """ + hidden_states: [seq_len, batch, hidden_size] + """ + + # [seq_len, batch, inner_hidden_size] + intermediate_parallel = self.dense_h_to_4h(hidden_states) + + intermediate_parallel = self.activation_func(intermediate_parallel) + + output = self.dense_4h_to_h(intermediate_parallel) + + return output + + +class GLMBlock(torch.nn.Module): + def __init__( + self, + hidden_size, + num_attention_heads, + layernorm_epsilon, + layer_id, + inner_hidden_size=None, + hidden_size_per_attention_head=None, + layernorm=LayerNorm, + use_bias=True, + params_dtype=torch.float, + num_layers=28, + position_encoding_2d=True, + empty_init=True + ): + super(GLMBlock, self).__init__() + # Set output layer initialization if not provided. + + self.layer_id = layer_id + + # Layernorm on the input data. + self.input_layernorm = layernorm(hidden_size, eps=layernorm_epsilon) + + self.position_encoding_2d = position_encoding_2d + + # Self attention. + self.attention = SelfAttention( + hidden_size, + num_attention_heads, + layer_id, + hidden_size_per_attention_head=hidden_size_per_attention_head, + bias=use_bias, + params_dtype=params_dtype, + position_encoding_2d=self.position_encoding_2d, + empty_init=empty_init + ) + + # Layernorm on the input data. + self.post_attention_layernorm = layernorm(hidden_size, eps=layernorm_epsilon) + + self.num_layers = num_layers + + # GLU + self.mlp = GLU( + hidden_size, + inner_hidden_size=inner_hidden_size, + bias=use_bias, + layer_id=layer_id, + params_dtype=params_dtype, + empty_init=empty_init + ) + + def forward( + self, + hidden_states: torch.Tensor, + position_ids, + attention_mask: torch.Tensor, + layer_id, + layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, + use_cache: bool = False, + output_attentions: bool = False, + ): + """ + hidden_states: [seq_len, batch, hidden_size] + attention_mask: [(1, 1), seq_len, seq_len] + """ + + # Layer norm at the begining of the transformer layer. + # [seq_len, batch, hidden_size] + attention_input = self.input_layernorm(hidden_states) + + # Self attention. + attention_outputs = self.attention( + attention_input, + position_ids, + attention_mask=attention_mask, + layer_id=layer_id, + layer_past=layer_past, + use_cache=use_cache, + output_attentions=output_attentions + ) + + attention_output = attention_outputs[0] + + outputs = attention_outputs[1:] + + # Residual connection. + alpha = (2 * self.num_layers) ** 0.5 + hidden_states = attention_input * alpha + attention_output + + mlp_input = self.post_attention_layernorm(hidden_states) + + # MLP. + mlp_output = self.mlp(mlp_input) + + # Second residual connection. + output = mlp_input * alpha + mlp_output + + if use_cache: + outputs = (output,) + outputs + else: + outputs = (output,) + outputs[1:] + + return outputs # hidden_states, present, attentions + + +class ChatGLMPreTrainedModel(PreTrainedModel): + """ + An abstract class to handle weights initialization and + a simple interface for downloading and loading pretrained models. + """ + + is_parallelizable = False + supports_gradient_checkpointing = True + config_class = ChatGLMConfig + base_model_prefix = "transformer" + _no_split_modules = ["GLMBlock"] + + def __init__(self, *inputs, **kwargs): + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module: nn.Module): + """Initialize the weights.""" + return + + def get_masks(self, input_ids, device): + batch_size, seq_length = input_ids.shape + context_lengths = [seq.tolist().index(self.config.bos_token_id) for seq in input_ids] + attention_mask = torch.ones((batch_size, seq_length, seq_length), device=device) + attention_mask.tril_() + for i, context_length in enumerate(context_lengths): + attention_mask[i, :, :context_length] = 1 + attention_mask.unsqueeze_(1) + attention_mask = (attention_mask < 0.5).bool() + + return attention_mask + + def get_position_ids(self, input_ids, mask_positions, device, use_gmasks=None): + batch_size, seq_length = input_ids.shape + if use_gmasks is None: + use_gmasks = [False] * batch_size + context_lengths = [seq.tolist().index(self.config.bos_token_id) for seq in input_ids] + if self.position_encoding_2d: + position_ids = torch.arange(seq_length, dtype=torch.long, device=device).unsqueeze(0).repeat(batch_size, 1) + for i, context_length in enumerate(context_lengths): + position_ids[i, context_length:] = mask_positions[i] + block_position_ids = [torch.cat(( + torch.zeros(context_length, dtype=torch.long, device=device), + torch.arange(seq_length - context_length, dtype=torch.long, device=device) + 1 + )) for context_length in context_lengths] + block_position_ids = torch.stack(block_position_ids, dim=0) + position_ids = torch.stack((position_ids, block_position_ids), dim=1) + else: + position_ids = torch.arange(seq_length, dtype=torch.long, device=device).unsqueeze(0).repeat(batch_size, 1) + for i, context_length in enumerate(context_lengths): + if not use_gmasks[i]: + position_ids[i, context_length:] = mask_positions[i] + + return position_ids + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, ChatGLMModel): + module.gradient_checkpointing = value + + +CHATGLM_6B_START_DOCSTRING = r""" + This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) sub-class. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general + usage and behavior. + + Parameters: + config ([`~ChatGLM6BConfig`]): Model configuration class with all the parameters of the model. + Initializing with a config file does not load the weights associated with the model, only the configuration. + Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + +CHATGLM_6B_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `({0})`): + Indices of input sequence tokens in the vocabulary. + + Indices can be obtained using [`ChatGLM6BTokenizer`]. + See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.FloatTensor` of shape `({0})`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + token_type_ids (`torch.LongTensor` of shape `({0})`, *optional*): + Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0, 1]`: + + - 0 corresponds to a *sentence A* token, + - 1 corresponds to a *sentence B* token. + + [What are token type IDs?](../glossary#token-type-ids) + position_ids (`torch.LongTensor` of shape `({0})`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. + Selected in the range `[0, config.max_position_embeddings - 1]`. + + [What are position IDs?](../glossary#position-ids) + head_mask (`torch.FloatTensor` of shape `(num_heads,)` or `(num_layers, num_heads)`, *optional*): + Mask to nullify selected heads of the self-attention modules. Mask values selected in `[0, 1]`: + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + + inputs_embeds (`torch.FloatTensor` of shape `({0}, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. + This is useful if you want more control over how to convert *input_ids* indices into associated vectors + than the model's internal embedding lookup matrix. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare ChatGLM-6B Model transformer outputting raw hidden-states without any specific head on top.", + CHATGLM_6B_START_DOCSTRING, +) +class ChatGLMModel(ChatGLMPreTrainedModel): + """ + + The model can behave as an encoder (with only self-attention) as well + as a decoder, in which case a layer of cross-attention is added between + the self-attention layers, following the architecture described in [Attention is + all you need](https://arxiv.org/abs/1706.03762) by Ashish Vaswani, + Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin. + + To behave as an decoder the model needs to be initialized with the + `is_decoder` argument of the configuration set to `True`. + To be used in a Seq2Seq model, the model needs to initialized with both `is_decoder` + argument and `add_cross_attention` set to `True`; an + `encoder_hidden_states` is then expected as an input to the forward pass. + """ + + def __init__(self, config: ChatGLMConfig, empty_init=True): + super().__init__(config) + if empty_init: + init_method = skip_init + else: + init_method = default_init + # recording parameters + self.max_sequence_length = config.max_sequence_length + self.hidden_size = config.hidden_size + self.params_dtype = torch.half + self.num_attention_heads = config.num_attention_heads + self.vocab_size = config.vocab_size + self.num_layers = config.num_layers + self.layernorm_epsilon = config.layernorm_epsilon + self.inner_hidden_size = config.inner_hidden_size + self.hidden_size_per_attention_head = self.hidden_size // self.num_attention_heads + self.position_encoding_2d = config.position_encoding_2d + self.pre_seq_len = config.pre_seq_len + self.prefix_projection = config.prefix_projection + + self.word_embeddings = init_method( + torch.nn.Embedding, + num_embeddings=self.vocab_size, embedding_dim=self.hidden_size, + dtype=self.params_dtype + ) + self.gradient_checkpointing = False + + def get_layer(layer_id): + return GLMBlock( + self.hidden_size, + self.num_attention_heads, + self.layernorm_epsilon, + layer_id, + inner_hidden_size=self.inner_hidden_size, + hidden_size_per_attention_head=self.hidden_size_per_attention_head, + layernorm=LayerNorm, + use_bias=True, + params_dtype=self.params_dtype, + position_encoding_2d=self.position_encoding_2d, + empty_init=empty_init + ) + + self.layers = torch.nn.ModuleList( + [get_layer(layer_id) for layer_id in range(self.num_layers)] + ) + + # Final layer norm before output. + self.final_layernorm = LayerNorm(self.hidden_size, eps=self.layernorm_epsilon) + + if self.pre_seq_len is not None: + for param in self.parameters(): + param.requires_grad = False + self.prefix_tokens = torch.arange(self.pre_seq_len).long() + self.prefix_encoder = PrefixEncoder(config) + self.dropout = torch.nn.Dropout(0.1) + + # total_params = sum(p.numel() for p in self.parameters()) + # trainable_params = sum(p.numel() for p in self.parameters() if p.requires_grad) + # print("Using p-tuning v2: # trainable_params = {} / {}".format(trainable_params, total_params)) + + def get_input_embeddings(self): + return self.word_embeddings + + def set_input_embeddings(self, new_embeddings: torch.Tensor): + self.word_embeddings = new_embeddings + + def get_prompt(self, batch_size, device, dtype=torch.half): + prefix_tokens = self.prefix_tokens.unsqueeze(0).expand(batch_size, -1).to(device) + past_key_values = self.prefix_encoder(prefix_tokens).type(dtype) + past_key_values = past_key_values.view( + batch_size, + self.pre_seq_len, + self.num_layers * 2, + self.num_attention_heads, + self.hidden_size // self.num_attention_heads + ) + # seq_len, b, nh, hidden_size + past_key_values = self.dropout(past_key_values) + past_key_values = past_key_values.permute([2, 1, 0, 3, 4]).split(2) + # past_key_values = [(v[0], v[1]) for v in past_key_values] + return past_key_values + + @add_start_docstrings_to_model_forward(CHATGLM_6B_INPUTS_DOCSTRING.format("batch_size, sequence_length")) + @add_code_sample_docstrings( + checkpoint=_CHECKPOINT_FOR_DOC, + output_type=BaseModelOutputWithPastAndCrossAttentions, + config_class=_CONFIG_FOR_DOC, + ) + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + attention_mask: Optional[torch.Tensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + inputs_embeds: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple[torch.Tensor, ...], BaseModelOutputWithPast]: + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape[:2] + elif inputs_embeds is not None: + batch_size, seq_length = inputs_embeds.shape[:2] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + + if past_key_values is None: + if self.pre_seq_len is not None: + past_key_values = self.get_prompt(batch_size=input_ids.shape[0], device=input_ids.device, + dtype=inputs_embeds.dtype) + else: + past_key_values = tuple([None] * len(self.layers)) + + if attention_mask is None: + attention_mask = self.get_masks( + input_ids, + device=input_ids.device + ) + + + if position_ids is None: + MASK, gMASK = self.config.mask_token_id, self.config.gmask_token_id + seqs = input_ids.tolist() + + mask_positions, use_gmasks = [], [] + for seq in seqs: + mask_token = gMASK if gMASK in seq else MASK + use_gmask = mask_token == gMASK + mask_positions.append(seq.index(mask_token)) + use_gmasks.append(use_gmask) + + position_ids = self.get_position_ids( + input_ids, + mask_positions=mask_positions, + device=input_ids.device, + use_gmasks=use_gmasks + ) + + if self.pre_seq_len is not None and attention_mask is not None: + prefix_attention_mask = torch.ones(batch_size, 1, input_ids.size(-1), self.pre_seq_len).to( + attention_mask.device) + prefix_attention_mask = (prefix_attention_mask < 0.5).bool() + attention_mask = torch.cat((prefix_attention_mask, attention_mask), dim=3) + + # [seq_len, batch, hidden_size] + hidden_states = inputs_embeds.transpose(0, 1) + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + + if attention_mask is None: + attention_mask = torch.zeros(1, 1, device=input_ids.device).bool() + else: + attention_mask = attention_mask.to(hidden_states.device) + + for i, layer in enumerate(self.layers): + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + layer_past = past_key_values[i] + + if self.gradient_checkpointing and self.training: + layer_ret = torch.utils.checkpoint.checkpoint( + layer, + hidden_states, + position_ids, + attention_mask, + torch.tensor(i), + layer_past, + use_cache, + output_attentions + ) + else: + layer_ret = layer( + hidden_states, + position_ids=position_ids, + attention_mask=attention_mask, + layer_id=torch.tensor(i), + layer_past=layer_past, + use_cache=use_cache, + output_attentions=output_attentions + ) + + hidden_states = layer_ret[0] + + if use_cache: + presents = presents + (layer_ret[1],) + + if output_attentions: + all_self_attentions = all_self_attentions + (layer_ret[2 if use_cache else 1],) + + # Final layer norm. + hidden_states = self.final_layernorm(hidden_states) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + if not return_dict: + return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class ChatGLMForConditionalGeneration(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, empty_init=True): + super().__init__(config) + if empty_init: + init_method = skip_init + else: + init_method = default_init + + # self.hidden_size = config.hidden_size + # self.params_dtype = torch.half + # self.vocab_size = config.vocab_size + self.max_sequence_length = config.max_sequence_length + + self.position_encoding_2d = config.position_encoding_2d + + self.transformer = ChatGLMModel(config, empty_init=empty_init) + + self.lm_head = init_method( + nn.Linear, + config.hidden_size, + config.vocab_size, + bias=False, + dtype=torch.half + ) + + self.config = config + + self.quantized = False + + if self.config.quantization_bit: + self.quantize(self.config.quantization_bit, empty_init=True) + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def _update_model_kwargs_for_generation( + self, + outputs: ModelOutput, + model_kwargs: Dict[str, Any], + is_encoder_decoder: bool = False, + standardize_cache_format: bool = False, + ) -> Dict[str, Any]: + # update past_key_values + model_kwargs["past_key_values"] = self._extract_past_from_model_output( + outputs, standardize_cache_format=standardize_cache_format + ) + + # update attention mask + if "attention_mask" in model_kwargs: + attention_mask = model_kwargs["attention_mask"] + if attention_mask is not None and attention_mask.dtype == torch.bool: + attention_mask = torch.cat( + [attention_mask, attention_mask.new_ones((*attention_mask.shape[:3], 1))], dim=3) + new_attention_mask = attention_mask[:, :, -1:].clone() + new_attention_mask[..., -1] = False + model_kwargs["attention_mask"] = torch.cat( + [attention_mask, new_attention_mask], dim=2 + ) + + # update position ids + if "position_ids" in model_kwargs: + position_ids = model_kwargs["position_ids"] + new_position_id = position_ids[..., -1:].clone() + new_position_id[:, 1, :] += 1 + model_kwargs["position_ids"] = torch.cat( + [position_ids, new_position_id], dim=-1 + ) + + return model_kwargs + + def prepare_inputs_for_generation( + self, + input_ids: torch.LongTensor, + past: Optional[torch.Tensor] = None, + past_key_values: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + **kwargs + ) -> dict: + batch_size, seq_length = input_ids.shape + MASK, gMASK = self.config.mask_token_id, self.config.gmask_token_id + seqs = input_ids.tolist() + mask_positions, use_gmasks = [], [] + for seq in seqs: + mask_token = gMASK if gMASK in seq else MASK + use_gmask = mask_token == gMASK + mask_positions.append(seq.index(mask_token)) + use_gmasks.append(use_gmask) + + # only last token for input_ids if past is not None + if past is not None or past_key_values is not None: + last_token = input_ids[:, -1].unsqueeze(-1) + if attention_mask is not None and attention_mask.dtype == torch.bool: + attention_mask = attention_mask[:, :, -1:] + else: + attention_mask = None + if position_ids is not None: + position_ids = position_ids[..., -1:] + else: + context_lengths = [seq.index(self.config.bos_token_id) for seq in seqs] + if self.position_encoding_2d: + position_ids = torch.tensor( + [[mask_position, seq_length - context_length] for mask_position, context_length in + zip(mask_positions, context_lengths)], dtype=torch.long, device=input_ids.device).unsqueeze(-1) + else: + position_ids = torch.tensor([mask_position for mask_position in mask_positions], dtype=torch.long, + device=input_ids.device).unsqueeze(-1) + + if past is None: + past = past_key_values + return { + "input_ids": last_token, + "past_key_values": past, + "position_ids": position_ids, + "attention_mask": attention_mask + } + else: + if attention_mask is not None and attention_mask.dtype != torch.bool: + logger.warning_once(f"The dtype of attention mask ({attention_mask.dtype}) is not bool") + attention_mask = None + if attention_mask is None: + attention_mask = self.get_masks( + input_ids, + device=input_ids.device + ) + if position_ids is None: + position_ids = self.get_position_ids( + input_ids, + device=input_ids.device, + mask_positions=mask_positions, + use_gmasks=use_gmasks + ) + + return { + "input_ids": input_ids, + "past_key_values": past, + "position_ids": position_ids, + "attention_mask": attention_mask + } + + def forward( + self, + input_ids: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + past_key_values: Optional[Tuple[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.transformer( + input_ids=input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + + lm_logits = self.lm_head(hidden_states).permute(1, 0, 2).contiguous() + + loss = None + if labels is not None: + lm_logits = lm_logits.to(torch.float32) + + # Shift so that tokens < n predict n + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss(ignore_index=-100) + loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) + + lm_logits = lm_logits.to(hidden_states.dtype) + loss = loss.to(hidden_states.dtype) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], beam_idx: torch.LongTensor + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]: + """ + This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or + [`~PreTrainedModel.beam_sample`] is called. This is required to match `past_key_values` with the correct + beam_idx at every generation step. + + Output shares the same memory storage as `past`. + """ + return tuple( + ( + layer_past[0].index_select(1, beam_idx.to(layer_past[0].device)), + layer_past[1].index_select(1, beam_idx.to(layer_past[1].device)), + ) + for layer_past in past + ) + + def process_response(self, response): + response = response.strip() + response = response.replace("[[训练时间]]", "2023年") + punkts = [ + [",", ","], + ["!", "!"], + [":", ":"], + [";", ";"], + ["\?", "?"], + ] + for item in punkts: + response = re.sub(r"([\u4e00-\u9fff])%s" % item[0], r"\1%s" % item[1], response) + response = re.sub(r"%s([\u4e00-\u9fff])" % item[0], r"%s\1" % item[1], response) + return response + + @torch.no_grad() + def chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, max_length: int = 2048, num_beams=1, + do_sample=True, top_p=0.7, temperature=0.95, logits_processor=None, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "num_beams": num_beams, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + if not history: + prompt = query + else: + prompt = "" + for i, (old_query, response) in enumerate(history): + prompt += "[Round {}]\n问:{}\n答:{}\n".format(i, old_query, response) + prompt += "[Round {}]\n问:{}\n答:".format(len(history), query) + inputs = tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self.device) + outputs = self.generate(**inputs, **gen_kwargs) + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):] + response = tokenizer.decode(outputs) + response = self.process_response(response) + history = history + [(query, response)] + return response, history + + @torch.no_grad() + def stream_chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, max_length: int = 2048, + do_sample=True, top_p=0.7, temperature=0.95, logits_processor=None, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + if not history: + prompt = query + else: + prompt = "" + for i, (old_query, response) in enumerate(history): + prompt += "[Round {}]\n问:{}\n答:{}\n".format(i, old_query, response) + prompt += "[Round {}]\n问:{}\n答:".format(len(history), query) + inputs = tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self.device) + for outputs in self.stream_generate(**inputs, **gen_kwargs): + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):] + response = tokenizer.decode(outputs) + response = self.process_response(response) + new_history = history + [(query, response)] + yield response, new_history + + @torch.no_grad() + def stream_generate( + self, + input_ids, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[Callable[[int, torch.Tensor], List[int]]] = None, + **kwargs, + ): + batch_size, input_ids_seq_length = input_ids.shape[0], input_ids.shape[-1] + + if generation_config is None: + generation_config = self.generation_config + generation_config = copy.deepcopy(generation_config) + model_kwargs = generation_config.update(**kwargs) + bos_token_id, eos_token_id = generation_config.bos_token_id, generation_config.eos_token_id + + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + + has_default_max_length = kwargs.get("max_length") is None and generation_config.max_length is not None + if has_default_max_length and generation_config.max_new_tokens is None: + warnings.warn( + f"Using `max_length`'s default ({generation_config.max_length}) to control the generation length. " + "This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we" + " recommend using `max_new_tokens` to control the maximum length of the generation.", + UserWarning, + ) + elif generation_config.max_new_tokens is not None: + generation_config.max_length = generation_config.max_new_tokens + input_ids_seq_length + if not has_default_max_length: + logger.warn( + f"Both `max_new_tokens` (={generation_config.max_new_tokens}) and `max_length`(=" + f"{generation_config.max_length}) seem to have been set. `max_new_tokens` will take precedence. " + "Please refer to the documentation for more information. " + "(https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)", + UserWarning, + ) + + if input_ids_seq_length >= generation_config.max_length: + input_ids_string = "decoder_input_ids" if self.config.is_encoder_decoder else "input_ids" + logger.warning( + f"Input length of {input_ids_string} is {input_ids_seq_length}, but `max_length` is set to" + f" {generation_config.max_length}. This can lead to unexpected behavior. You should consider" + " increasing `max_new_tokens`." + ) + + # 2. Set generation parameters if not already defined + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + + logits_processor = self._get_logits_processor( + generation_config=generation_config, + input_ids_seq_length=input_ids_seq_length, + encoder_input_ids=input_ids, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + logits_processor=logits_processor, + ) + + stopping_criteria = self._get_stopping_criteria( + generation_config=generation_config, stopping_criteria=stopping_criteria + ) + logits_warper = self._get_logits_warper(generation_config) + + unfinished_sequences = input_ids.new(input_ids.shape[0]).fill_(1) + scores = None + while True: + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + # forward pass to get next token + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=False, + output_hidden_states=False, + ) + + next_token_logits = outputs.logits[:, -1, :] + + # pre-process distribution + next_token_scores = logits_processor(input_ids, next_token_logits) + next_token_scores = logits_warper(input_ids, next_token_scores) + + # sample + probs = nn.functional.softmax(next_token_scores, dim=-1) + if generation_config.do_sample: + next_tokens = torch.multinomial(probs, num_samples=1).squeeze(1) + else: + next_tokens = torch.argmax(probs, dim=-1) + + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + unfinished_sequences = unfinished_sequences.mul((sum(next_tokens != i for i in eos_token_id)).long()) + + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + break + yield input_ids + + def quantize(self, bits: int, empty_init=False, **kwargs): + if bits == 0: + return + + from .quantization import quantize + + if self.quantized: + logger.info("Already quantized.") + return self + + self.quantized = True + + self.config.quantization_bit = bits + + self.transformer = quantize(self.transformer, bits, empty_init=empty_init, **kwargs) + return self diff --git a/transformers/llm/export/llm_models/chatglm2-6b/modeling_chatglm.py b/transformers/llm/export/llm_models/chatglm2-6b/modeling_chatglm.py new file mode 100644 index 000000000..e9b5ca258 --- /dev/null +++ b/transformers/llm/export/llm_models/chatglm2-6b/modeling_chatglm.py @@ -0,0 +1,1193 @@ +""" PyTorch ChatGLM model. """ + +import math +import copy +import warnings +import re +import sys + +import torch +import torch.utils.checkpoint +import torch.nn.functional as F +from torch import nn +from torch.nn import CrossEntropyLoss, LayerNorm +from torch.nn.utils import skip_init +from typing import Optional, Tuple, Union, List, Callable, Dict, Any + +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging +from transformers.generation.logits_process import LogitsProcessor +from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput + +from .configuration_chatglm import ChatGLMConfig + +# flags required to enable jit fusion kernels + +if sys.platform != 'darwin': + torch._C._jit_set_profiling_mode(False) + torch._C._jit_set_profiling_executor(False) + torch._C._jit_override_can_fuse_on_cpu(True) + torch._C._jit_override_can_fuse_on_gpu(True) + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "THUDM/ChatGLM2-6B" +_CONFIG_FOR_DOC = "ChatGLM6BConfig" + +CHATGLM_6B_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "THUDM/chatglm2-6b", + # See all ChatGLM models at https://huggingface.co/models?filter=chatglm +] + + +def default_init(cls, *args, **kwargs): + return cls(*args, **kwargs) + + +class InvalidScoreLogitsProcessor(LogitsProcessor): + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if torch.isnan(scores).any() or torch.isinf(scores).any(): + scores.zero_() + scores[..., 5] = 5e4 + return scores + + +class PrefixEncoder(torch.nn.Module): + """ + The torch.nn model to encode the prefix + Input shape: (batch-size, prefix-length) + Output shape: (batch-size, prefix-length, 2*layers*hidden) + """ + + def __init__(self, config: ChatGLMConfig): + super().__init__() + self.prefix_projection = config.prefix_projection + if self.prefix_projection: + # Use a two-layer MLP to encode the prefix + kv_size = config.num_layers * config.kv_channels * config.multi_query_group_num * 2 + self.embedding = torch.nn.Embedding(config.pre_seq_len, kv_size) + self.trans = torch.nn.Sequential( + torch.nn.Linear(kv_size, config.hidden_size), + torch.nn.Tanh(), + torch.nn.Linear(config.hidden_size, kv_size) + ) + else: + self.embedding = torch.nn.Embedding(config.pre_seq_len, + config.num_layers * config.kv_channels * config.multi_query_group_num * 2) + + def forward(self, prefix: torch.Tensor): + if self.prefix_projection: + prefix_tokens = self.embedding(prefix) + past_key_values = self.trans(prefix_tokens) + else: + past_key_values = self.embedding(prefix) + return past_key_values + + +def split_tensor_along_last_dim( + tensor: torch.Tensor, + num_partitions: int, + contiguous_split_chunks: bool = False, +) -> List[torch.Tensor]: + """Split a tensor along its last dimension. + + Arguments: + tensor: input tensor. + num_partitions: number of partitions to split the tensor + contiguous_split_chunks: If True, make each chunk contiguous + in memory. + + Returns: + A list of Tensors + """ + # Get the size and dimension. + last_dim = tensor.dim() - 1 + last_dim_size = tensor.size()[last_dim] // num_partitions + # Split. + tensor_list = torch.split(tensor, last_dim_size, dim=last_dim) + # Note: torch.split does not create contiguous tensors by default. + if contiguous_split_chunks: + return tuple(chunk.contiguous() for chunk in tensor_list) + + return tensor_list + + +class RotaryEmbedding(nn.Module): + def __init__(self, dim, original_impl=False, device=None, dtype=None): + super().__init__() + inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2, device=device).to(dtype=dtype) / dim)) + self.register_buffer("inv_freq", inv_freq) + self.dim = dim + self.original_impl = original_impl + + def forward_impl( + self, seq_len: int, n_elem: int, dtype: torch.dtype, device: torch.device, base: int = 10000 + ): + """Enhanced Transformer with Rotary Position Embedding. + + Derived from: https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/labml_nn/ + transformers/rope/__init__.py. MIT License: + https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/license. + """ + # $\Theta = {\theta_i = 10000^{\frac{2(i-1)}{d}}, i \in [1, 2, ..., \frac{d}{2}]}$ + theta = 1.0 / (base ** (torch.arange(0, n_elem, 2, dtype=dtype, device=device) / n_elem)) + + # Create position indexes `[0, 1, ..., seq_len - 1]` + seq_idx = torch.arange(seq_len, dtype=dtype, device=device) + + # Calculate the product of position index and $\theta_i$ + idx_theta = torch.outer(seq_idx, theta).float() + + cache = torch.stack([torch.cos(idx_theta), torch.sin(idx_theta)], dim=-1) + + # this is to mimic the behaviour of complex32, else we will get different results + if dtype in (torch.float16, torch.bfloat16, torch.int8): + cache = cache.bfloat16() if dtype == torch.bfloat16 else cache.half() + return cache + + def forward(self, max_seq_len, offset=0): + return self.forward_impl( + max_seq_len, self.dim, dtype=self.inv_freq.dtype, device=self.inv_freq.device + ) + + +@torch.jit.script +def apply_rotary_pos_emb(x: torch.Tensor, rope_cache: torch.Tensor) -> torch.Tensor: + # x: [sq, b, np, hn] + sq, b, np, hn = x.size(0), x.size(1), x.size(2), x.size(3) + rot_dim = rope_cache.shape[-2] * 2 + x, x_pass = x[..., :rot_dim], x[..., rot_dim:] + # truncate to support variable sizes + rope_cache = rope_cache[:sq] + xshaped = x.reshape(sq, -1, np, rot_dim // 2, 2) + rope_cache = rope_cache.view(sq, -1, 1, xshaped.size(3), 2) + x_out2 = torch.stack( + [ + xshaped[..., 0] * rope_cache[..., 0] - xshaped[..., 1] * rope_cache[..., 1], + xshaped[..., 1] * rope_cache[..., 0] + xshaped[..., 0] * rope_cache[..., 1], + ], + -1, + ) + x_out2 = x_out2.flatten(3) + return torch.cat((x_out2, x_pass), dim=-1) + + +class RMSNorm(torch.nn.Module): + def __init__(self, normalized_shape, eps=1e-5, device=None, dtype=None, **kwargs): + super().__init__() + self.weight = torch.nn.Parameter(torch.empty(normalized_shape, device=device, dtype=dtype)) + self.eps = eps + + def forward(self, hidden_states: torch.Tensor): + input_dtype = hidden_states.dtype + variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.eps) + + return (self.weight * hidden_states).to(input_dtype) + + +class CoreAttention(torch.nn.Module): + def __init__(self, config: ChatGLMConfig, layer_number): + super(CoreAttention, self).__init__() + + self.apply_query_key_layer_scaling = config.apply_query_key_layer_scaling + self.attention_softmax_in_fp32 = config.attention_softmax_in_fp32 + if self.apply_query_key_layer_scaling: + self.attention_softmax_in_fp32 = True + self.layer_number = max(1, layer_number) + + projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + self.hidden_size_per_partition = projection_size + self.hidden_size_per_attention_head = projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads + + coeff = None + self.norm_factor = math.sqrt(self.hidden_size_per_attention_head) + if self.apply_query_key_layer_scaling: + coeff = self.layer_number + self.norm_factor *= coeff + self.coeff = coeff + + self.attention_dropout = torch.nn.Dropout(config.attention_dropout) + + def forward(self, query_layer, key_layer, value_layer, attention_mask): + pytorch_major_version = int(torch.__version__.split('.')[0]) + if pytorch_major_version >= 2 and False: + query_layer, key_layer, value_layer = [k.permute(1, 2, 0, 3) for k in [query_layer, key_layer, value_layer]] + if attention_mask is None and query_layer.shape[2] == key_layer.shape[2]: + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, key_layer, value_layer, + is_causal=True) + else: + if attention_mask is not None: + attention_mask = ~attention_mask + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, key_layer, value_layer, + attention_mask) + context_layer = context_layer.permute(2, 0, 1, 3) + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size_per_partition,) + context_layer = context_layer.reshape(*new_context_layer_shape) + else: + # Raw attention scores + + # [b, np, sq, sk] + output_size = (query_layer.size(1), query_layer.size(2), query_layer.size(0), key_layer.size(0)) + + # [sq, b, np, hn] -> [sq, b * np, hn] + query_layer = query_layer.view(output_size[2], output_size[0] * output_size[1], -1) + # [sk, b, np, hn] -> [sk, b * np, hn] + key_layer = key_layer.view(output_size[3], output_size[0] * output_size[1], -1) + + # preallocting input tensor: [b * np, sq, sk] + matmul_input_buffer = torch.empty( + output_size[0] * output_size[1], output_size[2], output_size[3], dtype=query_layer.dtype, + device=query_layer.device + ) + + # Raw attention scores. [b * np, sq, sk] + matmul_result = torch.baddbmm( + matmul_input_buffer, + query_layer.transpose(0, 1), # [b * np, sq, hn] + key_layer.transpose(0, 1).transpose(1, 2), # [b * np, hn, sk] + beta=0.0, + alpha=(1.0 / self.norm_factor), + ) + + # change view to [b, np, sq, sk] + attention_scores = matmul_result.view(*output_size) + + # =========================== + # Attention probs and dropout + # =========================== + + # attention scores and attention mask [b, np, sq, sk] + if self.attention_softmax_in_fp32: + attention_scores = attention_scores.float() + if self.coeff is not None: + attention_scores = attention_scores * self.coeff + if attention_mask is None and attention_scores.shape[2] == attention_scores.shape[3]: + attention_mask = torch.ones(output_size[0], 1, output_size[2], output_size[3], + device=attention_scores.device, dtype=torch.bool) + attention_mask.tril_() + attention_mask = ~attention_mask + if attention_mask is not None: + attention_scores = attention_scores.masked_fill(attention_mask, float("-inf")) + attention_probs = F.softmax(attention_scores, dim=-1) + attention_probs = attention_probs.type_as(value_layer) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self.attention_dropout(attention_probs) + # ========================= + # Context layer. [sq, b, hp] + # ========================= + + # value_layer -> context layer. + # [sk, b, np, hn] --> [b, np, sq, hn] + + # context layer shape: [b, np, sq, hn] + output_size = (value_layer.size(1), value_layer.size(2), query_layer.size(0), value_layer.size(3)) + # change view [sk, b * np, hn] + value_layer = value_layer.view(value_layer.size(0), output_size[0] * output_size[1], -1) + # change view [b * np, sq, sk] + attention_probs = attention_probs.view(output_size[0] * output_size[1], output_size[2], -1) + # matmul: [b * np, sq, hn] + context_layer = torch.bmm(attention_probs, value_layer.transpose(0, 1)) + # change view [b, np, sq, hn] + context_layer = context_layer.view(*output_size) + # [b, np, sq, hn] --> [sq, b, np, hn] + context_layer = context_layer.permute(2, 0, 1, 3).contiguous() + # [sq, b, np, hn] --> [sq, b, hp] + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size_per_partition,) + context_layer = context_layer.view(*new_context_layer_shape) + + return context_layer + + +class SelfAttention(torch.nn.Module): + """Parallel self-attention layer abstract class. + + Self-attention layer takes input with size [s, b, h] + and returns output of the same size. + """ + + def __init__(self, config: ChatGLMConfig, layer_number, device=None): + super(SelfAttention, self).__init__() + self.layer_number = max(1, layer_number) + + self.projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + self.hidden_size_per_attention_head = self.projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads + + self.multi_query_attention = config.multi_query_attention + self.qkv_hidden_size = 3 * self.projection_size + if self.multi_query_attention: + self.num_multi_query_groups_per_partition = config.multi_query_group_num + self.qkv_hidden_size = ( + self.projection_size + 2 * self.hidden_size_per_attention_head * config.multi_query_group_num + ) + self.query_key_value = nn.Linear(config.hidden_size, self.qkv_hidden_size, + bias=config.add_bias_linear or config.add_qkv_bias, + device=device, **_config_to_kwargs(config) + ) + + self.core_attention = CoreAttention(config, self.layer_number) + + # Output. + self.dense = nn.Linear(self.projection_size, config.hidden_size, bias=config.add_bias_linear, + device=device, **_config_to_kwargs(config) + ) + + def _allocate_memory(self, inference_max_sequence_len, batch_size, device=None, dtype=None): + if self.multi_query_attention: + num_attention_heads = self.num_multi_query_groups_per_partition + else: + num_attention_heads = self.num_attention_heads_per_partition + return torch.empty( + inference_max_sequence_len, + batch_size, + num_attention_heads, + self.hidden_size_per_attention_head, + dtype=dtype, + device=device, + ) + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_cache=None, use_cache=True + ): + # hidden_states: [sq, b, h] + + # ================================================= + # Pre-allocate memory for key-values for inference. + # ================================================= + # ===================== + # Query, Key, and Value + # ===================== + + # Attention heads [sq, b, h] --> [sq, b, (np * 3 * hn)] + mixed_x_layer = self.query_key_value(hidden_states) + + if self.multi_query_attention: + (query_layer, key_layer, value_layer) = mixed_x_layer.split( + [ + self.num_attention_heads_per_partition * self.hidden_size_per_attention_head, + self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head, + self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head, + ], + dim=-1, + ) + query_layer = query_layer.view( + query_layer.size()[:-1] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + key_layer = key_layer.view( + key_layer.size()[:-1] + (self.num_multi_query_groups_per_partition, self.hidden_size_per_attention_head) + ) + value_layer = value_layer.view( + value_layer.size()[:-1] + + (self.num_multi_query_groups_per_partition, self.hidden_size_per_attention_head) + ) + else: + new_tensor_shape = mixed_x_layer.size()[:-1] + \ + (self.num_attention_heads_per_partition, + 3 * self.hidden_size_per_attention_head) + mixed_x_layer = mixed_x_layer.view(*new_tensor_shape) + + # [sq, b, np, 3 * hn] --> 3 [sq, b, np, hn] + (query_layer, key_layer, value_layer) = split_tensor_along_last_dim(mixed_x_layer, 3) + + # apply relative positional encoding (rotary embedding) + if rotary_pos_emb is not None: + query_layer = apply_rotary_pos_emb(query_layer, rotary_pos_emb) + key_layer = apply_rotary_pos_emb(key_layer, rotary_pos_emb) + + # adjust key and value for inference + if kv_cache is not None: + cache_k, cache_v = kv_cache + key_layer = torch.cat((cache_k, key_layer), dim=0) + value_layer = torch.cat((cache_v, value_layer), dim=0) + if use_cache: + kv_cache = (key_layer, value_layer) + else: + kv_cache = None + + if self.multi_query_attention: + key_layer = key_layer.unsqueeze(-2) + key_layer = key_layer.expand( + -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1 + ) + key_layer = key_layer.contiguous().view( + key_layer.size()[:2] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + value_layer = value_layer.unsqueeze(-2) + value_layer = value_layer.expand( + -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1 + ) + value_layer = value_layer.contiguous().view( + value_layer.size()[:2] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + + # ================================== + # core attention computation + # ================================== + + context_layer = self.core_attention(query_layer, key_layer, value_layer, attention_mask) + + # ================= + # Output. [sq, b, h] + # ================= + + output = self.dense(context_layer) + + return output, kv_cache + + +def _config_to_kwargs(args): + common_kwargs = { + "dtype": args.torch_dtype, + } + return common_kwargs + + +class MLP(torch.nn.Module): + """MLP. + + MLP will take the input with h hidden state, project it to 4*h + hidden dimension, perform nonlinear transformation, and project the + state back into h hidden dimension. + """ + + def __init__(self, config: ChatGLMConfig, device=None): + super(MLP, self).__init__() + + self.add_bias = config.add_bias_linear + + # Project to 4h. If using swiglu double the output width, see https://arxiv.org/pdf/2002.05202.pdf + self.dense_h_to_4h = nn.Linear( + config.hidden_size, + config.ffn_hidden_size * 2, + bias=self.add_bias, + device=device, + **_config_to_kwargs(config) + ) + + def swiglu(x): + x = torch.chunk(x, 2, dim=-1) + return F.silu(x[0]) * x[1] + + self.activation_func = swiglu + + # Project back to h. + self.dense_4h_to_h = nn.Linear( + config.ffn_hidden_size, + config.hidden_size, + bias=self.add_bias, + device=device, + **_config_to_kwargs(config) + ) + + def forward(self, hidden_states): + # [s, b, 4hp] + intermediate_parallel = self.dense_h_to_4h(hidden_states) + intermediate_parallel = self.activation_func(intermediate_parallel) + # [s, b, h] + output = self.dense_4h_to_h(intermediate_parallel) + return output + + +class GLMBlock(torch.nn.Module): + """A single transformer layer. + + Transformer layer takes input with size [s, b, h] and returns an + output of the same size. + """ + + def __init__(self, config: ChatGLMConfig, layer_number, device=None): + super(GLMBlock, self).__init__() + self.layer_number = layer_number + + self.apply_residual_connection_post_layernorm = config.apply_residual_connection_post_layernorm + + self.fp32_residual_connection = config.fp32_residual_connection + + LayerNormFunc = RMSNorm if config.rmsnorm else LayerNorm + # Layernorm on the input data. + self.input_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + # Self attention. + self.self_attention = SelfAttention(config, layer_number, device=device) + self.hidden_dropout = config.hidden_dropout + + # Layernorm on the attention output + self.post_attention_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + # MLP + self.mlp = MLP(config, device=device) + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_cache=None, use_cache=True, + ): + # hidden_states: [s, b, h] + + # Layer norm at the beginning of the transformer layer. + layernorm_output = self.input_layernorm(hidden_states) + # Self attention. + attention_output, kv_cache = self.self_attention( + layernorm_output, + attention_mask, + rotary_pos_emb, + kv_cache=kv_cache, + use_cache=use_cache + ) + + # Residual connection. + if self.apply_residual_connection_post_layernorm: + residual = layernorm_output + else: + residual = hidden_states + + layernorm_input = torch.nn.functional.dropout(attention_output, p=self.hidden_dropout, training=self.training) + layernorm_input = residual + layernorm_input + + # Layer norm post the self attention. + layernorm_output = self.post_attention_layernorm(layernorm_input) + + # MLP. + mlp_output = self.mlp(layernorm_output) + + # Second residual connection. + if self.apply_residual_connection_post_layernorm: + residual = layernorm_output + else: + residual = layernorm_input + + output = torch.nn.functional.dropout(mlp_output, p=self.hidden_dropout, training=self.training) + output = residual + output + + return output, kv_cache + + +class GLMTransformer(torch.nn.Module): + """Transformer class.""" + + def __init__(self, config: ChatGLMConfig, device=None): + super(GLMTransformer, self).__init__() + + self.fp32_residual_connection = config.fp32_residual_connection + self.post_layer_norm = config.post_layer_norm + + # Number of layers. + self.num_layers = config.num_layers + + # Transformer layers. + def build_layer(layer_number): + return GLMBlock(config, layer_number, device=device) + + self.layers = torch.nn.ModuleList([build_layer(i + 1) for i in range(self.num_layers)]) + + if self.post_layer_norm: + LayerNormFunc = RMSNorm if config.rmsnorm else LayerNorm + # Final layer norm before output. + self.final_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + self.gradient_checkpointing = False + + def _get_layer(self, layer_number): + return self.layers[layer_number] + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_caches=None, + use_cache: Optional[bool] = True, + output_hidden_states: Optional[bool] = False, + ): + if not kv_caches: + kv_caches = [None for _ in range(self.num_layers)] + presents = () if use_cache else None + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + all_self_attentions = None + all_hidden_states = () if output_hidden_states else None + for index in range(self.num_layers): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + layer = self._get_layer(index) + if self.gradient_checkpointing and self.training: + layer_ret = torch.utils.checkpoint.checkpoint( + layer, + hidden_states, + attention_mask, + rotary_pos_emb, + kv_caches[index], + use_cache + ) + else: + layer_ret = layer( + hidden_states, + attention_mask, + rotary_pos_emb, + kv_cache=kv_caches[index], + use_cache=use_cache + ) + hidden_states, kv_cache = layer_ret + if use_cache: + presents = presents + (kv_cache,) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + # Final layer norm. + if self.post_layer_norm: + hidden_states = self.final_layernorm(hidden_states) + + return hidden_states, presents, all_hidden_states, all_self_attentions + + +class ChatGLMPreTrainedModel(PreTrainedModel): + """ + An abstract class to handle weights initialization and + a simple interface for downloading and loading pretrained models. + """ + + is_parallelizable = False + supports_gradient_checkpointing = True + config_class = ChatGLMConfig + base_model_prefix = "transformer" + _no_split_modules = ["GLMBlock"] + + def _init_weights(self, module: nn.Module): + """Initialize the weights.""" + return + + def get_masks(self, input_ids, past_key_values, padding_mask=None): + batch_size, seq_length = input_ids.shape + full_attention_mask = torch.ones(batch_size, seq_length, seq_length, device=input_ids.device) + full_attention_mask.tril_() + past_length = 0 + if past_key_values: + past_length = past_key_values[0][0].shape[0] + if past_length: + full_attention_mask = torch.cat((torch.ones(batch_size, seq_length, past_length, + device=input_ids.device), full_attention_mask), dim=-1) + if padding_mask is not None: + full_attention_mask = full_attention_mask * padding_mask.unsqueeze(1) + if not past_length and padding_mask is not None: + full_attention_mask -= padding_mask.unsqueeze(-1) - 1 + full_attention_mask = (full_attention_mask < 0.5).bool() + full_attention_mask.unsqueeze_(1) + return full_attention_mask + + def get_position_ids(self, input_ids, device): + batch_size, seq_length = input_ids.shape + position_ids = torch.arange(seq_length, dtype=torch.long, device=device).unsqueeze(0).repeat(batch_size, 1) + return position_ids + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, GLMTransformer): + module.gradient_checkpointing = value + + +class Embedding(torch.nn.Module): + """Language model embeddings.""" + + def __init__(self, config: ChatGLMConfig, device=None): + super(Embedding, self).__init__() + + self.hidden_size = config.hidden_size + # Word embeddings (parallel). + self.word_embeddings = nn.Embedding( + config.padded_vocab_size, + self.hidden_size, + dtype=config.torch_dtype, + device=device + ) + self.fp32_residual_connection = config.fp32_residual_connection + + def forward(self, input_ids): + # Embeddings. + words_embeddings = self.word_embeddings(input_ids) + embeddings = words_embeddings + # Data format change to avoid explicit tranposes : [b s h] --> [s b h]. + embeddings = embeddings.transpose(0, 1).contiguous() + # If the input flag for fp32 residual connection is set, convert for float. + if self.fp32_residual_connection: + embeddings = embeddings.float() + return embeddings + + +class ChatGLMModel(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, device=None, empty_init=True): + super().__init__(config) + if empty_init: + init_method = skip_init + else: + init_method = default_init + init_kwargs = {} + if device is not None: + init_kwargs["device"] = device + self.embedding = init_method(Embedding, config, **init_kwargs) + self.num_layers = config.num_layers + self.multi_query_group_num = config.multi_query_group_num + self.kv_channels = config.kv_channels + + # Rotary positional embeddings + self.seq_length = config.seq_length + rotary_dim = ( + config.hidden_size // config.num_attention_heads if config.kv_channels is None else config.kv_channels + ) + + self.rotary_pos_emb = RotaryEmbedding(rotary_dim // 2, original_impl=config.original_rope, device=device, + dtype=config.torch_dtype) + self.encoder = init_method(GLMTransformer, config, **init_kwargs) + self.output_layer = init_method(nn.Linear, config.hidden_size, config.padded_vocab_size, bias=False, + dtype=config.torch_dtype, **init_kwargs) + self.pre_seq_len = config.pre_seq_len + self.prefix_projection = config.prefix_projection + if self.pre_seq_len is not None: + for param in self.parameters(): + param.requires_grad = False + self.prefix_tokens = torch.arange(self.pre_seq_len).long() + self.prefix_encoder = PrefixEncoder(config) + self.dropout = torch.nn.Dropout(0.1) + + def get_input_embeddings(self): + return self.embedding.word_embeddings + + def get_prompt(self, batch_size, device, dtype=torch.half): + prefix_tokens = self.prefix_tokens.unsqueeze(0).expand(batch_size, -1).to(device) + past_key_values = self.prefix_encoder(prefix_tokens).type(dtype) + past_key_values = past_key_values.view( + batch_size, + self.pre_seq_len, + self.num_layers * 2, + self.multi_query_group_num, + self.kv_channels + ) + # seq_len, b, nh, hidden_size + past_key_values = self.dropout(past_key_values) + past_key_values = past_key_values.permute([2, 1, 0, 3, 4]).split(2) + return past_key_values + + def forward( + self, + input_ids, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.BoolTensor] = None, + full_attention_mask: Optional[torch.BoolTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + batch_size, seq_length = input_ids.shape + + if inputs_embeds is None: + inputs_embeds = self.embedding(input_ids) + + if self.pre_seq_len is not None: + if past_key_values is None: + past_key_values = self.get_prompt(batch_size=batch_size, device=input_ids.device, + dtype=inputs_embeds.dtype) + if attention_mask is not None: + attention_mask = torch.cat([attention_mask.new_ones((batch_size, self.pre_seq_len)), + attention_mask], dim=-1) + + if full_attention_mask is None: + if (attention_mask is not None and not attention_mask.all()) or (past_key_values and seq_length != 1): + full_attention_mask = self.get_masks(input_ids, past_key_values, padding_mask=attention_mask) + + # Rotary positional embeddings + rotary_pos_emb = self.rotary_pos_emb(self.seq_length) + if position_ids is not None: + rotary_pos_emb = rotary_pos_emb[position_ids] + else: + rotary_pos_emb = rotary_pos_emb[None, :seq_length] + rotary_pos_emb = rotary_pos_emb.transpose(0, 1).contiguous() + + # Run encoder. + hidden_states, presents, all_hidden_states, all_self_attentions = self.encoder( + inputs_embeds, full_attention_mask, rotary_pos_emb=rotary_pos_emb, + kv_caches=past_key_values, use_cache=use_cache, output_hidden_states=output_hidden_states + ) + + if not return_dict: + return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + def quantize(self, weight_bit_width: int): + from .quantization import quantize + quantize(self.encoder, weight_bit_width) + return self + + +class ChatGLMForConditionalGeneration(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, empty_init=True, device=None): + super().__init__(config) + + self.max_sequence_length = config.max_length + self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device) + self.config = config + self.quantized = False + + if self.config.quantization_bit: + self.quantize(self.config.quantization_bit, empty_init=True) + + def _update_model_kwargs_for_generation( + self, + outputs: ModelOutput, + model_kwargs: Dict[str, Any], + is_encoder_decoder: bool = False, + standardize_cache_format: bool = False, + ) -> Dict[str, Any]: + # update past_key_values + model_kwargs["past_key_values"] = self._extract_past_from_model_output( + outputs, standardize_cache_format=standardize_cache_format + ) + + # update attention mask + if "attention_mask" in model_kwargs: + attention_mask = model_kwargs["attention_mask"] + model_kwargs["attention_mask"] = torch.cat( + [attention_mask, attention_mask.new_ones((attention_mask.shape[0], 1))], dim=-1 + ) + + # update position ids + if "position_ids" in model_kwargs: + position_ids = model_kwargs["position_ids"] + new_position_id = position_ids[..., -1:].clone() + new_position_id += 1 + model_kwargs["position_ids"] = torch.cat( + [position_ids, new_position_id], dim=-1 + ) + + model_kwargs["is_first_forward"] = False + return model_kwargs + + def prepare_inputs_for_generation( + self, + input_ids: torch.LongTensor, + past_key_values: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + is_first_forward: bool = True, + **kwargs + ) -> dict: + # only last token for input_ids if past is not None + if position_ids is None: + position_ids = self.get_position_ids(input_ids, device=input_ids.device) + if not is_first_forward: + position_ids = position_ids[..., -1:] + input_ids = input_ids[:, -1:] + return { + "input_ids": input_ids, + "past_key_values": past_key_values, + "position_ids": position_ids, + "attention_mask": attention_mask, + "return_last_logit": True + } + + def forward( + self, + input_ids: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + past_key_values: Optional[Tuple[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + return_last_logit: Optional[bool] = False, + ): + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.transformer( + input_ids=input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + if return_last_logit: + hidden_states = hidden_states[-1:] + lm_logits = self.transformer.output_layer(hidden_states) + lm_logits = lm_logits.transpose(0, 1).contiguous() + + loss = None + if labels is not None: + lm_logits = lm_logits.to(torch.float32) + + # Shift so that tokens < n predict n + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss(ignore_index=-100) + loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) + + lm_logits = lm_logits.to(hidden_states.dtype) + loss = loss.to(hidden_states.dtype) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], beam_idx: torch.LongTensor + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]: + """ + This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or + [`~PreTrainedModel.beam_sample`] is called. This is required to match `past_key_values` with the correct + beam_idx at every generation step. + + Output shares the same memory storage as `past`. + """ + return tuple( + ( + layer_past[0].index_select(1, beam_idx.to(layer_past[0].device)), + layer_past[1].index_select(1, beam_idx.to(layer_past[1].device)), + ) + for layer_past in past + ) + + def process_response(self, response): + response = response.strip() + response = response.replace("[[训练时间]]", "2023年") + return response + + def build_inputs(self, tokenizer, query: str, history: List[Tuple[str, str]] = None): + prompt = tokenizer.build_prompt(query, history=history) + inputs = tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self.device) + return inputs + + def build_stream_inputs(self, tokenizer, query: str, history: List[Tuple[str, str]] = None): + if history: + prompt = "\n\n[Round {}]\n\n问:{}\n\n答:".format(len(history) + 1, query) + input_ids = tokenizer.encode(prompt, add_special_tokens=False) + input_ids = input_ids[1:] + inputs = tokenizer.batch_encode_plus([(input_ids, None)], return_tensors="pt", add_special_tokens=False) + else: + prompt = "[Round {}]\n\n问:{}\n\n答:".format(len(history) + 1, query) + inputs = tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self.device) + return inputs + + @torch.inference_mode() + def chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, max_length: int = 8192, num_beams=1, + do_sample=True, top_p=0.8, temperature=0.8, logits_processor=None, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "num_beams": num_beams, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + inputs = self.build_inputs(tokenizer, query, history=history) + outputs = self.generate(**inputs, **gen_kwargs) + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):] + response = tokenizer.decode(outputs) + response = self.process_response(response) + history = history + [(query, response)] + return response, history + + @torch.inference_mode() + def stream_chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, past_key_values=None, + max_length: int = 8192, do_sample=True, top_p=0.8, temperature=0.8, logits_processor=None, + return_past_key_values=False, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + if past_key_values is None and not return_past_key_values: + inputs = self.build_inputs(tokenizer, query, history=history) + else: + inputs = self.build_stream_inputs(tokenizer, query, history=history) + if past_key_values is not None: + past_length = past_key_values[0][0].shape[0] + if self.transformer.pre_seq_len is not None: + past_length -= self.transformer.pre_seq_len + inputs.position_ids += past_length + attention_mask = inputs.attention_mask + attention_mask = torch.cat((attention_mask.new_ones(1, past_length), attention_mask), dim=1) + inputs['attention_mask'] = attention_mask + for outputs in self.stream_generate(**inputs, past_key_values=past_key_values, + return_past_key_values=return_past_key_values, **gen_kwargs): + if return_past_key_values: + outputs, past_key_values = outputs + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):] + response = tokenizer.decode(outputs) + if response and response[-1] != "�": + response = self.process_response(response) + new_history = history + [(query, response)] + if return_past_key_values: + yield response, new_history, past_key_values + else: + yield response, new_history + + @torch.inference_mode() + def stream_generate( + self, + input_ids, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[Callable[[int, torch.Tensor], List[int]]] = None, + return_past_key_values=False, + **kwargs, + ): + batch_size, input_ids_seq_length = input_ids.shape[0], input_ids.shape[-1] + + if generation_config is None: + generation_config = self.generation_config + generation_config = copy.deepcopy(generation_config) + model_kwargs = generation_config.update(**kwargs) + bos_token_id, eos_token_id = generation_config.bos_token_id, generation_config.eos_token_id + + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + + has_default_max_length = kwargs.get("max_length") is None and generation_config.max_length is not None + if has_default_max_length and generation_config.max_new_tokens is None: + warnings.warn( + f"Using `max_length`'s default ({generation_config.max_length}) to control the generation length. " + "This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we" + " recommend using `max_new_tokens` to control the maximum length of the generation.", + UserWarning, + ) + elif generation_config.max_new_tokens is not None: + generation_config.max_length = generation_config.max_new_tokens + input_ids_seq_length + if not has_default_max_length: + logger.warn( + f"Both `max_new_tokens` (={generation_config.max_new_tokens}) and `max_length`(=" + f"{generation_config.max_length}) seem to have been set. `max_new_tokens` will take precedence. " + "Please refer to the documentation for more information. " + "(https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)", + UserWarning, + ) + + if input_ids_seq_length >= generation_config.max_length: + input_ids_string = "decoder_input_ids" if self.config.is_encoder_decoder else "input_ids" + logger.warning( + f"Input length of {input_ids_string} is {input_ids_seq_length}, but `max_length` is set to" + f" {generation_config.max_length}. This can lead to unexpected behavior. You should consider" + " increasing `max_new_tokens`." + ) + + # 2. Set generation parameters if not already defined + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + + logits_processor = self._get_logits_processor( + generation_config=generation_config, + input_ids_seq_length=input_ids_seq_length, + encoder_input_ids=input_ids, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + logits_processor=logits_processor, + ) + + stopping_criteria = self._get_stopping_criteria( + generation_config=generation_config, stopping_criteria=stopping_criteria + ) + logits_warper = self._get_logits_warper(generation_config) + + unfinished_sequences = input_ids.new(input_ids.shape[0]).fill_(1) + scores = None + while True: + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + # forward pass to get next token + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=False, + output_hidden_states=False, + ) + + next_token_logits = outputs.logits[:, -1, :] + + # pre-process distribution + next_token_scores = logits_processor(input_ids, next_token_logits) + next_token_scores = logits_warper(input_ids, next_token_scores) + + # sample + probs = nn.functional.softmax(next_token_scores, dim=-1) + if generation_config.do_sample: + next_tokens = torch.multinomial(probs, num_samples=1).squeeze(1) + else: + next_tokens = torch.argmax(probs, dim=-1) + + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + unfinished_sequences = unfinished_sequences.mul((sum(next_tokens != i for i in eos_token_id)).long()) + if return_past_key_values: + yield input_ids, outputs.past_key_values + else: + yield input_ids + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + break + + def quantize(self, bits: int, empty_init=False, device=None, **kwargs): + if bits == 0: + return + + from .quantization import quantize + + if self.quantized: + logger.info("Already quantized.") + return self + + self.quantized = True + + self.config.quantization_bit = bits + + self.transformer.encoder = quantize(self.transformer.encoder, bits, empty_init=empty_init, device=device, + **kwargs) + return self diff --git a/transformers/llm/export/llm_models/chatglm3-6b/modeling_chatglm.py b/transformers/llm/export/llm_models/chatglm3-6b/modeling_chatglm.py new file mode 100755 index 000000000..f887c44ce --- /dev/null +++ b/transformers/llm/export/llm_models/chatglm3-6b/modeling_chatglm.py @@ -0,0 +1,1293 @@ +""" PyTorch ChatGLM model. """ + +import math +import copy +import warnings +import re +import sys + +import torch +import torch.utils.checkpoint +import torch.nn.functional as F +from torch import nn +from torch.nn import CrossEntropyLoss, LayerNorm, MSELoss, BCEWithLogitsLoss +from torch.nn.utils import skip_init +from typing import Optional, Tuple, Union, List, Callable, Dict, Any +from copy import deepcopy + +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, + SequenceClassifierOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging +from transformers.generation.logits_process import LogitsProcessor +from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput + +from .configuration_chatglm import ChatGLMConfig + +# flags required to enable jit fusion kernels + +if sys.platform != 'darwin': + torch._C._jit_set_profiling_mode(False) + torch._C._jit_set_profiling_executor(False) + torch._C._jit_override_can_fuse_on_cpu(True) + torch._C._jit_override_can_fuse_on_gpu(True) + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "THUDM/ChatGLM" +_CONFIG_FOR_DOC = "ChatGLMConfig" + +CHATGLM_6B_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "THUDM/chatglm3-6b", + # See all ChatGLM models at https://huggingface.co/models?filter=chatglm +] + + +def default_init(cls, *args, **kwargs): + return cls(*args, **kwargs) + + +class InvalidScoreLogitsProcessor(LogitsProcessor): + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if torch.isnan(scores).any() or torch.isinf(scores).any(): + scores.zero_() + scores[..., 5] = 5e4 + return scores + + +class PrefixEncoder(torch.nn.Module): + """ + The torch.nn model to encode the prefix + Input shape: (batch-size, prefix-length) + Output shape: (batch-size, prefix-length, 2*layers*hidden) + """ + + def __init__(self, config: ChatGLMConfig): + super().__init__() + self.prefix_projection = config.prefix_projection + if self.prefix_projection: + # Use a two-layer MLP to encode the prefix + kv_size = config.num_layers * config.kv_channels * config.multi_query_group_num * 2 + self.embedding = torch.nn.Embedding(config.pre_seq_len, kv_size) + self.trans = torch.nn.Sequential( + torch.nn.Linear(kv_size, config.hidden_size), + torch.nn.Tanh(), + torch.nn.Linear(config.hidden_size, kv_size) + ) + else: + self.embedding = torch.nn.Embedding(config.pre_seq_len, + config.num_layers * config.kv_channels * config.multi_query_group_num * 2) + + def forward(self, prefix: torch.Tensor): + if self.prefix_projection: + prefix_tokens = self.embedding(prefix) + past_key_values = self.trans(prefix_tokens) + else: + past_key_values = self.embedding(prefix) + return past_key_values + + +def split_tensor_along_last_dim( + tensor: torch.Tensor, + num_partitions: int, + contiguous_split_chunks: bool = False, +) -> List[torch.Tensor]: + """Split a tensor along its last dimension. + + Arguments: + tensor: input tensor. + num_partitions: number of partitions to split the tensor + contiguous_split_chunks: If True, make each chunk contiguous + in memory. + + Returns: + A list of Tensors + """ + # Get the size and dimension. + last_dim = tensor.dim() - 1 + last_dim_size = tensor.size()[last_dim] // num_partitions + # Split. + tensor_list = torch.split(tensor, last_dim_size, dim=last_dim) + # Note: torch.split does not create contiguous tensors by default. + if contiguous_split_chunks: + return tuple(chunk.contiguous() for chunk in tensor_list) + + return tensor_list + + +class RotaryEmbedding(nn.Module): + def __init__(self, dim, original_impl=False, device=None, dtype=None): + super().__init__() + inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2, device=device).to(dtype=dtype) / dim)) + self.register_buffer("inv_freq", inv_freq) + self.dim = dim + self.original_impl = original_impl + + def forward_impl( + self, seq_len: int, n_elem: int, dtype: torch.dtype, device: torch.device, base: int = 10000 + ): + """Enhanced Transformer with Rotary Position Embedding. + + Derived from: https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/labml_nn/ + transformers/rope/__init__.py. MIT License: + https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/license. + """ + # $\Theta = {\theta_i = 10000^{\frac{2(i-1)}{d}}, i \in [1, 2, ..., \frac{d}{2}]}$ + theta = 1.0 / (base ** (torch.arange(0, n_elem, 2, dtype=torch.float, device=device) / n_elem)) + + # Create position indexes `[0, 1, ..., seq_len - 1]` + seq_idx = torch.arange(seq_len, dtype=torch.float, device=device) + + # Calculate the product of position index and $\theta_i$ + idx_theta = torch.outer(seq_idx, theta).float() + + cache = torch.stack([torch.cos(idx_theta), torch.sin(idx_theta)], dim=-1) + + # this is to mimic the behaviour of complex32, else we will get different results + if dtype in (torch.float16, torch.bfloat16, torch.int8): + cache = cache.bfloat16() if dtype == torch.bfloat16 else cache.half() + return cache + + def forward(self, max_seq_len, offset=0): + return self.forward_impl( + max_seq_len, self.dim, dtype=self.inv_freq.dtype, device=self.inv_freq.device + ) + + +@torch.jit.script +def apply_rotary_pos_emb(x: torch.Tensor, rope_cache: torch.Tensor) -> torch.Tensor: + # x: [sq, b, np, hn] + sq, b, np, hn = x.size(0), x.size(1), x.size(2), x.size(3) + rot_dim = rope_cache.shape[-2] * 2 + x, x_pass = x[..., :rot_dim], x[..., rot_dim:] + # truncate to support variable sizes + rope_cache = rope_cache[:sq] + xshaped = x.reshape(sq, -1, np, rot_dim // 2, 2) + rope_cache = rope_cache.view(sq, -1, 1, xshaped.size(3), 2) + x_out2 = torch.stack( + [ + xshaped[..., 0] * rope_cache[..., 0] - xshaped[..., 1] * rope_cache[..., 1], + xshaped[..., 1] * rope_cache[..., 0] + xshaped[..., 0] * rope_cache[..., 1], + ], + -1, + ) + x_out2 = x_out2.flatten(3) + return torch.cat((x_out2, x_pass), dim=-1) + + +class RMSNorm(torch.nn.Module): + def __init__(self, normalized_shape, eps=1e-5, device=None, dtype=None, **kwargs): + super().__init__() + self.weight = torch.nn.Parameter(torch.empty(normalized_shape, device=device, dtype=dtype)) + self.eps = eps + + def forward(self, hidden_states: torch.Tensor): + input_dtype = hidden_states.dtype + variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.eps) + + return (self.weight * hidden_states).to(input_dtype) + + +class CoreAttention(torch.nn.Module): + def __init__(self, config: ChatGLMConfig, layer_number): + super(CoreAttention, self).__init__() + + self.apply_query_key_layer_scaling = config.apply_query_key_layer_scaling + self.attention_softmax_in_fp32 = config.attention_softmax_in_fp32 + if self.apply_query_key_layer_scaling: + self.attention_softmax_in_fp32 = True + self.layer_number = max(1, layer_number) + + projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + self.hidden_size_per_partition = projection_size + self.hidden_size_per_attention_head = projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads + + coeff = None + self.norm_factor = math.sqrt(self.hidden_size_per_attention_head) + if self.apply_query_key_layer_scaling: + coeff = self.layer_number + self.norm_factor *= coeff + self.coeff = coeff + + self.attention_dropout = torch.nn.Dropout(config.attention_dropout) + + def forward(self, query_layer, key_layer, value_layer, attention_mask): + pytorch_major_version = int(torch.__version__.split('.')[0]) + if pytorch_major_version >= 2 and False: + query_layer, key_layer, value_layer = [k.permute(1, 2, 0, 3) for k in [query_layer, key_layer, value_layer]] + if attention_mask is None and query_layer.shape[2] == key_layer.shape[2]: + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, key_layer, value_layer, + is_causal=True) + else: + if attention_mask is not None: + attention_mask = ~attention_mask + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, key_layer, value_layer, + attention_mask) + context_layer = context_layer.permute(2, 0, 1, 3) + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size_per_partition,) + context_layer = context_layer.reshape(*new_context_layer_shape) + else: + # Raw attention scores + + # [b, np, sq, sk] + output_size = (query_layer.size(1), query_layer.size(2), query_layer.size(0), key_layer.size(0)) + + # [sq, b, np, hn] -> [sq, b * np, hn] + query_layer = query_layer.view(output_size[2], output_size[0] * output_size[1], -1) + # [sk, b, np, hn] -> [sk, b * np, hn] + key_layer = key_layer.view(output_size[3], output_size[0] * output_size[1], -1) + + # preallocting input tensor: [b * np, sq, sk] + matmul_input_buffer = torch.empty( + output_size[0] * output_size[1], output_size[2], output_size[3], dtype=query_layer.dtype, + device=query_layer.device + ) + + # Raw attention scores. [b * np, sq, sk] + matmul_result = torch.baddbmm( + matmul_input_buffer, + query_layer.transpose(0, 1), # [b * np, sq, hn] + key_layer.transpose(0, 1).transpose(1, 2), # [b * np, hn, sk] + beta=0.0, + alpha=(1.0 / self.norm_factor), + ) + + # change view to [b, np, sq, sk] + attention_scores = matmul_result.view(*output_size) + + # =========================== + # Attention probs and dropout + # =========================== + + # attention scores and attention mask [b, np, sq, sk] + if self.attention_softmax_in_fp32: + attention_scores = attention_scores.float() + if self.coeff is not None: + attention_scores = attention_scores * self.coeff + if attention_mask is None and attention_scores.shape[2] == attention_scores.shape[3]: + attention_mask = torch.ones(output_size[0], 1, output_size[2], output_size[3], + device=attention_scores.device, dtype=torch.bool) + attention_mask.tril_() + attention_mask = ~attention_mask + if attention_mask is not None: + attention_scores = attention_scores.masked_fill(attention_mask, float("-inf")) + attention_probs = F.softmax(attention_scores, dim=-1) + attention_probs = attention_probs.type_as(value_layer) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self.attention_dropout(attention_probs) + # ========================= + # Context layer. [sq, b, hp] + # ========================= + + # value_layer -> context layer. + # [sk, b, np, hn] --> [b, np, sq, hn] + + # context layer shape: [b, np, sq, hn] + output_size = (value_layer.size(1), value_layer.size(2), query_layer.size(0), value_layer.size(3)) + # change view [sk, b * np, hn] + value_layer = value_layer.view(value_layer.size(0), output_size[0] * output_size[1], -1) + # change view [b * np, sq, sk] + attention_probs = attention_probs.view(output_size[0] * output_size[1], output_size[2], -1) + # matmul: [b * np, sq, hn] + context_layer = torch.bmm(attention_probs, value_layer.transpose(0, 1)) + # change view [b, np, sq, hn] + context_layer = context_layer.view(*output_size) + # [b, np, sq, hn] --> [sq, b, np, hn] + context_layer = context_layer.permute(2, 0, 1, 3).contiguous() + # [sq, b, np, hn] --> [sq, b, hp] + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size_per_partition,) + context_layer = context_layer.view(*new_context_layer_shape) + + return context_layer + + +class SelfAttention(torch.nn.Module): + """Parallel self-attention layer abstract class. + + Self-attention layer takes input with size [s, b, h] + and returns output of the same size. + """ + + def __init__(self, config: ChatGLMConfig, layer_number, device=None): + super(SelfAttention, self).__init__() + self.layer_number = max(1, layer_number) + + self.projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + self.hidden_size_per_attention_head = self.projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads + + self.multi_query_attention = config.multi_query_attention + self.qkv_hidden_size = 3 * self.projection_size + if self.multi_query_attention: + self.num_multi_query_groups_per_partition = config.multi_query_group_num + self.qkv_hidden_size = ( + self.projection_size + 2 * self.hidden_size_per_attention_head * config.multi_query_group_num + ) + self.query_key_value = nn.Linear(config.hidden_size, self.qkv_hidden_size, + bias=config.add_bias_linear or config.add_qkv_bias, + device=device, **_config_to_kwargs(config) + ) + + self.core_attention = CoreAttention(config, self.layer_number) + + # Output. + self.dense = nn.Linear(self.projection_size, config.hidden_size, bias=config.add_bias_linear, + device=device, **_config_to_kwargs(config) + ) + + def _allocate_memory(self, inference_max_sequence_len, batch_size, device=None, dtype=None): + if self.multi_query_attention: + num_attention_heads = self.num_multi_query_groups_per_partition + else: + num_attention_heads = self.num_attention_heads_per_partition + return torch.empty( + inference_max_sequence_len, + batch_size, + num_attention_heads, + self.hidden_size_per_attention_head, + dtype=dtype, + device=device, + ) + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_cache=None, use_cache=True + ): + # hidden_states: [sq, b, h] + + # ================================================= + # Pre-allocate memory for key-values for inference. + # ================================================= + # ===================== + # Query, Key, and Value + # ===================== + + # Attention heads [sq, b, h] --> [sq, b, (np * 3 * hn)] + mixed_x_layer = self.query_key_value(hidden_states) + + if self.multi_query_attention: + (query_layer, key_layer, value_layer) = mixed_x_layer.split( + [ + self.num_attention_heads_per_partition * self.hidden_size_per_attention_head, + self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head, + self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head, + ], + dim=-1, + ) + query_layer = query_layer.view( + query_layer.size()[:-1] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + key_layer = key_layer.view( + key_layer.size()[:-1] + (self.num_multi_query_groups_per_partition, self.hidden_size_per_attention_head) + ) + value_layer = value_layer.view( + value_layer.size()[:-1] + + (self.num_multi_query_groups_per_partition, self.hidden_size_per_attention_head) + ) + else: + new_tensor_shape = mixed_x_layer.size()[:-1] + \ + (self.num_attention_heads_per_partition, + 3 * self.hidden_size_per_attention_head) + mixed_x_layer = mixed_x_layer.view(*new_tensor_shape) + + # [sq, b, np, 3 * hn] --> 3 [sq, b, np, hn] + (query_layer, key_layer, value_layer) = split_tensor_along_last_dim(mixed_x_layer, 3) + + # apply relative positional encoding (rotary embedding) + if rotary_pos_emb is not None: + query_layer = apply_rotary_pos_emb(query_layer, rotary_pos_emb) + key_layer = apply_rotary_pos_emb(key_layer, rotary_pos_emb) + + # adjust key and value for inference + if kv_cache is not None: + cache_k, cache_v = kv_cache + key_layer = torch.cat((cache_k, key_layer), dim=0) + value_layer = torch.cat((cache_v, value_layer), dim=0) + if use_cache: + kv_cache = (key_layer, value_layer) + else: + kv_cache = None + + if self.multi_query_attention: + key_layer = key_layer.unsqueeze(-2) + key_layer = key_layer.expand( + -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1 + ) + key_layer = key_layer.contiguous().view( + key_layer.size()[:2] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + value_layer = value_layer.unsqueeze(-2) + value_layer = value_layer.expand( + -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1 + ) + value_layer = value_layer.contiguous().view( + value_layer.size()[:2] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + + # ================================== + # core attention computation + # ================================== + + context_layer = self.core_attention(query_layer, key_layer, value_layer, attention_mask) + + # ================= + # Output. [sq, b, h] + # ================= + + output = self.dense(context_layer) + + return output, kv_cache + + +def _config_to_kwargs(args): + common_kwargs = { + "dtype": args.torch_dtype, + } + return common_kwargs + + +class MLP(torch.nn.Module): + """MLP. + + MLP will take the input with h hidden state, project it to 4*h + hidden dimension, perform nonlinear transformation, and project the + state back into h hidden dimension. + """ + + def __init__(self, config: ChatGLMConfig, device=None): + super(MLP, self).__init__() + + self.add_bias = config.add_bias_linear + + # Project to 4h. If using swiglu double the output width, see https://arxiv.org/pdf/2002.05202.pdf + self.dense_h_to_4h = nn.Linear( + config.hidden_size, + config.ffn_hidden_size * 2, + bias=self.add_bias, + device=device, + **_config_to_kwargs(config) + ) + + def swiglu(x): + x = torch.chunk(x, 2, dim=-1) + return F.silu(x[0]) * x[1] + + self.activation_func = swiglu + + # Project back to h. + self.dense_4h_to_h = nn.Linear( + config.ffn_hidden_size, + config.hidden_size, + bias=self.add_bias, + device=device, + **_config_to_kwargs(config) + ) + + def forward(self, hidden_states): + # [s, b, 4hp] + intermediate_parallel = self.dense_h_to_4h(hidden_states) + intermediate_parallel = self.activation_func(intermediate_parallel) + # [s, b, h] + output = self.dense_4h_to_h(intermediate_parallel) + return output + + +class GLMBlock(torch.nn.Module): + """A single transformer layer. + + Transformer layer takes input with size [s, b, h] and returns an + output of the same size. + """ + + def __init__(self, config: ChatGLMConfig, layer_number, device=None): + super(GLMBlock, self).__init__() + self.layer_number = layer_number + + self.apply_residual_connection_post_layernorm = config.apply_residual_connection_post_layernorm + + self.fp32_residual_connection = config.fp32_residual_connection + + LayerNormFunc = RMSNorm if config.rmsnorm else LayerNorm + # Layernorm on the input data. + self.input_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + # Self attention. + self.self_attention = SelfAttention(config, layer_number, device=device) + self.hidden_dropout = config.hidden_dropout + + # Layernorm on the attention output + self.post_attention_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + # MLP + self.mlp = MLP(config, device=device) + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_cache=None, use_cache=True, + ): + # hidden_states: [s, b, h] + + # Layer norm at the beginning of the transformer layer. + layernorm_output = self.input_layernorm(hidden_states) + # Self attention. + attention_output, kv_cache = self.self_attention( + layernorm_output, + attention_mask, + rotary_pos_emb, + kv_cache=kv_cache, + use_cache=use_cache + ) + + # Residual connection. + if self.apply_residual_connection_post_layernorm: + residual = layernorm_output + else: + residual = hidden_states + + layernorm_input = torch.nn.functional.dropout(attention_output, p=self.hidden_dropout, training=self.training) + layernorm_input = residual + layernorm_input + + # Layer norm post the self attention. + layernorm_output = self.post_attention_layernorm(layernorm_input) + + # MLP. + mlp_output = self.mlp(layernorm_output) + + # Second residual connection. + if self.apply_residual_connection_post_layernorm: + residual = layernorm_output + else: + residual = layernorm_input + + output = torch.nn.functional.dropout(mlp_output, p=self.hidden_dropout, training=self.training) + output = residual + output + + return output, kv_cache + + +class GLMTransformer(torch.nn.Module): + """Transformer class.""" + + def __init__(self, config: ChatGLMConfig, device=None): + super(GLMTransformer, self).__init__() + + self.fp32_residual_connection = config.fp32_residual_connection + self.post_layer_norm = config.post_layer_norm + + # Number of layers. + self.num_layers = config.num_layers + + # Transformer layers. + def build_layer(layer_number): + return GLMBlock(config, layer_number, device=device) + + self.layers = torch.nn.ModuleList([build_layer(i + 1) for i in range(self.num_layers)]) + + if self.post_layer_norm: + LayerNormFunc = RMSNorm if config.rmsnorm else LayerNorm + # Final layer norm before output. + self.final_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + self.gradient_checkpointing = False + + def _get_layer(self, layer_number): + return self.layers[layer_number] + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_caches=None, + use_cache: Optional[bool] = True, + output_hidden_states: Optional[bool] = False, + ): + if not kv_caches: + kv_caches = [None for _ in range(self.num_layers)] + presents = () if use_cache else None + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + all_self_attentions = None + all_hidden_states = () if output_hidden_states else None + for index in range(self.num_layers): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + layer = self._get_layer(index) + if self.gradient_checkpointing and self.training: + layer_ret = torch.utils.checkpoint.checkpoint( + layer, + hidden_states, + attention_mask, + rotary_pos_emb, + kv_caches[index], + use_cache + ) + else: + layer_ret = layer( + hidden_states, + attention_mask, + rotary_pos_emb, + kv_cache=kv_caches[index], + use_cache=use_cache + ) + hidden_states, kv_cache = layer_ret + if use_cache: + presents = presents + (kv_cache,) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + # Final layer norm. + if self.post_layer_norm: + hidden_states = self.final_layernorm(hidden_states) + + return hidden_states, presents, all_hidden_states, all_self_attentions + + +class ChatGLMPreTrainedModel(PreTrainedModel): + """ + An abstract class to handle weights initialization and + a simple interface for downloading and loading pretrained models. + """ + + is_parallelizable = False + supports_gradient_checkpointing = True + config_class = ChatGLMConfig + base_model_prefix = "transformer" + _no_split_modules = ["GLMBlock"] + + def _init_weights(self, module: nn.Module): + """Initialize the weights.""" + return + + def get_masks(self, input_ids, past_key_values, padding_mask=None): + batch_size, seq_length = input_ids.shape + full_attention_mask = torch.ones(batch_size, seq_length, seq_length, device=input_ids.device) + full_attention_mask.tril_() + past_length = 0 + if past_key_values: + past_length = past_key_values[0][0].shape[0] + if past_length: + full_attention_mask = torch.cat((torch.ones(batch_size, seq_length, past_length, + device=input_ids.device), full_attention_mask), dim=-1) + if padding_mask is not None: + full_attention_mask = full_attention_mask * padding_mask.unsqueeze(1) + if not past_length and padding_mask is not None: + full_attention_mask -= padding_mask.unsqueeze(-1) - 1 + full_attention_mask = (full_attention_mask < 0.5).bool() + full_attention_mask.unsqueeze_(1) + return full_attention_mask + + def get_position_ids(self, input_ids, device): + batch_size, seq_length = input_ids.shape + position_ids = torch.arange(seq_length, dtype=torch.long, device=device).unsqueeze(0).repeat(batch_size, 1) + return position_ids + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, GLMTransformer): + module.gradient_checkpointing = value + + +class Embedding(torch.nn.Module): + """Language model embeddings.""" + + def __init__(self, config: ChatGLMConfig, device=None): + super(Embedding, self).__init__() + + self.hidden_size = config.hidden_size + # Word embeddings (parallel). + self.word_embeddings = nn.Embedding( + config.padded_vocab_size, + self.hidden_size, + dtype=config.torch_dtype, + device=device + ) + self.fp32_residual_connection = config.fp32_residual_connection + + def forward(self, input_ids): + # Embeddings. + words_embeddings = self.word_embeddings(input_ids) + embeddings = words_embeddings + # Data format change to avoid explicit tranposes : [b s h] --> [s b h]. + embeddings = embeddings.transpose(0, 1).contiguous() + # If the input flag for fp32 residual connection is set, convert for float. + if self.fp32_residual_connection: + embeddings = embeddings.float() + return embeddings + + +class ChatGLMModel(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, device=None, empty_init=True): + super().__init__(config) + if empty_init: + init_method = skip_init + else: + init_method = default_init + init_kwargs = {} + if device is not None: + init_kwargs["device"] = device + self.embedding = init_method(Embedding, config, **init_kwargs) + self.num_layers = config.num_layers + self.multi_query_group_num = config.multi_query_group_num + self.kv_channels = config.kv_channels + + # Rotary positional embeddings + self.seq_length = config.seq_length + rotary_dim = ( + config.hidden_size // config.num_attention_heads if config.kv_channels is None else config.kv_channels + ) + + self.rotary_pos_emb = RotaryEmbedding(rotary_dim // 2, original_impl=config.original_rope, device=device, + dtype=config.torch_dtype) + self.encoder = init_method(GLMTransformer, config, **init_kwargs) + self.output_layer = init_method(nn.Linear, config.hidden_size, config.padded_vocab_size, bias=False, + dtype=config.torch_dtype, **init_kwargs) + self.pre_seq_len = config.pre_seq_len + self.prefix_projection = config.prefix_projection + if self.pre_seq_len is not None: + for param in self.parameters(): + param.requires_grad = False + self.prefix_tokens = torch.arange(self.pre_seq_len).long() + self.prefix_encoder = PrefixEncoder(config) + self.dropout = torch.nn.Dropout(0.1) + + def get_input_embeddings(self): + return self.embedding.word_embeddings + + def get_prompt(self, batch_size, device, dtype=torch.half): + prefix_tokens = self.prefix_tokens.unsqueeze(0).expand(batch_size, -1).to(device) + past_key_values = self.prefix_encoder(prefix_tokens).type(dtype) + past_key_values = past_key_values.view( + batch_size, + self.pre_seq_len, + self.num_layers * 2, + self.multi_query_group_num, + self.kv_channels + ) + # seq_len, b, nh, hidden_size + past_key_values = self.dropout(past_key_values) + past_key_values = past_key_values.permute([2, 1, 0, 3, 4]).split(2) + return past_key_values + + def forward( + self, + input_ids, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.BoolTensor] = None, + full_attention_mask: Optional[torch.BoolTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + batch_size, seq_length = input_ids.shape + + if inputs_embeds is None: + inputs_embeds = self.embedding(input_ids) + + if self.pre_seq_len is not None: + if past_key_values is None: + past_key_values = self.get_prompt(batch_size=batch_size, device=input_ids.device, + dtype=inputs_embeds.dtype) + if attention_mask is not None: + attention_mask = torch.cat([attention_mask.new_ones((batch_size, self.pre_seq_len)), + attention_mask], dim=-1) + + if full_attention_mask is None: + if (attention_mask is not None and not attention_mask.all()) or (past_key_values and seq_length != 1): + full_attention_mask = self.get_masks(input_ids, past_key_values, padding_mask=attention_mask) + + # Rotary positional embeddings + rotary_pos_emb = self.rotary_pos_emb(self.seq_length) + if position_ids is not None: + rotary_pos_emb = rotary_pos_emb[position_ids] + else: + rotary_pos_emb = rotary_pos_emb[None, :seq_length] + rotary_pos_emb = rotary_pos_emb.transpose(0, 1).contiguous() + + # Run encoder. + hidden_states, presents, all_hidden_states, all_self_attentions = self.encoder( + inputs_embeds, full_attention_mask, rotary_pos_emb=rotary_pos_emb, + kv_caches=past_key_values, use_cache=use_cache, output_hidden_states=output_hidden_states + ) + + if not return_dict: + return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + def quantize(self, weight_bit_width: int): + from .quantization import quantize + quantize(self.encoder, weight_bit_width) + return self + + +class ChatGLMForConditionalGeneration(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, empty_init=True, device=None): + super().__init__(config) + + self.max_sequence_length = config.max_length + self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device) + self.config = config + self.quantized = False + + if self.config.quantization_bit: + self.quantize(self.config.quantization_bit, empty_init=True) + + def _update_model_kwargs_for_generation( + self, + outputs: ModelOutput, + model_kwargs: Dict[str, Any], + is_encoder_decoder: bool = False, + standardize_cache_format: bool = False, + ) -> Dict[str, Any]: + # update past_key_values + model_kwargs["past_key_values"] = self._extract_past_from_model_output( + outputs, standardize_cache_format=standardize_cache_format + ) + + # update attention mask + if "attention_mask" in model_kwargs: + attention_mask = model_kwargs["attention_mask"] + model_kwargs["attention_mask"] = torch.cat( + [attention_mask, attention_mask.new_ones((attention_mask.shape[0], 1))], dim=-1 + ) + + # update position ids + if "position_ids" in model_kwargs: + position_ids = model_kwargs["position_ids"] + new_position_id = position_ids[..., -1:].clone() + new_position_id += 1 + model_kwargs["position_ids"] = torch.cat( + [position_ids, new_position_id], dim=-1 + ) + + model_kwargs["is_first_forward"] = False + return model_kwargs + + def prepare_inputs_for_generation( + self, + input_ids: torch.LongTensor, + past_key_values: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + is_first_forward: bool = True, + **kwargs + ) -> dict: + # only last token for input_ids if past is not None + if position_ids is None: + position_ids = self.get_position_ids(input_ids, device=input_ids.device) + if not is_first_forward: + if past_key_values is not None: + position_ids = position_ids[..., -1:] + input_ids = input_ids[:, -1:] + return { + "input_ids": input_ids, + "past_key_values": past_key_values, + "position_ids": position_ids, + "attention_mask": attention_mask, + "return_last_logit": True, + "use_cache": use_cache + } + + def forward( + self, + input_ids: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + past_key_values: Optional[Tuple[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + return_last_logit: Optional[bool] = False, + ): + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.transformer( + input_ids=input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + if return_last_logit: + hidden_states = hidden_states[-1:] + lm_logits = self.transformer.output_layer(hidden_states) + lm_logits = lm_logits.transpose(0, 1).contiguous() + + loss = None + if labels is not None: + lm_logits = lm_logits.to(torch.float32) + + # Shift so that tokens < n predict n + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss(ignore_index=-100) + loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) + + lm_logits = lm_logits.to(hidden_states.dtype) + loss = loss.to(hidden_states.dtype) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], beam_idx: torch.LongTensor + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]: + """ + This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or + [`~PreTrainedModel.beam_sample`] is called. This is required to match `past_key_values` with the correct + beam_idx at every generation step. + + Output shares the same memory storage as `past`. + """ + return tuple( + ( + layer_past[0].index_select(1, beam_idx.to(layer_past[0].device)), + layer_past[1].index_select(1, beam_idx.to(layer_past[1].device)), + ) + for layer_past in past + ) + + def process_response(self, output, history): + content = "" + history = deepcopy(history) + for response in output.split("<|assistant|>"): + metadata, content = response.split("\n", maxsplit=1) + if not metadata.strip(): + content = content.strip() + history.append({"role": "assistant", "metadata": metadata, "content": content}) + content = content.replace("[[训练时间]]", "2023年") + else: + history.append({"role": "assistant", "metadata": metadata, "content": content}) + if history[0]["role"] == "system" and "tools" in history[0]: + content = "\n".join(content.split("\n")[1:-1]) + def tool_call(**kwargs): + return kwargs + parameters = eval(content) + content = {"name": metadata.strip(), "parameters": parameters} + else: + content = {"name": metadata.strip(), "content": content} + return content, history + + @torch.inference_mode() + def chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, role: str = "user", + max_length: int = 8192, num_beams=1, do_sample=True, top_p=0.8, temperature=0.8, logits_processor=None, + **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "num_beams": num_beams, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + inputs = tokenizer.build_chat_input(query, history=history, role=role) + inputs = inputs.to(self.device) + eos_token_id = [tokenizer.eos_token_id, tokenizer.get_command("<|user|>"), + tokenizer.get_command("<|observation|>")] + outputs = self.generate(**inputs, **gen_kwargs, eos_token_id=eos_token_id) + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):-1] + response = tokenizer.decode(outputs) + history.append({"role": role, "content": query}) + response, history = self.process_response(response, history) + return response, history + + @torch.inference_mode() + def stream_chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, role: str = "user", + past_key_values=None,max_length: int = 8192, do_sample=True, top_p=0.8, temperature=0.8, + logits_processor=None, return_past_key_values=False, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + eos_token_id = [tokenizer.eos_token_id, tokenizer.get_command("<|user|>"), + tokenizer.get_command("<|observation|>")] + gen_kwargs = {"max_length": max_length, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + if past_key_values is None: + inputs = tokenizer.build_chat_input(query, history=history, role=role) + else: + inputs = tokenizer.build_chat_input(query, role=role) + inputs = inputs.to(self.device) + if past_key_values is not None: + past_length = past_key_values[0][0].shape[0] + if self.transformer.pre_seq_len is not None: + past_length -= self.transformer.pre_seq_len + inputs.position_ids += past_length + attention_mask = inputs.attention_mask + attention_mask = torch.cat((attention_mask.new_ones(1, past_length), attention_mask), dim=1) + inputs['attention_mask'] = attention_mask + history.append({"role": role, "content": query}) + for outputs in self.stream_generate(**inputs, past_key_values=past_key_values, + eos_token_id=eos_token_id, return_past_key_values=return_past_key_values, + **gen_kwargs): + if return_past_key_values: + outputs, past_key_values = outputs + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):-1] + response = tokenizer.decode(outputs) + if response and response[-1] != "�": + response, new_history = self.process_response(response, history) + if return_past_key_values: + yield response, new_history, past_key_values + else: + yield response, new_history + + @torch.inference_mode() + def stream_generate( + self, + input_ids, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[Callable[[int, torch.Tensor], List[int]]] = None, + return_past_key_values=False, + **kwargs, + ): + batch_size, input_ids_seq_length = input_ids.shape[0], input_ids.shape[-1] + + if generation_config is None: + generation_config = self.generation_config + generation_config = copy.deepcopy(generation_config) + model_kwargs = generation_config.update(**kwargs) + model_kwargs["use_cache"] = generation_config.use_cache + bos_token_id, eos_token_id = generation_config.bos_token_id, generation_config.eos_token_id + + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + eos_token_id_tensor = torch.tensor(eos_token_id).to(input_ids.device) if eos_token_id is not None else None + + has_default_max_length = kwargs.get("max_length") is None and generation_config.max_length is not None + if has_default_max_length and generation_config.max_new_tokens is None: + warnings.warn( + f"Using `max_length`'s default ({generation_config.max_length}) to control the generation length. " + "This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we" + " recommend using `max_new_tokens` to control the maximum length of the generation.", + UserWarning, + ) + elif generation_config.max_new_tokens is not None: + generation_config.max_length = generation_config.max_new_tokens + input_ids_seq_length + if not has_default_max_length: + logger.warn( + f"Both `max_new_tokens` (={generation_config.max_new_tokens}) and `max_length`(=" + f"{generation_config.max_length}) seem to have been set. `max_new_tokens` will take precedence. " + "Please refer to the documentation for more information. " + "(https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)", + UserWarning, + ) + + if input_ids_seq_length >= generation_config.max_length: + input_ids_string = "decoder_input_ids" if self.config.is_encoder_decoder else "input_ids" + logger.warning( + f"Input length of {input_ids_string} is {input_ids_seq_length}, but `max_length` is set to" + f" {generation_config.max_length}. This can lead to unexpected behavior. You should consider" + " increasing `max_new_tokens`." + ) + + # 2. Set generation parameters if not already defined + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + + logits_processor = self._get_logits_processor( + generation_config=generation_config, + input_ids_seq_length=input_ids_seq_length, + encoder_input_ids=input_ids, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + logits_processor=logits_processor, + ) + + stopping_criteria = self._get_stopping_criteria( + generation_config=generation_config, stopping_criteria=stopping_criteria + ) + logits_warper = self._get_logits_warper(generation_config) + + unfinished_sequences = input_ids.new(input_ids.shape[0]).fill_(1) + scores = None + while True: + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + # forward pass to get next token + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=False, + output_hidden_states=False, + ) + + next_token_logits = outputs.logits[:, -1, :] + + # pre-process distribution + next_token_scores = logits_processor(input_ids, next_token_logits) + next_token_scores = logits_warper(input_ids, next_token_scores) + + # sample + probs = nn.functional.softmax(next_token_scores, dim=-1) + if generation_config.do_sample: + next_tokens = torch.multinomial(probs, num_samples=1).squeeze(1) + else: + next_tokens = torch.argmax(probs, dim=-1) + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + unfinished_sequences = unfinished_sequences.mul( + next_tokens.tile(eos_token_id_tensor.shape[0], 1).ne(eos_token_id_tensor.unsqueeze(1)).prod(dim=0) + ) + if return_past_key_values: + yield input_ids, outputs.past_key_values + else: + yield input_ids + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + break + + def quantize(self, bits: int, empty_init=False, device=None, **kwargs): + if bits == 0: + return + + from .quantization import quantize + + if self.quantized: + logger.info("Already quantized.") + return self + + self.quantized = True + + self.config.quantization_bit = bits + + self.transformer.encoder = quantize(self.transformer.encoder, bits, empty_init=empty_init, device=device, + **kwargs) + return self + + +class ChatGLMForSequenceClassification(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, empty_init=True, device=None): + super().__init__(config) + + self.num_labels = config.num_labels + self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device) + + self.classifier_head = nn.Linear(config.hidden_size, config.num_labels, bias=True, dtype=torch.half) + if config.classifier_dropout is not None: + self.dropout = nn.Dropout(config.classifier_dropout) + else: + self.dropout = None + self.config = config + + if self.config.quantization_bit: + self.quantize(self.config.quantization_bit, empty_init=True) + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + attention_mask: Optional[torch.Tensor] = None, + full_attention_mask: Optional[torch.Tensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + inputs_embeds: Optional[torch.LongTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple[torch.Tensor, ...], SequenceClassifierOutputWithPast]: + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.transformer( + input_ids=input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + full_attention_mask=full_attention_mask, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + pooled_hidden_states = hidden_states[-1] + if self.dropout is not None: + pooled_hidden_states = self.dropout(pooled_hidden_states) + logits = self.classifier_head(pooled_hidden_states) + + loss = None + if labels is not None: + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(logits.squeeze().float(), labels.squeeze()) + else: + loss = loss_fct(logits.float(), labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(logits.view(-1, self.num_labels).float(), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(logits.float(), labels.view(-1, self.num_labels)) + + if not return_dict: + output = (logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/codegeex2-6b/modeling_chatglm.py b/transformers/llm/export/llm_models/codegeex2-6b/modeling_chatglm.py new file mode 100755 index 000000000..fdc619f81 --- /dev/null +++ b/transformers/llm/export/llm_models/codegeex2-6b/modeling_chatglm.py @@ -0,0 +1,1092 @@ +""" PyTorch ChatGLM model. """ + +import math +import copy +import warnings +import re +import sys + +import torch +import torch.utils.checkpoint +import torch.nn.functional as F +from torch import nn +from torch.nn import CrossEntropyLoss, LayerNorm +from torch.nn.utils import skip_init +from typing import Optional, Tuple, Union, List, Callable, Dict, Any + +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging +from transformers.generation.logits_process import LogitsProcessor +from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput + +from .configuration_chatglm import ChatGLMConfig + +# flags required to enable jit fusion kernels + +if sys.platform != 'darwin': + torch._C._jit_set_profiling_mode(False) + torch._C._jit_set_profiling_executor(False) + torch._C._jit_override_can_fuse_on_cpu(True) + torch._C._jit_override_can_fuse_on_gpu(True) + +logger = logging.get_logger(__name__) + +_CHECKPOINT_FOR_DOC = "THUDM/ChatGLM-6B" +_CONFIG_FOR_DOC = "ChatGLM6BConfig" + +CHATGLM_6B_PRETRAINED_MODEL_ARCHIVE_LIST = [ + "THUDM/chatglm-6b", + # See all ChatGLM-6B models at https://huggingface.co/models?filter=chatglm +] + + +def default_init(cls, *args, **kwargs): + return cls(*args, **kwargs) + + +class InvalidScoreLogitsProcessor(LogitsProcessor): + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + if torch.isnan(scores).any() or torch.isinf(scores).any(): + scores.zero_() + scores[..., 5] = 5e4 + return scores + + +def split_tensor_along_last_dim( + tensor: torch.Tensor, + num_partitions: int, + contiguous_split_chunks: bool = False, +) -> List[torch.Tensor]: + """Split a tensor along its last dimension. + + Arguments: + tensor: input tensor. + num_partitions: number of partitions to split the tensor + contiguous_split_chunks: If True, make each chunk contiguous + in memory. + + Returns: + A list of Tensors + """ + # Get the size and dimension. + last_dim = tensor.dim() - 1 + last_dim_size = tensor.size()[last_dim] // num_partitions + # Split. + tensor_list = torch.split(tensor, last_dim_size, dim=last_dim) + # Note: torch.split does not create contiguous tensors by default. + if contiguous_split_chunks: + return tuple(chunk.contiguous() for chunk in tensor_list) + + return tensor_list + + +class RotaryEmbedding(nn.Module): + def __init__(self, dim, original_impl=False, device=None, dtype=None): + super().__init__() + inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2, device=device, dtype=dtype) / dim)) + self.register_buffer("inv_freq", inv_freq) + self.dim = dim + self.original_impl = original_impl + + def forward_original_impl( + self, seq_len: int, n_elem: int, dtype: torch.dtype, device: torch.device, base: int = 10000 + ): + """Enhanced Transformer with Rotary Position Embedding. + + Derived from: https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/labml_nn/ + transformers/rope/__init__.py. MIT License: + https://github.com/labmlai/annotated_deep_learning_paper_implementations/blob/master/license. + """ + # $\Theta = {\theta_i = 10000^{\frac{2(i-1)}{d}}, i \in [1, 2, ..., \frac{d}{2}]}$ + theta = 1.0 / (base ** (torch.arange(0, n_elem, 2, dtype=dtype, device=device) / n_elem)) + + # Create position indexes `[0, 1, ..., seq_len - 1]` + seq_idx = torch.arange(seq_len, dtype=dtype, device=device) + + # Calculate the product of position index and $\theta_i$ + idx_theta = torch.outer(seq_idx, theta).float() + + cache = torch.stack([torch.cos(idx_theta), torch.sin(idx_theta)], dim=-1) + + # this is to mimic the behaviour of complex32, else we will get different results + if dtype in (torch.float16, torch.bfloat16, torch.int8): + cache = cache.bfloat16() if dtype == torch.bfloat16 else cache.half() + return cache + + def forward(self, max_seq_len, offset=0): + if self.original_impl: + return self.forward_original_impl( + max_seq_len, self.dim, dtype=self.inv_freq.dtype, device=self.inv_freq.device + ) + + +@torch.jit.script +def apply_rotary_pos_emb_original(x: torch.Tensor, rope_cache: torch.Tensor) -> torch.Tensor: + # x: [sq, b, np, hn] + sq, b, np, hn = x.size(0), x.size(1), x.size(2), x.size(3) + rot_dim = rope_cache.shape[-2] * 2 + x, x_pass = x[..., :rot_dim], x[..., rot_dim:] + # truncate to support variable sizes + rope_cache = rope_cache[:sq] + xshaped = x.reshape(sq, -1, np, rot_dim // 2, 2) + rope_cache = rope_cache.view(sq, -1, 1, xshaped.size(3), 2) + x_out2 = torch.stack( + [ + xshaped[..., 0] * rope_cache[..., 0] - xshaped[..., 1] * rope_cache[..., 1], + xshaped[..., 1] * rope_cache[..., 0] + xshaped[..., 0] * rope_cache[..., 1], + ], + -1, + ) + x_out2 = x_out2.flatten(3) + return torch.cat((x_out2, x_pass), dim=-1) + + +class RMSNorm(torch.nn.Module): + def __init__(self, normalized_shape, eps=1e-5, device=None, dtype=None, **kwargs): + super().__init__() + self.weight = torch.nn.Parameter(torch.empty(normalized_shape, device=device, dtype=dtype)) + self.eps = eps + + def forward(self, input: torch.Tensor): + norm_x = torch.mean(input * input, dim=-1, keepdim=True) + x_normed = input * torch.rsqrt(norm_x + self.eps) + return self.weight * x_normed + + +class CoreAttention(torch.nn.Module): + def __init__(self, config: ChatGLMConfig, layer_number): + super(CoreAttention, self).__init__() + + self.apply_query_key_layer_scaling = config.apply_query_key_layer_scaling + self.attention_softmax_in_fp32 = config.attention_softmax_in_fp32 + if self.apply_query_key_layer_scaling: + self.attention_softmax_in_fp32 = True + self.layer_number = max(1, layer_number) + + projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + self.hidden_size_per_partition = projection_size + self.hidden_size_per_attention_head = projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads + + coeff = None + self.norm_factor = math.sqrt(self.hidden_size_per_attention_head) + if self.apply_query_key_layer_scaling: + coeff = self.layer_number + self.norm_factor *= coeff + self.coeff = coeff + + self.attention_dropout = torch.nn.Dropout(config.attention_dropout) + + def forward(self, query_layer, key_layer, value_layer, attention_mask): + pytorch_major_version = int(torch.__version__.split('.')[0]) + if pytorch_major_version >= 2 and False: + query_layer, key_layer, value_layer = [k.permute(1, 2, 0, 3) for k in [query_layer, key_layer, value_layer]] + if attention_mask is None and query_layer.shape[2] == key_layer.shape[2]: + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, key_layer, value_layer, + is_causal=True) + else: + if attention_mask is not None: + attention_mask = ~attention_mask + context_layer = torch.nn.functional.scaled_dot_product_attention(query_layer, key_layer, value_layer, + attention_mask) + context_layer = context_layer.permute(2, 0, 1, 3) + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size_per_partition,) + context_layer = context_layer.reshape(*new_context_layer_shape) + else: + # Raw attention scores + + # [b, np, sq, sk] + output_size = (query_layer.size(1), query_layer.size(2), query_layer.size(0), key_layer.size(0)) + + # [sq, b, np, hn] -> [sq, b * np, hn] + query_layer = query_layer.view(output_size[2], output_size[0] * output_size[1], -1) + # [sk, b, np, hn] -> [sk, b * np, hn] + key_layer = key_layer.view(output_size[3], output_size[0] * output_size[1], -1) + + # preallocting input tensor: [b * np, sq, sk] + matmul_input_buffer = torch.empty( + output_size[0] * output_size[1], output_size[2], output_size[3], dtype=query_layer.dtype, + device=query_layer.device + ) + + # Raw attention scores. [b * np, sq, sk] + matmul_result = torch.baddbmm( + matmul_input_buffer, + query_layer.transpose(0, 1), # [b * np, sq, hn] + key_layer.transpose(0, 1).transpose(1, 2), # [b * np, hn, sk] + beta=0.0, + alpha=(1.0 / self.norm_factor), + ) + + # change view to [b, np, sq, sk] + attention_scores = matmul_result.view(*output_size) + + # =========================== + # Attention probs and dropout + # =========================== + + # attention scores and attention mask [b, np, sq, sk] + if self.attention_softmax_in_fp32: + attention_scores = attention_scores.float() + if self.coeff is not None: + attention_scores = attention_scores * self.coeff + if attention_mask is None and attention_scores.shape[2] == attention_scores.shape[3]: + attention_mask = torch.ones(output_size[0], 1, output_size[2], output_size[3], + device=attention_scores.device, dtype=torch.bool) + attention_mask.tril_() + attention_mask = ~attention_mask + if attention_mask is not None: + attention_scores = attention_scores.masked_fill(attention_mask, float("-inf")) + attention_probs = F.softmax(attention_scores, dim=-1) + attention_probs = attention_probs.type_as(value_layer) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self.attention_dropout(attention_probs) + # ========================= + # Context layer. [sq, b, hp] + # ========================= + + # value_layer -> context layer. + # [sk, b, np, hn] --> [b, np, sq, hn] + + # context layer shape: [b, np, sq, hn] + output_size = (value_layer.size(1), value_layer.size(2), query_layer.size(0), value_layer.size(3)) + # change view [sk, b * np, hn] + value_layer = value_layer.view(value_layer.size(0), output_size[0] * output_size[1], -1) + # change view [b * np, sq, sk] + attention_probs = attention_probs.view(output_size[0] * output_size[1], output_size[2], -1) + # matmul: [b * np, sq, hn] + context_layer = torch.bmm(attention_probs, value_layer.transpose(0, 1)) + # change view [b, np, sq, hn] + context_layer = context_layer.view(*output_size) + # [b, np, sq, hn] --> [sq, b, np, hn] + context_layer = context_layer.permute(2, 0, 1, 3).contiguous() + # [sq, b, np, hn] --> [sq, b, hp] + new_context_layer_shape = context_layer.size()[:-2] + (self.hidden_size_per_partition,) + context_layer = context_layer.view(*new_context_layer_shape) + + return context_layer + + +class SelfAttention(torch.nn.Module): + """Parallel self-attention layer abstract class. + + Self-attention layer takes input with size [s, b, h] + and returns output of the same size. + """ + + def __init__(self, config: ChatGLMConfig, layer_number, device=None): + super(SelfAttention, self).__init__() + self.layer_number = max(1, layer_number) + + self.projection_size = config.kv_channels * config.num_attention_heads + + # Per attention head and per partition values. + self.hidden_size_per_attention_head = self.projection_size // config.num_attention_heads + self.num_attention_heads_per_partition = config.num_attention_heads + + self.multi_query_attention = config.multi_query_attention + self.qkv_hidden_size = 3 * self.projection_size + if self.multi_query_attention: + self.num_multi_query_groups_per_partition = config.multi_query_group_num + self.qkv_hidden_size = ( + self.projection_size + 2 * self.hidden_size_per_attention_head * config.multi_query_group_num + ) + self.query_key_value = nn.Linear(config.hidden_size, self.qkv_hidden_size, + bias=config.add_bias_linear or config.add_qkv_bias, + device=device, **_config_to_kwargs(config) + ) + + self.core_attention = CoreAttention(config, self.layer_number) + + # Output. + self.dense = nn.Linear(self.projection_size, config.hidden_size, bias=config.add_bias_linear, + device=device, **_config_to_kwargs(config) + ) + + self.interleaved_qkv = config.interleaved_qkv + + def _allocate_memory(self, inference_max_sequence_len, batch_size, device=None, dtype=None): + if self.multi_query_attention: + num_attention_heads = self.num_multi_query_groups_per_partition + else: + num_attention_heads = self.num_attention_heads_per_partition + return torch.empty( + inference_max_sequence_len, + batch_size, + num_attention_heads, + self.hidden_size_per_attention_head, + dtype=dtype, + device=device, + ) + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_cache=None, use_cache=True + ): + # hidden_states: [sq, b, h] + + # ================================================= + # Pre-allocate memory for key-values for inference. + # ================================================= + # ===================== + # Query, Key, and Value + # ===================== + + # Attention heads [sq, b, h] --> [sq, b, (np * 3 * hn)] + mixed_x_layer = self.query_key_value(hidden_states) + + if self.multi_query_attention: + (query_layer, key_layer, value_layer) = mixed_x_layer.split( + [ + self.num_attention_heads_per_partition * self.hidden_size_per_attention_head, + self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head, + self.num_multi_query_groups_per_partition * self.hidden_size_per_attention_head, + ], + dim=-1, + ) + query_layer = query_layer.view( + query_layer.size()[:-1] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + key_layer = key_layer.view( + key_layer.size()[:-1] + (self.num_multi_query_groups_per_partition, self.hidden_size_per_attention_head) + ) + value_layer = value_layer.view( + value_layer.size()[:-1] + + (self.num_multi_query_groups_per_partition, self.hidden_size_per_attention_head) + ) + else: + if self.interleaved_qkv: + new_tensor_shape = mixed_x_layer.size()[:-1] + \ + (self.num_attention_heads_per_partition, + 3 * self.hidden_size_per_attention_head) + mixed_x_layer = mixed_x_layer.view(*new_tensor_shape) + + # [sq, b, np, 3 * hn] --> 3 [sq, b, np, hn] + (query_layer, key_layer, value_layer) = split_tensor_along_last_dim(mixed_x_layer, 3) + + if not self.interleaved_qkv: + query_layer = query_layer.view( + query_layer.size()[:-1] + ( + self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ).contiguous() + key_layer = key_layer.view( + key_layer.size()[:-1] + ( + self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ).contiguous() + value_layer = value_layer.view( + value_layer.size()[:-1] + ( + self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ).contiguous() + + # apply relative positional encoding (rotary embedding) + if rotary_pos_emb is not None: + query_layer = apply_rotary_pos_emb_original(query_layer, rotary_pos_emb) + key_layer = apply_rotary_pos_emb_original(key_layer, rotary_pos_emb) + + # adjust key and value for inference + if use_cache: + if kv_cache is not None: + cache_k, cache_v = kv_cache + key_layer = torch.cat((cache_k, key_layer), dim=0) + value_layer = torch.cat((cache_v, value_layer), dim=0) + kv_cache = (key_layer, value_layer) + else: + kv_cache = None + + if self.multi_query_attention: + key_layer = key_layer.unsqueeze(-2) + key_layer = key_layer.expand( + -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1 + ) + key_layer = key_layer.contiguous().view( + key_layer.size()[:2] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + value_layer = value_layer.unsqueeze(-2) + value_layer = value_layer.expand( + -1, -1, -1, self.num_attention_heads_per_partition // self.num_multi_query_groups_per_partition, -1 + ) + value_layer = value_layer.contiguous().view( + value_layer.size()[:2] + (self.num_attention_heads_per_partition, self.hidden_size_per_attention_head) + ) + + # ================================== + # core attention computation + # ================================== + + context_layer = self.core_attention(query_layer, key_layer, value_layer, attention_mask) + + # ================= + # Output. [sq, b, h] + # ================= + + output = self.dense(context_layer) + + return output, kv_cache + + +def _config_to_kwargs(args): + common_kwargs = { + "dtype": args.torch_dtype, + } + return common_kwargs + + +class MLP(torch.nn.Module): + """MLP. + + MLP will take the input with h hidden state, project it to 4*h + hidden dimension, perform nonlinear transformation, and project the + state back into h hidden dimension. + """ + + def __init__(self, config: ChatGLMConfig, device=None): + super(MLP, self).__init__() + + self.add_bias = config.add_bias_linear + + # Project to 4h. If using swiglu double the output width, see https://arxiv.org/pdf/2002.05202.pdf + self.dense_h_to_4h = nn.Linear( + config.hidden_size, + config.ffn_hidden_size * 2, + bias=self.add_bias, + device=device, + **_config_to_kwargs(config) + ) + + def swiglu(x): + x = torch.chunk(x, 2, dim=-1) + return F.silu(x[0]) * x[1] + + self.activation_func = swiglu + + # Project back to h. + self.dense_4h_to_h = nn.Linear( + config.ffn_hidden_size, + config.hidden_size, + bias=self.add_bias, + device=device, + **_config_to_kwargs(config) + ) + + def forward(self, hidden_states): + # [s, b, 4hp] + intermediate_parallel = self.dense_h_to_4h(hidden_states) + intermediate_parallel = self.activation_func(intermediate_parallel) + # [s, b, h] + output = self.dense_4h_to_h(intermediate_parallel) + return output + + +class GLMBlock(torch.nn.Module): + """A single transformer layer. + + Transformer layer takes input with size [s, b, h] and returns an + output of the same size. + """ + + def __init__(self, config: ChatGLMConfig, layer_number, device=None): + super(GLMBlock, self).__init__() + self.layer_number = layer_number + + self.apply_residual_connection_post_layernorm = config.apply_residual_connection_post_layernorm + + self.fp32_residual_connection = config.fp32_residual_connection + + LayerNormFunc = RMSNorm if config.rmsnorm else LayerNorm + # Layernorm on the input data. + self.input_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + # Self attention. + self.self_attention = SelfAttention(config, layer_number, device=device) + self.hidden_dropout = config.hidden_dropout + + # Layernorm on the attention output + self.post_attention_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + # MLP + self.mlp = MLP(config, device=device) + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_cache=None, use_cache=True, + ): + # hidden_states: [s, b, h] + + # Layer norm at the beginning of the transformer layer. + layernorm_output = self.input_layernorm(hidden_states) + # Self attention. + attention_output, kv_cache = self.self_attention( + layernorm_output, + attention_mask, + rotary_pos_emb, + kv_cache=kv_cache, + use_cache=use_cache + ) + + # Residual connection. + if self.apply_residual_connection_post_layernorm: + residual = layernorm_output + else: + residual = hidden_states + + layernorm_input = torch.nn.functional.dropout(attention_output, p=self.hidden_dropout, training=self.training) + layernorm_input = residual + layernorm_input + + # Layer norm post the self attention. + layernorm_output = self.post_attention_layernorm(layernorm_input) + + # MLP. + mlp_output = self.mlp(layernorm_output) + + # Second residual connection. + if self.apply_residual_connection_post_layernorm: + residual = layernorm_output + else: + residual = layernorm_input + + output = torch.nn.functional.dropout(mlp_output, p=self.hidden_dropout, training=self.training) + output = residual + output + + return output, kv_cache + + +class GLMTransformer(torch.nn.Module): + """Transformer class.""" + + def __init__(self, config: ChatGLMConfig, device=None): + super(GLMTransformer, self).__init__() + + self.fp32_residual_connection = config.fp32_residual_connection + self.post_layer_norm = config.post_layer_norm + + # Number of layers. + self.num_layers = config.num_layers + + # Transformer layers. + def build_layer(layer_number): + return GLMBlock(config, layer_number, device=device) + + self.layers = torch.nn.ModuleList([build_layer(i + 1) for i in range(self.num_layers)]) + + if self.post_layer_norm: + LayerNormFunc = RMSNorm if config.rmsnorm else LayerNorm + # Final layer norm before output. + self.final_layernorm = LayerNormFunc(config.hidden_size, eps=config.layernorm_epsilon, device=device, + dtype=config.torch_dtype) + + def _get_layer(self, layer_number): + return self.layers[layer_number] + + def forward( + self, hidden_states, attention_mask, rotary_pos_emb, kv_caches=None, + use_cache: Optional[bool] = True, + output_hidden_states: Optional[bool] = False, + ): + if not kv_caches: + kv_caches = [None for _ in range(self.num_layers)] + presents = () if use_cache else None + all_self_attentions = None + all_hidden_states = () if output_hidden_states else None + for index in range(self.num_layers): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + layer = self._get_layer(index) + + hidden_states, kv_cache = layer( + hidden_states, + attention_mask, + rotary_pos_emb, + kv_cache=kv_caches[index], + use_cache=use_cache + ) + if use_cache: + presents = presents + (kv_cache,) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) + + # Final layer norm. + if self.post_layer_norm: + hidden_states = self.final_layernorm(hidden_states) + + return hidden_states, presents, all_hidden_states, all_self_attentions + + +class ChatGLMPreTrainedModel(PreTrainedModel): + """ + An abstract class to handle weights initialization and + a simple interface for downloading and loading pretrained models. + """ + + is_parallelizable = False + supports_gradient_checkpointing = True + config_class = ChatGLMConfig + base_model_prefix = "transformer" + _no_split_modules = ["GLMBlock"] + + def _init_weights(self, module: nn.Module): + """Initialize the weights.""" + return + + def get_masks(self, input_ids, past_key_values, padding_mask=None): + batch_size, seq_length = input_ids.shape + full_attention_mask = torch.ones(batch_size, seq_length, seq_length, device=input_ids.device) + full_attention_mask.tril_() + past_length = 0 + if past_key_values: + past_length = past_key_values[0][0].shape[0] + if past_length: + full_attention_mask = torch.cat((torch.ones(batch_size, seq_length, past_length, + device=input_ids.device), full_attention_mask), dim=-1) + if padding_mask is not None: + full_attention_mask = full_attention_mask * padding_mask.unsqueeze(1) + if not past_length and padding_mask is not None: + full_attention_mask -= padding_mask.unsqueeze(-1) - 1 + full_attention_mask = (full_attention_mask < 0.5).bool() + full_attention_mask.unsqueeze_(1) + return full_attention_mask + + def get_position_ids(self, input_ids, device): + batch_size, seq_length = input_ids.shape + position_ids = torch.arange(seq_length, dtype=torch.long, device=device).unsqueeze(0).repeat(batch_size, 1) + return position_ids + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, ChatGLMModel): + module.gradient_checkpointing = value + + +class Embedding(torch.nn.Module): + """Language model embeddings.""" + + def __init__(self, config: ChatGLMConfig, device=None): + super(Embedding, self).__init__() + + self.hidden_size = config.hidden_size + # Word embeddings (parallel). + self.word_embeddings = nn.Embedding( + config.padded_vocab_size, + self.hidden_size, + dtype=config.torch_dtype, + device=device + ) + self.fp32_residual_connection = config.fp32_residual_connection + + def forward(self, input_ids): + # Embeddings. + words_embeddings = self.word_embeddings(input_ids) + embeddings = words_embeddings + # Data format change to avoid explicit tranposes : [b s h] --> [s b h]. + embeddings = embeddings.transpose(0, 1).contiguous() + # If the input flag for fp32 residual connection is set, convert for float. + if self.fp32_residual_connection: + embeddings = embeddings.float() + return embeddings + + +class ChatGLMModel(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, device=None, empty_init=True): + super().__init__(config) + if empty_init: + init_method = skip_init + else: + init_method = default_init + init_kwargs = {} + if device is not None: + init_kwargs["device"] = device + self.embedding = init_method(Embedding, config, **init_kwargs) + + # Rotary positional embeddings + self.seq_length = config.seq_length + rotary_dim = ( + config.hidden_size // config.num_attention_heads if config.kv_channels is None else config.kv_channels + ) + + if config.rotary_percent < 1.0: + rotary_dim = int(rotary_dim * config.rotary_percent) + + # partial rotary embeddings, which is better than full rotary + # Wang and Komatsuzaki et al + # https://github.com/kingoflolz/mesh-transformer-jax/ + self.rotary_pos_emb = RotaryEmbedding(rotary_dim, original_impl=config.original_rope, device=device, + dtype=config.torch_dtype) + self.encoder = init_method(GLMTransformer, config, **init_kwargs) + self.output_layer = init_method(nn.Linear, config.hidden_size, config.padded_vocab_size, bias=False, + dtype=config.torch_dtype, **init_kwargs) + self.gradient_checkpointing = False + + def forward( + self, + input_ids, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.BoolTensor] = None, + full_attention_mask: Optional[torch.BoolTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + batch_size, seq_length = input_ids.shape + + if inputs_embeds is None: + inputs_embeds = self.embedding(input_ids) + + if full_attention_mask is None and attention_mask is not None and not attention_mask.all(): + full_attention_mask = self.get_masks(input_ids, past_key_values, padding_mask=attention_mask) + + # Rotary positional embeddings + rotary_pos_emb = self.rotary_pos_emb(self.seq_length) + if position_ids is not None: + rotary_pos_emb = rotary_pos_emb[position_ids] + else: + rotary_pos_emb = rotary_pos_emb[None, :seq_length] + rotary_pos_emb = rotary_pos_emb.transpose(0, 1).contiguous() + + # Run encoder. + hidden_states, presents, all_hidden_states, all_self_attentions = self.encoder( + inputs_embeds, full_attention_mask, rotary_pos_emb=rotary_pos_emb, + kv_caches=past_key_values, use_cache=use_cache, output_hidden_states=output_hidden_states + ) + + if not return_dict: + return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + def quantize(self, weight_bit_width: int): + from .quantization import quantize + quantize(self.encoder, weight_bit_width) + return self + + +class ChatGLMForConditionalGeneration(ChatGLMPreTrainedModel): + def __init__(self, config: ChatGLMConfig, empty_init=True, device=None): + super().__init__(config) + + self.max_sequence_length = config.max_length + self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device) + self.config = config + self.quantized = False + + if self.config.quantization_bit: + self.quantize(self.config.quantization_bit, empty_init=True) + + def _update_model_kwargs_for_generation( + self, + outputs: ModelOutput, + model_kwargs: Dict[str, Any], + is_encoder_decoder: bool = False, + standardize_cache_format: bool = False, + ) -> Dict[str, Any]: + # update past_key_values + model_kwargs["past_key_values"] = self._extract_past_from_model_output( + outputs, standardize_cache_format=standardize_cache_format + ) + + # update attention mask + if "attention_mask" in model_kwargs: + attention_mask = model_kwargs["attention_mask"] + model_kwargs["attention_mask"] = torch.cat( + [attention_mask, attention_mask.new_ones((attention_mask.shape[0], 1))], dim=-1 + ) + + # update position ids + if "position_ids" in model_kwargs: + position_ids = model_kwargs["position_ids"] + new_position_id = position_ids[..., -1:].clone() + new_position_id += 1 + model_kwargs["position_ids"] = torch.cat( + [position_ids, new_position_id], dim=-1 + ) + + return model_kwargs + + def prepare_inputs_for_generation( + self, + input_ids: torch.LongTensor, + past_key_values: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + input_pos: int = None, + **kwargs + ) -> dict: + # only last token for input_ids if past is not None + if past_key_values is not None: + if position_ids is None: + position_ids = self.get_position_ids(input_ids, device=input_ids.device) + position_ids = position_ids[..., -1:] + input_ids = input_ids[:, -1:] + return { + "input_ids": input_ids, + "past_key_values": past_key_values, + "position_ids": position_ids, + "attention_mask": attention_mask + } + + def forward( + self, + input_ids: Optional[torch.Tensor] = None, + position_ids: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + past_key_values: Optional[Tuple[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ): + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.transformer( + input_ids=input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + + lm_logits = self.transformer.output_layer(hidden_states) + lm_logits = lm_logits.transpose(0, 1).contiguous() + + loss = None + if labels is not None: + lm_logits = lm_logits.to(torch.float32) + + # Shift so that tokens < n predict n + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss(ignore_index=-100) + loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) + + lm_logits = lm_logits.to(hidden_states.dtype) + loss = loss.to(hidden_states.dtype) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + @staticmethod + def _reorder_cache( + past: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], beam_idx: torch.LongTensor + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]: + """ + This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or + [`~PreTrainedModel.beam_sample`] is called. This is required to match `past_key_values` with the correct + beam_idx at every generation step. + + Output shares the same memory storage as `past`. + """ + return tuple( + ( + layer_past[0].index_select(1, beam_idx.to(layer_past[0].device)), + layer_past[1].index_select(1, beam_idx.to(layer_past[1].device)), + ) + for layer_past in past + ) + + def process_response(self, response): + response = response.strip() + response = response.replace("[[训练时间]]", "2023年") + return response + + def build_inputs(self, tokenizer, query: str, history: List[Tuple[str, str]] = None): + prompt = "" + for i, (old_query, response) in enumerate(history): + prompt += "[Round {}]\n\n问:{}\n\n答:{}\n\n".format(i + 1, old_query, response) + prompt += "[Round {}]\n\n问:{}\n\n答:".format(len(history) + 1, query) + inputs = tokenizer([prompt], return_tensors="pt") + inputs = inputs.to(self.device) + return inputs + + @torch.no_grad() + def chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, max_length: int = 2048, num_beams=1, + do_sample=True, top_p=0.8, temperature=0.8, logits_processor=None, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "num_beams": num_beams, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + inputs = self.build_inputs(tokenizer, query, history=history) + outputs = self.generate(**inputs, **gen_kwargs) + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):] + response = tokenizer.decode(outputs) + response = self.process_response(response) + history = history + [(query, response)] + return response, history + + @torch.no_grad() + def stream_chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, max_length: int = 2048, + do_sample=True, top_p=0.7, temperature=0.95, logits_processor=None, **kwargs): + if history is None: + history = [] + if logits_processor is None: + logits_processor = LogitsProcessorList() + logits_processor.append(InvalidScoreLogitsProcessor()) + gen_kwargs = {"max_length": max_length, "do_sample": do_sample, "top_p": top_p, + "temperature": temperature, "logits_processor": logits_processor, **kwargs} + inputs = self.build_inputs(tokenizer, query, history=history) + for outputs in self.stream_generate(**inputs, **gen_kwargs): + outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):] + response = tokenizer.decode(outputs) + response = self.process_response(response) + new_history = history + [(query, response)] + yield response, new_history + + @torch.no_grad() + def stream_generate( + self, + input_ids, + generation_config: Optional[GenerationConfig] = None, + logits_processor: Optional[LogitsProcessorList] = None, + stopping_criteria: Optional[StoppingCriteriaList] = None, + prefix_allowed_tokens_fn: Optional[Callable[[int, torch.Tensor], List[int]]] = None, + **kwargs, + ): + batch_size, input_ids_seq_length = input_ids.shape[0], input_ids.shape[-1] + + if generation_config is None: + generation_config = self.generation_config + generation_config = copy.deepcopy(generation_config) + model_kwargs = generation_config.update(**kwargs) + bos_token_id, eos_token_id = generation_config.bos_token_id, generation_config.eos_token_id + + if isinstance(eos_token_id, int): + eos_token_id = [eos_token_id] + + has_default_max_length = kwargs.get("max_length") is None and generation_config.max_length is not None + if has_default_max_length and generation_config.max_new_tokens is None: + warnings.warn( + f"Using `max_length`'s default ({generation_config.max_length}) to control the generation length. " + "This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we" + " recommend using `max_new_tokens` to control the maximum length of the generation.", + UserWarning, + ) + elif generation_config.max_new_tokens is not None: + generation_config.max_length = generation_config.max_new_tokens + input_ids_seq_length + if not has_default_max_length: + logger.warn( + f"Both `max_new_tokens` (={generation_config.max_new_tokens}) and `max_length`(=" + f"{generation_config.max_length}) seem to have been set. `max_new_tokens` will take precedence. " + "Please refer to the documentation for more information. " + "(https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)", + UserWarning, + ) + + if input_ids_seq_length >= generation_config.max_length: + input_ids_string = "decoder_input_ids" if self.config.is_encoder_decoder else "input_ids" + logger.warning( + f"Input length of {input_ids_string} is {input_ids_seq_length}, but `max_length` is set to" + f" {generation_config.max_length}. This can lead to unexpected behavior. You should consider" + " increasing `max_new_tokens`." + ) + + # 2. Set generation parameters if not already defined + logits_processor = logits_processor if logits_processor is not None else LogitsProcessorList() + stopping_criteria = stopping_criteria if stopping_criteria is not None else StoppingCriteriaList() + + logits_processor = self._get_logits_processor( + generation_config=generation_config, + input_ids_seq_length=input_ids_seq_length, + encoder_input_ids=input_ids, + prefix_allowed_tokens_fn=prefix_allowed_tokens_fn, + logits_processor=logits_processor, + ) + + stopping_criteria = self._get_stopping_criteria( + generation_config=generation_config, stopping_criteria=stopping_criteria + ) + logits_warper = self._get_logits_warper(generation_config) + + unfinished_sequences = input_ids.new(input_ids.shape[0]).fill_(1) + scores = None + while True: + model_inputs = self.prepare_inputs_for_generation(input_ids, **model_kwargs) + # forward pass to get next token + outputs = self( + **model_inputs, + return_dict=True, + output_attentions=False, + output_hidden_states=False, + ) + + next_token_logits = outputs.logits[:, -1, :] + + # pre-process distribution + next_token_scores = logits_processor(input_ids, next_token_logits) + next_token_scores = logits_warper(input_ids, next_token_scores) + + # sample + probs = nn.functional.softmax(next_token_scores, dim=-1) + if generation_config.do_sample: + next_tokens = torch.multinomial(probs, num_samples=1).squeeze(1) + else: + next_tokens = torch.argmax(probs, dim=-1) + + # update generated ids, model inputs, and length for next step + input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1) + model_kwargs = self._update_model_kwargs_for_generation( + outputs, model_kwargs, is_encoder_decoder=self.config.is_encoder_decoder + ) + unfinished_sequences = unfinished_sequences.mul((sum(next_tokens != i for i in eos_token_id)).long()) + + # stop when each sentence is finished, or if we exceed the maximum length + if unfinished_sequences.max() == 0 or stopping_criteria(input_ids, scores): + break + yield input_ids + + def quantize(self, bits: int, empty_init=False, device=None, **kwargs): + if bits == 0: + return + + from .quantization import quantize + + if self.quantized: + logger.info("Already quantized.") + return self + + self.quantized = True + + self.config.quantization_bit = bits + + self.transformer.encoder = quantize(self.transformer.encoder, bits, empty_init=empty_init, device=device, + **kwargs) + return self diff --git a/transformers/llm/export/llm_models/deepseek-llm-7b-chat/config.json b/transformers/llm/export/llm_models/deepseek-llm-7b-chat/config.json new file mode 100755 index 000000000..67a803b6a --- /dev/null +++ b/transformers/llm/export/llm_models/deepseek-llm-7b-chat/config.json @@ -0,0 +1,28 @@ +{ + "architectures": [ + "LlamaForCausalLM" + ], + "auto_map": { + "AutoModelForCausalLM": "modeling_llama.LlamaForCausalLM" + }, + "bos_token_id": 100000, + "eos_token_id": 100001, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 11008, + "max_position_embeddings": 4096, + "model_type": "llama", + "num_attention_heads": 32, + "num_hidden_layers": 30, + "num_key_value_heads": 32, + "pretraining_tp": 1, + "rms_norm_eps": 1e-06, + "rope_scaling": null, + "rope_theta": 10000.0, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.33.1", + "use_cache": true, + "vocab_size": 102400 +} diff --git a/transformers/llm/export/llm_models/deepseek-llm-7b-chat/configuration_llama.py b/transformers/llm/export/llm_models/deepseek-llm-7b-chat/configuration_llama.py new file mode 100644 index 000000000..1b0e9c357 --- /dev/null +++ b/transformers/llm/export/llm_models/deepseek-llm-7b-chat/configuration_llama.py @@ -0,0 +1,174 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" LLaMA model configuration""" + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +LLAMA_PRETRAINED_CONFIG_ARCHIVE_MAP = {} + + +class LlamaConfig(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`LlamaModel`]. It is used to instantiate an LLaMA + model according to the specified arguments, defining the model architecture. Instantiating a configuration with the + defaults will yield a similar configuration to that of the LLaMA-7B. + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + + Args: + vocab_size (`int`, *optional*, defaults to 32000): + Vocabulary size of the LLaMA model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`LlamaModel`] + hidden_size (`int`, *optional*, defaults to 4096): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 11008): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer encoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer encoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + pretraining_tp (`int`, *optional*, defaults to `1`): + Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this + document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is + necessary to ensure exact reproducibility of the pretraining results. Please refer to [this + issue](https://github.com/pytorch/pytorch/issues/76232). + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 2048): + The maximum sequence length that this model might ever be used with. Typically set this to something large + just in case (e.g., 512 or 1024 or 2048). + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-12): + The epsilon used by the rms normalization layers. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. + tie_word_embeddings(`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_scaling (`Dict`, *optional*): + Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports three scaling + strategies: linear and dynamic. Their scaling factor must be an float greater than 1. The expected format + is `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update + `max_position_embeddings` to the expected new maximum. See the following thread for more information on how + these scaling strategies behave: + https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an + experimental feature, subject to breaking API changes in future versions. + + Example: + + ```python + >>> from transformers import LlamaModel, LlamaConfig + + >>> # Initializing a LLaMA llama-7b style configuration + >>> configuration = LlamaConfig() + + >>> # Initializing a model from the llama-7b style configuration + >>> model = LlamaModel(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + model_type = "llama" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=32000, + hidden_size=4096, + intermediate_size=11008, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + hidden_act="silu", + max_position_embeddings=2048, + initializer_range=0.02, + rms_norm_eps=1e-6, + use_cache=True, + pad_token_id=0, + bos_token_id=1, + eos_token_id=2, + pretraining_tp=1, + tie_word_embeddings=False, + rope_scaling=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.max_position_embeddings = max_position_embeddings + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + + # for backward compatibility + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.hidden_act = hidden_act + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.pretraining_tp = pretraining_tp + self.use_cache = use_cache + self.rope_scaling = rope_scaling + self._rope_scaling_validation() + + super().__init__( + pad_token_id=pad_token_id, + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + def _rope_scaling_validation(self): + """ + Validate the `rope_scaling` configuration. + """ + if self.rope_scaling is None: + return + + if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 2: + raise ValueError( + "`rope_scaling` must be a dictionary with with two fields, `name` and `factor`, " + f"got {self.rope_scaling}" + ) + rope_scaling_type = self.rope_scaling.get("type", None) + rope_scaling_factor = self.rope_scaling.get("factor", None) + if rope_scaling_type is None or rope_scaling_type not in ["linear", "dynamic"]: + raise ValueError( + f"`rope_scaling`'s name field must be one of ['linear', 'dynamic'], got {rope_scaling_type}" + ) + if rope_scaling_factor is None or not isinstance(rope_scaling_factor, float) or rope_scaling_factor <= 1.0: + raise ValueError(f"`rope_scaling`'s factor field must be an float > 1, got {rope_scaling_factor}") diff --git a/transformers/llm/export/llm_models/deepseek-llm-7b-chat/modeling_llama.py b/transformers/llm/export/llm_models/deepseek-llm-7b-chat/modeling_llama.py new file mode 100644 index 000000000..8c562c604 --- /dev/null +++ b/transformers/llm/export/llm_models/deepseek-llm-7b-chat/modeling_llama.py @@ -0,0 +1,1010 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch LLaMA model.""" +import math +from typing import List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings +from .configuration_llama import LlamaConfig + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "LlamaConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.finfo(dtype).min, device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class LlamaRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + LlamaRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +class LlamaRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self._set_cos_sin_cache( + seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype() + ) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if seq_len > self.max_seq_len_cached: + self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype) + + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +class LlamaLinearScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with linear scaling. Credits to the Reddit user /u/kaiokendev""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + t = t / self.scaling_factor + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +class LlamaDynamicNTKScalingRotaryEmbedding(LlamaRotaryEmbedding): + """LlamaRotaryEmbedding extended with Dynamic NTK scaling. Credits to the Reddit users /u/bloc97 and /u/emozilla""" + + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None, scaling_factor=1.0): + self.scaling_factor = scaling_factor + super().__init__(dim, max_position_embeddings, base, device) + + def _set_cos_sin_cache(self, seq_len, device, dtype): + self.max_seq_len_cached = seq_len + + if seq_len > self.max_position_embeddings: + base = self.base * ( + (self.scaling_factor * seq_len / self.max_position_embeddings) - (self.scaling_factor - 1) + ) ** (self.dim / (self.dim - 2)) + inv_freq = 1.0 / (base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim)) + self.register_buffer("inv_freq", inv_freq) + + t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype) + + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + # The first two dimensions of cos and sin are always 1, so we can `squeeze` them. + # cos = cos.squeeze(1).squeeze(0) # [seq_len, dim] + # sin = sin.squeeze(1).squeeze(0) # [seq_len, dim] + cos = torch.squeeze(cos) # [seq_len, dim] + sin = torch.squeeze(sin) # [seq_len, dim] + cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class LlamaMLP(nn.Module): + def __init__(self, config): + super().__init__() + self.pretraining_tp = config.pretraining_tp + self.hidden_size = config.hidden_size + self.intermediate_size = config.intermediate_size + self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False) + self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False) + self.act_fn = ACT2FN[config.hidden_act] + + def forward(self, x): + if self.pretraining_tp > 1: + slice = self.intermediate_size // self.pretraining_tp + gate_proj_slices = self.gate_proj.weight.split(slice, dim=0) + up_proj_slices = self.up_proj.weight.split(slice, dim=0) + down_proj_slices = self.down_proj.weight.split(slice, dim=1) + + gate_proj = torch.cat([F.linear(x, gate_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + up_proj = torch.cat([F.linear(x, up_proj_slices[i]) for i in range(self.pretraining_tp)], dim=-1) + + intermediate_states = (self.act_fn(gate_proj) * up_proj).split(slice, dim=2) + down_proj = [F.linear(intermediate_states[i], down_proj_slices[i]) for i in range(self.pretraining_tp)] + down_proj = sum(down_proj) + else: + down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + return down_proj + + +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class LlamaAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: LlamaConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.pretraining_tp = config.pretraining_tp + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) + self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self._init_rope() + + def _init_rope(self): + if self.config.rope_scaling is None: + self.rotary_emb = LlamaRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + else: + scaling_type = self.config.rope_scaling["type"] + scaling_factor = self.config.rope_scaling["factor"] + if scaling_type == "linear": + self.rotary_emb = LlamaLinearScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + elif scaling_type == "dynamic": + self.rotary_emb = LlamaDynamicNTKScalingRotaryEmbedding( + self.head_dim, max_position_embeddings=self.max_position_embeddings, scaling_factor=scaling_factor + ) + else: + raise ValueError(f"Unknown RoPE scaling type {scaling_type}") + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + if self.pretraining_tp > 1: + key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.pretraining_tp + query_slices = self.q_proj.weight.split((self.num_heads * self.head_dim) // self.pretraining_tp, dim=0) + key_slices = self.k_proj.weight.split(key_value_slicing, dim=0) + value_slices = self.v_proj.weight.split(key_value_slicing, dim=0) + + query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.pretraining_tp)] + query_states = torch.cat(query_states, dim=-1) + + key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.pretraining_tp)] + key_states = torch.cat(key_states, dim=-1) + + value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.pretraining_tp)] + value_states = torch.cat(value_states, dim=-1) + + else: + query_states = self.q_proj(hidden_states) + key_states = self.k_proj(hidden_states) + value_states = self.v_proj(hidden_states) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + if self.pretraining_tp > 1: + attn_output = attn_output.split(self.hidden_size // self.pretraining_tp, dim=2) + o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.pretraining_tp, dim=1) + attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.pretraining_tp)]) + else: + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class LlamaDecoderLayer(nn.Module): + def __init__(self, config: LlamaConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = LlamaAttention(config=config) + self.mlp = LlamaMLP(config) + self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +LLAMA_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`LlamaConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaPreTrainedModel(PreTrainedModel): + config_class = LlamaConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["LlamaDecoderLayer"] + _skip_keys_device_placement = "past_key_values" + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, LlamaModel): + module.gradient_checkpointing = value + + +LLAMA_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare LLaMA Model outputting raw hidden-states without any specific head on top.", + LLAMA_START_DOCSTRING, +) +class LlamaModel(LlamaPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`] + + Args: + config: LlamaConfig + """ + + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([LlamaDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class LlamaForCausalLM(LlamaPreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.model = LlamaModel(config) + self.pretraining_tp = config.pretraining_tp + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, LlamaForCausalLM + + >>> model = LlamaForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you conscious? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + if self.pretraining_tp > 1: + lm_head_slices = self.lm_head.weight.split(self.vocab_size // self.pretraining_tp, dim=0) + logits = [F.linear(hidden_states, lm_head_slices[i]) for i in range(self.pretraining_tp)] + logits = torch.cat(logits, dim=-1) + else: + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The LLaMa Model transformer with a sequence classification head on top (linear layer). + + [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + LLAMA_START_DOCSTRING, +) +class LlamaForSequenceClassification(LlamaPreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = LlamaModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/internlm-chat-7b/modeling_internlm.py b/transformers/llm/export/llm_models/internlm-chat-7b/modeling_internlm.py new file mode 100755 index 000000000..af9f5842c --- /dev/null +++ b/transformers/llm/export/llm_models/internlm-chat-7b/modeling_internlm.py @@ -0,0 +1,1017 @@ +# coding=utf-8 +# Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved. +# +# This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX +# and OPT implementations in this library. It has been modified from its +# original forms to accommodate minor architectural differences compared +# to GPT-NeoX and OPT used by the Meta AI team that trained the model. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PyTorch InternLM model.""" +import math +from typing import List, Optional, Tuple, Union +import threading, queue + +import torch +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss + +from transformers.activations import ACT2FN +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, + CausalLMOutputWithPast, + SequenceClassifierOutputWithPast, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.generation.streamers import BaseStreamer +from transformers.utils import ( + add_start_docstrings, + add_start_docstrings_to_model_forward, + logging, + replace_return_docstrings, +) +from .configuration_internlm import InternLMConfig + + +logger = logging.get_logger(__name__) + +_CONFIG_FOR_DOC = "InternLMConfig" + + +# Copied from transformers.models.bart.modeling_bart._make_causal_mask +def _make_causal_mask( + input_ids_shape: torch.Size, dtype: torch.dtype, device: torch.device, past_key_values_length: int = 0 +): + """ + Make causal mask used for bi-directional self-attention. + """ + bsz, tgt_len = input_ids_shape + mask = torch.full((tgt_len, tgt_len), torch.tensor(torch.finfo(dtype).min, device=device), device=device) + mask_cond = torch.arange(mask.size(-1), device=device) + mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) + mask = mask.to(dtype) + + if past_key_values_length > 0: + mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) + return mask[None, None, :, :].expand(bsz, 1, tgt_len, tgt_len + past_key_values_length) + + +# Copied from transformers.models.bart.modeling_bart._expand_mask +def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): + """ + Expands attention_mask from `[bsz, seq_len]` to `[bsz, 1, tgt_seq_len, src_seq_len]`. + """ + bsz, src_len = mask.size() + tgt_len = tgt_len if tgt_len is not None else src_len + + expanded_mask = mask[:, None, None, :].expand(bsz, 1, tgt_len, src_len).to(dtype) + + inverted_mask = 1.0 - expanded_mask + + return inverted_mask.masked_fill(inverted_mask.to(torch.bool), torch.finfo(dtype).min) + + +class InternLMRMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + InternLMRMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + variance = hidden_states.to(torch.float32).pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + + # convert into half-precision if necessary + if self.weight.dtype in [torch.float16, torch.bfloat16]: + hidden_states = hidden_states.to(self.weight.dtype) + + return self.weight * hidden_states + + +class InternLMRotaryEmbedding(torch.nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + inv_freq = 1.0 / (base ** (torch.arange(0, dim, 2).float().to(device) / dim)) + self.register_buffer("inv_freq", inv_freq) + + # Build here to make `torch.jit.trace` work. + self.max_seq_len_cached = max_position_embeddings + t = torch.arange(self.max_seq_len_cached, device=self.inv_freq.device, dtype=self.inv_freq.dtype) + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False) + + def forward(self, x, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + # This `if` block is unlikely to be run after we build sin/cos in `__init__`. Keep the logic here just in case. + if seq_len > self.max_seq_len_cached: + self.max_seq_len_cached = seq_len + t = torch.arange(self.max_seq_len_cached, device=x.device, dtype=self.inv_freq.dtype) + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + # Different from paper, but it uses a different permutation in order to obtain the same calculation + emb = torch.cat((freqs, freqs), dim=-1).to(x.device) + self.register_buffer("cos_cached", emb.cos()[None, None, :, :], persistent=False) + self.register_buffer("sin_cached", emb.sin()[None, None, :, :], persistent=False) + return ( + self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), + ) + + +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +def apply_rotary_pos_emb(q, k, cos, sin, position_ids): + # The first two dimensions of cos and sin are always 1, so we can `squeeze` them. + # cos = cos.squeeze(1).squeeze(0) # [seq_len, dim] + # sin = sin.squeeze(1).squeeze(0) # [seq_len, dim] + cos = torch.squeeze(cos) # [seq_len, dim] + sin = torch.squeeze(sin) # [seq_len, dim] + cos = cos[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + sin = sin[position_ids].unsqueeze(1) # [bs, 1, seq_len, dim] + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class InternLMMLP(nn.Module): + def __init__( + self, + hidden_size: int, + intermediate_size: int, + hidden_act: str, + ): + super().__init__() + self.gate_proj = nn.Linear(hidden_size, intermediate_size, bias=False) + self.down_proj = nn.Linear(intermediate_size, hidden_size, bias=False) + self.up_proj = nn.Linear(hidden_size, intermediate_size, bias=False) + self.act_fn = ACT2FN[hidden_act] + + def forward(self, x): + return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) + + +class InternLMAttention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: InternLMConfig): + super().__init__() + self.config = config + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.max_position_embeddings = config.max_position_embeddings + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=config.bias) + self.k_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=config.bias) + self.v_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=config.bias) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=config.bias) + self.rotary_emb = InternLMRotaryEmbedding(self.head_dim, max_position_embeddings=self.max_position_embeddings) + + def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + bsz, q_len, _ = hidden_states.size() + + query_states = self.q_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = self.k_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + value_states = self.v_proj(hidden_states).view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value[0].shape[-2] + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + # [bsz, nh, t, hd] + + if past_key_value is not None: + # reuse k, v, self_attention + key_states = torch.cat([past_key_value[0], key_states], dim=2) + value_states = torch.cat([past_key_value[1], value_states], dim=2) + + past_key_value = (key_states, value_states) if use_cache else None + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + attn_weights = torch.max(attn_weights, torch.tensor(torch.finfo(attn_weights.dtype).min)) + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2) + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class InternLMDecoderLayer(nn.Module): + def __init__(self, config: InternLMConfig): + super().__init__() + self.hidden_size = config.hidden_size + self.self_attn = InternLMAttention(config=config) + self.mlp = InternLMMLP( + hidden_size=self.hidden_size, + intermediate_size=config.intermediate_size, + hidden_act=config.hidden_act, + ) + self.input_layernorm = InternLMRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + self.post_attention_layernorm = InternLMRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +INTERNLM_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`InternLMConfig`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare InternLM Model outputting raw hidden-states without any specific head on top.", + INTERNLM_START_DOCSTRING, +) +class InternLMPreTrainedModel(PreTrainedModel): + config_class = InternLMConfig + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["InternLMDecoderLayer"] + _keys_to_ignore_on_load_unexpected = [r"decoder\.version"] + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + def _set_gradient_checkpointing(self, module, value=False): + if isinstance(module, InternLMModel): + module.gradient_checkpointing = value + + +INTERNLM_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`tuple(tuple(torch.FloatTensor))`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`): + Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of shape + `(batch_size, num_heads, sequence_length, embed_size_per_head)`) and 2 additional tensors of shape + `(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)`. + + Contains pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used (see `past_key_values` input) to speed up sequential decoding. + + If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that + don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all + `decoder_input_ids` of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare InternLM Model outputting raw hidden-states without any specific head on top.", + INTERNLM_START_DOCSTRING, +) +class InternLMModel(InternLMPreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`InternLMDecoderLayer`] + + Args: + config: InternLMConfig + """ + + _auto_class = "AutoModel" + + def __init__(self, config: InternLMConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.layers = nn.ModuleList([InternLMDecoderLayer(config) for _ in range(config.num_hidden_layers)]) + self.norm = InternLMRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + # Copied from transformers.models.bart.modeling_bart.BartDecoder._prepare_decoder_attention_mask + def _prepare_decoder_attention_mask(self, attention_mask, input_shape, inputs_embeds, past_key_values_length): + # create causal mask + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + combined_attention_mask = None + if input_shape[-1] > 1: + combined_attention_mask = _make_causal_mask( + input_shape, + inputs_embeds.dtype, + device=inputs_embeds.device, + past_key_values_length=past_key_values_length, + ) + + if attention_mask is not None: + # [bsz, seq_len] -> [bsz, 1, tgt_seq_len, src_seq_len] + expanded_attn_mask = _expand_mask(attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1]).to( + inputs_embeds.device + ) + combined_attention_mask = ( + expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask + ) + + return combined_attention_mask + + @add_start_docstrings_to_model_forward(INTERNLM_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either decoder_input_ids or decoder_inputs_embeds") + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), dtype=torch.bool, device=inputs_embeds.device + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, (batch_size, seq_length), inputs_embeds, past_key_values_length + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) + + past_key_value = past_key_values[idx] if past_key_values is not None else None + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module(*inputs, output_attentions, None) + + return custom_forward + + layer_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(decoder_layer), + hidden_states, + attention_mask, + position_ids, + None, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class InternLMForCausalLM(InternLMPreTrainedModel): + _auto_class = "AutoModelForCausalLM" + + def __init__(self, config): + super().__init__(config) + self.model = InternLMModel(config) + + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + def set_decoder(self, decoder): + self.model = decoder + + def get_decoder(self): + return self.model + + @add_start_docstrings_to_model_forward(INTERNLM_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for computing the masked language modeling loss. Indices should either be in `[0, ..., + config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored + (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, InternLMForCausalLM + + >>> model = InternLMForCausalLM.from_pretrained(PATH_TO_CONVERTED_WEIGHTS) + >>> tokenizer = AutoTokenizer.from_pretrained(PATH_TO_CONVERTED_TOKENIZER) + + >>> prompt = "Hey, are you consciours? Can you talk to me?" + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + "Hey, are you consciours? Can you talk to me?\nI'm not consciours, but I can talk to you." + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values: + input_ids = input_ids[:, -1:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -1].unsqueeze(-1) + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += (tuple(past_state.index_select(0, beam_idx) for past_state in layer_past),) + return reordered_past + + def build_inputs(self, tokenizer, query: str, history: List[Tuple[str, str]] = []): + prompt = "" + for record in history: + prompt += f"""<|User|>:{record[0]}\n<|Bot|>:{record[1]}\n""" + if len(prompt) == 0: + prompt += "" + prompt += f"""<|User|>:{query}\n<|Bot|>:""" + return tokenizer([prompt], return_tensors="pt") + + @torch.no_grad() + def chat( + self, + tokenizer, + query: str, + history: List[Tuple[str, str]] = [], + streamer: Optional[BaseStreamer] = None, + max_new_tokens: int = 1024, + do_sample: bool = True, + temperature: float = 0.8, + top_p: float = 0.8, + **kwargs, + ): + inputs = self.build_inputs(tokenizer, query, history) + inputs = {k: v.to(self.device) for k, v in inputs.items() if torch.is_tensor(v)} + outputs = self.generate( + **inputs, + streamer=streamer, + max_new_tokens=max_new_tokens, + do_sample=do_sample, + temperature=temperature, + top_p=top_p, + **kwargs, + ) + outputs = outputs[0].cpu().tolist()[len(inputs["input_ids"][0]) :] + response = tokenizer.decode(outputs, skip_special_tokens=True) + response = response.split("")[0] + history = history + [(query, response)] + return response, history + + @torch.no_grad() + def stream_chat( + self, + tokenizer, + query: str, + history: List[Tuple[str, str]] = [], + max_new_tokens: int = 1024, + do_sample: bool = True, + temperature: float = 0.8, + top_p: float = 0.8, + **kwargs, + ): + """ + Return a generator in format: (response, history) + Eg. + ('你好,有什么可以帮助您的吗', [('你好', '你好,有什么可以帮助您的吗')]) + ('你好,有什么可以帮助您的吗?', [('你好', '你好,有什么可以帮助您的吗?')]) + """ + + response_queue = queue.Queue(maxsize=20) + + class ChatStreamer(BaseStreamer): + def __init__(self, tokenizer) -> None: + super().__init__() + self.tokenizer = tokenizer + self.queue = response_queue + self.query = query + self.history = history + self.response = "" + self.received_inputs = False + self.queue.put((self.response, history + [(self.query, self.response)])) + + def put(self, value): + if len(value.shape) > 1 and value.shape[0] > 1: + raise ValueError("ChatStreamer only supports batch size 1") + elif len(value.shape) > 1: + value = value[0] + + if not self.received_inputs: + # The first received value is input_ids, ignore here + self.received_inputs = True + return + + token = self.tokenizer.decode([value[-1]], skip_special_tokens=True) + if token.strip() != "": + self.response = self.response + token + history = self.history + [(self.query, self.response)] + self.queue.put((self.response, history)) + + def end(self): + self.queue.put(None) + + def stream_producer(): + return self.chat( + tokenizer=tokenizer, + query=query, + streamer=ChatStreamer(tokenizer=tokenizer), + history=history, + max_new_tokens=max_new_tokens, + do_sample=do_sample, + temperature=temperature, + top_p=top_p, + **kwargs, + ) + + def consumer(): + producer = threading.Thread(target=stream_producer) + producer.start() + while True: + res = response_queue.get() + if res is not None: + return + yield res + + return consumer() + + +@add_start_docstrings( + """ + The InternLM Model transformer with a sequence classification head on top (linear layer). + + [`InternLMForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + INTERNLM_START_DOCSTRING, +) +class InternLMForSequenceClassification(InternLMPreTrainedModel): + _keys_to_ignore_on_load_missing = [r"lm_head.weight"] + + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = InternLMModel(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(INTERNLM_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + transformer_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = (torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1).to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) diff --git a/transformers/llm/export/llm_models/phi-2/modeling_phi.py b/transformers/llm/export/llm_models/phi-2/modeling_phi.py new file mode 100644 index 000000000..30b7fc8fd --- /dev/null +++ b/transformers/llm/export/llm_models/phi-2/modeling_phi.py @@ -0,0 +1,989 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. +# +# Copyright (c) 2022, Tri Dao, trid@cs.stanford.edu. +# Licensed under the BSD 3-Clause License. + +from __future__ import annotations + +import math +from dataclasses import dataclass, field +from typing import Any, Dict, Optional, Tuple, Union + +import torch +import torch.nn as nn +from einops import rearrange, repeat +from transformers import PretrainedConfig, PreTrainedModel +from transformers.activations import ACT2FN +from transformers.modeling_outputs import CausalLMOutputWithPast + +from .configuration_phi import PhiConfig + +try: + from flash_attn.bert_padding import pad_input, unpad_input + from flash_attn.layers.rotary import RotaryEmbedding as FlashRotaryEmbedding + from flash_attn.modules.mha import FlashCrossAttention, FlashSelfAttention + from flash_attn.ops.fused_dense import FusedDense +except: + pad_input, unpad_input = None, None + FlashRotaryEmbedding = None + FlashSelfAttention, FlashCrossAttention = None, None + FusedDense = None + + +@dataclass +class InferenceParams: + """Inference parameters passed to model to efficiently calculate + and store context during inference. + + Reference: + https://github.com/Dao-AILab/flash-attention/blob/main/flash_attn/utils/generation.py. + + Args: + max_seqlen: Maximum sequence length. + max_batch_size: Maximum batch size. + seqlen_offset: Sequence length offset. + batch_size_offset: Batch size offset. + key_value_memory_dict: Key value memory dictionary. + lengths_per_sample: Lengths per sample. + + """ + + max_seqlen: int = field(metadata={"help": "Maximum sequence length."}) + + max_batch_size: int = field(metadata={"help": "Maximum batch size."}) + + seqlen_offset: int = field(default=0, metadata={"help": "Sequence length offset."}) + + batch_size_offset: int = field(default=0, metadata={"help": "Batch size offset."}) + + key_value_memory_dict: Dict[str, Any] = field( + default_factory=dict, metadata={"help": "Key value memory dictionary."} + ) + + lengths_per_sample: torch.Tensor = field(default=None, metadata={"help": "Lengths per sample."}) + + +class Embedding(nn.Module): + """Token embedding with dropout.""" + + def __init__(self, config: PretrainedConfig) -> None: + super().__init__() + + self.wte = nn.Embedding(config.vocab_size, config.n_embd) + self.drop = nn.Dropout(config.embd_pdrop) + + def forward(self, input_ids: torch.LongTensor) -> torch.FloatTensor: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) + + hidden_states = self.wte(input_ids) + hidden_states = self.drop(hidden_states) + + return hidden_states + + +def _apply_rotary_emb( + x: torch.FloatTensor, + cos: torch.FloatTensor, + sin: torch.FloatTensor, +) -> torch.FloatTensor: + _, seqlen, _, _ = x.shape + _, rotary_dim = cos.shape + rotary_dim *= 2 + + x_rot = x[:, :, :, :rotary_dim] + x_pass = x[:, :, :, rotary_dim:] + + x1, x2 = x_rot.chunk(2, dim=-1) + c, s = rearrange(cos[:seqlen], "s d -> s 1 d"), rearrange(sin[:seqlen], "s d -> s 1 d") + x1, x2, c, s = [t.to(dtype=torch.float32) for t in [x1, x2, c, s]] + + x_rot = torch.cat([x1 * c - x2 * s, x1 * s + x2 * c], axis=-1).to(x.dtype) + + return torch.cat([x_rot, x_pass], axis=-1) + + +def _apply_rotary_emb_kv( + kv: torch.FloatTensor, + cos: torch.FloatTensor, + sin: torch.FloatTensor, + cos_k: Optional[torch.FloatTensor] = None, + sin_k: Optional[torch.FloatTensor] = None, +) -> torch.FloatTensor: + _, seqlen, _, _, _ = kv.shape + _, rotary_dim = cos.shape + rotary_dim *= 2 + + k_rot = kv[:, :, 0, :, :rotary_dim] + k_pass = kv[:, :, 0, :, rotary_dim:] + + k1, k2 = k_rot.chunk(2, dim=-1) + c, s = rearrange(cos[:seqlen], "s d -> s 1 d"), rearrange(sin[:seqlen], "s d -> s 1 d") + k1, k2, c, s = [t.to(dtype=torch.float32) for t in [k1, k2, c, s]] + + k_rot = torch.cat([k1 * c - k2 * s, k1 * s + k2 * c], axis=-1).to(kv.dtype) + + return torch.cat( + [ + torch.cat([k_rot, k_pass], axis=-1).unsqueeze(2), + kv[:, :, 1:2, :, :], + ], + axis=2, + ) + + +def _apply_rotary_emb_qkv( + qkv: torch.FloatTensor, + cos: torch.FloatTensor, + sin: torch.FloatTensor, + cos_k: Optional[torch.FloatTensor] = None, + sin_k: Optional[torch.FloatTensor] = None, +) -> torch.FloatTensor: + _, seqlen, _, _, _ = qkv.shape + _, rotary_dim = cos.shape + rotary_dim *= 2 + + q_rot = qkv[:, :, 0, :, :rotary_dim] + q_pass = qkv[:, :, 0, :, rotary_dim:] + + k_rot = qkv[:, :, 1, :, :rotary_dim] + k_pass = qkv[:, :, 1, :, rotary_dim:] + + q1, q2 = q_rot.chunk(2, dim=-1) + k1, k2 = k_rot.chunk(2, dim=-1) + c, s = rearrange(cos[:seqlen], "s d -> s 1 d"), rearrange(sin[:seqlen], "s d -> s 1 d") + q1, q2, k1, k2, c, s = [t.to(dtype=torch.float32) for t in [q1, q2, k1, k2, c, s]] + + q_rot = torch.cat([q1 * c - q2 * s, q1 * s + q2 * c], axis=-1).to(qkv.dtype) + k_rot = torch.cat([k1 * c - k2 * s, k1 * s + k2 * c], axis=-1).to(qkv.dtype) + + return torch.cat( + [ + torch.cat([q_rot, q_pass], axis=-1).unsqueeze(2), + torch.cat([k_rot, k_pass], axis=-1).unsqueeze(2), + qkv[:, :, 2:3, :, :], + ], + axis=2, + ) + + +class RotaryEmbedding(nn.Module): + """Rotary positional embedding (RoPE). + + Reference: + RoFormer: Enhanced Transformer with Rotary Position Embedding. + https://arxiv.org/pdf/2104.09864.pdf. + + """ + + def __init__( + self, + dim: int, + base: int = 10000, + scale_base: Optional[float] = None, + pos_idx_in_fp32: bool = True, + max_position_embeddings: int = 2048, + device: Optional[str] = None, + **kwargs, + ) -> None: + super().__init__() + + if scale_base is not None: + raise NotImplementedError + + self.dim = dim + self.base = float(base) + self.scale_base = scale_base + self.pos_idx_in_fp32 = pos_idx_in_fp32 + self.max_position_embeddings = max_position_embeddings + self.device = device + + # Generate and save the inverse frequency buffer (non-trainable) + inv_freq = self._compute_inv_freq(device) + self.register_buffer("inv_freq", inv_freq, persistent=False) + + # Generate and save the scale buffer (non-trainable) + scale = ( + (torch.arange(0, dim, 2, device=device, dtype=torch.float32) + 0.4 * dim) / (1.4 * dim) + if scale_base is not None + else None + ) + self.register_buffer("scale", scale, persistent=False) + + # Initialize cached attributes since ONNX can't rely on dynamic initialization + self._update_cos_sin_cache(max_position_embeddings, device=device, dtype=torch.float32) + + def _compute_inv_freq(self, device: Optional[str] = None) -> torch.FloatTensor: + return 1.0 / (self.base ** (torch.arange(0, self.dim, 2, device=device, dtype=torch.float32) / self.dim)) + + def _update_cos_sin_cache( + self, + seqlen: int, + device: Optional[str] = None, + dtype: Optional[torch.dtype] = None, + ) -> None: + self._seq_len_cached = seqlen + + # fp32 is preferred since the output of `torch.arange` can be quite large + # and bf16 would lose a lot of precision + if self.pos_idx_in_fp32: + t = torch.arange(seqlen, device=device, dtype=torch.float32) + if self.inv_freq.dtype != torch.float32: + inv_freq = self._compute_inv_freq(device=device) + else: + inv_freq = self.inv_freq + else: + t = torch.arange(seqlen, device=device, dtype=self.inv_freq.dtype) + inv_freq = self.inv_freq + + # `torch.outer` is preferred since `torch.einsum` converts from fp32 to fp16 if used with AMP + freqs = torch.outer(t, inv_freq) + if self.scale is None: + self._cos_cached = torch.cos(freqs).to(dtype) + self._sin_cached = torch.sin(freqs).to(dtype) + else: + power = ( + torch.arange(seqlen, dtype=self.scale.dtype, device=self.scale.device) - seqlen // 2 + ) / self.scale_base + scale = self.scale.to(device=power.device) ** rearrange(power, "s -> s 1") + + # Force the scale multiplication to happen in fp32 + self._cos_cached = (torch.cos(freqs) * scale).to(dtype) + self._sin_cached = (torch.sin(freqs) * scale).to(dtype) + self._cos_k_cached = (torch.cos(freqs) / scale).to(dtype) + self._sin_k_cached = (torch.sin(freqs) / scale).to(dtype) + + def forward( + self, + qkv: torch.Tensor, + kv: Optional[torch.Tensor] = None, + seqlen_offset: int = 0, + **kwargs, + ) -> Tuple[torch.Tensor, torch.Tensor]: + if ( + self._seq_len_cached < qkv.shape[1] + seqlen_offset + or self._cos_cached.device != qkv.device + or self._cos_cached.dtype != qkv.dtype + or (self.training and self._cos_cached.is_inference()) + ): + self._update_cos_sin_cache(qkv.shape[1] + seqlen_offset, device=qkv.device, dtype=qkv.dtype) + + if kv is None: + return _apply_rotary_emb_qkv( + qkv, + self._cos_cached[seqlen_offset:], + self._sin_cached[seqlen_offset:], + ) + else: + q = _apply_rotary_emb( + qkv, + self._cos_cached[seqlen_offset:], + self._sin_cached[seqlen_offset:], + ) + kv = _apply_rotary_emb_kv( + kv, + self._cos_cached[seqlen_offset:], + self._sin_cached[seqlen_offset:], + ) + + return q, kv + + +class MLP(nn.Module): + """Multi-Layer Perceptron. + + Reference: + Attention Is All You Need. + https://arxiv.org/pdf/1706.03762.pdf. + + """ + + def __init__( + self, + config: PretrainedConfig, + n_inner: Optional[int] = None, + act_fn: Optional[str] = None, + ) -> None: + super().__init__() + + act_fn = config.activation_function if act_fn is None else act_fn + + n_inner = getattr(config, "n_inner", None) if n_inner is None else n_inner + n_inner = n_inner if n_inner is not None else 4 * config.n_embd + + self.fc1 = nn.Linear(config.n_embd, n_inner) + self.fc2 = nn.Linear(n_inner, config.n_embd) + self.act = ACT2FN[act_fn] + + def forward(self, hidden_states: torch.FloatTensor) -> torch.FloatTensor: + hidden_states = self.fc1(hidden_states) + hidden_states = self.act(hidden_states) + hidden_states = self.fc2(hidden_states) + + return hidden_states + + +class SelfAttention(nn.Module): + """Self-attention layer (compatible with PyTorch). + + Reference: + https://github.com/Dao-AILab/flash-attention/blob/main/flash_attn/modules/mha.py. + + """ + + def __init__( + self, + causal: bool = True, + softmax_scale: Optional[float] = None, + attention_dropout: float = 0.0, + ) -> None: + super().__init__() + + self.causal = causal + self.softmax_scale = softmax_scale + self.drop = nn.Dropout(attention_dropout) + + @torch.autocast("cpu", enabled=False) + @torch.autocast("cuda", enabled=False) + def forward( + self, + qkv: torch.FloatTensor, + causal: bool = None, + key_padding_mask: Optional[torch.BoolTensor] = None, + **kwargs, + ) -> torch.FloatTensor: + batch_size, seqlen = qkv.shape[0], qkv.shape[1] + q, k, v = qkv.unbind(dim=2) + + q = q.to(torch.float32) + k = k.to(torch.float32) + + causal = self.causal if causal is None else causal + softmax_scale = self.softmax_scale or 1.0 / math.sqrt(q.shape[-1]) + + # Autocast is manually disabled to avoid `torch.einsum` performing the operation + # using float16, which might lead to overflow + scores = torch.einsum("bthd,bshd->bhts", q, k * softmax_scale) + + if key_padding_mask is not None: + padding_mask = torch.full((batch_size, seqlen), -10000.0, dtype=scores.dtype, device=scores.device) + padding_mask.masked_fill_(key_padding_mask, 0.0) + + scores = scores + rearrange(padding_mask, "b s -> b 1 1 s") + + if causal: + causal_mask = torch.triu(torch.full((seqlen, seqlen), -10000.0, device=scores.device), 1) + scores = scores + causal_mask.to(dtype=scores.dtype) + + attention = torch.softmax(scores, dim=-1).to(v.dtype) + attention = self.drop(attention) + + output = torch.einsum("bhts,bshd->bthd", attention, v) + + return output + + +class CrossAttention(nn.Module): + """Cross-attention layer (compatible with PyTorch). + + Reference: + https://github.com/Dao-AILab/flash-attention/blob/main/flash_attn/modules/mha.py. + + """ + + def __init__( + self, + causal: bool = True, + softmax_scale: Optional[float] = None, + attention_dropout: float = 0.0, + ) -> None: + super().__init__() + + self.causal = causal + self.softmax_scale = softmax_scale + self.drop = nn.Dropout(attention_dropout) + + @torch.autocast("cpu", enabled=False) + @torch.autocast("cuda", enabled=False) + def forward( + self, + q: torch.FloatTensor, + kv: torch.FloatTensor, + causal: bool = None, + key_padding_mask: Optional[torch.BoolTensor] = None, + causal_mask: Optional[torch.Tensor] = None, + **kwargs, + ) -> torch.FloatTensor: + batch_size, seqlen_q = q.shape[0], q.shape[1] + seqlen_k = kv.shape[1] + + if kv.shape[3] != q.shape[2]: + kv = repeat(kv, "... hkv d -> ... (hkv g) d", g=q.shape[2] // kv.shape[3]) + k, v = kv.unbind(dim=2) + + q = q.to(torch.float32) + k = k.to(torch.float32) + + causal = self.causal if causal is None else causal + softmax_scale = self.softmax_scale or 1.0 / math.sqrt(q.shape[-1]) + + # Autocast is manually disabled to avoid `torch.einsum` performing the operation + # using float16, which might lead to overflow + # scores = torch.einsum("bthd,bshd->bhts", q, k * softmax_scale) + q = q.permute(0, 2, 1, 3) + k_ = (k * softmax_scale).permute(0, 2, 3, 1) + scores = torch.matmul(q, k_) + + if key_padding_mask is not None: + padding_mask = torch.full( + (batch_size, seqlen_k), + -10000.0, + dtype=scores.dtype, + device=scores.device, + ) + padding_mask.masked_fill_(key_padding_mask, 0.0) + + scores = scores + rearrange(padding_mask, "b s -> b 1 1 s") + + if causal_mask is not None: + scores = scores.masked_fill(causal_mask, -10000.0) + elif causal: + rows = rearrange(torch.arange(seqlen_q, device=q.device, dtype=torch.long), "s -> s 1") + cols = torch.arange(seqlen_k, device=k.device, dtype=torch.long) + causal_mask = cols > rows + seqlen_k - seqlen_q + + scores = scores.masked_fill(causal_mask, -10000.0) + + attention = torch.softmax(scores, dim=-1).to(v.dtype) + attention = self.drop(attention) + + # output = torch.einsum("bhts,bshd->bthd", attention, v) + v = v.permute(0, 2, 1, 3) + output = torch.matmul(attention, v).permute(0, 2, 1, 3) + return output + + +def _find_mha_dims( + config: PretrainedConfig, + n_head: Optional[int] = None, + n_head_kv: Optional[int] = None, + head_dim: Optional[int] = None, +) -> Tuple[int, int]: + if n_head is None and head_dim is None: + head_dim = config.n_embd // config.n_head + n_head = config.n_head + elif n_head is None or head_dim is None: + raise ValueError("`n_head` and `head_dim` must be both specified or `None`.") + + if n_head_kv is None: + n_head_kv = getattr(config, "n_head_kv", None) or n_head + + return n_head, n_head_kv, head_dim + + +def _update_kv_cache(kv: torch.FloatTensor, inference_params: InferenceParams, layer_idx: int) -> torch.FloatTensor: + num_heads, head_dim = kv.shape[-2:] + + if layer_idx not in inference_params.key_value_memory_dict: + inference_params.key_value_memory_dict[layer_idx] = torch.empty( + inference_params.max_batch_size, + inference_params.max_seqlen, + 2, + num_heads, + head_dim, + dtype=kv.dtype, + device=kv.device, + ) + + batch_start = inference_params.batch_size_offset + batch_end = batch_start + kv.shape[0] + + sequence_start = inference_params.seqlen_offset + sequence_end = sequence_start + kv.shape[1] + + # When the current sequence length is equal to or larger than the maximum sequence length, + # we need to concatenate the current `kv` with the cached `kv` to expand its length + if sequence_end >= inference_params.max_seqlen: + inference_params.key_value_memory_dict[layer_idx] = torch.concatenate((inference_params.key_value_memory_dict[layer_idx], kv), dim=1) + + inference_params.key_value_memory_dict[layer_idx][batch_start:batch_end, sequence_start:sequence_end, ...] = kv + kv = inference_params.key_value_memory_dict[layer_idx][batch_start:batch_end, :sequence_end, ...] + + return kv + + +class MHA(nn.Module): + """Multi-head attention layer.""" + + def __init__( + self, + config: PretrainedConfig, + dtype: Optional[torch.dtype] = None, + device: Optional[str] = None, + rotary_dim: Optional[int] = None, + rotary_base: float = 10000.0, + rotary_scale_base: Optional[float] = None, + n_head: Optional[int] = None, + n_head_kv: Optional[int] = None, + head_dim: Optional[int] = None, + bias: bool = True, + causal: bool = True, + softmax_scale: Optional[float] = None, + layer_idx: Optional[int] = None, + return_residual: bool = False, + checkpointing: bool = False, + ) -> None: + super().__init__() + + # Rotary embedding + self.rotary_dim = rotary_dim if rotary_dim is not None else getattr(config, "rotary_dim", 0) + if self.rotary_dim > 0: + rotary_cls = FlashRotaryEmbedding if config.flash_rotary else RotaryEmbedding + if rotary_cls is None: + rotary_cls = RotaryEmbedding + + rotary_kwargs = {} + if rotary_cls is RotaryEmbedding: + rotary_kwargs["max_position_embeddings"] = config.n_positions + + self.rotary_emb = rotary_cls( + self.rotary_dim, + base=rotary_base, + scale_base=rotary_scale_base, + device=device, + **rotary_kwargs, + ) + + # MLP + self.n_head, self.n_head_kv, self.head_dim = _find_mha_dims( + config, n_head=n_head, n_head_kv=n_head_kv, head_dim=head_dim + ) + op_size = self.head_dim * (self.n_head + 2 * self.n_head_kv) + hidden_size = config.n_embd + + linear_cls = FusedDense if config.fused_dense else nn.Linear + if linear_cls is None: + linear_cls = nn.Linear + + self.Wqkv = linear_cls(hidden_size, op_size, bias=bias, device=device, dtype=dtype) + self.out_proj = linear_cls(hidden_size, hidden_size, bias=bias, device=device, dtype=dtype) + + # Attention + attn_cls = FlashSelfAttention if config.flash_attn else SelfAttention + if attn_cls is None: + attn_cls = SelfAttention + + cross_attn_cls = FlashCrossAttention if config.flash_attn else CrossAttention + if cross_attn_cls is None: + cross_attn_cls = CrossAttention + + self.inner_attn = attn_cls( + causal=causal, + softmax_scale=softmax_scale, + attention_dropout=config.attn_pdrop, + ) + self.inner_cross_attn = cross_attn_cls( + causal=causal, + softmax_scale=softmax_scale, + attention_dropout=config.attn_pdrop, + ) + + self.flash_attn = config.flash_attn and attn_cls is FlashSelfAttention + self.layer_idx = layer_idx + self.return_residual = return_residual + self.checkpointing = checkpointing + + def _forward_self_attn( + self, x: torch.FloatTensor, key_padding_mask: Optional[torch.BoolTensor] + ) -> torch.FloatTensor: + qkv = self.Wqkv(x) + qkv = rearrange(qkv, "... (three h d) -> ... three h d", three=3, d=self.head_dim) + + if self.rotary_dim > 0: + qkv = self.rotary_emb(qkv) + + if self.flash_attn: + batch_size, seqlen = qkv.shape[0], qkv.shape[1] + + cu_seqlens, max_seqlen = None, None + if key_padding_mask is not None: + # If `key_padding_mask` is supplied, we need to unpad the input and retrieve + # the `cu_seqlens` and `max_seqlen` to be used by `flash-attn` + qkv, indices, cu_seqlens, max_seqlen = unpad_input(qkv, key_padding_mask) + + if self.checkpointing: + attn_output = torch.utils.checkpoint.checkpoint( + self.inner_attn, qkv, cu_seqlens=cu_seqlens, max_seqlen=max_seqlen + ) + else: + attn_output = self.inner_attn(qkv, cu_seqlens=cu_seqlens, max_seqlen=max_seqlen).to(qkv.device) + + # If `key_padding_mask` is supplied, we need to pad the output back to the original shape + return pad_input(attn_output, indices, batch_size, seqlen) if key_padding_mask is not None else attn_output + + if self.checkpointing: + return torch.utils.checkpoint.checkpoint(self.inner_attn, qkv, key_padding_mask=key_padding_mask) + + return self.inner_attn(qkv, key_padding_mask=key_padding_mask) + + def _forward_cross_attn( + self, + x: torch.FloatTensor, + past_key_values: Optional[Union[torch.Tensor, InferenceParams]], + key_padding_mask: Optional[torch.BoolTensor], + rotary_pos_emb: Optional[torch.Tensor] = None, + causal_mask: Optional[torch.Tensor] = None, + ) -> torch.FloatTensor: + batch_size = x.shape[0] + + qkv = self.Wqkv(x) + + q = qkv[..., : self.n_head * self.head_dim] + q = rearrange(q, "... (h d) -> ... h d", d=self.head_dim) + + kv = qkv[..., self.n_head * self.head_dim :] + kv = rearrange(kv, "... (two hkv d) -> ... two hkv d", two=2, d=self.head_dim) + + if rotary_pos_emb is None: + seqlen_offset = past_key_values.seqlen_offset if past_key_values is not None else 0 + causal = None if seqlen_offset == 0 else False + if self.rotary_dim > 0: + q, kv = self.rotary_emb(q, kv=kv, seqlen_offset=seqlen_offset) + else: + causal = False + cos_pos, sin_pos = rotary_pos_emb + q = _apply_rotary_emb(q, cos_pos, sin_pos) + kv = _apply_rotary_emb_kv(kv, cos_pos, sin_pos) + + if past_key_values is not None: + if type(past_key_values) is InferenceParams: + kv = _update_kv_cache(kv, past_key_values, self.layer_idx) + else: + # kv.shape is [1, past + 1, 2, 32, 80] + #print('kv.shape', kv.shape) + #print('past_key_values.shape', past_key_values.shape) + kv = torch.cat((past_key_values, kv), dim=1) + + if self.flash_attn: + batch_size, seqlen_q = q.shape[0], q.shape[1] + seqlen_k = kv.shape[1] + + cu_seqlens_q, cu_seqlens_k, max_seqlen_q, max_seqlen_k = ( + None, + None, + None, + None, + ) + if key_padding_mask is not None: + kv, _, cu_seqlens_k, max_seqlen_k = unpad_input(kv, key_padding_mask) + + if seqlen_q == 1: + key_padding_mask = torch.ones(batch_size, 1, device=q.device) + elif seqlen_q != seqlen_k: + key_padding_mask = key_padding_mask[:, -seqlen_q:] + + q, indices_q, cu_seqlens_q, max_seqlen_q = unpad_input(q, key_padding_mask) + + if self.checkpointing: + attn_output = torch.utils.checkpoint.checkpoint( + self.inner_cross_attn, + q, + kv, + causal=causal, + cu_seqlens=cu_seqlens_q, + max_seqlen=max_seqlen_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_k=max_seqlen_k, + ) + else: + attn_output = self.inner_cross_attn( + q, + kv, + causal=causal, + cu_seqlens=cu_seqlens_q, + max_seqlen=max_seqlen_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_k=max_seqlen_k, + ) + + return ( + pad_input(attn_output, indices_q, batch_size, max_seqlen_q) + if key_padding_mask is not None + else attn_output + ) + + if self.checkpointing: + return torch.utils.checkpoint.checkpoint( + self.inner_cross_attn, + q, + kv, + key_padding_mask=key_padding_mask, + causal=causal, + ) + output = self.inner_cross_attn(q, kv, key_padding_mask=key_padding_mask, causal=causal, causal_mask=causal_mask) + return output, kv + + def forward( + self, + x: torch.FloatTensor, + past_key_values: Optional[InferenceParams] = None, + attention_mask: Optional[Union[torch.LongTensor, torch.BoolTensor]] = None, + rotary_pos_emb: Optional[torch.Tensor] = None, + causal_mask: Optional[torch.Tensor] = None, + **kwargs, + ) -> Tuple[torch.FloatTensor, torch.FloatTensor]: + if attention_mask is not None: + attention_mask = attention_mask.bool() + else: + attention_mask = None + + attention_mask = None + kv = None + # MHA + if self.n_head == self.n_head_kv: + if past_key_values is None and False: + # If `past_key_values` are not supplied, we run self-attention + attn_output = self._forward_self_attn(x, attention_mask) + else: + # If `past_key_values` are supplied, it means that we might have cached values and + # could take advantage of cross-attention + attn_output, kv = self._forward_cross_attn(x, past_key_values, attention_mask, rotary_pos_emb, causal_mask) + # MQA / GQA + else: + # Regardless of `past_key_values` being supplied or not, it always use cross-attention + # because `q` and `kv` lengths might be different + attn_output = self._forward_cross_attn(x, past_key_values, attention_mask) + + output = rearrange(attn_output, "... h d -> ... (h d)") + output = self.out_proj(output) + + # return output if not self.return_residual else (output, x) + return output, kv + + +class ParallelBlock(nn.Module): + """Parallel block. + + This block applies parallel mixer and MLP layers to the input (used in GPT-J and CodeGen). + + """ + + def __init__( + self, + config: PretrainedConfig, + block_idx: Optional[int] = None, + ) -> None: + super().__init__() + + self.ln = nn.LayerNorm(config.n_embd, eps=config.layer_norm_epsilon) + self.resid_dropout = nn.Dropout(config.resid_pdrop) + self.block_idx = block_idx + + self.mixer = MHA(config, layer_idx=block_idx) + self.mlp = MLP(config) + + def forward( + self, + hidden_states: torch.FloatTensor, + past_key_values: Optional[Union[torch.FloatTensor, InferenceParams]] = None, + attention_mask: Optional[torch.BoolTensor] = None, + rotary_pos_emb: Optional[torch.Tensor] = None, + causal_mask: Optional[torch.Tensor] = None, + **kwargs, + ) -> torch.FloatTensor: + residual = hidden_states + hidden_states = self.ln(hidden_states) + + attn_outputs, kv = self.mixer( + hidden_states, + past_key_values=past_key_values, + attention_mask=attention_mask, + rotary_pos_emb=rotary_pos_emb, + causal_mask=causal_mask, + ) + + if isinstance(attn_outputs, tuple): + attn_outputs = attn_outputs[0] + + # attn_outputs = self.resid_dropout(attn_outputs) + # feed_forward_hidden_states = self.resid_dropout(self.mlp(hidden_states)) + feed_forward_hidden_states = self.mlp(hidden_states) + hidden_states = attn_outputs + feed_forward_hidden_states + residual + return hidden_states, kv + + +class CausalLMHead(nn.Module): + """Causal Language Modeling head. + + Reference: + Improving Language Understanding by Generative Pre-Training. + https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf. + + """ + + def __init__(self, config: PretrainedConfig) -> None: + super().__init__() + + self.ln = nn.LayerNorm(config.n_embd, eps=config.layer_norm_epsilon) + self.linear = nn.Linear(config.n_embd, config.vocab_size) + + def forward(self, hidden_states: torch.FloatTensor) -> torch.FloatTensor: + hidden_states = self.ln(hidden_states) + logits = self.linear(hidden_states).to(torch.float32) + return logits + + +class CausalLMLoss(nn.Module): + """Causal Language Modeling loss. + + Reference: + Improving Language Understanding by Generative Pre-Training. + https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf. + + """ + + def __init__(self, shift_labels: bool = True) -> None: + super().__init__() + + self.shift_labels = shift_labels + self.loss_fct = nn.CrossEntropyLoss() + + def forward(self, logits: torch.FloatTensor, labels: torch.LongTensor) -> torch.FloatTensor: + if self.shift_labels: + logits = logits[..., :-1, :].contiguous() + labels = labels[..., 1:].contiguous() + + loss = self.loss_fct(logits.view(-1, logits.size(-1)), labels.view(-1)) + + return loss + + +class PhiPreTrainedModel(PreTrainedModel): + """Phi pre-trained model.""" + + config_class = PhiConfig + base_model_prefix = "transformer" + supports_gradient_checkpointing = False + _no_split_modules = ["ParallelBlock"] + + def __init__(self, *inputs, **kwargs) -> None: + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module: nn.Module) -> None: + if isinstance(module, (nn.Linear,)): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, nn.LayerNorm): + if module.bias is not None: + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def prepare_inputs_for_generation( + self, + input_ids: torch.LongTensor, + past_key_values: Optional[Union[torch.FloatTensor, InferenceParams]] = None, + attention_mask: Optional[Union[torch.LongTensor, torch.BoolTensor]] = None, + **kwargs, + ) -> Dict[str, Any]: + if past_key_values is None or not (isinstance(past_key_values, InferenceParams)): + past_key_values = InferenceParams( + max_seqlen=self.config.n_positions, + max_batch_size=input_ids.shape[0], + seqlen_offset=0, + batch_size_offset=0, + key_value_memory_dict={}, + lengths_per_sample=None, + ) + else: + # Assume that `past_key_values` has cached all tokens up to the last token in `input_ids` + past_key_values.seqlen_offset = input_ids.shape[1] - 1 + input_ids = input_ids[:, -1].unsqueeze(-1) + + return { + "input_ids": input_ids, + "past_key_values": past_key_values, + "attention_mask": attention_mask, + } + + +class PhiModel(PhiPreTrainedModel): + """Phi model.""" + + _keys_to_ignore_on_load_missing = [""] + _keys_to_ignore_on_load_unexpected = [r"h\.\d+\.mlp.(fc_in|fc_out)\.(weight|bias)"] + + def __init__(self, config: PhiConfig) -> None: + super().__init__(config) + + self.embd = Embedding(config) + self.h = nn.ModuleList([ParallelBlock(config, block_idx=i) for i in range(config.n_layer)]) + self.gradient_checkpointing = False + self.post_init() + + def get_input_embeddings(self) -> nn.Embedding: + return self.embd.wte + + def set_input_embeddings(self, new_embeddings: nn.Embedding) -> None: + self.embd.wte = new_embeddings + + def forward( + self, + input_ids: torch.LongTensor, + past_key_values: Optional[Union[torch.FloatTensor, InferenceParams]] = None, + attention_mask: Optional[torch.BoolTensor] = None, + ) -> torch.FloatTensor: + hidden_states = self.embd(input_ids) + + for layer in self.h: + hidden_states, _ = layer( + hidden_states, + past_key_values=past_key_values, + attention_mask=attention_mask, + ) + + return hidden_states + + +class PhiForCausalLM(PhiPreTrainedModel): + """Phi for Causal Language Modeling.""" + + _keys_to_ignore_on_load_missing = [""] + _keys_to_ignore_on_load_unexpected = [r"transformer\.h\.\d+\.mlp.(fc_in|fc_out)\.(weight|bias)"] + + def __init__(self, config: PhiConfig) -> None: + super().__init__(config) + + self.transformer = PhiModel(config) + self.lm_head = CausalLMHead(config) + self.loss = CausalLMLoss() + + self.post_init() + + def get_output_embeddings(self) -> nn.Linear: + return self.lm_head.linear + + def set_output_embeddings(self, new_embeddings: nn.Linear) -> None: + self.lm_head.linear = new_embeddings + + def forward( + self, + input_ids: torch.LongTensor, + past_key_values: Optional[Union[torch.FloatTensor, InferenceParams]] = None, + attention_mask: Optional[torch.BoolTensor] = None, + labels: Optional[torch.LongTensor] = None, + **kwargs, + ) -> CausalLMOutputWithPast: + hidden_states = self.transformer(input_ids, past_key_values=past_key_values, attention_mask=attention_mask) + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + loss = self.loss(lm_logits, labels) + + return CausalLMOutputWithPast(loss=loss, logits=lm_logits, past_key_values=past_key_values)