diff --git a/README.md b/README.md index f16b8c80c7..b20e1c8065 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Open the `cocos2d-x/build/cocos2d-win32.vc2012.sln` ``` $ cd cocos2d-x/build $ python ./android-build.py cpp-empty-test -p 10 -$ adb install ../tests/cpp-empty-tst/proj.android/bin/CppEmptyTest-debug.apk +$ adb install ../tests/cpp-empty-test/proj.android/bin/CppEmptyTest-debug.apk ``` Then click item on Android device to run tests. Available value of `-p` is the API level, cocos2d-x supports from level 10. diff --git a/build/cocos2d_libs.xcodeproj/project.pbxproj b/build/cocos2d_libs.xcodeproj/project.pbxproj index 592a58106b..8216151edb 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -1749,6 +1749,14 @@ 50ED2BE519BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50ED2BDE19BEAF7900A0AB90 /* UIEditBoxImpl-win32.cpp */; }; 50ED2BE619BEAF7900A0AB90 /* UIEditBoxImpl-wp8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50ED2BDF19BEAF7900A0AB90 /* UIEditBoxImpl-wp8.cpp */; }; 50ED2BE719BEAF7900A0AB90 /* UIEditBoxImpl-wp8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50ED2BDF19BEAF7900A0AB90 /* UIEditBoxImpl-wp8.cpp */; }; + 5E9F61261A3FFE3D0038DE01 /* CCFrustum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E9F61221A3FFE3D0038DE01 /* CCFrustum.cpp */; }; + 5E9F61271A3FFE3D0038DE01 /* CCFrustum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E9F61221A3FFE3D0038DE01 /* CCFrustum.cpp */; }; + 5E9F61281A3FFE3D0038DE01 /* CCFrustum.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E9F61231A3FFE3D0038DE01 /* CCFrustum.h */; }; + 5E9F61291A3FFE3D0038DE01 /* CCFrustum.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E9F61231A3FFE3D0038DE01 /* CCFrustum.h */; }; + 5E9F612A1A3FFE3D0038DE01 /* CCPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E9F61241A3FFE3D0038DE01 /* CCPlane.cpp */; }; + 5E9F612B1A3FFE3D0038DE01 /* CCPlane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E9F61241A3FFE3D0038DE01 /* CCPlane.cpp */; }; + 5E9F612C1A3FFE3D0038DE01 /* CCPlane.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E9F61251A3FFE3D0038DE01 /* CCPlane.h */; }; + 5E9F612D1A3FFE3D0038DE01 /* CCPlane.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E9F61251A3FFE3D0038DE01 /* CCPlane.h */; }; A07A4CAF1783777C0073F6A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1551A342158F2AB200E66CFE /* Foundation.framework */; }; B2165EEA19921124000BE3E6 /* CCPrimitiveCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B257B45E198A353E00D9A687 /* CCPrimitiveCommand.cpp */; }; B217703C1977ECB4009EE11B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B217703B1977ECB4009EE11B /* IOKit.framework */; }; @@ -2921,6 +2929,10 @@ 50FCEB9018C72017004AD434 /* WidgetReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WidgetReader.cpp; sourceTree = ""; }; 50FCEB9118C72017004AD434 /* WidgetReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetReader.h; sourceTree = ""; }; 50FCEB9218C72017004AD434 /* WidgetReaderProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WidgetReaderProtocol.h; sourceTree = ""; }; + 5E9F61221A3FFE3D0038DE01 /* CCFrustum.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCFrustum.cpp; sourceTree = ""; }; + 5E9F61231A3FFE3D0038DE01 /* CCFrustum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCFrustum.h; sourceTree = ""; }; + 5E9F61241A3FFE3D0038DE01 /* CCPlane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPlane.cpp; sourceTree = ""; }; + 5E9F61251A3FFE3D0038DE01 /* CCPlane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPlane.h; sourceTree = ""; }; A07A4D641783777C0073F6A7 /* libcocos2d iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libcocos2d iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; B217703B1977ECB4009EE11B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; B217703D1977ECC1009EE11B /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -5160,6 +5172,10 @@ B29594B81926D61F003EEF37 /* 3d */ = { isa = PBXGroup; children = ( + 5E9F61221A3FFE3D0038DE01 /* CCFrustum.cpp */, + 5E9F61231A3FFE3D0038DE01 /* CCFrustum.h */, + 5E9F61241A3FFE3D0038DE01 /* CCPlane.cpp */, + 5E9F61251A3FFE3D0038DE01 /* CCPlane.h */, B60C5BD219AC68B10056FBDE /* CCBillBoard.cpp */, B60C5BD319AC68B10056FBDE /* CCBillBoard.h */, 15AE17E419AAD2F700C27E9E /* CCAABB.cpp */, @@ -5392,6 +5408,7 @@ 5034CA47191D591100CE6051 /* ccShader_Label_normal.frag in Headers */, 15AE182219AAD2F700C27E9E /* CCBundleReader.h in Headers */, 15AE18A519AAD33D00C27E9E /* CCScale9SpriteLoader.h in Headers */, + 5E9F61281A3FFE3D0038DE01 /* CCFrustum.h in Headers */, 50ED2BE019BEAF7900A0AB90 /* UIEditBoxImpl-win32.h in Headers */, 15AE197119AAD35700C27E9E /* CCFrame.h in Headers */, 15AE1A6519AAD40300C27E9E /* b2TimeStep.h in Headers */, @@ -5676,6 +5693,7 @@ 50ABBFFD1926664800A911A9 /* CCFileUtils-apple.h in Headers */, 15B3708219EE414C00ABE682 /* CCEventListenerAssetsManagerEx.h in Headers */, 15B3708619EE414C00ABE682 /* Downloader.h in Headers */, + 5E9F612C1A3FFE3D0038DE01 /* CCPlane.h in Headers */, 5034CA41191D591100CE6051 /* ccShader_Position_uColor.frag in Headers */, 50ABBE7F1925AB6F00A911A9 /* CCEventTouch.h in Headers */, 50ABBE5B1925AB6F00A911A9 /* CCEventKeyboard.h in Headers */, @@ -5974,6 +5992,7 @@ 15AE182F19AAD2F700C27E9E /* CCMeshVertexIndexData.h in Headers */, 15AE1BAA19AADFDF00C27E9E /* UIVBox.h in Headers */, 3EACC9A719F5014D00EB3C5E /* CCLight.h in Headers */, + 5E9F61291A3FFE3D0038DE01 /* CCFrustum.h in Headers */, 15AE194E19AAD35100C27E9E /* CCDataReaderHelper.h in Headers */, 15AE1ADB19AAD41000C27E9E /* b2Rope.h in Headers */, D0FD03561A3B51AA00825BB5 /* CCAllocatorMacros.h in Headers */, @@ -6258,6 +6277,7 @@ 15AE19AD19AAD39700C27E9E /* LoadingBarReader.h in Headers */, 50ABBE5C1925AB6F00A911A9 /* CCEventKeyboard.h in Headers */, B375107D1823ACA100B3BA6A /* CCPhysicsBodyInfo_chipmunk.h in Headers */, + 5E9F612D1A3FFE3D0038DE01 /* CCPlane.h in Headers */, 50ABC01C1926664800A911A9 /* CCSAXParser.h in Headers */, 503DD8F11926736A00CD74DD /* OpenGL_Internal-ios.h in Headers */, 38ACD1FF1A27111900C3093D /* WidgetCallBackHandlerProtocol.h in Headers */, @@ -6396,6 +6416,7 @@ 15AE189819AAD33D00C27E9E /* CCMenuItemLoader.cpp in Sources */, 15AE1A5719AAD40300C27E9E /* b2Settings.cpp in Sources */, 50ABBE271925AB6F00A911A9 /* CCAutoreleasePool.cpp in Sources */, + 5E9F612A1A3FFE3D0038DE01 /* CCPlane.cpp in Sources */, 15AE197419AAD35700C27E9E /* CCTimeLine.cpp in Sources */, 15AE188E19AAD33D00C27E9E /* CCLabelTTFLoader.cpp in Sources */, 15AE1A3019AAD3D500C27E9E /* b2ChainShape.cpp in Sources */, @@ -6668,6 +6689,7 @@ 15AE196E19AAD35700C27E9E /* CCActionTimelineCache.cpp in Sources */, 50ABBEB31925AB6F00A911A9 /* CCUserDefault-apple.mm in Sources */, 50ABBEB51925AB6F00A911A9 /* CCUserDefault-android.cpp in Sources */, + 5E9F61261A3FFE3D0038DE01 /* CCFrustum.cpp in Sources */, 29394CF619B01DBA00D2DE1A /* UIWebViewImpl-ios.mm in Sources */, 382383FC1A258FA7002C4610 /* idl_gen_text.cpp in Sources */, 50ABBE831925AB6F00A911A9 /* ccFPSImages.c in Sources */, @@ -6968,6 +6990,7 @@ B29A7E0019EE1B7700872B35 /* Json.c in Sources */, 1A570120180BC90D0088DEC7 /* CCGrid.cpp in Sources */, 15AE181119AAD2F700C27E9E /* CCAnimation3D.cpp in Sources */, + 5E9F612B1A3FFE3D0038DE01 /* CCPlane.cpp in Sources */, 1A57019E180BCB590088DEC7 /* CCFont.cpp in Sources */, 15AE1ACC19AAD40300C27E9E /* b2PrismaticJoint.cpp in Sources */, 15AE195F19AAD35100C27E9E /* CCSpriteFrameCacheHelper.cpp in Sources */, @@ -7138,6 +7161,7 @@ 1A57030D180BCF190088DEC7 /* CCComponent.cpp in Sources */, 15AE1B8F19AADA9A00C27E9E /* UIDeprecated.cpp in Sources */, 464AD6E6197EBB1400E502D8 /* pvr.cpp in Sources */, + 5E9F61271A3FFE3D0038DE01 /* CCFrustum.cpp in Sources */, 15AE1B7619AADA9A00C27E9E /* UIPageView.cpp in Sources */, 1A570311180BCF190088DEC7 /* CCComponentContainer.cpp in Sources */, 50ABBE2C1925AB6F00A911A9 /* ccCArray.cpp in Sources */, diff --git a/cocos/2d/CCCamera.cpp b/cocos/2d/CCCamera.cpp index 9bdbc33edc..89baefd956 100644 --- a/cocos/2d/CCCamera.cpp +++ b/cocos/2d/CCCamera.cpp @@ -69,6 +69,8 @@ Camera::Camera() : _scene(nullptr) , _viewProjectionDirty(true) , _cameraFlag(1) +, _frustumDirty(true) +, _enableFrustumCulling(true) { } @@ -96,6 +98,7 @@ const Mat4& Camera::getViewMatrix() const if (memcmp(viewInv.m, _viewInv.m, count) != 0) { _viewProjectionDirty = true; + _frustumDirty = true; _viewInv = viewInv; _view = viewInv.getInversed(); } @@ -205,6 +208,7 @@ bool Camera::initPerspective(float fieldOfView, float aspectRatio, float nearPla } #endif _viewProjectionDirty = true; + _frustumDirty = true; return true; } @@ -225,6 +229,7 @@ bool Camera::initOrthographic(float zoomX, float zoomY, float nearPlane, float f } #endif _viewProjectionDirty = true; + _frustumDirty = true; return true; } @@ -248,6 +253,26 @@ void Camera::unproject(const Size& viewport, Vec3* src, Vec3* dst) const dst->set(screen.x, screen.y, screen.z); } +void Camera::enableFrustumCulling(bool enalbe, bool clipZ) +{ + _enableFrustumCulling = enalbe; + _frustum.setClipZ(clipZ); +} + +bool Camera::isVisibleInFrustum(const AABB* aabb) const +{ + if (_enableFrustumCulling) + { + if (_frustumDirty) + { + _frustum.initFrustum(this); + _frustumDirty = false; + } + return !_frustum.isOutOfFrustum(*aabb); + } + return true; +} + void Camera::onEnter() { if (_scene == nullptr) diff --git a/cocos/2d/CCCamera.h b/cocos/2d/CCCamera.h index c1178cd96b..bd4e73fb15 100644 --- a/cocos/2d/CCCamera.h +++ b/cocos/2d/CCCamera.h @@ -25,6 +25,7 @@ THE SOFTWARE. #define _CCCAMERA_H__ #include "2d/CCNode.h" +#include "3d/CCFrustum.h" NS_CC_BEGIN @@ -135,6 +136,16 @@ public: */ void unproject(const Size& viewport, Vec3* src, Vec3* dst) const; + /** + * Enable frustum culling + */ + void enableFrustumCulling(bool enalbe, bool clipZ); + + /** + * Is this aabb visible in frustum + */ + bool isVisibleInFrustum(const AABB* aabb)const; + //override virtual void onEnter() override; virtual void onExit() override; @@ -171,7 +182,9 @@ protected: float _farPlane; mutable bool _viewProjectionDirty; unsigned short _cameraFlag; // camera flag - + mutable Frustum _frustum; // camera frustum + mutable bool _frustumDirty; + bool _enableFrustumCulling; static Camera* _visitingCamera; friend class Director; diff --git a/cocos/2d/CCSprite.cpp b/cocos/2d/CCSprite.cpp index a98e65105d..caa06dbe50 100644 --- a/cocos/2d/CCSprite.cpp +++ b/cocos/2d/CCSprite.cpp @@ -264,6 +264,7 @@ Sprite::Sprite(void) : _batchNode(nullptr) , _shouldBeHidden(false) , _texture(nullptr) +, _spriteFrame(nullptr) , _insideBounds(true) { #if CC_SPRITE_DEBUG_DRAW @@ -274,6 +275,7 @@ Sprite::Sprite(void) Sprite::~Sprite(void) { + CC_SAFE_RELEASE(_spriteFrame); CC_SAFE_RELEASE(_texture); } @@ -936,6 +938,14 @@ void Sprite::setSpriteFrame(const std::string &spriteFrameName) void Sprite::setSpriteFrame(SpriteFrame *spriteFrame) { + // retain the sprite frame + // do not removed by SpriteFrameCache::removeUnusedSpriteFrames + if (_spriteFrame != spriteFrame) + { + CC_SAFE_RELEASE(_spriteFrame); + _spriteFrame = spriteFrame; + spriteFrame->retain(); + } _unflippedOffsetPositionFromCenter = spriteFrame->getOffset(); Texture2D *texture = spriteFrame->getTexture(); diff --git a/cocos/2d/CCSprite.h b/cocos/2d/CCSprite.h index 226eb4d55b..29c152c3bf 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -538,6 +538,7 @@ protected: // BlendFunc _blendFunc; /// It's required for TextureProtocol inheritance Texture2D* _texture; /// Texture2D object that is used to render the sprite + SpriteFrame* _spriteFrame; QuadCommand _quadCommand; /// quad command #if CC_SPRITE_DEBUG_DRAW DrawNode *_debugDrawNode; diff --git a/cocos/2d/libcocos2d.vcxproj b/cocos/2d/libcocos2d.vcxproj index 395dbfdcf1..5898629f82 100644 --- a/cocos/2d/libcocos2d.vcxproj +++ b/cocos/2d/libcocos2d.vcxproj @@ -228,11 +228,13 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + + @@ -600,11 +602,13 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + + diff --git a/cocos/3d/CCAttachNode.cpp b/cocos/3d/CCAttachNode.cpp index ee53d03d9d..0cb16fca26 100644 --- a/cocos/3d/CCAttachNode.cpp +++ b/cocos/3d/CCAttachNode.cpp @@ -62,6 +62,21 @@ Mat4 AttachNode::getWorldToNodeTransform() const return mat; } +Mat4 AttachNode::getNodeToWorldTransform() const +{ + Mat4 mat; + auto parent = getParent(); + if (parent) + { + mat = parent->getNodeToWorldTransform() * _attachBone->getWorldMat(); + } + else + { + mat = _attachBone->getWorldMat(); + } + return mat; +} + void AttachNode::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags) { Node::visit(renderer, parentTransform * _attachBone->getWorldMat(), Node::FLAGS_DIRTY_MASK); diff --git a/cocos/3d/CCAttachNode.h b/cocos/3d/CCAttachNode.h index f312b6cc7c..6cba23ae8b 100644 --- a/cocos/3d/CCAttachNode.h +++ b/cocos/3d/CCAttachNode.h @@ -49,6 +49,7 @@ public: static AttachNode* create(Bone3D* attachBone); virtual Mat4 getWorldToNodeTransform() const override; + virtual Mat4 getNodeToWorldTransform() const override; virtual void visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags) override; CC_CONSTRUCTOR_ACCESS: diff --git a/cocos/3d/CCBundle3D.cpp b/cocos/3d/CCBundle3D.cpp index bde5b47a92..4b6f50292b 100644 --- a/cocos/3d/CCBundle3D.cpp +++ b/cocos/3d/CCBundle3D.cpp @@ -260,7 +260,6 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD } meshdatas.meshDatas.push_back(meshdata); - NMaterialData materialdata; int i = 0; char str[20]; std::string dir = ""; @@ -270,6 +269,8 @@ bool Bundle3D::loadObj(MeshDatas& meshdatas, MaterialDatas& materialdatas, NodeD for (const auto& it : shapes.shapes) { + NMaterialData materialdata; + NTextureData tex; tex.filename = it.material.diffuse_texname.empty() ? it.material.diffuse_texname : dir + it.material.diffuse_texname; tex.type = NTextureData::Usage::Diffuse; diff --git a/cocos/3d/CCFrustum.cpp b/cocos/3d/CCFrustum.cpp new file mode 100755 index 0000000000..ace97e6098 --- /dev/null +++ b/cocos/3d/CCFrustum.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** + Copyright (c) 2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#include "3d/CCFrustum.h" +#include "2d/CCCamera.h" + +NS_CC_BEGIN + +bool Frustum::initFrustum(const Camera* camera) +{ + _initialized = true; + createPlane(camera); + return true; +} +bool Frustum::isOutOfFrustum(const AABB& aabb) const +{ + if (_initialized) + { + Vec3 point; + + int plane = _clipZ ? 6 : 4; + for (int i = 0; i < plane; i++) + { + const Vec3& normal = _plane[i].getNormal(); + point.x = normal.x < 0 ? aabb._max.x : aabb._min.x; + point.y = normal.y < 0 ? aabb._max.y : aabb._min.y; + point.z = normal.z < 0 ? aabb._max.z : aabb._min.z; + + if (_plane[i].getSide(point) == PointSide::FRONT_PLANE ) + return true; + } + } + return false; +} + +bool Frustum::isOutOfFrustum(const OBB& obb) const +{ + if (_initialized) + { + Vec3 point; + int plane = _clipZ ? 6 : 4; + Vec3 obbExtentX = obb._xAxis * obb._extents.x; + Vec3 obbExtentY = obb._yAxis * obb._extents.y; + Vec3 obbExtentZ = obb._zAxis * obb._extents.z; + + for (int i = 0; i < plane; i++) + { + const Vec3& normal = _plane[i].getNormal(); + point = obb._center; + point = normal.dot(obb._xAxis) > 0 ? point - obbExtentX : point + obbExtentX; + point = normal.dot(obb._yAxis) > 0 ? point - obbExtentY : point + obbExtentY; + point = normal.dot(obb._zAxis) > 0 ? point - obbExtentZ : point + obbExtentZ; + + if (_plane[i].getSide(point) == PointSide::FRONT_PLANE) + return true; + } + } + return false; +} + +void Frustum::createPlane(const Camera* camera) +{ + const Mat4& mat = camera->getViewProjectionMatrix(); + //ref http://www.lighthouse3d.com/tutorials/view-frustum-culling/clip-space-approach-extracting-the-planes/ + //extract frustum plane + _plane[0].initPlane(-Vec3(mat.m[3] + mat.m[0], mat.m[7] + mat.m[4], mat.m[11] + mat.m[8]), (mat.m[15] + mat.m[12]));//left + _plane[1].initPlane(-Vec3(mat.m[3] - mat.m[0], mat.m[7] - mat.m[4], mat.m[11] - mat.m[8]), (mat.m[15] - mat.m[12]));//right + _plane[2].initPlane(-Vec3(mat.m[3] + mat.m[1], mat.m[7] + mat.m[5], mat.m[11] + mat.m[9]), (mat.m[15] + mat.m[13]));//bottom + _plane[3].initPlane(-Vec3(mat.m[3] - mat.m[1], mat.m[7] - mat.m[5], mat.m[11] - mat.m[9]), (mat.m[15] - mat.m[13]));//top + _plane[4].initPlane(-Vec3(mat.m[3] + mat.m[2], mat.m[7] + mat.m[6], mat.m[11] + mat.m[10]), (mat.m[15] + mat.m[14]));//near + _plane[5].initPlane(-Vec3(mat.m[3] - mat.m[2], mat.m[7] - mat.m[6], mat.m[11] - mat.m[10]), (mat.m[15] - mat.m[14]));//far +} + +NS_CC_END diff --git a/cocos/3d/CCFrustum.h b/cocos/3d/CCFrustum.h new file mode 100755 index 0000000000..86638342b1 --- /dev/null +++ b/cocos/3d/CCFrustum.h @@ -0,0 +1,80 @@ +/**************************************************************************** + Copyright (c) 2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef __CC_FRUSTUM_H_ +#define __CC_FRUSTUM_H_ + +#include "base/ccMacros.h" +#include "math/CCMath.h" +#include "3d/CCAABB.h" +#include "3d/CCOBB.h" +#include "3d/CCPlane.h" + +NS_CC_BEGIN + +class Camera; +class CC_DLL Frustum +{ + friend class Camera; +public: + /** + * Constructor & Destructor. + */ + Frustum(): _initialized(false), _clipZ(true){} + ~Frustum(){} + + /** + * init frustum from camera. + */ + bool initFrustum(const Camera* camera); + + /** + * is aabb out of frustum. + */ + bool isOutOfFrustum(const AABB& aabb) const; + /** + * is obb out of frustum + */ + bool isOutOfFrustum(const OBB& obb) const; + + /** + * get & set z clip. if bclipZ == true use near and far plane + */ + void setClipZ(bool clipZ) { _clipZ = clipZ; } + bool isClipZ() { return _clipZ; } + +protected: + /** + * create clip plane + */ + void createPlane(const Camera* camera); + + Plane _plane[6]; // clip plane, left, right, top, bottom, near, far + bool _clipZ; // use near and far clip plane + bool _initialized; +}; + +NS_CC_END + +#endif//__CC_FRUSTUM_H_ diff --git a/cocos/3d/CCOBB.cpp b/cocos/3d/CCOBB.cpp index 582898657b..826e40d2bf 100755 --- a/cocos/3d/CCOBB.cpp +++ b/cocos/3d/CCOBB.cpp @@ -215,6 +215,8 @@ OBB::OBB(const AABB& aabb) _extents = aabb._max - aabb._min; _extents.scale(0.5f); + + computeExtAxis(); } OBB::OBB(const Vec3* verts, int num) @@ -259,6 +261,8 @@ OBB::OBB(const Vec3* verts, int num) _zAxis.normalize(); _extents = 0.5f * (vecMax - vecMin); + + computeExtAxis(); } bool OBB::containPoint(const Vec3& point) const @@ -296,19 +300,15 @@ void OBB::reset() void OBB::getCorners(Vec3* verts) const { - Vec3 extX = _xAxis * _extents.x; - Vec3 extY = _yAxis * _extents.y; - Vec3 extZ = _zAxis * _extents.z; + verts[0] = _center - _extentX + _extentY + _extentZ; // left top front + verts[1] = _center - _extentX - _extentY + _extentZ; // left bottom front + verts[2] = _center + _extentX - _extentY + _extentZ; // right bottom front + verts[3] = _center + _extentX + _extentY + _extentZ; // right top front - verts[0] = _center - extX + extY + extZ; // left top front - verts[1] = _center - extX - extY + extZ; // left bottom front - verts[2] = _center + extX - extY + extZ; // right bottom front - verts[3] = _center + extX + extY + extZ; // right top front - - verts[4] = _center + extX + extY - extZ; // right top back - verts[5] = _center + extX - extY - extZ; // right bottom back - verts[6] = _center - extX - extY - extZ; // left bottom back - verts[7] = _center - extX + extY - extZ; // left top back + verts[4] = _center + _extentX + _extentY - _extentZ; // right top back + verts[5] = _center + _extentX - _extentY - _extentZ; // right bottom back + verts[6] = _center - _extentX - _extentY - _extentZ; // left bottom back + verts[7] = _center - _extentX + _extentY - _extentZ; // left top back } float OBB::projectPoint(const Vec3& point, const Vec3& axis)const @@ -447,6 +447,8 @@ void OBB::transform(const Mat4& mat) _extents.x *= scale.x; _extents.y *= scale.y; _extents.z *= scale.z; + + computeExtAxis(); } NS_CC_END diff --git a/cocos/3d/CCOBB.h b/cocos/3d/CCOBB.h index 0fd8c1eea1..2065035060 100644 --- a/cocos/3d/CCOBB.h +++ b/cocos/3d/CCOBB.h @@ -84,6 +84,16 @@ public: void transform(const Mat4& mat); protected: + /* + * compute extX, extY, extZ + */ + void computeExtAxis() + { + _extentX = _xAxis * _extents.x; + _extentY = _yAxis * _extents.y; + _extentZ = _zAxis * _extents.z; + } + /* * Project point to the target axis */ @@ -109,6 +119,9 @@ public: Vec3 _xAxis; // x axis of obb, unit vector Vec3 _yAxis; // y axis of obb, unit vecotr Vec3 _zAxis; // z axis of obb, unit vector + Vec3 _extentX; // _xAxis * _extents.x + Vec3 _extentY; // _yAxis * _extents.y + Vec3 _extentZ; // _zAxis * _extents.z Vec3 _extents; // obb length along each axis }; diff --git a/cocos/3d/CCPlane.cpp b/cocos/3d/CCPlane.cpp new file mode 100755 index 0000000000..722ed2e91d --- /dev/null +++ b/cocos/3d/CCPlane.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** + Copyright (c) 2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#include "CCPlane.h" + +NS_CC_BEGIN + +Plane::Plane() +: +_normal(0.f, 0.f, 1.f), +_dist(0.f) +{ + +} + +// create plane from tree point +Plane::Plane(const Vec3& p1, const Vec3& p2, const Vec3& p3) +{ + initPlane(p1, p2, p3); +} + +// create plane from normal and dist +Plane::Plane(const Vec3& normal, float dist) +{ + initPlane(normal, dist); +} + +// create plane from normal and a point on plane +Plane::Plane(const Vec3& normal, const Vec3& point) +{ + initPlane(normal, point); +} + +void Plane::initPlane(const Vec3& p1, const Vec3& p2, const Vec3& p3) +{ + Vec3 p21 = p2 - p1; + Vec3 p32 = p3 - p2; + Vec3::cross(p21, p32, &_normal); + _normal.normalize(); + _dist = _normal.dot(p1); +} + +void Plane::initPlane(const Vec3& normal, float dist) +{ + float oneOverLength = 1 / normal.length(); + _normal = normal * oneOverLength; + _dist = dist * oneOverLength; +} + +void Plane::initPlane(const Vec3& normal, const Vec3& point) +{ + _normal = normal; + _normal.normalize(); + _dist = _normal.dot(point); +} + +float Plane::dist2Plane(const Vec3& p) const +{ + return _normal.dot(p) - _dist; +} + + +PointSide Plane::getSide(const Vec3& point) const +{ + float dist = dist2Plane(point); + if (dist > 0) + return PointSide::FRONT_PLANE; + else if (dist < 0) + return PointSide::BEHIND_PLANE; + else + return PointSide::IN_PLANE; +} + +NS_CC_END diff --git a/cocos/3d/CCPlane.h b/cocos/3d/CCPlane.h new file mode 100755 index 0000000000..ad77ec5bb0 --- /dev/null +++ b/cocos/3d/CCPlane.h @@ -0,0 +1,101 @@ +/**************************************************************************** + Copyright (c) 2014 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ + +#ifndef __CC_PLANE_H_ +#define __CC_PLANE_H_ + +#include "base/ccMacros.h" +#include "math/CCMath.h" + +NS_CC_BEGIN + +enum class PointSide +{ + IN_PLANE, + FRONT_PLANE, + BEHIND_PLANE, +}; + +class CC_DLL Plane +{ +public: + /** + * create plane from tree point. + */ + Plane(const Vec3& p1, const Vec3& p2, const Vec3& p3); + + /** + * create plane from normal and dist. + */ + Plane(const Vec3& normal, float dist); + + /** + * create plane from normal and a point on plane. + */ + Plane(const Vec3& normal, const Vec3& point); + Plane(); + + /** + * init plane from tree point. + */ + void initPlane(const Vec3& p1, const Vec3& p2, const Vec3& p3); + + /** + * init plane from normal and dist. + */ + void initPlane(const Vec3& normal, float dist); + + /** + * init plane from normal and a point on plane. + */ + void initPlane(const Vec3& normal, const Vec3& point); + + /** + * dist to plane, > 0 normal direction + */ + float dist2Plane(const Vec3& p) const; + + /** + * Gets the plane's normal. + */ + const Vec3& getNormal() const { return _normal; } + + /** + * Gets the plane's distance to the origin along its normal. + */ + float getDist() const { return _dist; } + + /** + * Return the side where the point is. + */ + PointSide getSide(const Vec3& point) const; + +protected: + Vec3 _normal; + float _dist; +}; + +NS_CC_END + +#endif diff --git a/cocos/3d/CCRay.cpp b/cocos/3d/CCRay.cpp index 94189183d1..046901e8ef 100755 --- a/cocos/3d/CCRay.cpp +++ b/cocos/3d/CCRay.cpp @@ -140,10 +140,26 @@ bool Ray::intersects(const OBB& obb) const return ray.intersects(aabb); } +float Ray::dist(const Plane& plane) const +{ + float ndd = Vec3::dot(plane.getNormal(), _direction); + if(ndd == 0) + return 0.0f; + float ndo = Vec3::dot(plane.getNormal(), _origin); + return (plane.getDist() - ndo) / ndd; +} + +Vec3 Ray::intersects(const Plane& plane) const +{ + float dis = this->dist(plane); + return _origin + dis * _direction; +} + void Ray::set(const Vec3& origin, const Vec3& direction) { _origin = origin; _direction = direction; + _direction.normalize(); } void Ray::transform(const Mat4& matrix) diff --git a/cocos/3d/CCRay.h b/cocos/3d/CCRay.h index 417147d56d..150c734071 100644 --- a/cocos/3d/CCRay.h +++ b/cocos/3d/CCRay.h @@ -28,6 +28,7 @@ #include "math/CCMath.h" #include "3d/CCAABB.h" #include "3d/CCOBB.h" +#include "3d/CCPlane.h" NS_CC_BEGIN @@ -67,6 +68,9 @@ public: */ bool intersects(const OBB& obb) const; + float dist(const Plane& plane) const; + Vec3 intersects(const Plane& plane) const; + /** * Sets this ray to the specified values. * diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 0bb423bfc0..d98ee8e258 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -601,6 +601,10 @@ static Texture2D * getDummyTexture() void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { + // camera clipping + if(!Camera::getVisitingCamera()->isVisibleInFrustum(&this->getAABB())) + return; + if (_skeleton) _skeleton->updateBoneMatrix(); diff --git a/cocos/3d/CMakeLists.txt b/cocos/3d/CMakeLists.txt index 0e35a5a63e..3acd5a5254 100644 --- a/cocos/3d/CMakeLists.txt +++ b/cocos/3d/CMakeLists.txt @@ -11,11 +11,13 @@ set(COCOS_3D_SRC 3d/CCAttachNode.cpp 3d/CCBundle3D.cpp 3d/CCBundleReader.cpp + 3d/CCFrustum.cpp 3d/CCMesh.cpp 3d/CCMeshSkin.cpp 3d/CCMeshVertexIndexData.cpp 3d/CCOBB.cpp 3d/CCObjLoader.cpp + 3d/CCPlane.cpp 3d/CCRay.cpp 3d/CCSkeleton3D.cpp 3d/CCSprite3D.cpp diff --git a/cocos/Android.mk b/cocos/Android.mk index f94950c4ca..2cd641e5d6 100644 --- a/cocos/Android.mk +++ b/cocos/Android.mk @@ -77,6 +77,8 @@ cocos2d.cpp \ 2d/CCTransitionPageTurn.cpp \ 2d/CCTransitionProgress.cpp \ 2d/CCTweenFunction.cpp \ +3d/CCFrustum.cpp \ +3d/CCPlane.cpp \ platform/CCGLView.cpp \ platform/CCFileUtils.cpp \ platform/CCSAXParser.cpp \ diff --git a/cocos/base/CCConsole.cpp b/cocos/base/CCConsole.cpp index 2e063ebfe2..96e87a9bc5 100644 --- a/cocos/base/CCConsole.cpp +++ b/cocos/base/CCConsole.cpp @@ -279,6 +279,7 @@ Console::Console() , _running(false) , _endThread(false) , _sendDebugStrings(false) +, _bindAddress("") { // VS2012 doesn't support initializer list, so we create a new array and assign its elements to '_command'. Command commands[] = { @@ -365,6 +366,22 @@ bool Console::listenOnTCP(int port) continue; /* error, try next one */ setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)); + + // bind address + if (_bindAddress.length() > 0) + { + if (res->ai_family == AF_INET) + { + struct sockaddr_in *sin = (struct sockaddr_in*) res->ai_addr; + inet_pton(res->ai_family, _bindAddress.c_str(), (void*)&sin->sin_addr); + } + else if (res->ai_family == AF_INET6) + { + struct sockaddr_in6 *sin = (struct sockaddr_in6*) res->ai_addr; + inet_pton(res->ai_family, _bindAddress.c_str(), (void*)&sin->sin6_addr); + } + } + if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) break; /* success */ @@ -1160,6 +1177,9 @@ void Console::loop() _running = false; } - +void Console::setBindAddress(const std::string &address) +{ + _bindAddress = address; +} NS_CC_END diff --git a/cocos/base/CCConsole.h b/cocos/base/CCConsole.h index 6d7a199d99..85cb33ee7f 100644 --- a/cocos/base/CCConsole.h +++ b/cocos/base/CCConsole.h @@ -100,6 +100,13 @@ public: void addCommand(const Command& cmd); /** log something in the console */ void log(const char *buf); + + /** + * set bind address + * + * @address : 127.0.0.1 + */ + void setBindAddress(const std::string &address); protected: void loop(); @@ -143,6 +150,8 @@ protected: std::vector _DebugStrings; intptr_t _touchId; + + std::string _bindAddress; private: CC_DISALLOW_COPY_AND_ASSIGN(Console); }; diff --git a/cocos/base/CCDirector.cpp b/cocos/base/CCDirector.cpp index 87feec6c82..5e239a8886 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -120,6 +120,7 @@ bool Director::init(void) _FPSLabel = _drawnBatchesLabel = _drawnVerticesLabel = nullptr; _totalFrames = 0; _lastUpdate = new struct timeval; + _secondsPerFrame = 1.0f; // paused ? _paused = false; diff --git a/cocos/base/ccFPSImages.c b/cocos/base/ccFPSImages.c index 725491f9b1..aaf5d1f92d 100644 --- a/cocos/base/ccFPSImages.c +++ b/cocos/base/ccFPSImages.c @@ -26,2451 +26,2350 @@ #include "base/ccFPSImages.h" unsigned char cc_fps_images_png[] = { - 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x36, - 0x08, 0x06, 0x00, 0x00, 0x00, 0xa5, 0x74, 0xe8, 0xab, 0x00, 0x00, 0x0a, - 0x41, 0x69, 0x43, 0x43, 0x50, 0x49, 0x43, 0x43, 0x20, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x48, 0x0d, 0x9d, 0x96, 0x77, 0x54, - 0x53, 0xd9, 0x16, 0x87, 0xcf, 0xbd, 0x37, 0xbd, 0xd0, 0x12, 0x22, 0x20, - 0x25, 0xf4, 0x1a, 0x7a, 0x09, 0x20, 0xd2, 0x3b, 0x48, 0x15, 0x04, 0x51, - 0x89, 0x49, 0x80, 0x50, 0x02, 0x86, 0x84, 0x26, 0x76, 0x44, 0x05, 0x46, - 0x14, 0x11, 0x29, 0x56, 0x64, 0x54, 0xc0, 0x01, 0x47, 0x87, 0x22, 0x63, - 0x45, 0x14, 0x0b, 0x83, 0x82, 0x62, 0xd7, 0x09, 0xf2, 0x10, 0x50, 0xc6, - 0xc1, 0x51, 0x44, 0x45, 0xe5, 0xdd, 0x8c, 0x6b, 0x09, 0xef, 0xad, 0x35, - 0xf3, 0xde, 0x9a, 0xfd, 0xc7, 0x59, 0xdf, 0xd9, 0xe7, 0xb7, 0xd7, 0xd9, - 0x67, 0xef, 0x7d, 0xd7, 0xba, 0x00, 0x50, 0xfc, 0x82, 0x04, 0xc2, 0x74, - 0x58, 0x01, 0x80, 0x34, 0xa1, 0x58, 0x14, 0xee, 0xeb, 0xc1, 0x5c, 0x12, - 0x13, 0xcb, 0xc4, 0xf7, 0x02, 0x18, 0x10, 0x01, 0x0e, 0x58, 0x01, 0xc0, - 0xe1, 0x66, 0x66, 0x04, 0x47, 0xf8, 0x44, 0x02, 0xd4, 0xfc, 0xbd, 0x3d, - 0x99, 0x99, 0xa8, 0x48, 0xc6, 0xb3, 0xf6, 0xee, 0x2e, 0x80, 0x64, 0xbb, - 0xdb, 0x2c, 0xbf, 0x50, 0x26, 0x73, 0xd6, 0xff, 0x7f, 0x91, 0x22, 0x37, - 0x43, 0x24, 0x06, 0x00, 0x0a, 0x45, 0xd5, 0x36, 0x3c, 0x7e, 0x26, 0x17, - 0xe5, 0x02, 0x94, 0x53, 0xb3, 0xc5, 0x19, 0x32, 0xff, 0x04, 0xca, 0xf4, - 0x95, 0x29, 0x32, 0x86, 0x31, 0x32, 0x16, 0xa1, 0x09, 0xa2, 0xac, 0x22, - 0xe3, 0xc4, 0xaf, 0x6c, 0xf6, 0xa7, 0xe6, 0x2b, 0xbb, 0xc9, 0x98, 0x97, - 0x26, 0xe4, 0xa1, 0x1a, 0x59, 0xce, 0x19, 0xbc, 0x34, 0x9e, 0x8c, 0xbb, - 0x50, 0xde, 0x9a, 0x25, 0xe1, 0xa3, 0x8c, 0x04, 0xa1, 0x5c, 0x98, 0x25, - 0xe0, 0x67, 0xa3, 0x7c, 0x07, 0x65, 0xbd, 0x54, 0x49, 0x9a, 0x00, 0xe5, - 0xf7, 0x28, 0xd3, 0xd3, 0xf8, 0x9c, 0x4c, 0x00, 0x30, 0x14, 0x99, 0x5f, - 0xcc, 0xe7, 0x26, 0xa1, 0x6c, 0x89, 0x32, 0x45, 0x14, 0x19, 0xee, 0x89, - 0xf2, 0x02, 0x00, 0x08, 0x94, 0xc4, 0x39, 0xbc, 0x72, 0x0e, 0x8b, 0xf9, - 0x39, 0x68, 0x9e, 0x00, 0x78, 0xa6, 0x67, 0xe4, 0x8a, 0x04, 0x89, 0x49, - 0x62, 0xa6, 0x11, 0xd7, 0x98, 0x69, 0xe5, 0xe8, 0xc8, 0x66, 0xfa, 0xf1, - 0xb3, 0x53, 0xf9, 0x62, 0x31, 0x2b, 0x94, 0xc3, 0x4d, 0xe1, 0x88, 0x78, - 0x4c, 0xcf, 0xf4, 0xb4, 0x0c, 0x8e, 0x30, 0x17, 0x80, 0xaf, 0x6f, 0x96, - 0x45, 0x01, 0x25, 0x59, 0x6d, 0x99, 0x68, 0x91, 0xed, 0xad, 0x1c, 0xed, - 0xed, 0x59, 0xd6, 0xe6, 0x68, 0xf9, 0xbf, 0xd9, 0xdf, 0x1e, 0x7e, 0x53, - 0xfd, 0x3d, 0xc8, 0x7a, 0xfb, 0x55, 0xf1, 0x26, 0xec, 0xcf, 0x9e, 0x41, - 0x8c, 0x9e, 0x59, 0xdf, 0x6c, 0xec, 0xac, 0x2f, 0xbd, 0x16, 0x00, 0xf6, - 0x24, 0x5a, 0x9b, 0x1d, 0xb3, 0xbe, 0x95, 0x55, 0x00, 0xb4, 0x6d, 0x06, - 0x40, 0xe5, 0xe1, 0xac, 0x4f, 0xef, 0x20, 0x00, 0xf2, 0x05, 0x00, 0xb4, - 0xde, 0x9c, 0xf3, 0x1e, 0x86, 0x6c, 0x5e, 0x92, 0xc4, 0xe2, 0x0c, 0x27, - 0x0b, 0x8b, 0xec, 0xec, 0x6c, 0x73, 0x01, 0x9f, 0x6b, 0x2e, 0x2b, 0xe8, - 0x37, 0xfb, 0x9f, 0x82, 0x6f, 0xca, 0xbf, 0x86, 0x39, 0xf7, 0x99, 0xcb, - 0xee, 0xfb, 0x56, 0x3b, 0xa6, 0x17, 0x3f, 0x81, 0x23, 0x49, 0x15, 0x33, - 0x65, 0x45, 0xe5, 0xa6, 0xa7, 0xa6, 0x4b, 0x44, 0xcc, 0xcc, 0x0c, 0x0e, - 0x97, 0xcf, 0x64, 0xfd, 0xf7, 0x10, 0xff, 0xe3, 0xc0, 0x39, 0x69, 0xcd, - 0xc9, 0xc3, 0x2c, 0x9c, 0x9f, 0xc0, 0x17, 0xf1, 0x85, 0xe8, 0x55, 0x51, - 0xe8, 0x94, 0x09, 0x84, 0x89, 0x68, 0xbb, 0x85, 0x3c, 0x81, 0x58, 0x90, - 0x2e, 0x64, 0x0a, 0x84, 0x7f, 0xd5, 0xe1, 0x7f, 0x18, 0x36, 0x27, 0x07, - 0x19, 0x7e, 0x9d, 0x6b, 0x14, 0x68, 0x75, 0x5f, 0x00, 0x7d, 0x85, 0x39, - 0x50, 0xb8, 0x49, 0x07, 0xc8, 0x6f, 0x3d, 0x00, 0x43, 0x23, 0x03, 0x24, - 0x6e, 0x3f, 0x7a, 0x02, 0x7d, 0xeb, 0x5b, 0x10, 0x31, 0x0a, 0xc8, 0xbe, - 0xbc, 0x68, 0xad, 0x91, 0xaf, 0x73, 0x8f, 0x32, 0x7a, 0xfe, 0xe7, 0xfa, - 0x1f, 0x0b, 0x5c, 0x8a, 0x6e, 0xe1, 0x4c, 0x41, 0x22, 0x53, 0xe6, 0xf6, - 0x0c, 0x8f, 0x64, 0x72, 0x25, 0xa2, 0x2c, 0x19, 0xa3, 0xdf, 0x84, 0x6c, - 0xc1, 0x02, 0x12, 0x90, 0x07, 0x74, 0xa0, 0x0a, 0x34, 0x81, 0x2e, 0x30, - 0x02, 0x2c, 0x60, 0x0d, 0x1c, 0x80, 0x33, 0x70, 0x03, 0xde, 0x20, 0x00, - 0x84, 0x80, 0x48, 0x10, 0x03, 0x96, 0x03, 0x2e, 0x48, 0x02, 0x69, 0x40, - 0x04, 0xb2, 0x41, 0x3e, 0xd8, 0x00, 0x0a, 0x41, 0x31, 0xd8, 0x01, 0x76, - 0x83, 0x6a, 0x70, 0x00, 0xd4, 0x81, 0x7a, 0xd0, 0x04, 0x4e, 0x82, 0x36, - 0x70, 0x06, 0x5c, 0x04, 0x57, 0xc0, 0x0d, 0x70, 0x0b, 0x0c, 0x80, 0x47, - 0x40, 0x0a, 0x86, 0xc1, 0x4b, 0x30, 0x01, 0xde, 0x81, 0x69, 0x08, 0x82, - 0xf0, 0x10, 0x15, 0xa2, 0x41, 0xaa, 0x90, 0x16, 0xa4, 0x0f, 0x99, 0x42, - 0xd6, 0x10, 0x1b, 0x5a, 0x08, 0x79, 0x43, 0x41, 0x50, 0x38, 0x14, 0x03, - 0xc5, 0x43, 0x89, 0x90, 0x10, 0x92, 0x40, 0xf9, 0xd0, 0x26, 0xa8, 0x18, - 0x2a, 0x83, 0xaa, 0xa1, 0x43, 0x50, 0x3d, 0xf4, 0x23, 0x74, 0x1a, 0xba, - 0x08, 0x5d, 0x83, 0xfa, 0xa0, 0x07, 0xd0, 0x20, 0x34, 0x06, 0xfd, 0x01, - 0x7d, 0x84, 0x11, 0x98, 0x02, 0xd3, 0x61, 0x0d, 0xd8, 0x00, 0xb6, 0x80, - 0xd9, 0xb0, 0x3b, 0x1c, 0x08, 0x47, 0xc2, 0xcb, 0xe0, 0x44, 0x78, 0x15, - 0x9c, 0x07, 0x17, 0xc0, 0xdb, 0xe1, 0x4a, 0xb8, 0x16, 0x3e, 0x0e, 0xb7, - 0xc2, 0x17, 0xe1, 0x1b, 0xf0, 0x00, 0x2c, 0x85, 0x5f, 0xc2, 0x93, 0x08, - 0x40, 0xc8, 0x08, 0x03, 0xd1, 0x46, 0x58, 0x08, 0x1b, 0xf1, 0x44, 0x42, - 0x90, 0x58, 0x24, 0x01, 0x11, 0x21, 0x6b, 0x91, 0x22, 0xa4, 0x02, 0xa9, - 0x45, 0x9a, 0x90, 0x0e, 0xa4, 0x1b, 0xb9, 0x8d, 0x48, 0x91, 0x71, 0xe4, - 0x03, 0x06, 0x87, 0xa1, 0x61, 0x98, 0x18, 0x16, 0xc6, 0x19, 0xe3, 0x87, - 0x59, 0x8c, 0xe1, 0x62, 0x56, 0x61, 0xd6, 0x62, 0x4a, 0x30, 0xd5, 0x98, - 0x63, 0x98, 0x56, 0x4c, 0x17, 0xe6, 0x36, 0x66, 0x10, 0x33, 0x81, 0xf9, - 0x82, 0xa5, 0x62, 0xd5, 0xb1, 0xa6, 0x58, 0x27, 0xac, 0x3f, 0x76, 0x09, - 0x36, 0x11, 0x9b, 0x8d, 0x2d, 0xc4, 0x56, 0x60, 0x8f, 0x60, 0x5b, 0xb0, - 0x97, 0xb1, 0x03, 0xd8, 0x61, 0xec, 0x3b, 0x1c, 0x0e, 0xc7, 0xc0, 0x19, - 0xe2, 0x1c, 0x70, 0x7e, 0xb8, 0x18, 0x5c, 0x32, 0x6e, 0x35, 0xae, 0x04, - 0xb7, 0x0f, 0xd7, 0x8c, 0xbb, 0x80, 0xeb, 0xc3, 0x0d, 0xe1, 0x26, 0xf1, - 0x78, 0xbc, 0x2a, 0xde, 0x14, 0xef, 0x82, 0x0f, 0xc1, 0x73, 0xf0, 0x62, - 0x7c, 0x21, 0xbe, 0x0a, 0x7f, 0x1c, 0x7f, 0x1e, 0xdf, 0x8f, 0x1f, 0xc6, - 0xbf, 0x27, 0x90, 0x09, 0x5a, 0x04, 0x6b, 0x82, 0x0f, 0x21, 0x96, 0x20, - 0x24, 0x6c, 0x24, 0x54, 0x10, 0x1a, 0x08, 0xe7, 0x08, 0xfd, 0x84, 0x11, - 0xc2, 0x34, 0x51, 0x81, 0xa8, 0x4f, 0x74, 0x22, 0x86, 0x10, 0x79, 0xc4, - 0x5c, 0x62, 0x29, 0xb1, 0x8e, 0xd8, 0x41, 0xbc, 0x49, 0x1c, 0x26, 0x4e, - 0x93, 0x14, 0x49, 0x86, 0x24, 0x17, 0x52, 0x24, 0x29, 0x99, 0xb4, 0x81, - 0x54, 0x49, 0x6a, 0x22, 0x5d, 0x26, 0x3d, 0x26, 0xbd, 0x21, 0x93, 0xc9, - 0x3a, 0x64, 0x47, 0x72, 0x18, 0x59, 0x40, 0x5e, 0x4f, 0xae, 0x24, 0x9f, - 0x20, 0x5f, 0x25, 0x0f, 0x92, 0x3f, 0x50, 0x94, 0x28, 0x26, 0x14, 0x4f, - 0x4a, 0x1c, 0x45, 0x42, 0xd9, 0x4e, 0x39, 0x4a, 0xb9, 0x40, 0x79, 0x40, - 0x79, 0x43, 0xa5, 0x52, 0x0d, 0xa8, 0x6e, 0xd4, 0x58, 0xaa, 0x98, 0xba, - 0x9d, 0x5a, 0x4f, 0xbd, 0x44, 0x7d, 0x4a, 0x7d, 0x2f, 0x47, 0x93, 0x33, - 0x97, 0xf3, 0x97, 0xe3, 0xc9, 0xad, 0x93, 0xab, 0x91, 0x6b, 0x95, 0xeb, - 0x97, 0x7b, 0x25, 0x4f, 0x94, 0xd7, 0x97, 0x77, 0x97, 0x5f, 0x2e, 0x9f, - 0x27, 0x5f, 0x21, 0x7f, 0x4a, 0xfe, 0xa6, 0xfc, 0xb8, 0x02, 0x51, 0xc1, - 0x40, 0xc1, 0x53, 0x81, 0xa3, 0xb0, 0x56, 0xa1, 0x46, 0xe1, 0xb4, 0xc2, - 0x3d, 0x85, 0x49, 0x45, 0x9a, 0xa2, 0x95, 0x62, 0x88, 0x62, 0x9a, 0x62, - 0x89, 0x62, 0x83, 0xe2, 0x35, 0xc5, 0x51, 0x25, 0xbc, 0x92, 0x81, 0x92, - 0xb7, 0x12, 0x4f, 0xa9, 0x40, 0xe9, 0xb0, 0xd2, 0x25, 0xa5, 0x21, 0x1a, - 0x42, 0xd3, 0xa5, 0x79, 0xd2, 0xb8, 0xb4, 0x4d, 0xb4, 0x3a, 0xda, 0x65, - 0xda, 0x30, 0x1d, 0x47, 0x37, 0xa4, 0xfb, 0xd3, 0x93, 0xe9, 0xc5, 0xf4, - 0x1f, 0xe8, 0xbd, 0xf4, 0x09, 0x65, 0x25, 0x65, 0x5b, 0xe5, 0x28, 0xe5, - 0x1c, 0xe5, 0x1a, 0xe5, 0xb3, 0xca, 0x52, 0x06, 0xc2, 0x30, 0x60, 0xf8, - 0x33, 0x52, 0x19, 0xa5, 0x8c, 0x93, 0x8c, 0xbb, 0x8c, 0x8f, 0xf3, 0x34, - 0xe6, 0xb9, 0xcf, 0xe3, 0xcf, 0xdb, 0x36, 0xaf, 0x69, 0x5e, 0xff, 0xbc, - 0x29, 0x95, 0xf9, 0x2a, 0x6e, 0x2a, 0x7c, 0x95, 0x22, 0x95, 0x66, 0x95, - 0x01, 0x95, 0x8f, 0xaa, 0x4c, 0x55, 0x6f, 0xd5, 0x14, 0xd5, 0x9d, 0xaa, - 0x6d, 0xaa, 0x4f, 0xd4, 0x30, 0x6a, 0x26, 0x6a, 0x61, 0x6a, 0xd9, 0x6a, - 0xfb, 0xd5, 0x2e, 0xab, 0x8d, 0xcf, 0xa7, 0xcf, 0x77, 0x9e, 0xcf, 0x9d, - 0x5f, 0x34, 0xff, 0xe4, 0xfc, 0x87, 0xea, 0xb0, 0xba, 0x89, 0x7a, 0xb8, - 0xfa, 0x6a, 0xf5, 0xc3, 0xea, 0x3d, 0xea, 0x93, 0x1a, 0x9a, 0x1a, 0xbe, - 0x1a, 0x19, 0x1a, 0x55, 0x1a, 0x97, 0x34, 0xc6, 0x35, 0x19, 0x9a, 0x6e, - 0x9a, 0xc9, 0x9a, 0xe5, 0x9a, 0xe7, 0x34, 0xc7, 0xb4, 0x68, 0x5a, 0x0b, - 0xb5, 0x04, 0x5a, 0xe5, 0x5a, 0xe7, 0xb5, 0x5e, 0x30, 0x95, 0x99, 0xee, - 0xcc, 0x54, 0x66, 0x25, 0xb3, 0x8b, 0x39, 0xa1, 0xad, 0xae, 0xed, 0xa7, - 0x2d, 0xd1, 0x3e, 0xa4, 0xdd, 0xab, 0x3d, 0xad, 0x63, 0xa8, 0xb3, 0x58, - 0x67, 0xa3, 0x4e, 0xb3, 0xce, 0x13, 0x5d, 0x92, 0x2e, 0x5b, 0x37, 0x41, - 0xb7, 0x5c, 0xb7, 0x53, 0x77, 0x42, 0x4f, 0x4b, 0x2f, 0x58, 0x2f, 0x5f, - 0xaf, 0x51, 0xef, 0xa1, 0x3e, 0x51, 0x9f, 0xad, 0x9f, 0xa4, 0xbf, 0x47, - 0xbf, 0x5b, 0x7f, 0xca, 0xc0, 0xd0, 0x20, 0xda, 0x60, 0x8b, 0x41, 0x9b, - 0xc1, 0xa8, 0xa1, 0x8a, 0xa1, 0xbf, 0x61, 0x9e, 0x61, 0xa3, 0xe1, 0x63, - 0x23, 0xaa, 0x91, 0xab, 0xd1, 0x2a, 0xa3, 0x5a, 0xa3, 0x3b, 0xc6, 0x38, - 0x63, 0xb6, 0x71, 0x8a, 0xf1, 0x3e, 0xe3, 0x5b, 0x26, 0xb0, 0x89, 0x9d, - 0x49, 0x92, 0x49, 0x8d, 0xc9, 0x4d, 0x53, 0xd8, 0xd4, 0xde, 0x54, 0x60, - 0xba, 0xcf, 0xb4, 0xcf, 0x0c, 0x6b, 0xe6, 0x68, 0x26, 0x34, 0xab, 0x35, - 0xbb, 0xc7, 0xa2, 0xb0, 0xdc, 0x59, 0x59, 0xac, 0x46, 0xd6, 0xa0, 0x39, - 0xc3, 0x3c, 0xc8, 0x7c, 0xa3, 0x79, 0x9b, 0xf9, 0x2b, 0x0b, 0x3d, 0x8b, - 0x58, 0x8b, 0x9d, 0x16, 0xdd, 0x16, 0x5f, 0x2c, 0xed, 0x2c, 0x53, 0x2d, - 0xeb, 0x2c, 0x1f, 0x59, 0x29, 0x59, 0x05, 0x58, 0x6d, 0xb4, 0xea, 0xb0, - 0xfa, 0xc3, 0xda, 0xc4, 0x9a, 0x6b, 0x5d, 0x63, 0x7d, 0xc7, 0x86, 0x6a, - 0xe3, 0x63, 0xb3, 0xce, 0xa6, 0xdd, 0xe6, 0xb5, 0xad, 0xa9, 0x2d, 0xdf, - 0x76, 0xbf, 0xed, 0x7d, 0x3b, 0x9a, 0x5d, 0xb0, 0xdd, 0x16, 0xbb, 0x4e, - 0xbb, 0xcf, 0xf6, 0x0e, 0xf6, 0x22, 0xfb, 0x26, 0xfb, 0x31, 0x07, 0x3d, - 0x87, 0x78, 0x87, 0xbd, 0x0e, 0xf7, 0xd8, 0x74, 0x76, 0x28, 0xbb, 0x84, - 0x7d, 0xd5, 0x11, 0xeb, 0xe8, 0xe1, 0xb8, 0xce, 0xf1, 0x8c, 0xe3, 0x07, - 0x27, 0x7b, 0x27, 0xb1, 0xd3, 0x49, 0xa7, 0xdf, 0x9d, 0x59, 0xce, 0x29, - 0xce, 0x0d, 0xce, 0xa3, 0x0b, 0x0c, 0x17, 0xf0, 0x17, 0xd4, 0x2d, 0x18, - 0x72, 0xd1, 0x71, 0xe1, 0xb8, 0x1c, 0x72, 0x91, 0x2e, 0x64, 0x2e, 0x8c, - 0x5f, 0x78, 0x70, 0xa1, 0xd4, 0x55, 0xdb, 0x95, 0xe3, 0x5a, 0xeb, 0xfa, - 0xcc, 0x4d, 0xd7, 0x8d, 0xe7, 0x76, 0xc4, 0x6d, 0xc4, 0xdd, 0xd8, 0x3d, - 0xd9, 0xfd, 0xb8, 0xfb, 0x2b, 0x0f, 0x4b, 0x0f, 0x91, 0x47, 0x8b, 0xc7, - 0x94, 0xa7, 0x93, 0xe7, 0x1a, 0xcf, 0x0b, 0x5e, 0x88, 0x97, 0xaf, 0x57, - 0x91, 0x57, 0xaf, 0xb7, 0x92, 0xf7, 0x62, 0xef, 0x6a, 0xef, 0xa7, 0x3e, - 0x3a, 0x3e, 0x89, 0x3e, 0x8d, 0x3e, 0x13, 0xbe, 0x76, 0xbe, 0xab, 0x7d, - 0x2f, 0xf8, 0x61, 0xfd, 0x02, 0xfd, 0x76, 0xfa, 0xdd, 0xf3, 0xd7, 0xf0, - 0xe7, 0xfa, 0xd7, 0xfb, 0x4f, 0x04, 0x38, 0x04, 0xac, 0x09, 0xe8, 0x0a, - 0xa4, 0x04, 0x46, 0x04, 0x56, 0x07, 0x3e, 0x0b, 0x32, 0x09, 0x12, 0x05, - 0x75, 0x04, 0xc3, 0xc1, 0x01, 0xc1, 0xbb, 0x82, 0x1f, 0x2f, 0xd2, 0x5f, - 0x24, 0x5c, 0xd4, 0x16, 0x02, 0x42, 0xfc, 0x43, 0x76, 0x85, 0x3c, 0x09, - 0x35, 0x0c, 0x5d, 0x15, 0xfa, 0x73, 0x18, 0x2e, 0x2c, 0x34, 0xac, 0x26, - 0xec, 0x79, 0xb8, 0x55, 0x78, 0x7e, 0x78, 0x77, 0x04, 0x2d, 0x62, 0x45, - 0x44, 0x43, 0xc4, 0xbb, 0x48, 0x8f, 0xc8, 0xd2, 0xc8, 0x47, 0x8b, 0x8d, - 0x16, 0x4b, 0x16, 0x77, 0x46, 0xc9, 0x47, 0xc5, 0x45, 0xd5, 0x47, 0x4d, - 0x45, 0x7b, 0x45, 0x97, 0x45, 0x4b, 0x97, 0x58, 0x2c, 0x59, 0xb3, 0xe4, - 0x46, 0x8c, 0x5a, 0x8c, 0x20, 0xa6, 0x3d, 0x16, 0x1f, 0x1b, 0x15, 0x7b, - 0x24, 0x76, 0x72, 0xa9, 0xf7, 0xd2, 0xdd, 0x4b, 0x87, 0xe3, 0xec, 0xe2, - 0x0a, 0xe3, 0xee, 0x2e, 0x33, 0x5c, 0x96, 0xb3, 0xec, 0xda, 0x72, 0xb5, - 0xe5, 0xa9, 0xcb, 0xcf, 0xae, 0x90, 0x5f, 0xc1, 0x59, 0x71, 0x2a, 0x1e, - 0x1b, 0x1f, 0x1d, 0xdf, 0x10, 0xff, 0x89, 0x13, 0xc2, 0xa9, 0xe5, 0x4c, - 0xae, 0xf4, 0x5f, 0xb9, 0x77, 0xe5, 0x04, 0xd7, 0x93, 0xbb, 0x87, 0xfb, - 0x92, 0xe7, 0xc6, 0x2b, 0xe7, 0x8d, 0xf1, 0x5d, 0xf8, 0x65, 0xfc, 0x91, - 0x04, 0x97, 0x84, 0xb2, 0x84, 0xd1, 0x44, 0x97, 0xc4, 0x5d, 0x89, 0x63, - 0x49, 0xae, 0x49, 0x15, 0x49, 0xe3, 0x02, 0x4f, 0x41, 0xb5, 0xe0, 0x75, - 0xb2, 0x5f, 0xf2, 0x81, 0xe4, 0xa9, 0x94, 0x90, 0x94, 0xa3, 0x29, 0x33, - 0xa9, 0xd1, 0xa9, 0xcd, 0x69, 0x84, 0xb4, 0xf8, 0xb4, 0xd3, 0x42, 0x25, - 0x61, 0x8a, 0xb0, 0x2b, 0x5d, 0x33, 0x3d, 0x27, 0xbd, 0x2f, 0xc3, 0x34, - 0xa3, 0x30, 0x43, 0xba, 0xca, 0x69, 0xd5, 0xee, 0x55, 0x13, 0xa2, 0x40, - 0xd1, 0x91, 0x4c, 0x28, 0x73, 0x59, 0x66, 0xbb, 0x98, 0x8e, 0xfe, 0x4c, - 0xf5, 0x48, 0x8c, 0x24, 0x9b, 0x25, 0x83, 0x59, 0x0b, 0xb3, 0x6a, 0xb2, - 0xde, 0x67, 0x47, 0x65, 0x9f, 0xca, 0x51, 0xcc, 0x11, 0xe6, 0xf4, 0xe4, - 0x9a, 0xe4, 0x6e, 0xcb, 0x1d, 0xc9, 0xf3, 0xc9, 0xfb, 0x7e, 0x35, 0x66, - 0x35, 0x77, 0x75, 0x67, 0xbe, 0x76, 0xfe, 0x86, 0xfc, 0xc1, 0x35, 0xee, - 0x6b, 0x0e, 0xad, 0x85, 0xd6, 0xae, 0x5c, 0xdb, 0xb9, 0x4e, 0x77, 0x5d, - 0xc1, 0xba, 0xe1, 0xf5, 0xbe, 0xeb, 0x8f, 0x6d, 0x20, 0x6d, 0x48, 0xd9, - 0xf0, 0xcb, 0x46, 0xcb, 0x8d, 0x65, 0x1b, 0xdf, 0x6e, 0x8a, 0xde, 0xd4, - 0x51, 0xa0, 0x51, 0xb0, 0xbe, 0x60, 0x68, 0xb3, 0xef, 0xe6, 0xc6, 0x42, - 0xb9, 0x42, 0x51, 0xe1, 0xbd, 0x2d, 0xce, 0x5b, 0x0e, 0x6c, 0xc5, 0x6c, - 0x15, 0x6c, 0xed, 0xdd, 0x66, 0xb3, 0xad, 0x6a, 0xdb, 0x97, 0x22, 0x5e, - 0xd1, 0xf5, 0x62, 0xcb, 0xe2, 0x8a, 0xe2, 0x4f, 0x25, 0xdc, 0x92, 0xeb, - 0xdf, 0x59, 0x7d, 0x57, 0xf9, 0xdd, 0xcc, 0xf6, 0x84, 0xed, 0xbd, 0xa5, - 0xf6, 0xa5, 0xfb, 0x77, 0xe0, 0x76, 0x08, 0x77, 0xdc, 0xdd, 0xe9, 0xba, - 0xf3, 0x58, 0x99, 0x62, 0x59, 0x5e, 0xd9, 0xd0, 0xae, 0xe0, 0x5d, 0xad, - 0xe5, 0xcc, 0xf2, 0xa2, 0xf2, 0xb7, 0xbb, 0x57, 0xec, 0xbe, 0x56, 0x61, - 0x5b, 0x71, 0x60, 0x0f, 0x69, 0x8f, 0x64, 0x8f, 0xb4, 0x32, 0xa8, 0xb2, - 0xbd, 0x4a, 0xaf, 0x6a, 0x47, 0xd5, 0xa7, 0xea, 0xa4, 0xea, 0x81, 0x1a, - 0x8f, 0x9a, 0xe6, 0xbd, 0xea, 0x7b, 0xb7, 0xed, 0x9d, 0xda, 0xc7, 0xdb, - 0xd7, 0xbf, 0xdf, 0x6d, 0x7f, 0xd3, 0x01, 0x8d, 0x03, 0xc5, 0x07, 0x3e, - 0x1e, 0x14, 0x1c, 0xbc, 0x7f, 0xc8, 0xf7, 0x50, 0x6b, 0xad, 0x41, 0x6d, - 0xc5, 0x61, 0xdc, 0xe1, 0xac, 0xc3, 0xcf, 0xeb, 0xa2, 0xea, 0xba, 0xbf, - 0x67, 0x7f, 0x5f, 0x7f, 0x44, 0xed, 0x48, 0xf1, 0x91, 0xcf, 0x47, 0x85, - 0x47, 0xa5, 0xc7, 0xc2, 0x8f, 0x75, 0xd5, 0x3b, 0xd4, 0xd7, 0x37, 0xa8, - 0x37, 0x94, 0x36, 0xc2, 0x8d, 0x92, 0xc6, 0xb1, 0xe3, 0x71, 0xc7, 0x6f, - 0xfd, 0xe0, 0xf5, 0x43, 0x7b, 0x13, 0xab, 0xe9, 0x50, 0x33, 0xa3, 0xb9, - 0xf8, 0x04, 0x38, 0x21, 0x39, 0xf1, 0xe2, 0xc7, 0xf8, 0x1f, 0xef, 0x9e, - 0x0c, 0x3c, 0xd9, 0x79, 0x8a, 0x7d, 0xaa, 0xe9, 0x27, 0xfd, 0x9f, 0xf6, - 0xb6, 0xd0, 0x5a, 0x8a, 0x5a, 0xa1, 0xd6, 0xdc, 0xd6, 0x89, 0xb6, 0xa4, - 0x36, 0x69, 0x7b, 0x4c, 0x7b, 0xdf, 0xe9, 0x80, 0xd3, 0x9d, 0x1d, 0xce, - 0x1d, 0x2d, 0x3f, 0x9b, 0xff, 0x7c, 0xf4, 0x8c, 0xf6, 0x99, 0x9a, 0xb3, - 0xca, 0x67, 0x4b, 0xcf, 0x91, 0xce, 0x15, 0x9c, 0x9b, 0x39, 0x9f, 0x77, - 0x7e, 0xf2, 0x42, 0xc6, 0x85, 0xf1, 0x8b, 0x89, 0x17, 0x87, 0x3a, 0x57, - 0x74, 0x3e, 0xba, 0xb4, 0xe4, 0xd2, 0x9d, 0xae, 0xb0, 0xae, 0xde, 0xcb, - 0x81, 0x97, 0xaf, 0x5e, 0xf1, 0xb9, 0x72, 0xa9, 0xdb, 0xbd, 0xfb, 0xfc, - 0x55, 0x97, 0xab, 0x67, 0xae, 0x39, 0x5d, 0x3b, 0x7d, 0x9d, 0x7d, 0xbd, - 0xed, 0x86, 0xfd, 0x8d, 0xd6, 0x1e, 0xbb, 0x9e, 0x96, 0x5f, 0xec, 0x7e, - 0x69, 0xe9, 0xb5, 0xef, 0x6d, 0xbd, 0xe9, 0x70, 0xb3, 0xfd, 0x96, 0xe3, - 0xad, 0x8e, 0xbe, 0x05, 0x7d, 0xe7, 0xfa, 0x5d, 0xfb, 0x2f, 0xde, 0xf6, - 0xba, 0x7d, 0xe5, 0x8e, 0xff, 0x9d, 0x1b, 0x03, 0x8b, 0x06, 0xfa, 0xee, - 0x2e, 0xbe, 0x7b, 0xff, 0x5e, 0xdc, 0x3d, 0xe9, 0x7d, 0xde, 0xfd, 0xd1, - 0x07, 0xa9, 0x0f, 0x5e, 0x3f, 0xcc, 0x7a, 0x38, 0xfd, 0x68, 0xfd, 0x63, - 0xec, 0xe3, 0xa2, 0x27, 0x0a, 0x4f, 0x2a, 0x9e, 0xaa, 0x3f, 0xad, 0xfd, - 0xd5, 0xf8, 0xd7, 0x66, 0xa9, 0xbd, 0xf4, 0xec, 0xa0, 0xd7, 0x60, 0xcf, - 0xb3, 0x88, 0x67, 0x8f, 0x86, 0xb8, 0x43, 0x2f, 0xff, 0x95, 0xf9, 0xaf, - 0x4f, 0xc3, 0x05, 0xcf, 0xa9, 0xcf, 0x2b, 0x46, 0xb4, 0x46, 0xea, 0x47, - 0xad, 0x47, 0xcf, 0x8c, 0xf9, 0x8c, 0xdd, 0x7a, 0xb1, 0xf4, 0xc5, 0xf0, - 0xcb, 0x8c, 0x97, 0xd3, 0xe3, 0x85, 0xbf, 0x29, 0xfe, 0xb6, 0xf7, 0x95, - 0xd1, 0xab, 0x9f, 0x7e, 0x77, 0xfb, 0xbd, 0x67, 0x62, 0xc9, 0xc4, 0xf0, - 0x6b, 0xd1, 0xeb, 0x99, 0x3f, 0x4a, 0xde, 0xa8, 0xbe, 0x39, 0xfa, 0xd6, - 0xf6, 0x6d, 0xe7, 0x64, 0xe8, 0xe4, 0xd3, 0x77, 0x69, 0xef, 0xa6, 0xa7, - 0x8a, 0xde, 0xab, 0xbe, 0x3f, 0xf6, 0x81, 0xfd, 0xa1, 0xfb, 0x63, 0xf4, - 0xc7, 0x91, 0xe9, 0xec, 0x4f, 0xf8, 0x4f, 0x95, 0x9f, 0x8d, 0x3f, 0x77, - 0x7c, 0x09, 0xfc, 0xf2, 0x78, 0x26, 0x6d, 0x66, 0xe6, 0xdf, 0xf7, 0x84, - 0xf3, 0xfb, 0x32, 0x3a, 0x59, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, - 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, - 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x03, 0xa7, 0x69, 0x54, 0x58, 0x74, 0x58, - 0x4d, 0x4c, 0x3a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, - 0x2e, 0x78, 0x6d, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x78, 0x3a, - 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, - 0x73, 0x3a, 0x78, 0x3d, 0x22, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, - 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x22, 0x20, 0x78, 0x3a, 0x78, - 0x6d, 0x70, 0x74, 0x6b, 0x3d, 0x22, 0x58, 0x4d, 0x50, 0x20, 0x43, 0x6f, - 0x72, 0x65, 0x20, 0x35, 0x2e, 0x34, 0x2e, 0x30, 0x22, 0x3e, 0x0a, 0x20, - 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, - 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x22, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, - 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, - 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, - 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x64, 0x66, 0x3a, 0x61, - 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, - 0x73, 0x3a, 0x78, 0x6d, 0x70, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x74, 0x69, 0x66, 0x66, 0x3d, - 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, - 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x66, - 0x66, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, - 0x73, 0x3a, 0x65, 0x78, 0x69, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x69, 0x66, 0x2f, 0x31, 0x2e, 0x30, - 0x2f, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x32, - 0x2d, 0x31, 0x32, 0x54, 0x30, 0x36, 0x3a, 0x30, 0x32, 0x3a, 0x34, 0x32, - 0x3c, 0x2f, 0x78, 0x6d, 0x70, 0x3a, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x44, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x3c, 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x6f, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x3e, 0x50, 0x69, 0x78, 0x65, - 0x6c, 0x6d, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x33, 0x2e, 0x31, 0x3c, 0x2f, - 0x78, 0x6d, 0x70, 0x3a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x54, - 0x6f, 0x6f, 0x6c, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x31, 0x3c, 0x2f, 0x74, - 0x69, 0x66, 0x66, 0x3a, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x43, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x35, 0x3c, 0x2f, 0x74, - 0x69, 0x66, 0x66, 0x3a, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x69, 0x74, 0x3e, 0x31, - 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x69, 0x74, 0x3e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x66, - 0x66, 0x3a, 0x59, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x3e, 0x37, 0x32, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x59, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, - 0x66, 0x66, 0x3a, 0x58, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x3e, 0x37, 0x32, 0x3c, 0x2f, 0x74, 0x69, 0x66, 0x66, 0x3a, - 0x58, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3e, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, - 0x78, 0x69, 0x66, 0x3a, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x58, 0x44, 0x69, - 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x39, 0x39, 0x39, 0x3c, - 0x2f, 0x65, 0x78, 0x69, 0x66, 0x3a, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x58, - 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x78, 0x69, - 0x66, 0x3a, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, - 0x3e, 0x31, 0x3c, 0x2f, 0x65, 0x78, 0x69, 0x66, 0x3a, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x65, 0x78, 0x69, 0x66, 0x3a, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x59, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x3e, 0x35, 0x34, 0x3c, 0x2f, 0x65, 0x78, 0x69, 0x66, - 0x3a, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x59, 0x44, 0x69, 0x6d, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x3c, 0x2f, - 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x0a, 0x3c, 0x2f, 0x78, - 0x3a, 0x78, 0x6d, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x0a, 0x28, 0x4f, - 0x0c, 0x47, 0x00, 0x00, 0x40, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, - 0xed, 0x9d, 0x07, 0x98, 0x14, 0xc5, 0xd6, 0x86, 0x67, 0x36, 0x2f, 0x39, - 0x4a, 0x14, 0x5c, 0x32, 0x8a, 0xa0, 0x04, 0xb3, 0x92, 0xc5, 0x1c, 0x31, - 0x47, 0xcc, 0x39, 0xc7, 0xab, 0x22, 0x28, 0x26, 0xcc, 0x11, 0xc3, 0x55, - 0x82, 0x22, 0xe6, 0x80, 0x28, 0x2a, 0x41, 0x44, 0x40, 0x41, 0x90, 0x20, - 0x48, 0x8e, 0x4b, 0x96, 0xb8, 0x6c, 0x8e, 0xff, 0xfb, 0xb5, 0x53, 0x73, - 0x7b, 0x7b, 0x7b, 0x76, 0x67, 0x17, 0xd0, 0xcb, 0xfd, 0xab, 0x9e, 0xe7, - 0x4c, 0x77, 0x57, 0xae, 0xaf, 0x4e, 0x9d, 0x3a, 0xa7, 0xaa, 0xba, 0x27, - 0x10, 0xb0, 0xce, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xf8, 0x5b, 0x11, - 0x08, 0xfe, 0xad, 0xa5, 0xd9, 0xc2, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, - 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0xfc, 0x3f, 0x45, 0x20, 0x2d, - 0x2d, 0xed, 0xb4, 0x60, 0x30, 0x98, 0x94, 0x93, 0x93, 0x33, 0xb5, 0x4e, - 0x9d, 0x3a, 0xeb, 0xf6, 0x04, 0x0c, 0x9b, 0x37, 0x6f, 0xae, 0x9f, 0x98, - 0x98, 0xb8, 0x7f, 0x51, 0x51, 0xd1, 0xb2, 0x1a, 0x35, 0x6a, 0x6c, 0xdf, - 0x13, 0x79, 0x46, 0x9b, 0xc7, 0xf6, 0xed, 0xdb, 0x6b, 0xc4, 0xc4, 0xc4, - 0xb4, 0xa4, 0x3d, 0xa9, 0xfb, 0xed, 0xb7, 0xdf, 0xc6, 0x68, 0xd3, 0x95, - 0x15, 0x8f, 0x36, 0x55, 0x49, 0x48, 0x48, 0x68, 0x0d, 0x56, 0x75, 0xf3, - 0xf3, 0xf3, 0xd7, 0x6c, 0xdb, 0xb6, 0x6d, 0x79, 0xcb, 0x96, 0x2d, 0x73, - 0xca, 0x4a, 0xe7, 0x17, 0xbe, 0x69, 0xd3, 0xa6, 0x7a, 0x49, 0x49, 0x49, - 0x4d, 0x2a, 0x8a, 0x0f, 0xe9, 0x82, 0x7f, 0xfe, 0xf9, 0x67, 0x65, 0xda, - 0x97, 0xee, 0x97, 0x7f, 0x24, 0x3f, 0xd2, 0x54, 0xad, 0x5b, 0xb7, 0xee, - 0x2e, 0xbf, 0xf0, 0xf4, 0xf4, 0xf4, 0x0e, 0xe4, 0x5b, 0x50, 0xb5, 0x6a, - 0xd5, 0xf9, 0x7e, 0xe1, 0x5e, 0x3f, 0xd3, 0x06, 0xe3, 0x4f, 0xda, 0x22, - 0xfa, 0x7a, 0xa6, 0x79, 0xb6, 0x57, 0x8b, 0xc0, 0xff, 0x17, 0x04, 0x18, - 0x57, 0xad, 0x69, 0x6b, 0x11, 0x63, 0x6b, 0xc9, 0xff, 0x6a, 0x9b, 0xe3, - 0xf6, 0x46, 0xc3, 0x76, 0xec, 0xd8, 0xd1, 0x43, 0x82, 0xa3, 0x66, 0xcd, - 0x9a, 0x3f, 0xf8, 0xe5, 0x8f, 0x90, 0x6d, 0x17, 0x1f, 0x1f, 0x7f, 0x2c, - 0x51, 0xf2, 0x11, 0xe8, 0x3f, 0x46, 0x03, 0xf0, 0xda, 0xb5, 0x6b, 0x6b, - 0x23, 0xc4, 0x8e, 0x28, 0x28, 0x28, 0xf8, 0xbd, 0x56, 0xad, 0x5a, 0x6b, - 0xfc, 0xf2, 0x95, 0xdf, 0xfa, 0xf5, 0xeb, 0x2b, 0x25, 0x27, 0x27, 0x77, - 0x26, 0xff, 0x43, 0x0b, 0x0b, 0x0b, 0x33, 0x11, 0xea, 0xd3, 0x89, 0x3f, - 0x2f, 0x52, 0x7c, 0x26, 0x80, 0x16, 0xc4, 0x6f, 0xcf, 0x04, 0xd0, 0x82, - 0x38, 0x9b, 0xa9, 0xcf, 0xaf, 0xb5, 0x6b, 0xd7, 0x5e, 0x10, 0x29, 0xbe, - 0xdb, 0x7f, 0xe6, 0xcc, 0x99, 0xf1, 0x4c, 0x16, 0x17, 0x30, 0x31, 0xe5, - 0x50, 0xb7, 0x8f, 0x08, 0x2b, 0x72, 0x87, 0x93, 0x77, 0x4b, 0x26, 0xcc, - 0x56, 0x6e, 0x3f, 0x73, 0x9f, 0x91, 0x91, 0x31, 0xbd, 0x61, 0xc3, 0x86, - 0x5b, 0xcc, 0xb3, 0xf7, 0x0a, 0x46, 0xd5, 0xc9, 0xb7, 0x53, 0x5c, 0x5c, - 0x9c, 0x04, 0x78, 0x6e, 0x56, 0x56, 0xd6, 0xf7, 0x4c, 0x0c, 0x4b, 0x4d, - 0xbc, 0x5d, 0xbb, 0x76, 0xb5, 0xa3, 0x7d, 0x4d, 0xcd, 0xb3, 0xdf, 0x95, - 0xb6, 0xaf, 0xf2, 0x6b, 0x0b, 0xfd, 0xd3, 0x4b, 0xf9, 0x2a, 0x0d, 0x71, - 0x7e, 0xaf, 0x5e, 0xbd, 0xfa, 0x38, 0xda, 0x5f, 0xac, 0xee, 0x26, 0xbf, - 0x8f, 0x3e, 0xfa, 0x28, 0xb6, 0x77, 0xef, 0xde, 0xc7, 0x81, 0x67, 0x7b, - 0xb0, 0xdf, 0x92, 0x99, 0x99, 0x39, 0xb5, 0x41, 0x83, 0x06, 0xab, 0x4c, - 0xf8, 0xff, 0xf7, 0x6b, 0xa8, 0x1f, 0xda, 0xc7, 0xc6, 0xc6, 0x36, 0xa6, - 0x9f, 0x76, 0x81, 0xd1, 0x12, 0xf0, 0x9c, 0x18, 0x09, 0x4f, 0x83, 0x97, - 0x26, 0x5a, 0xf8, 0xae, 0x45, 0x76, 0x76, 0xf6, 0xdc, 0xb2, 0x26, 0x7c, - 0xf5, 0xc1, 0x49, 0x27, 0x9d, 0x74, 0x2e, 0xf9, 0x17, 0x3d, 0xfb, 0xec, - 0xb3, 0x1f, 0x0d, 0x18, 0x30, 0xa0, 0xd0, 0xe4, 0x63, 0xae, 0xf4, 0x69, - 0x27, 0xca, 0xac, 0x6f, 0x9e, 0xb9, 0x2a, 0xce, 0x16, 0xfa, 0x77, 0x03, - 0x3c, 0xb0, 0xd6, 0xe5, 0xef, 0x7b, 0xab, 0xf1, 0x55, 0xa5, 0x4a, 0x95, - 0x43, 0xe0, 0x8b, 0xf6, 0x14, 0x93, 0x0f, 0xa5, 0xe6, 0xe5, 0xe5, 0x4d, - 0x24, 0x6d, 0x9a, 0x12, 0x78, 0xf2, 0x2f, 0x60, 0x9c, 0x2c, 0x67, 0xdc, - 0x2e, 0xa7, 0xcc, 0x12, 0x75, 0x31, 0x05, 0x48, 0x0e, 0x10, 0x9e, 0x6c, - 0x9e, 0xbd, 0xd7, 0xdc, 0xdc, 0xdc, 0xd9, 0xe4, 0xb1, 0xde, 0xf8, 0xa3, - 0xac, 0x1c, 0x0c, 0x7e, 0x4d, 0xcc, 0xb3, 0xf7, 0xca, 0x78, 0x58, 0xed, - 0xa7, 0xc8, 0x50, 0xd7, 0x58, 0x14, 0xc4, 0x83, 0xa8, 0x7b, 0x17, 0xe2, - 0xd4, 0xe0, 0x79, 0x35, 0xe3, 0x67, 0x42, 0xd3, 0xa6, 0x4d, 0xc3, 0x4a, - 0xaa, 0xa9, 0x3f, 0xe3, 0x68, 0x52, 0xfd, 0xfa, 0xf5, 0x33, 0xdc, 0x79, - 0x6f, 0xdc, 0xb8, 0xb1, 0x32, 0x7d, 0xd1, 0x8d, 0x74, 0x1b, 0x51, 0x76, - 0x66, 0x99, 0x30, 0x94, 0xe8, 0xa3, 0xf1, 0xab, 0x61, 0x9e, 0xdd, 0x57, - 0xda, 0xb5, 0xbd, 0x5a, 0xb5, 0x6a, 0xd3, 0xdc, 0x7e, 0x7e, 0xf7, 0xc8, - 0xa3, 0x3a, 0x95, 0x2b, 0x57, 0x3e, 0x9c, 0x7e, 0x58, 0x09, 0x96, 0x7f, - 0xb8, 0xe3, 0x50, 0xa7, 0xe3, 0x79, 0xce, 0xa7, 0xcc, 0x89, 0x6e, 0x7f, - 0xdd, 0xd3, 0x9e, 0x0e, 0xb4, 0xa5, 0x31, 0x63, 0x7c, 0x3e, 0x72, 0x74, - 0xb5, 0xfc, 0x76, 0xee, 0xdc, 0x79, 0x18, 0x97, 0xba, 0x6a, 0x5b, 0x4a, - 0x4a, 0x4a, 0xb6, 0xfc, 0x22, 0x39, 0xf2, 0xee, 0x49, 0x1d, 0x93, 0xe8, - 0xc3, 0x15, 0x18, 0x00, 0x0b, 0xdd, 0xf1, 0x8c, 0xec, 0xa0, 0x6d, 0xd9, - 0x94, 0x3d, 0x41, 0x61, 0x06, 0x1f, 0xfa, 0x75, 0x31, 0xfc, 0xb8, 0xcc, - 0x1d, 0x5f, 0xfc, 0xd7, 0xa7, 0x4f, 0x9f, 0x13, 0x88, 0xbf, 0x81, 0xf8, - 0xbf, 0xb9, 0xc3, 0x24, 0x03, 0x5b, 0xb4, 0x68, 0xd1, 0x01, 0xfe, 0xef, - 0x82, 0x7f, 0x0c, 0xfd, 0xf7, 0x33, 0xfc, 0x3f, 0x97, 0xb2, 0x0b, 0xdc, - 0xf1, 0x36, 0x6c, 0xd8, 0x50, 0xb7, 0x52, 0xa5, 0x4a, 0xaa, 0xbf, 0x71, - 0x34, 0xad, 0x70, 0x03, 0x79, 0xae, 0x44, 0x3e, 0xef, 0x34, 0x9e, 0xde, - 0x6b, 0xb4, 0xf9, 0x6f, 0xdd, 0xba, 0xb5, 0x1a, 0xfd, 0x7f, 0xac, 0x49, - 0xaf, 0xb6, 0xd1, 0xf6, 0xb5, 0xf0, 0xd4, 0xea, 0xd2, 0xb0, 0x52, 0xdb, - 0x8e, 0x3f, 0xfe, 0xf8, 0x6e, 0xd4, 0xbf, 0x25, 0x75, 0xae, 0x44, 0x3f, - 0xcd, 0x25, 0x8f, 0xdf, 0x68, 0x67, 0x98, 0x77, 0x94, 0x27, 0xd8, 0x9f, - 0x6c, 0xf2, 0x2e, 0xe5, 0x5a, 0x48, 0xdb, 0xc7, 0x2a, 0x1c, 0xde, 0x39, - 0x8a, 0x3a, 0xd4, 0xfc, 0xee, 0xbb, 0xef, 0xbe, 0x3d, 0xf7, 0xdc, 0x73, - 0x8b, 0x61, 0xa1, 0x32, 0x4f, 0x38, 0xe1, 0x84, 0x53, 0xc1, 0x6a, 0x3b, - 0x7d, 0x3b, 0x99, 0xbe, 0x6e, 0xaf, 0xbe, 0x46, 0xb6, 0xce, 0x40, 0xb6, - 0xfe, 0xe9, 0x97, 0x7f, 0x48, 0x31, 0xef, 0x0c, 0x66, 0x6b, 0x89, 0xdb, - 0x80, 0xbc, 0xb7, 0x50, 0xc7, 0x52, 0x15, 0x73, 0xfa, 0xb4, 0x33, 0x6d, - 0xaa, 0xc3, 0x3c, 0xf4, 0x03, 0x7d, 0xda, 0x8b, 0xb4, 0x19, 0x94, 0x37, - 0xc9, 0x2f, 0x7f, 0xea, 0xab, 0xf9, 0xb8, 0xea, 0x6f, 0xbf, 0xfd, 0xf6, - 0x7d, 0xe7, 0xce, 0x9d, 0xdb, 0x10, 0xb7, 0xa9, 0xb0, 0x88, 0x24, 0x3b, - 0xc0, 0xbb, 0xb1, 0xe6, 0x10, 0xda, 0xb0, 0x9a, 0xfe, 0x5b, 0x10, 0x6a, - 0xaf, 0xef, 0x58, 0x31, 0xe5, 0x51, 0x17, 0xdf, 0x31, 0x03, 0xb6, 0x27, - 0x12, 0x27, 0xc6, 0xc4, 0xd3, 0x15, 0xd9, 0x30, 0x19, 0xd9, 0x50, 0xcc, - 0xa8, 0xa1, 0x3d, 0xa5, 0xea, 0x15, 0xee, 0xf4, 0xba, 0x97, 0x61, 0x84, - 0x71, 0x77, 0x9c, 0xc7, 0x3f, 0xdc, 0x47, 0x1e, 0x7f, 0xf7, 0x63, 0x10, - 0xbe, 0x39, 0x5f, 0x73, 0x74, 0xbd, 0x7a, 0xf5, 0x56, 0xb8, 0x03, 0xf6, - 0xc0, 0x7d, 0xc2, 0xa4, 0x49, 0x93, 0x8e, 0x3a, 0xf5, 0xd4, 0x53, 0xef, - 0x05, 0x3b, 0x8d, 0x7b, 0xc9, 0x80, 0x62, 0xfc, 0x51, 0x81, 0x32, 0x62, - 0xe0, 0x9d, 0x9b, 0xc0, 0xeb, 0x81, 0x45, 0x8b, 0x16, 0xf5, 0x23, 0xfd, - 0x08, 0xa8, 0xb0, 0x02, 0xf9, 0x54, 0x24, 0x49, 0x0c, 0xfc, 0x75, 0x7a, - 0xab, 0x56, 0xad, 0x86, 0xad, 0x5e, 0xbd, 0xfa, 0x71, 0x32, 0x78, 0x68, - 0x0f, 0x94, 0x1d, 0x64, 0x4c, 0x5c, 0x8e, 0x7c, 0x7d, 0x1e, 0x5e, 0xaf, - 0x6e, 0x2a, 0x85, 0xfc, 0x98, 0xc2, 0x7d, 0xd7, 0x0a, 0xe4, 0x2f, 0x7c, - 0xae, 0x63, 0x0c, 0x0c, 0x58, 0xb2, 0x64, 0xc9, 0x35, 0xa4, 0x7f, 0xbb, - 0x9c, 0x79, 0x04, 0x91, 0x8b, 0x63, 0x90, 0xa3, 0x3d, 0x16, 0x2c, 0x58, - 0x90, 0x72, 0xd0, 0x41, 0x07, 0x45, 0xb3, 0x00, 0x11, 0x64, 0xae, 0x19, - 0x8a, 0xfe, 0x77, 0x11, 0xb2, 0xaf, 0x03, 0xe3, 0xba, 0x98, 0xec, 0xa7, - 0xfc, 0x78, 0x78, 0x73, 0x3c, 0x3c, 0x90, 0xc5, 0x7d, 0x33, 0x28, 0x1f, - 0x2a, 0xcd, 0xc5, 0xc0, 0x8f, 0x57, 0xd1, 0x86, 0x41, 0x26, 0x12, 0xe3, - 0x55, 0x7c, 0xa3, 0xf9, 0x35, 0xcf, 0xf8, 0xd9, 0xab, 0x45, 0x60, 0x5f, - 0x46, 0x00, 0x9e, 0x8e, 0xdd, 0xb2, 0x65, 0x4b, 0x73, 0xf4, 0xb1, 0x4a, - 0xe8, 0xa3, 0x73, 0x22, 0xb4, 0x25, 0x8e, 0xb1, 0x33, 0x8c, 0x39, 0x4a, - 0x63, 0xa6, 0x3b, 0xe4, 0x3b, 0x76, 0x18, 0x2f, 0x87, 0x32, 0xee, 0x33, - 0x18, 0xb7, 0xd2, 0x53, 0x77, 0x57, 0xc6, 0x46, 0xa8, 0xca, 0x3e, 0xe4, - 0x8d, 0xf0, 0x3a, 0x04, 0x80, 0x0b, 0x97, 0x2d, 0x5b, 0xf6, 0x19, 0xd5, - 0x8e, 0xf7, 0x54, 0x3d, 0x08, 0x60, 0x43, 0x08, 0x2f, 0xe6, 0x98, 0x08, - 0x25, 0xd4, 0x23, 0xee, 0xe2, 0x23, 0xdc, 0xba, 0x30, 0x59, 0xaf, 0x51, - 0xa2, 0x3f, 0xfe, 0xf8, 0xe3, 0x01, 0xe2, 0xc6, 0x7a, 0xf2, 0xd5, 0x63, - 0x90, 0x49, 0xfe, 0x7c, 0x14, 0x8a, 0xcd, 0xc5, 0x32, 0xa7, 0x2e, 0x94, - 0x39, 0x14, 0x83, 0xa6, 0xd8, 0xe4, 0x2f, 0xc3, 0x19, 0xc3, 0xe8, 0x33, - 0x4f, 0x5c, 0x3d, 0x16, 0xd2, 0xa1, 0xef, 0x4a, 0x81, 0xf2, 0x29, 0xc3, - 0xed, 0x15, 0x84, 0x89, 0x9e, 0x52, 0x02, 0xf2, 0x91, 0x72, 0x99, 0xe8, - 0x0e, 0xe4, 0x3e, 0x76, 0xcd, 0x9a, 0x35, 0x6f, 0x2b, 0xdc, 0xcf, 0xfd, - 0xf2, 0xcb, 0x2f, 0x7d, 0x89, 0x53, 0xac, 0x4e, 0x4a, 0xff, 0xc3, 0x0f, - 0x3f, 0xc4, 0x51, 0xfe, 0x0b, 0xa4, 0x29, 0x74, 0xa7, 0x9b, 0x37, 0x6f, - 0xde, 0xa3, 0xca, 0x53, 0x71, 0x70, 0x71, 0xa9, 0xa9, 0xa9, 0x9f, 0xba, - 0xc3, 0xfd, 0xee, 0x29, 0xff, 0x7d, 0xc5, 0x75, 0x52, 0xf0, 0xb3, 0x74, - 0xe9, 0xd2, 0xba, 0xe0, 0x38, 0xc3, 0x1b, 0x17, 0xbf, 0x59, 0x2b, 0x56, - 0xac, 0xa8, 0x67, 0xe2, 0x99, 0x2b, 0x86, 0x45, 0x13, 0x26, 0xa5, 0x9f, - 0x3d, 0xf1, 0x0b, 0x50, 0x92, 0xee, 0x23, 0x4e, 0xc4, 0xfe, 0x32, 0xe9, - 0xff, 0x97, 0xaf, 0x28, 0xa7, 0x07, 0xa2, 0xfc, 0x2f, 0xf4, 0x60, 0xe3, - 0x3c, 0x82, 0xe7, 0x22, 0x14, 0xc3, 0x8e, 0x3e, 0xed, 0x0f, 0x62, 0x18, - 0x5d, 0x07, 0x8f, 0xae, 0x70, 0xa5, 0xcb, 0x27, 0xfe, 0x4f, 0xeb, 0xd6, - 0xad, 0xdb, 0xdf, 0x27, 0xbe, 0xe3, 0x45, 0xbf, 0x1d, 0x6f, 0xe2, 0x33, - 0xae, 0x24, 0x8c, 0xbc, 0x2e, 0x1e, 0x03, 0xf3, 0x07, 0x13, 0xc7, 0x7b, - 0xa5, 0x9e, 0x7f, 0x30, 0x36, 0x2e, 0x24, 0x51, 0x89, 0x3e, 0xc3, 0xf8, - 0xa9, 0x84, 0x12, 0xf1, 0xba, 0x37, 0x8d, 0x9e, 0x11, 0x7e, 0x59, 0xb4, - 0xe3, 0x34, 0xd2, 0xf9, 0xe6, 0x4f, 0x78, 0x26, 0x75, 0xff, 0x9e, 0xb1, - 0xd4, 0xc2, 0x5b, 0x21, 0x9e, 0x13, 0xe0, 0xe3, 0x4d, 0x7e, 0xf9, 0x1a, - 0xbf, 0xb9, 0x73, 0xe7, 0xde, 0x40, 0x3c, 0x33, 0x06, 0xe2, 0xc0, 0xe0, - 0x73, 0x13, 0xe6, 0x77, 0x85, 0xe7, 0x3f, 0x26, 0x7e, 0x98, 0x9f, 0x55, - 0x26, 0x65, 0x1f, 0x0a, 0x9e, 0xcb, 0xbd, 0xf1, 0x55, 0x37, 0xc6, 0x67, - 0x4f, 0xc5, 0xc1, 0x85, 0xeb, 0xff, 0xed, 0xb7, 0xdf, 0xaa, 0x5f, 0xdc, - 0x38, 0x04, 0xe5, 0xa7, 0xf4, 0xc2, 0x50, 0x71, 0x95, 0x00, 0x17, 0x8f, - 0x11, 0x3c, 0xd7, 0x9b, 0x6f, 0xe8, 0xb9, 0x90, 0xbc, 0x7f, 0x55, 0x1c, - 0x27, 0x66, 0xe4, 0x9f, 0x18, 0xc6, 0xf9, 0xd9, 0x4a, 0x83, 0xe2, 0x3a, - 0x82, 0x68, 0xee, 0xba, 0x27, 0xd0, 0x2f, 0xe9, 0x60, 0x24, 0x45, 0x2f, - 0xc1, 0x9d, 0x05, 0xe3, 0xb6, 0x8b, 0x94, 0x36, 0xfa, 0x6c, 0xf5, 0x39, - 0xe7, 0x9c, 0xa3, 0x15, 0x62, 0x61, 0x14, 0x4f, 0x99, 0xbf, 0x28, 0xaf, - 0x4f, 0x3e, 0xf9, 0xa4, 0x25, 0xcf, 0xee, 0x36, 0xb8, 0x93, 0xeb, 0x3e, - 0x81, 0x3e, 0xdd, 0xa2, 0xb8, 0xa4, 0x19, 0xc7, 0xb3, 0xbb, 0xdc, 0x38, - 0xda, 0x35, 0x4d, 0x61, 0x8a, 0xa3, 0xb8, 0x50, 0x18, 0x1f, 0xf8, 0x73, - 0xb6, 0x27, 0x7e, 0xe0, 0xbe, 0xfb, 0xee, 0xab, 0xa9, 0xf8, 0xe0, 0xf3, - 0xbd, 0x3b, 0x8c, 0x05, 0x9d, 0xc6, 0xf4, 0xff, 0x6c, 0x85, 0xb9, 0x1d, - 0x32, 0x63, 0xba, 0x64, 0x0d, 0x71, 0x8d, 0x8b, 0xf9, 0xf5, 0xd7, 0x5f, - 0x2f, 0x70, 0xc7, 0x71, 0xdf, 0x13, 0xff, 0x1b, 0xea, 0x74, 0xb0, 0x89, - 0x6c, 0xae, 0xe5, 0xc8, 0x3f, 0x38, 0x61, 0xc2, 0x84, 0xe3, 0xdc, 0x79, - 0x9a, 0x7b, 0xf8, 0x20, 0x03, 0x8c, 0x5f, 0x5e, 0xb9, 0x72, 0x65, 0x09, - 0xc3, 0x91, 0x31, 0x7c, 0x14, 0xf5, 0x5f, 0x6a, 0xe2, 0xba, 0xaf, 0x32, - 0x3a, 0xe1, 0xfd, 0x56, 0xa1, 0xba, 0x24, 0xba, 0xc3, 0x22, 0xdd, 0x93, - 0x46, 0x4a, 0xb2, 0xe6, 0x81, 0x78, 0x8c, 0x8b, 0xf9, 0x8a, 0xc7, 0xbc, - 0x53, 0xcb, 0xb4, 0xc7, 0x5c, 0x0d, 0x9e, 0xb4, 0x59, 0x8b, 0xc0, 0xc9, - 0xb3, 0x66, 0xcd, 0x7a, 0x4c, 0x71, 0xe1, 0xff, 0xa7, 0x78, 0x36, 0xe3, - 0xc1, 0x44, 0xd7, 0x35, 0x86, 0xb0, 0x17, 0x15, 0xe7, 0xe7, 0x9f, 0x7f, - 0x7e, 0x8a, 0xf9, 0x6c, 0x23, 0xbc, 0xa1, 0xdd, 0xb6, 0xd2, 0xf8, 0x4f, - 0x75, 0x98, 0xad, 0x31, 0x48, 0xbc, 0x9a, 0xc8, 0xf2, 0xe9, 0x24, 0x2f, - 0x5c, 0xb5, 0x6a, 0x55, 0x0f, 0x65, 0xe8, 0x76, 0xc8, 0x7e, 0x61, 0xa7, - 0xb0, 0xf1, 0xf8, 0x57, 0xfe, 0xfc, 0xf3, 0xcf, 0x2f, 0x57, 0x59, 0xc8, - 0x79, 0x19, 0x8f, 0x66, 0xce, 0x71, 0x27, 0x89, 0x25, 0xec, 0x07, 0xc5, - 0x61, 0x9e, 0x94, 0x5c, 0x49, 0xa6, 0x3e, 0x8b, 0xf4, 0x5c, 0x9a, 0x13, - 0x26, 0xc4, 0xf5, 0xd6, 0x39, 0x51, 0xb8, 0x79, 0xd3, 0x31, 0x0f, 0x1e, - 0x43, 0x5c, 0x37, 0x8f, 0xc7, 0x2f, 0x5f, 0xbe, 0x7c, 0x34, 0xfd, 0x59, - 0x88, 0x8e, 0x71, 0x90, 0xbb, 0x32, 0x11, 0xee, 0x83, 0xca, 0xc3, 0x9b, - 0x2f, 0xc9, 0x4d, 0x1f, 0x45, 0x48, 0x16, 0x08, 0xa0, 0x63, 0x1c, 0xa1, - 0x74, 0xf0, 0x87, 0xc6, 0x8e, 0x5f, 0xfb, 0x23, 0xa6, 0x8d, 0x22, 0x40, - 0xfc, 0x71, 0xe1, 0x93, 0x4f, 0x3e, 0xe9, 0xc8, 0x46, 0xda, 0x22, 0x3d, - 0x60, 0x77, 0x5d, 0xf2, 0x07, 0x1f, 0x7c, 0xf0, 0x85, 0xea, 0xfc, 0xda, - 0x6b, 0xaf, 0x0d, 0x26, 0xb3, 0x62, 0xf2, 0x64, 0x77, 0x33, 0x2f, 0x23, - 0x7d, 0x82, 0xca, 0x54, 0xd9, 0x1f, 0x7e, 0xf8, 0xe1, 0x97, 0xc4, 0x95, - 0xb1, 0xb8, 0x5b, 0x8e, 0x05, 0xad, 0xfd, 0x91, 0x8d, 0xd9, 0xf0, 0x4b, - 0xde, 0xbf, 0xfe, 0xf5, 0xaf, 0x6d, 0xc7, 0x1c, 0x73, 0xcc, 0x7a, 0x16, - 0xb8, 0xd6, 0x9e, 0x79, 0xe6, 0x99, 0x5f, 0x90, 0x71, 0xb5, 0x0a, 0x64, - 0x9e, 0xfc, 0xfe, 0xfb, 0xef, 0x7f, 0xac, 0x3a, 0xbe, 0xfe, 0xfa, 0xeb, - 0x2f, 0x90, 0xde, 0xab, 0xab, 0x95, 0x95, 0x65, 0xd5, 0x9f, 0x7e, 0xfa, - 0x69, 0x39, 0x3c, 0x9e, 0x4f, 0x1d, 0x3a, 0x10, 0xd9, 0xcd, 0x97, 0x91, - 0xd2, 0x56, 0x19, 0x3b, 0x76, 0xec, 0x2c, 0x74, 0xc3, 0x82, 0xbb, 0xef, - 0xbe, 0xfb, 0x14, 0x22, 0x79, 0xf9, 0xa8, 0x16, 0xb2, 0x39, 0x87, 0x39, - 0x2d, 0x93, 0xb0, 0x9a, 0x91, 0x32, 0x71, 0xf9, 0x27, 0xb1, 0x80, 0x78, - 0x19, 0x0b, 0x30, 0xf3, 0x0e, 0x3c, 0xf0, 0xc0, 0x35, 0x2c, 0x32, 0x30, - 0xed, 0xe5, 0x6b, 0x01, 0xa6, 0x8e, 0x2b, 0x8e, 0xbd, 0xfd, 0x1b, 0x10, - 0x60, 0x21, 0xf2, 0x48, 0xe4, 0xea, 0x1d, 0x14, 0x15, 0x0d, 0x1f, 0xfc, - 0x0d, 0x35, 0xfa, 0x9f, 0x28, 0x42, 0xba, 0xf1, 0x0d, 0xcc, 0x05, 0x5a, - 0xb0, 0x2f, 0x02, 0x63, 0x2d, 0x92, 0x7b, 0xe7, 0x0a, 0xd3, 0xd0, 0xea, - 0x73, 0xe6, 0xcc, 0x59, 0xcf, 0x42, 0x72, 0x2a, 0x1e, 0x91, 0xe4, 0x41, - 0x3c, 0x79, 0xfc, 0xae, 0xbc, 0x94, 0xa7, 0xf2, 0x26, 0xee, 0x3e, 0xd5, - 0x5f, 0x6e, 0xa5, 0xcd, 0x34, 0x7c, 0x77, 0xae, 0x5a, 0xd1, 0x78, 0x50, - 0x20, 0x5c, 0x7f, 0xfd, 0xf5, 0x52, 0x0a, 0x34, 0x49, 0x68, 0x32, 0x94, - 0x0b, 0xb2, 0xfa, 0xdf, 0x9f, 0xd5, 0xcf, 0xeb, 0x46, 0x8f, 0x1e, 0x9d, - 0x81, 0xd0, 0xdd, 0xc9, 0xca, 0x7b, 0xe0, 0x89, 0x27, 0x9e, 0xa8, 0x7e, - 0xe2, 0x89, 0x27, 0xde, 0x8f, 0xf2, 0xb0, 0x89, 0x9d, 0xe4, 0x97, 0x88, - 0xe7, 0xde, 0xc1, 0x0d, 0xa2, 0xc0, 0x5c, 0xcd, 0x6e, 0xc4, 0x4b, 0x5c, - 0x83, 0xac, 0x80, 0x04, 0x50, 0xf2, 0xda, 0x10, 0x47, 0x9d, 0x56, 0x6c, - 0x25, 0x04, 0xe5, 0xac, 0x09, 0xab, 0x94, 0x6f, 0x22, 0xb4, 0x62, 0x1f, - 0x7e, 0xf8, 0xe1, 0xcd, 0xd3, 0xa6, 0x4d, 0xcb, 0x39, 0xec, 0xb0, 0xc3, - 0x92, 0xfb, 0xf7, 0xef, 0x5f, 0xf5, 0x90, 0x43, 0x0e, 0xb9, 0xfc, 0xea, - 0xab, 0xaf, 0x5e, 0x88, 0xa2, 0xf4, 0x74, 0x28, 0xff, 0x58, 0xf2, 0xe9, - 0xd1, 0xb3, 0x67, 0xcf, 0x53, 0x5f, 0x78, 0xe1, 0x85, 0x1d, 0x28, 0xbb, - 0x59, 0x18, 0x3d, 0xf9, 0xdd, 0xbb, 0x77, 0xaf, 0x84, 0xe2, 0x54, 0xb5, - 0x43, 0x87, 0x0e, 0x17, 0x1f, 0x7b, 0xec, 0xb1, 0xcb, 0x89, 0x3b, 0x30, - 0x14, 0x9f, 0x4b, 0x71, 0x07, 0x73, 0x1c, 0xcd, 0x2e, 0xc4, 0x9d, 0x28, - 0xac, 0x05, 0x94, 0x5b, 0x89, 0xd0, 0xca, 0x90, 0xfb, 0xc8, 0x55, 0x12, - 0x0a, 0x79, 0xa7, 0xfd, 0xf7, 0xdf, 0x3f, 0x40, 0xd9, 0xdb, 0x98, 0x6c, - 0xc2, 0xed, 0xa2, 0xdd, 0x59, 0x84, 0xe9, 0x59, 0x02, 0x3b, 0xbc, 0xc2, - 0xfd, 0xc6, 0x1b, 0x6f, 0xc4, 0x1f, 0x7e, 0xf8, 0xe1, 0xe3, 0x58, 0x35, - 0xea, 0xca, 0x44, 0x97, 0xf6, 0xea, 0xab, 0xaf, 0xa6, 0x53, 0x4e, 0x2e, - 0x2b, 0x48, 0x39, 0xac, 0x98, 0x6e, 0x26, 0xae, 0x69, 0x77, 0xe2, 0x9d, - 0x77, 0xde, 0xb9, 0x13, 0x2c, 0x37, 0xa2, 0x6c, 0x78, 0xfb, 0x30, 0xd8, - 0xad, 0x5b, 0xb7, 0xe4, 0x7e, 0xfd, 0xfa, 0x55, 0x02, 0x67, 0x29, 0x86, - 0x9a, 0x88, 0xb4, 0xb2, 0x14, 0xc3, 0x4e, 0xcb, 0x70, 0x76, 0xc0, 0xbb, - 0xbc, 0xf2, 0xca, 0x2b, 0x69, 0x2f, 0xbf, 0xfc, 0x72, 0x3a, 0xab, 0xd2, - 0x81, 0x9b, 0x6e, 0xba, 0xa9, 0xea, 0x8d, 0x37, 0xde, 0xd8, 0x91, 0x1d, - 0xc9, 0x61, 0xc4, 0xd1, 0x24, 0x62, 0x70, 0x8d, 0xe5, 0x18, 0xd8, 0x28, - 0x26, 0x84, 0xc3, 0x1f, 0x78, 0xe0, 0x81, 0x6d, 0xc3, 0x87, 0x0f, 0xcf, - 0x60, 0x62, 0x88, 0x19, 0x3c, 0x78, 0x70, 0x0d, 0x76, 0xd2, 0x9f, 0xd8, - 0xb0, 0x61, 0x43, 0x1a, 0xab, 0xc1, 0x43, 0x88, 0x1f, 0x6e, 0x17, 0xf7, - 0xff, 0x5f, 0x5c, 0x6c, 0xfb, 0xf6, 0xed, 0x13, 0x30, 0xea, 0xea, 0x8f, - 0x1b, 0x37, 0x6e, 0x27, 0xca, 0x44, 0x0e, 0x0a, 0x6e, 0xfe, 0x01, 0x07, - 0x1c, 0x10, 0x77, 0xf2, 0xc9, 0x27, 0x27, 0xdd, 0x72, 0xcb, 0x2d, 0xad, - 0xd8, 0x2d, 0x1d, 0xfb, 0xf6, 0xdb, 0x6f, 0xb7, 0xb8, 0xf2, 0xca, 0x2b, - 0xcd, 0xee, 0x8f, 0x76, 0x03, 0x9e, 0xc6, 0xff, 0x8e, 0xa1, 0x43, 0x87, - 0xae, 0xa1, 0x7f, 0x53, 0xd9, 0xe5, 0x28, 0x38, 0xea, 0xa8, 0xa3, 0x62, - 0x1f, 0x7f, 0xfc, 0xf1, 0x76, 0x8d, 0x1b, 0x37, 0x9e, 0x09, 0x4f, 0xf4, - 0x60, 0xb7, 0x57, 0x0a, 0xbb, 0xdb, 0xc5, 0x63, 0x44, 0x5d, 0x2f, 0xfe, - 0xa1, 0xbf, 0xb4, 0xb8, 0x25, 0x21, 0x33, 0x05, 0x32, 0xe3, 0x4a, 0x71, - 0x93, 0x31, 0x3e, 0x0e, 0x60, 0x97, 0x27, 0xc0, 0xb8, 0xdb, 0x8e, 0x22, - 0x9f, 0xcb, 0x4a, 0x61, 0x10, 0xfe, 0x8c, 0x61, 0x0c, 0x24, 0x5c, 0x75, - 0xd5, 0x55, 0xad, 0xe9, 0xdf, 0x11, 0x28, 0xb7, 0x9b, 0x9b, 0x37, 0x6f, - 0x2e, 0x05, 0xdc, 0x71, 0x8b, 0x17, 0x2f, 0xae, 0x43, 0x9d, 0xa7, 0x32, - 0x66, 0x5b, 0xb1, 0xf8, 0x93, 0x33, 0x64, 0xc8, 0x90, 0x0c, 0x0c, 0x85, - 0x5c, 0xea, 0x10, 0xc7, 0x58, 0x48, 0xea, 0xd4, 0xa9, 0x53, 0xe0, 0xc2, - 0x0b, 0x2f, 0x14, 0x7f, 0x56, 0x73, 0xe7, 0x8f, 0xd1, 0x92, 0xc7, 0x4e, - 0x49, 0xfc, 0x11, 0x47, 0x1c, 0x11, 0xcb, 0x0e, 0x50, 0x6f, 0x76, 0xd7, - 0xe6, 0xa1, 0x68, 0x5c, 0xcb, 0xf8, 0x7c, 0x8f, 0xb8, 0x86, 0x1f, 0xaa, - 0xa0, 0xcc, 0x54, 0x97, 0x70, 0xa4, 0xfc, 0xad, 0x7f, 0x95, 0xf8, 0x9f, - 0x5f, 0x8d, 0x01, 0xe4, 0x81, 0xf8, 0x52, 0xfc, 0x9b, 0x0b, 0x25, 0x81, - 0x47, 0x4b, 0x64, 0x40, 0xe0, 0xa1, 0x87, 0x1e, 0x4a, 0xa3, 0xae, 0xf2, - 0x0b, 0x3b, 0xda, 0x9e, 0xc7, 0x84, 0xa8, 0xdd, 0x4c, 0xc3, 0xcf, 0x3a, - 0x25, 0x73, 0x3c, 0xbb, 0x76, 0xa3, 0xf1, 0x4b, 0x78, 0xfa, 0xe9, 0xa7, - 0x77, 0xd2, 0x1f, 0xd9, 0x2c, 0xf4, 0x05, 0xa8, 0x57, 0x02, 0xf5, 0x8e, - 0x47, 0xa1, 0x93, 0x30, 0x56, 0xfe, 0x61, 0x7c, 0x50, 0xd8, 0x1b, 0xf1, - 0x2c, 0xc1, 0x6f, 0xf8, 0x3c, 0x46, 0x7e, 0xec, 0x0c, 0x07, 0xd4, 0x46, - 0xc5, 0x85, 0x84, 0x6d, 0x32, 0x79, 0xcf, 0xa4, 0x9e, 0xf1, 0xb4, 0xaf, - 0x12, 0x75, 0x6b, 0x82, 0x90, 0x2f, 0x62, 0xd7, 0x24, 0x15, 0xa5, 0x3d, - 0x03, 0xc5, 0x48, 0x3b, 0xec, 0x49, 0xa1, 0xb8, 0x5c, 0x7c, 0x5d, 0xec, - 0x94, 0x29, 0x53, 0x9a, 0x33, 0xa6, 0x03, 0xf3, 0xe7, 0xcf, 0x6f, 0x4d, - 0x8c, 0x70, 0xdd, 0xb9, 0xaf, 0x8a, 0xe2, 0x96, 0xc4, 0xa4, 0xa1, 0xfa, - 0x55, 0x81, 0xb6, 0x41, 0x81, 0xc9, 0x93, 0x27, 0x37, 0x00, 0xc7, 0xd1, - 0xf8, 0xc7, 0x33, 0x8e, 0x17, 0x33, 0xfe, 0xd3, 0xf1, 0x16, 0xa6, 0x95, - 0xe0, 0x8f, 0x26, 0xd4, 0x25, 0x80, 0xac, 0xd3, 0x09, 0x09, 0xc9, 0x27, - 0x83, 0x35, 0xb7, 0xc5, 0x5c, 0x15, 0x70, 0xa8, 0x8a, 0xe1, 0xa9, 0xf0, - 0x23, 0x21, 0xc9, 0xa7, 0xb4, 0x50, 0x8c, 0xca, 0xf4, 0x77, 0x27, 0xf2, - 0x2f, 0xc2, 0x28, 0xae, 0x8a, 0x9f, 0xca, 0xce, 0x37, 0xfd, 0xab, 0xd3, - 0x13, 0xb3, 0x67, 0xcf, 0x3e, 0xf9, 0xd0, 0x43, 0x0f, 0x95, 0xa2, 0x2d, - 0x17, 0x44, 0x96, 0x3a, 0x86, 0x2d, 0x32, 0xb2, 0x19, 0xcf, 0xc2, 0x67, - 0xd7, 0x88, 0x11, 0x23, 0x2a, 0x53, 0xcf, 0x19, 0xc8, 0x93, 0x06, 0x28, - 0xbe, 0x19, 0xff, 0xfe, 0xf7, 0xbf, 0x33, 0x54, 0xde, 0x25, 0x97, 0x5c, - 0x92, 0x7c, 0xed, 0xb5, 0xd7, 0x1e, 0x06, 0x3f, 0x4f, 0x7b, 0xe9, 0xa5, - 0x97, 0xda, 0x31, 0x16, 0x24, 0x13, 0xe3, 0xa6, 0x4e, 0x9d, 0xda, 0x92, - 0x1d, 0xd9, 0x00, 0x86, 0x5f, 0x36, 0xfc, 0x9f, 0x26, 0xd9, 0xdf, 0xa8, - 0x51, 0xa3, 0xb8, 0xb3, 0xcf, 0x3e, 0x3b, 0x99, 0x76, 0x9e, 0x88, 0x1c, - 0xeb, 0x34, 0x7e, 0xfc, 0xf8, 0xf6, 0xbd, 0x7a, 0xf5, 0xd2, 0xbc, 0x11, - 0x28, 0x67, 0xfe, 0xb1, 0x28, 0xcf, 0x4d, 0x7a, 0xf4, 0xe8, 0x21, 0xfc, - 0xf2, 0x9e, 0x79, 0xe6, 0x99, 0xed, 0xc8, 0xae, 0x80, 0xf8, 0xf8, 0xb2, - 0xcb, 0x2e, 0xab, 0xd4, 0xae, 0x5d, 0xbb, 0x9b, 0xe8, 0xcb, 0x96, 0x64, - 0x7b, 0x12, 0xe4, 0xc8, 0xdb, 0xaf, 0xbf, 0xfe, 0xba, 0x3e, 0x6d, 0x1d, - 0xc3, 0x30, 0xa9, 0xf1, 0xdc, 0x73, 0xcf, 0xa5, 0xfd, 0xf8, 0xe3, 0x8f, - 0xb9, 0xf0, 0x63, 0x01, 0x7d, 0x95, 0x20, 0x22, 0x6d, 0x65, 0x8c, 0x02, - 0xc9, 0x67, 0x19, 0xcb, 0x55, 0xc8, 0x67, 0x25, 0x63, 0x50, 0x78, 0x39, - 0xee, 0xcd, 0x37, 0xdf, 0xac, 0x0d, 0x3f, 0x68, 0xbc, 0x85, 0x79, 0x9b, - 0x36, 0xed, 0x20, 0x50, 0xf3, 0x40, 0x21, 0xbc, 0xd9, 0x10, 0x79, 0xab, - 0xfa, 0x48, 0xf1, 0x16, 0xdf, 0x9a, 0xbe, 0x0a, 0xe3, 0x89, 0x0c, 0x6d, - 0x80, 0x7f, 0x75, 0xe5, 0x81, 0xd1, 0x1d, 0x60, 0xa8, 0x5c, 0xcc, 0xb3, - 0xe6, 0x1c, 0x29, 0xec, 0x6e, 0x97, 0x0c, 0xff, 0x9f, 0x0f, 0x46, 0x81, - 0xeb, 0xae, 0xbb, 0x2e, 0x9b, 0x79, 0x22, 0xb1, 0x6d, 0xdb, 0xb6, 0x2d, - 0x88, 0xa0, 0xb2, 0x54, 0xa6, 0x9f, 0xab, 0x04, 0x7f, 0xb5, 0x44, 0x2e, - 0x89, 0x97, 0xab, 0x9d, 0x7e, 0xfa, 0xe9, 0x2b, 0xc0, 0xa8, 0x0b, 0x73, - 0xe9, 0x9b, 0xe0, 0xdd, 0x8e, 0xdd, 0x5b, 0xe7, 0xe4, 0x05, 0x73, 0x6f, - 0x22, 0x72, 0xe2, 0x2d, 0xf8, 0xa5, 0x88, 0xdd, 0xfc, 0x65, 0xc4, 0x4d, - 0xc0, 0x00, 0x59, 0x4b, 0x78, 0x46, 0xd7, 0xae, 0x5d, 0xbb, 0x33, 0x4f, - 0x76, 0xef, 0xd2, 0xa5, 0x4b, 0x58, 0x66, 0xa8, 0x20, 0x16, 0xf4, 0x7a, - 0x92, 0x4f, 0xb7, 0xef, 0xbf, 0xff, 0x7e, 0x17, 0x63, 0x6c, 0x3d, 0x5e, - 0x95, 0x99, 0x43, 0x36, 0x31, 0x57, 0x68, 0x11, 0xc7, 0xbb, 0xb8, 0x10, - 0x3c, 0xe3, 0x8c, 0x33, 0x2a, 0x93, 0x67, 0xd2, 0x17, 0x5f, 0x7c, 0x21, - 0x3c, 0xc5, 0x8b, 0x3b, 0x21, 0xe3, 0xaa, 0x82, 0x63, 0x2c, 0xbc, 0x55, - 0x70, 0xc1, 0x05, 0x17, 0xa8, 0xef, 0x8b, 0xc8, 0x67, 0x17, 0xb2, 0x52, - 0xe3, 0x53, 0x79, 0x99, 0x71, 0x9a, 0x70, 0xf3, 0xcd, 0x37, 0x6f, 0xa2, - 0xdf, 0x82, 0xf0, 0xdc, 0x83, 0xf8, 0x0b, 0x2b, 0x13, 0xc6, 0x6d, 0x09, - 0x17, 0xc3, 0xbc, 0x5b, 0x40, 0xdb, 0x16, 0x91, 0xbf, 0xfa, 0x2d, 0x08, - 0x9f, 0xd6, 0x43, 0xfe, 0xa9, 0x0e, 0x7a, 0x76, 0xcf, 0xd5, 0xee, 0xc4, - 0x71, 0xcc, 0xab, 0x8f, 0xb2, 0x40, 0x96, 0xd7, 0xa4, 0x49, 0x93, 0x5e, - 0xd3, 0xa7, 0x4f, 0xef, 0x0a, 0x3f, 0x4c, 0x74, 0x47, 0xd8, 0xcd, 0x7b, - 0xc9, 0xb5, 0xb1, 0xe8, 0x19, 0xcd, 0x18, 0x3f, 0x77, 0x30, 0x97, 0xde, - 0xcb, 0xb3, 0x64, 0x58, 0x31, 0x79, 0x57, 0xce, 0x32, 0x82, 0xc8, 0x23, - 0xc9, 0x91, 0x00, 0x3c, 0xaa, 0xeb, 0xdf, 0xa9, 0x84, 0x06, 0x43, 0x65, - 0xea, 0x14, 0xde, 0x9e, 0x28, 0x5b, 0xa7, 0x6f, 0x7a, 0x33, 0x96, 0x12, - 0xbf, 0xfa, 0xea, 0xab, 0x34, 0xe6, 0x46, 0xe9, 0x6c, 0x5a, 0x30, 0x14, - 0xdf, 0x88, 0x3f, 0xb4, 0xd3, 0x5c, 0x6e, 0x67, 0xf0, 0x31, 0xd7, 0xf2, - 0x66, 0x80, 0x3e, 0x38, 0x16, 0x99, 0xd2, 0x91, 0x31, 0xa5, 0xb1, 0x1c, - 0x8d, 0x2b, 0x62, 0x6c, 0x8d, 0x45, 0x97, 0x2b, 0x64, 0xfe, 0x5e, 0xe3, - 0x93, 0x20, 0xc8, 0x78, 0x8e, 0x61, 0xbc, 0x48, 0x1e, 0x45, 0xd3, 0x5f, - 0x39, 0xe0, 0xf2, 0x09, 0x73, 0xef, 0x14, 0xa8, 0x09, 0x98, 0x8f, 0x21, - 0xad, 0x30, 0x89, 0x26, 0xad, 0x4f, 0xf1, 0xd6, 0xab, 0x82, 0x08, 0xc4, - 0x33, 0x4f, 0xdc, 0x81, 0xce, 0x7f, 0x10, 0xe9, 0xa5, 0xff, 0x56, 0x88, - 0x1f, 0x2b, 0x58, 0xf6, 0xff, 0x6c, 0x32, 0xec, 0xb6, 0x9e, 0xcc, 0xc7, - 0xaf, 0x32, 0x6f, 0xe6, 0x60, 0x1b, 0x6e, 0x60, 0xde, 0x5a, 0x45, 0x63, - 0xa5, 0x6b, 0xb8, 0xf5, 0x5c, 0xd3, 0x7e, 0x8d, 0x9d, 0x58, 0xc6, 0x83, - 0x9e, 0x23, 0xf1, 0x7f, 0x25, 0x4e, 0x9b, 0xae, 0x44, 0xde, 0xd7, 0x46, - 0x86, 0xd4, 0x46, 0xaf, 0x7c, 0x85, 0x32, 0x96, 0xa0, 0xb7, 0x16, 0x9b, - 0xcb, 0x4c, 0x86, 0xff, 0xf3, 0xd7, 0xa7, 0x9e, 0x7a, 0xaa, 0x21, 0xc2, - 0x2b, 0x97, 0x89, 0x5d, 0x0c, 0x7b, 0x0c, 0xe4, 0x4c, 0x18, 0xa1, 0x86, - 0x57, 0xc2, 0xc0, 0xfe, 0x93, 0xdd, 0x90, 0x7c, 0x0c, 0x94, 0x77, 0xf1, - 0xeb, 0x0a, 0x75, 0xe7, 0xe8, 0xd2, 0x28, 0x94, 0x94, 0x7c, 0x76, 0xc0, - 0xd6, 0xf2, 0x2c, 0x65, 0xd7, 0x38, 0x19, 0xe6, 0xce, 0x8e, 0x02, 0xca, - 0xe8, 0x2e, 0x76, 0x90, 0x9c, 0x15, 0x15, 0x0c, 0x9e, 0x51, 0x44, 0x50, - 0xa7, 0xb9, 0x9d, 0x26, 0xf1, 0x94, 0x83, 0x0f, 0x3e, 0x78, 0x1a, 0x8a, - 0xe7, 0x77, 0xdc, 0x5f, 0x04, 0x1d, 0x0a, 0x5d, 0x80, 0xf1, 0x30, 0x0b, - 0x21, 0x56, 0x44, 0x67, 0x2f, 0xe2, 0xd9, 0xa4, 0x93, 0x91, 0xdb, 0x07, - 0xe5, 0x69, 0x3a, 0xd7, 0xc7, 0xa1, 0xde, 0xd0, 0xc1, 0xd0, 0x25, 0xa7, - 0x9d, 0x76, 0x9a, 0xb3, 0x13, 0x84, 0xb2, 0xba, 0x8c, 0x67, 0x13, 0x9f, - 0xdb, 0xff, 0x38, 0x0c, 0x81, 0xca, 0x18, 0x1e, 0x2b, 0x50, 0xbc, 0x32, - 0x50, 0x50, 0xb2, 0x50, 0xd6, 0xf3, 0x09, 0xf5, 0xae, 0x60, 0x56, 0x45, - 0xb1, 0x59, 0x8d, 0x31, 0x25, 0xe1, 0x7b, 0x2b, 0x74, 0x99, 0x8b, 0x2e, - 0xe0, 0xbe, 0x31, 0xe4, 0x56, 0x64, 0x82, 0x18, 0x4b, 0x57, 0xa9, 0xae, - 0x18, 0xc0, 0x9a, 0x00, 0xde, 0x80, 0xfa, 0x40, 0xcd, 0x20, 0x29, 0x96, - 0x0d, 0x20, 0x13, 0x5f, 0xf5, 0x3f, 0x1c, 0x52, 0x3b, 0x2f, 0xf5, 0xd0, - 0x55, 0xec, 0x48, 0x6e, 0x44, 0xf9, 0x2e, 0x64, 0x61, 0xe0, 0x0e, 0xc2, - 0x4c, 0x1b, 0xaa, 0x52, 0x97, 0x6c, 0x29, 0xa0, 0x4c, 0x18, 0xcf, 0xe2, - 0x7f, 0x24, 0x74, 0x14, 0xf7, 0xcf, 0xc9, 0x4f, 0x61, 0x3c, 0x87, 0x57, - 0xa1, 0x50, 0x4a, 0x9c, 0x23, 0x84, 0xb4, 0x51, 0x7d, 0x79, 0x1f, 0x24, - 0x3c, 0xbb, 0x83, 0xef, 0x28, 0x29, 0x4e, 0xd0, 0x26, 0x8c, 0x37, 0x4d, - 0x0e, 0xff, 0xb8, 0xa3, 0xaf, 0x6a, 0x50, 0xff, 0xfe, 0x28, 0x98, 0xb7, - 0x51, 0x99, 0x48, 0x83, 0xb5, 0xb4, 0x7a, 0x06, 0xb5, 0x12, 0x4a, 0x1e, - 0x0f, 0xb2, 0xe3, 0x17, 0xc6, 0xa0, 0x94, 0x04, 0x2a, 0x43, 0x3b, 0x83, - 0xef, 0x41, 0x83, 0xa0, 0xd3, 0xa0, 0x2e, 0xd0, 0xa9, 0xd0, 0xe0, 0x4f, - 0x3f, 0xfd, 0x34, 0x4b, 0xfd, 0x88, 0xe1, 0x7e, 0x3a, 0xcf, 0x4e, 0x7d, - 0xa8, 0xe3, 0xf9, 0x08, 0x93, 0x42, 0x94, 0xeb, 0x54, 0xfc, 0x9e, 0x84, - 0x4e, 0x86, 0x84, 0xe9, 0x45, 0x28, 0x69, 0xe3, 0xe8, 0xfb, 0x5d, 0x18, - 0xd5, 0xe3, 0x79, 0x76, 0x8f, 0x99, 0x00, 0x61, 0x55, 0xc1, 0x3a, 0x0d, - 0x23, 0x2f, 0x6f, 0xc6, 0x8c, 0x19, 0xf9, 0xf0, 0x9a, 0x14, 0x5b, 0x19, - 0x54, 0x6e, 0x57, 0x1d, 0xc5, 0x3b, 0x55, 0x65, 0x62, 0xdc, 0x3c, 0x41, - 0xc0, 0x59, 0x21, 0xea, 0xc7, 0xf5, 0xf9, 0x77, 0xde, 0x79, 0x27, 0x5d, - 0x61, 0x18, 0x7a, 0x9f, 0xf0, 0x2c, 0xde, 0x91, 0x8b, 0x61, 0x2c, 0x0e, - 0x93, 0xbf, 0x16, 0xa7, 0xe0, 0x83, 0x09, 0xf8, 0xdd, 0x00, 0xf5, 0x84, - 0xce, 0x87, 0x06, 0x43, 0x23, 0xa0, 0x46, 0x50, 0x0d, 0x57, 0xfe, 0xaa, - 0xbb, 0xf8, 0xf7, 0x2e, 0x68, 0x04, 0x0a, 0xc8, 0x66, 0x56, 0x28, 0x75, - 0xcc, 0x3d, 0x43, 0x3b, 0x1e, 0xf8, 0x19, 0x57, 0x5b, 0x82, 0x96, 0x71, - 0x22, 0x09, 0x7a, 0x2d, 0x74, 0xa1, 0x87, 0xce, 0xe1, 0x39, 0x05, 0x92, - 0xb2, 0x2c, 0x57, 0x95, 0xb1, 0xe4, 0x9c, 0x44, 0x38, 0xeb, 0xac, 0xb3, - 0xde, 0xe2, 0xf9, 0x62, 0xc8, 0x9d, 0xe6, 0x3c, 0x9e, 0x3b, 0x43, 0x06, - 0x9f, 0x04, 0xe4, 0xc3, 0x32, 0xd5, 0x1f, 0x03, 0x6f, 0x13, 0xfe, 0x8f, - 0x41, 0xc2, 0x54, 0xf5, 0xbf, 0x19, 0x1a, 0x0a, 0x69, 0xcc, 0x08, 0xff, - 0x30, 0x3e, 0x2c, 0x6a, 0x9d, 0xc1, 0xb3, 0x29, 0x93, 0xdb, 0x40, 0xac, - 0xfc, 0x94, 0x8f, 0xda, 0xa8, 0xb8, 0xf2, 0xc4, 0x29, 0x5d, 0x0d, 0xa8, - 0x3e, 0x74, 0x18, 0x65, 0x49, 0x46, 0x69, 0x9c, 0xab, 0x9f, 0xe5, 0xa7, - 0x78, 0x8a, 0x53, 0x9a, 0x8b, 0x47, 0x26, 0xde, 0xaf, 0xbc, 0x51, 0x34, - 0x67, 0x12, 0xd1, 0xdd, 0x6f, 0x75, 0x84, 0x1b, 0x7d, 0x9e, 0x83, 0x7f, - 0x6d, 0x65, 0xc2, 0xe2, 0x61, 0x02, 0x3b, 0x92, 0xbf, 0x88, 0x4f, 0x90, - 0x43, 0xcb, 0xf1, 0x3a, 0x0a, 0x32, 0xfd, 0x55, 0x9d, 0xfe, 0x77, 0x76, - 0xdb, 0x30, 0x3a, 0x24, 0x3b, 0x8d, 0x2c, 0xe0, 0xb6, 0x84, 0xab, 0x4d, - 0x5d, 0x73, 0x31, 0xaa, 0x73, 0x55, 0x36, 0x46, 0xf2, 0x81, 0x26, 0x06, - 0x3b, 0x6c, 0xce, 0xae, 0x20, 0x6d, 0xcd, 0x55, 0x1c, 0xfc, 0x55, 0xb6, - 0x83, 0x0f, 0xbb, 0x38, 0x85, 0x28, 0x7e, 0xaa, 0xd3, 0x1c, 0xfc, 0xcc, - 0xee, 0x5b, 0x90, 0x05, 0xa4, 0xe6, 0xca, 0x07, 0xb9, 0xbe, 0x0a, 0x7f, - 0x8d, 0x8f, 0xe0, 0xc2, 0x85, 0x0b, 0xef, 0x90, 0xdf, 0x67, 0x9f, 0x7d, - 0x96, 0xcd, 0xf3, 0x9b, 0x90, 0x78, 0xff, 0x44, 0x28, 0xcc, 0x6f, 0xc4, - 0x51, 0xbf, 0x0b, 0xa3, 0x04, 0x0c, 0xe6, 0x81, 0x8a, 0xcf, 0x22, 0xdf, - 0x22, 0x9e, 0xcf, 0x87, 0xfa, 0x42, 0xea, 0xa7, 0xcf, 0x58, 0xa8, 0x72, - 0xc6, 0x0b, 0xf1, 0xd5, 0x87, 0x6a, 0x57, 0x79, 0xf3, 0x8f, 0x63, 0x01, - 0xf1, 0x32, 0xe5, 0x8f, 0xf1, 0xb6, 0x81, 0xf4, 0xe2, 0x1b, 0x95, 0x71, - 0x57, 0xfd, 0xfa, 0xf5, 0x27, 0xc3, 0x9b, 0x85, 0x0a, 0xc3, 0xf8, 0x57, - 0xdf, 0xc9, 0xc5, 0xd0, 0xfe, 0x6b, 0xe4, 0x37, 0x6a, 0xd4, 0xa8, 0x0c, - 0x9e, 0x9f, 0x82, 0x54, 0x9f, 0x5e, 0xd0, 0x8d, 0xd0, 0x6b, 0x90, 0xda, - 0x54, 0x13, 0x92, 0x4b, 0x84, 0x34, 0xa6, 0x94, 0xaf, 0xe8, 0x1a, 0xc6, - 0x61, 0x41, 0x88, 0x1f, 0xae, 0x09, 0xf9, 0x69, 0x4c, 0x88, 0xb7, 0x14, - 0xb7, 0xe6, 0xef, 0xbf, 0xff, 0xbe, 0x43, 0xf9, 0x1f, 0x77, 0xdc, 0x71, - 0x2d, 0x79, 0x76, 0xf3, 0x49, 0x18, 0x4f, 0xc5, 0x21, 0x4c, 0xf8, 0x1f, - 0xcc, 0xe2, 0x45, 0xb6, 0xe2, 0x8f, 0x1c, 0x39, 0xf2, 0x10, 0x9e, 0x8b, - 0x39, 0x16, 0x34, 0x0e, 0x53, 0x98, 0xe2, 0x10, 0x70, 0x0c, 0xf2, 0x65, - 0x95, 0x9e, 0x59, 0xf8, 0x6b, 0x5a, 0x2c, 0x62, 0xf1, 0x87, 0x5a, 0xb4, - 0xbb, 0x00, 0x3c, 0xd6, 0xe0, 0x5d, 0x07, 0x3a, 0x92, 0x79, 0x65, 0xab, - 0xd2, 0x21, 0x8b, 0xee, 0xe5, 0x59, 0x75, 0x0a, 0x32, 0x2f, 0xde, 0x2d, - 0xbf, 0xfb, 0xef, 0xbf, 0x5f, 0x46, 0x76, 0x07, 0x48, 0x63, 0xa3, 0x36, - 0x06, 0xfc, 0xf7, 0x28, 0x40, 0x45, 0x8c, 0xe1, 0x5f, 0x79, 0x36, 0x3c, - 0xc8, 0xad, 0x73, 0xca, 0x62, 0x36, 0x46, 0x4e, 0x11, 0x7c, 0xf1, 0x15, - 0xcf, 0xb5, 0x20, 0xb5, 0xb9, 0x0f, 0xa4, 0x31, 0x5b, 0x6c, 0x3e, 0xa2, - 0xfd, 0xf7, 0x21, 0x97, 0xf3, 0x58, 0x9c, 0xca, 0x43, 0xf9, 0x7a, 0x94, - 0xf0, 0xca, 0x90, 0xdb, 0xe9, 0x34, 0x57, 0x21, 0xe1, 0xea, 0x87, 0x13, - 0xa0, 0xa3, 0x21, 0xcd, 0x6d, 0x0e, 0x9f, 0x71, 0x35, 0x4e, 0xe3, 0xbe, - 0x2b, 0x18, 0x60, 0xeb, 0x64, 0x65, 0x33, 0x56, 0xea, 0x9b, 0x80, 0x08, - 0x57, 0xb5, 0x4f, 0x79, 0x28, 0x2f, 0xe5, 0x79, 0x82, 0xca, 0xc0, 0xa8, - 0xd1, 0x7c, 0x5c, 0x17, 0xf2, 0x75, 0xf0, 0x73, 0x3b, 0xc6, 0x5f, 0x01, - 0xfa, 0xc6, 0x4a, 0xcd, 0x7d, 0xe8, 0x26, 0xde, 0xf6, 0xfb, 0xa6, 0x2b, - 0xa7, 0xa7, 0xea, 0xa6, 0x3a, 0x88, 0xdf, 0x9f, 0x85, 0xaa, 0x42, 0xbb, - 0xe3, 0x2a, 0xbd, 0xf7, 0xde, 0x7b, 0x32, 0xd6, 0x8a, 0x5e, 0x7c, 0xf1, - 0x45, 0xe5, 0xa7, 0xfe, 0xf8, 0xbb, 0x5c, 0x22, 0x65, 0x3e, 0xa7, 0xb2, - 0xe1, 0xdd, 0xaf, 0x29, 0x74, 0x77, 0x75, 0x82, 0x04, 0xe4, 0x81, 0x73, - 0x4a, 0x84, 0x8d, 0x9b, 0xc9, 0xe4, 0x27, 0x9c, 0xc4, 0x7f, 0x92, 0x47, - 0x46, 0xf6, 0x73, 0x5b, 0x2e, 0x97, 0xcc, 0x62, 0x9f, 0x73, 0x2a, 0x8b, - 0x8d, 0x89, 0x57, 0x48, 0x59, 0x5e, 0x7c, 0x0c, 0x2f, 0xed, 0x47, 0x5a, - 0xf7, 0xdc, 0x51, 0x5a, 0x25, 0x94, 0x46, 0xf2, 0xbe, 0x1e, 0xe4, 0x1e, - 0x3f, 0x26, 0x8d, 0x64, 0x74, 0x1e, 0x8b, 0x40, 0x59, 0x78, 0x68, 0x0c, - 0x45, 0xeb, 0x94, 0x6f, 0x1d, 0x64, 0xe5, 0x2e, 0x78, 0xb9, 0x88, 0xfb, - 0x88, 0xbc, 0x1c, 0x6d, 0x86, 0x36, 0x5e, 0xb9, 0x10, 0xa8, 0xc2, 0x86, - 0xdc, 0x16, 0xe9, 0xd8, 0xa4, 0x32, 0xba, 0x42, 0xb9, 0x32, 0xb0, 0x91, - 0x4b, 0x20, 0x10, 0x8f, 0xac, 0x7d, 0x4b, 0x32, 0xe4, 0x8e, 0x3b, 0xee, - 0x58, 0x4d, 0xe8, 0x95, 0x50, 0x27, 0x28, 0xd2, 0x78, 0xaf, 0xc1, 0xae, - 0xf9, 0x26, 0xec, 0x2b, 0xcd, 0x59, 0x91, 0xfa, 0x40, 0x69, 0x95, 0xc7, - 0x55, 0x9c, 0x5c, 0x71, 0x4e, 0x5d, 0x33, 0xe7, 0xff, 0x9b, 0x67, 0xbf, - 0xb1, 0x88, 0xf7, 0x7f, 0x9f, 0x2b, 0x4d, 0xc1, 0x2b, 0x6f, 0x6d, 0x63, - 0x30, 0x84, 0x6f, 0x60, 0x45, 0x29, 0x9e, 0x89, 0xe2, 0x37, 0x12, 0xff, - 0x01, 0x49, 0x99, 0x75, 0x1c, 0xe0, 0x1f, 0xcb, 0x2a, 0x76, 0x1d, 0xae, - 0xdb, 0x30, 0x82, 0x06, 0xe0, 0x39, 0x0d, 0x9a, 0x82, 0x82, 0xda, 0x1f, - 0xa5, 0x6f, 0x3b, 0xbb, 0xb2, 0x8d, 0x30, 0xc2, 0x0f, 0x73, 0x22, 0xff, - 0xf5, 0x93, 0x74, 0xcd, 0x35, 0xd7, 0x04, 0x50, 0x2c, 0xb7, 0xb1, 0xa2, - 0x3f, 0xb6, 0x75, 0xeb, 0xd6, 0x5f, 0xba, 0xc2, 0xbc, 0xb7, 0x9a, 0x70, - 0xd7, 0xa1, 0xec, 0x5c, 0xc5, 0x44, 0x7f, 0x09, 0xf7, 0x32, 0x42, 0xe6, - 0x41, 0xa3, 0xe9, 0x90, 0xc7, 0x50, 0x24, 0xb8, 0x75, 0x14, 0x6a, 0x09, - 0x78, 0xb9, 0x3c, 0xe8, 0x47, 0x14, 0x61, 0x29, 0x5c, 0x8f, 0x43, 0x93, - 0xa0, 0x05, 0xd0, 0xe7, 0xec, 0x1a, 0x3d, 0x09, 0x8f, 0x04, 0x50, 0x6c, - 0xa4, 0x34, 0xf9, 0x09, 0xf1, 0xe0, 0xc5, 0x17, 0x5f, 0xfc, 0x14, 0x0b, - 0x0c, 0x07, 0xb0, 0x2b, 0x3f, 0x1b, 0x03, 0x3f, 0x93, 0xdd, 0x17, 0x09, - 0x49, 0xaf, 0x8b, 0x61, 0xb7, 0xb2, 0x32, 0xca, 0xae, 0x0a, 0x57, 0x7d, - 0x3e, 0x70, 0xd1, 0x67, 0xdc, 0xaf, 0x87, 0x54, 0x6f, 0xe3, 0x12, 0x58, - 0xa8, 0xb8, 0x8f, 0x3a, 0x15, 0xf2, 0x5e, 0xf1, 0x1b, 0x78, 0x3e, 0x04, - 0x4d, 0x84, 0x56, 0x42, 0x52, 0xd4, 0x25, 0x0c, 0x4c, 0x7c, 0xd5, 0x7f, - 0x16, 0xa4, 0x7c, 0x3f, 0x74, 0xd1, 0x47, 0x28, 0x17, 0x2b, 0xd8, 0xd5, - 0xad, 0x87, 0xc1, 0xb5, 0x03, 0x65, 0x7b, 0x34, 0x61, 0x52, 0xfe, 0xe5, - 0x12, 0x98, 0x0c, 0xb4, 0xb2, 0x5e, 0x80, 0x72, 0xa3, 0x09, 0x4a, 0x4a, - 0xc7, 0x0c, 0x8c, 0xed, 0x57, 0x69, 0x6f, 0x21, 0x4a, 0x88, 0xe2, 0x18, - 0xc6, 0x8d, 0x23, 0x6e, 0x6f, 0x79, 0x60, 0x10, 0xa8, 0xec, 0x61, 0x90, - 0xf0, 0x9c, 0x02, 0xbe, 0x0f, 0x6a, 0xb1, 0x84, 0x76, 0xef, 0x47, 0x3d, - 0xbb, 0xe2, 0x57, 0xc2, 0x4d, 0x9b, 0x36, 0x2d, 0x99, 0x72, 0xe6, 0x42, - 0x73, 0xd8, 0x95, 0x4c, 0x2a, 0x11, 0xc1, 0xe3, 0x81, 0xa2, 0x15, 0x43, - 0xdc, 0x69, 0xd0, 0x22, 0x76, 0x07, 0x8d, 0x42, 0xec, 0x89, 0x55, 0xf2, - 0x91, 0xf6, 0xd5, 0x62, 0x11, 0xe2, 0x31, 0x76, 0x38, 0x56, 0xc1, 0x77, - 0x0f, 0x61, 0x78, 0xb4, 0x24, 0x96, 0x5f, 0x9f, 0x95, 0x4c, 0x5c, 0xdc, - 0x27, 0x91, 0xb4, 0xad, 0xc9, 0x63, 0x40, 0xb3, 0x66, 0xcd, 0x56, 0x93, - 0xe7, 0xa3, 0x65, 0xd4, 0x43, 0xfd, 0xbd, 0x15, 0xba, 0x11, 0x7a, 0x02, - 0xfa, 0x16, 0x12, 0xcf, 0x7f, 0x07, 0x3d, 0x87, 0x42, 0xbb, 0x90, 0xab, - 0x76, 0x98, 0xf6, 0xe7, 0xa2, 0xc9, 0x3c, 0x91, 0x55, 0xf7, 0x87, 0x31, - 0x5e, 0xd3, 0x38, 0x56, 0x37, 0x88, 0xe7, 0xa7, 0xd9, 0x29, 0xda, 0xce, - 0x6e, 0x73, 0x07, 0x8e, 0x35, 0xae, 0x81, 0xf7, 0xef, 0xc5, 0x78, 0x59, - 0xcc, 0x49, 0x84, 0x1e, 0x18, 0xa8, 0xc5, 0x94, 0x73, 0xfa, 0xf3, 0x38, - 0xb0, 0xd6, 0x42, 0xcf, 0x7a, 0x70, 0xdd, 0xc8, 0x0e, 0x60, 0x35, 0x76, - 0xf9, 0x8e, 0x22, 0x0f, 0x5f, 0xc7, 0x8e, 0x9a, 0xf8, 0x62, 0x2c, 0x34, - 0x06, 0x1a, 0x05, 0x3d, 0x89, 0x61, 0x3f, 0x81, 0xab, 0xde, 0x63, 0x6e, - 0xc1, 0xc5, 0x19, 0x03, 0x13, 0x27, 0x4e, 0x3c, 0x18, 0xc3, 0xe5, 0x12, - 0xc6, 0x5f, 0x11, 0xbb, 0x9b, 0x9f, 0xc2, 0x13, 0x57, 0x11, 0x36, 0x14, - 0x92, 0x42, 0xf4, 0x39, 0xf4, 0x08, 0x74, 0x13, 0x24, 0xc6, 0x50, 0x7b, - 0x1d, 0x47, 0xfe, 0x33, 0xb9, 0xf9, 0x02, 0x92, 0x01, 0x73, 0x3b, 0x47, - 0xf7, 0x6e, 0xe4, 0x14, 0xc6, 0x36, 0xf8, 0xa8, 0x12, 0xbb, 0xca, 0x52, - 0x0c, 0xfd, 0x64, 0x8a, 0x94, 0xf8, 0x4f, 0x3d, 0xa4, 0xf1, 0x2c, 0x41, - 0x5c, 0x00, 0x15, 0x73, 0x8c, 0x75, 0x61, 0xa9, 0x3a, 0xb8, 0xd3, 0xa8, - 0xcc, 0x39, 0x90, 0x33, 0x98, 0x39, 0x7a, 0x7a, 0x1e, 0xf2, 0xa4, 0x39, - 0xb2, 0x23, 0x07, 0x63, 0xe5, 0x4e, 0xfc, 0x9f, 0x86, 0xbe, 0x87, 0x54, - 0xff, 0x7f, 0x43, 0xb7, 0x42, 0x32, 0xda, 0xc3, 0x75, 0xe7, 0xbe, 0x3c, - 0x4e, 0xe9, 0x76, 0x40, 0x1a, 0x77, 0x2b, 0x95, 0x30, 0x34, 0xce, 0x57, - 0x71, 0x2b, 0xbf, 0x9d, 0x50, 0x45, 0xf3, 0x26, 0x69, 0x09, 0x17, 0x64, - 0xf7, 0xf1, 0x15, 0x76, 0x24, 0x75, 0x52, 0x65, 0x2b, 0xa7, 0x5e, 0xee, - 0x25, 0xc6, 0x6c, 0x48, 0x63, 0xbd, 0x42, 0x0e, 0xc5, 0x4f, 0xf5, 0x0f, - 0xb0, 0x5a, 0xdc, 0x9d, 0x8b, 0xfa, 0x25, 0x16, 0xcc, 0x7a, 0x49, 0x1e, - 0xc2, 0xdf, 0xdb, 0x14, 0x66, 0x9c, 0xda, 0xc6, 0x8e, 0x64, 0x21, 0xa7, - 0x75, 0x76, 0xb0, 0xca, 0xdc, 0x81, 0xe3, 0xf8, 0x5d, 0x4d, 0x98, 0xcf, - 0x35, 0x91, 0x7a, 0x8a, 0xf7, 0x03, 0xec, 0x46, 0xfe, 0xc0, 0xe5, 0x61, - 0x48, 0xbc, 0x3f, 0x1e, 0x7a, 0x92, 0xb1, 0xa4, 0xfe, 0x0e, 0x20, 0xff, - 0xee, 0xe0, 0xe2, 0xf0, 0x9b, 0x9e, 0xe5, 0x30, 0xd0, 0x54, 0x27, 0xc5, - 0x95, 0x6c, 0x52, 0x3f, 0xdd, 0xcc, 0x22, 0xd6, 0x4f, 0x5c, 0xf5, 0x5e, - 0x77, 0x0f, 0x2e, 0x1a, 0xbf, 0x15, 0xce, 0x9f, 0x71, 0x96, 0x49, 0x7a, - 0xe5, 0x2f, 0xfe, 0x19, 0x82, 0x22, 0x75, 0x0b, 0x06, 0xaa, 0x14, 0xe0, - 0x00, 0xf3, 0x4e, 0x37, 0x2e, 0x1a, 0x8f, 0x71, 0x60, 0xd3, 0x9e, 0x6b, - 0x80, 0x45, 0x97, 0x85, 0x5c, 0x9e, 0x83, 0x54, 0x9f, 0x1f, 0xa1, 0x77, - 0x20, 0x61, 0x7f, 0x17, 0xe4, 0xe0, 0xc7, 0x35, 0x17, 0xd2, 0x78, 0x32, - 0xfc, 0xa8, 0x1d, 0xf7, 0xa2, 0x10, 0x3f, 0x18, 0xff, 0xcf, 0x08, 0xff, - 0x06, 0xca, 0x81, 0xca, 0xe3, 0x24, 0xd3, 0xd7, 0xb1, 0x70, 0xb0, 0x54, - 0x89, 0xe0, 0xfd, 0x8b, 0xb9, 0xa8, 0x8e, 0xc6, 0xc5, 0x72, 0x0a, 0xe1, - 0x52, 0x3d, 0x80, 0x93, 0xe2, 0xac, 0x61, 0x31, 0x75, 0x9d, 0x9e, 0x31, - 0x7c, 0xb5, 0xe8, 0x12, 0xd4, 0xbd, 0xd7, 0x3d, 0xf8, 0xe0, 0x83, 0x75, - 0x19, 0x93, 0x7a, 0x1f, 0x78, 0x33, 0x61, 0xaa, 0xff, 0x7c, 0x76, 0x10, - 0x5e, 0xa3, 0xdd, 0xf9, 0x8c, 0xfb, 0xfe, 0x8c, 0x99, 0x46, 0x22, 0x64, - 0xce, 0xc3, 0x18, 0xad, 0xb9, 0x9c, 0x1e, 0xd0, 0xd8, 0x5d, 0x06, 0x69, - 0x3c, 0xa6, 0x31, 0xae, 0x9e, 0x24, 0x3c, 0x83, 0xf0, 0xce, 0xc8, 0x9e, - 0x5e, 0xf8, 0x39, 0x8e, 0xf9, 0xf1, 0x24, 0x4e, 0xe8, 0x1c, 0x32, 0x72, - 0xe4, 0xc8, 0x5d, 0xc8, 0xa3, 0xc1, 0x78, 0xa6, 0x41, 0x6a, 0xf3, 0x44, - 0xe8, 0x63, 0x28, 0x3c, 0x1f, 0x21, 0xd7, 0x3e, 0x23, 0x8f, 0x73, 0xa8, - 0x47, 0x2c, 0xa7, 0x29, 0x66, 0x62, 0xa4, 0xbf, 0x45, 0xb8, 0xfa, 0xa7, - 0x84, 0x63, 0xb7, 0x5c, 0xe5, 0xce, 0x82, 0xa6, 0x43, 0x92, 0x31, 0xbb, - 0x20, 0xf7, 0xf8, 0xca, 0xe7, 0x79, 0x3e, 0x46, 0xd6, 0x3c, 0xfa, 0x38, - 0xf1, 0xbc, 0xf3, 0xce, 0xbb, 0x96, 0x67, 0x3f, 0x59, 0x83, 0xb7, 0xe3, - 0x94, 0x56, 0x79, 0x28, 0x2f, 0xe5, 0x39, 0x2b, 0x54, 0x06, 0xb7, 0x11, - 0x5d, 0x2c, 0x0b, 0xfc, 0xf7, 0x33, 0xaf, 0xe4, 0x51, 0xef, 0x27, 0x99, - 0xdf, 0x66, 0x80, 0x55, 0x67, 0x16, 0x35, 0xfb, 0x44, 0x4c, 0x51, 0xb1, - 0x00, 0xd5, 0x6d, 0x0b, 0xf4, 0x38, 0x34, 0x00, 0x4a, 0x87, 0x4a, 0x38, - 0x74, 0x87, 0x56, 0x2c, 0x1a, 0x3f, 0xc1, 0x9c, 0x3b, 0x85, 0xf5, 0x82, - 0xd5, 0xcc, 0x8f, 0x4b, 0xb8, 0x1f, 0xc7, 0x38, 0xd1, 0xc2, 0x93, 0x6f, - 0xbf, 0x23, 0xc7, 0x73, 0xe1, 0xf9, 0x8b, 0xd1, 0x5f, 0xbe, 0x23, 0xcd, - 0x4a, 0xae, 0x63, 0xd1, 0x29, 0xfa, 0x96, 0xc8, 0xfc, 0x3f, 0x1e, 0x41, - 0xe6, 0x80, 0x7e, 0x6c, 0xaa, 0x7c, 0x41, 0xfe, 0x7f, 0xa8, 0x0c, 0xdd, - 0x33, 0x56, 0x1e, 0x65, 0x1e, 0x6b, 0xfa, 0x9f, 0x68, 0x7f, 0xdd, 0x31, - 0x87, 0x9c, 0xa5, 0x3c, 0x43, 0x79, 0x7f, 0xb7, 0x61, 0xc3, 0x86, 0x0b, - 0x79, 0x8e, 0x28, 0xa3, 0x08, 0x3f, 0x80, 0x3a, 0xbd, 0x4d, 0xbd, 0x7f, - 0x43, 0xee, 0x2c, 0x27, 0xee, 0x68, 0xea, 0x7f, 0xa2, 0x4f, 0xbe, 0xc7, - 0xd1, 0xd6, 0x57, 0x28, 0xf7, 0x63, 0x4e, 0x34, 0xaa, 0x7d, 0x81, 0x2b, - 0xae, 0xb8, 0xa2, 0x35, 0x7e, 0x1f, 0x93, 0xf6, 0x5b, 0x68, 0x2c, 0x78, - 0x34, 0xf7, 0xa6, 0xa3, 0x6d, 0xe7, 0x10, 0x36, 0x41, 0xf5, 0xa1, 0xee, - 0x0b, 0xb9, 0x9f, 0xa8, 0xe7, 0x10, 0x8d, 0x27, 0x7e, 0x31, 0x9c, 0x88, - 0x57, 0xc8, 0x18, 0x50, 0x1b, 0xbe, 0x0c, 0xa5, 0x99, 0x45, 0x19, 0xcf, - 0xf8, 0x2d, 0xca, 0x93, 0x77, 0x4f, 0x93, 0x0f, 0xd7, 0xcf, 0xa1, 0x51, - 0x9c, 0xa0, 0x8a, 0xb4, 0xf8, 0xe0, 0xbc, 0xb2, 0x16, 0x8a, 0xaf, 0xf2, - 0xc7, 0x43, 0x5f, 0x42, 0xef, 0x93, 0xcf, 0xb1, 0xde, 0x7a, 0x97, 0xf2, - 0x1c, 0x24, 0xfe, 0x79, 0xca, 0x07, 0x2c, 0xc4, 0x1f, 0xc5, 0xea, 0xcf, - 0xb3, 0x78, 0xa7, 0xc4, 0x9c, 0xe9, 0xce, 0x8f, 0x7e, 0xab, 0xa3, 0xf4, - 0x5c, 0xdb, 0xd2, 0xb6, 0x27, 0x85, 0x0b, 0x57, 0x8d, 0xef, 0x18, 0xfa, - 0xfa, 0x32, 0x9e, 0xe7, 0x11, 0xfe, 0x13, 0xfa, 0x47, 0x5b, 0x93, 0x2e, - 0x84, 0xe3, 0x78, 0xe4, 0x7e, 0x35, 0xee, 0xfb, 0x46, 0x83, 0x8f, 0xd2, - 0xb2, 0x48, 0x79, 0x24, 0xfd, 0xfb, 0x01, 0x79, 0x2e, 0x10, 0x71, 0x3f, - 0x12, 0x1e, 0xe9, 0x60, 0xf2, 0x0d, 0x5d, 0xf5, 0xca, 0xe9, 0x05, 0x94, - 0x39, 0x5e, 0xaf, 0xd1, 0x71, 0x2f, 0x9e, 0x31, 0x3c, 0x54, 0x2a, 0x7f, - 0xba, 0xf8, 0x6d, 0x05, 0x69, 0xbe, 0x11, 0x36, 0xca, 0x43, 0x79, 0x29, - 0x4f, 0xf2, 0x0f, 0xe3, 0x43, 0xd8, 0xd9, 0x6a, 0x37, 0x7d, 0x54, 0x15, - 0x19, 0xd9, 0x8c, 0x36, 0xbf, 0x42, 0x9d, 0x66, 0x87, 0xea, 0x35, 0x0a, - 0xfe, 0x69, 0xed, 0xa9, 0x97, 0xe6, 0x9c, 0x13, 0xc8, 0x77, 0x34, 0x71, - 0x16, 0xc3, 0x9f, 0x2b, 0xe0, 0xfd, 0xcf, 0xc1, 0xfd, 0x41, 0xca, 0x3d, - 0xce, 0x1d, 0x97, 0xe7, 0xae, 0xc2, 0x12, 0xdd, 0xf0, 0x73, 0xe4, 0x5f, - 0xed, 0x94, 0x94, 0x94, 0x5a, 0xc8, 0xb3, 0xd1, 0x2a, 0xcf, 0x10, 0xba, - 0x6e, 0x9c, 0x49, 0x13, 0xc2, 0x73, 0x02, 0x57, 0xcd, 0x69, 0xc5, 0x9c, - 0xfc, 0x94, 0x86, 0xeb, 0xb9, 0x04, 0x04, 0x39, 0x25, 0x58, 0x9d, 0xe7, - 0x71, 0xe4, 0xff, 0xb2, 0x9e, 0x8b, 0x45, 0xfe, 0xeb, 0x41, 0xdf, 0x2f, - 0x78, 0x9d, 0x7a, 0x7e, 0xa7, 0xfe, 0xe1, 0xfa, 0x35, 0x65, 0xdf, 0x6d, - 0xe2, 0x82, 0x47, 0xbc, 0xc2, 0xc8, 0xc3, 0xc1, 0x37, 0x94, 0x5e, 0xfc, - 0x78, 0x8b, 0xe2, 0xb2, 0xd0, 0x18, 0x4b, 0xfc, 0x3b, 0x54, 0xa6, 0xf0, - 0xf4, 0xe6, 0x2f, 0x3f, 0x85, 0x29, 0x8e, 0xf2, 0xd4, 0x58, 0x50, 0x7e, - 0xd4, 0xe7, 0x55, 0x53, 0x86, 0x27, 0x4d, 0xb8, 0x3e, 0xe8, 0xaf, 0x55, - 0x42, 0x61, 0x41, 0xb0, 0xd3, 0x58, 0x0d, 0xe3, 0xe1, 0xbd, 0x77, 0xe3, - 0xe3, 0xc9, 0x2f, 0x0e, 0x3e, 0x72, 0x64, 0x0d, 0x27, 0x66, 0x34, 0x87, - 0x7e, 0x02, 0xcd, 0x81, 0x24, 0xf3, 0x2b, 0xea, 0x94, 0x56, 0x79, 0x7c, - 0xc2, 0x3c, 0x2d, 0x7d, 0x20, 0x00, 0xbf, 0x37, 0xe1, 0x12, 0xaf, 0xfb, - 0x7d, 0xc1, 0x95, 0x36, 0xb9, 0x95, 0xab, 0xfe, 0x28, 0x74, 0x49, 0x4c, - 0x64, 0xd7, 0xa2, 0xf4, 0xe5, 0x33, 0x81, 0x8a, 0xc9, 0x32, 0x5c, 0x19, - 0xc4, 0x01, 0x8c, 0xc3, 0xec, 0xac, 0xda, 0xcf, 0xc7, 0x5f, 0x0a, 0x83, - 0x04, 0xba, 0x68, 0x13, 0xab, 0xf7, 0x32, 0x8c, 0x03, 0x30, 0x53, 0x37, - 0x2e, 0x86, 0xc1, 0xf3, 0x30, 0x30, 0x3f, 0xbd, 0xf5, 0xd6, 0x5b, 0x25, - 0x5c, 0xee, 0xe1, 0x58, 0xb7, 0x94, 0x80, 0xd2, 0x9c, 0x14, 0x90, 0x45, - 0x90, 0xf2, 0x96, 0xb2, 0x20, 0x01, 0x96, 0xc9, 0x4e, 0x7b, 0x91, 0x8e, - 0x50, 0xc2, 0xc0, 0xaa, 0x8f, 0xbb, 0xbd, 0xd9, 0x3c, 0xaf, 0x87, 0x34, - 0x31, 0xaa, 0x1e, 0x85, 0x50, 0x26, 0x65, 0x36, 0xa5, 0x33, 0x03, 0x18, - 0xf5, 0xc5, 0x94, 0x57, 0xc2, 0x1c, 0xc7, 0x8a, 0x59, 0x77, 0xea, 0x72, - 0x03, 0xab, 0xc5, 0x5b, 0x50, 0x60, 0x9e, 0x43, 0x51, 0xf0, 0x1b, 0x4c, - 0x8a, 0x2b, 0xe3, 0x3c, 0x19, 0xc6, 0x57, 0x39, 0x52, 0x0e, 0x55, 0x27, - 0x37, 0xa9, 0xbc, 0xb0, 0xe3, 0xdd, 0xbd, 0xb6, 0xe0, 0xd7, 0x1c, 0x05, - 0x6c, 0x27, 0x82, 0xe5, 0x6d, 0x02, 0x34, 0x79, 0xab, 0x5e, 0x12, 0xc6, - 0x8a, 0xab, 0xab, 0xdb, 0x89, 0xf9, 0xdc, 0xf9, 0xe9, 0x3e, 0x9f, 0x23, - 0xf9, 0x1a, 0x60, 0x3a, 0x16, 0xfa, 0x15, 0x97, 0x4d, 0x90, 0x29, 0xa7, - 0x88, 0xc1, 0xb1, 0x95, 0xa3, 0xa4, 0xf1, 0x1c, 0x61, 0xee, 0x8a, 0xbf, - 0xf0, 0x29, 0xc0, 0xf8, 0x3e, 0x03, 0x61, 0x13, 0x87, 0x51, 0xe8, 0x8e, - 0x1b, 0x07, 0xe6, 0xce, 0x44, 0x88, 0x00, 0x91, 0xc2, 0x24, 0xec, 0x15, - 0x5f, 0xf5, 0xf9, 0x93, 0xa3, 0xcf, 0x32, 0x1a, 0xf4, 0xc1, 0x9d, 0x23, - 0xb9, 0x98, 0xfe, 0x92, 0x97, 0x5c, 0x90, 0x9d, 0xb7, 0xce, 0x60, 0xde, - 0x1e, 0xea, 0x40, 0xbf, 0x77, 0x94, 0x9f, 0x13, 0x12, 0xe1, 0x07, 0x05, - 0xb0, 0x15, 0x71, 0x8f, 0x84, 0x5a, 0x87, 0xea, 0x56, 0x6a, 0x7c, 0x94, - 0x8f, 0xfd, 0x10, 0x24, 0x4f, 0xc3, 0x73, 0xab, 0x31, 0xa8, 0xef, 0x62, - 0x67, 0x38, 0x87, 0xe3, 0x2b, 0x8b, 0x39, 0x3e, 0x3d, 0x85, 0x22, 0x84, - 0x93, 0x04, 0xd3, 0x8d, 0x08, 0x87, 0x19, 0xa5, 0x11, 0x71, 0xa4, 0xe0, - 0xa9, 0xac, 0x22, 0x14, 0x81, 0x9f, 0x30, 0x62, 0x16, 0xb3, 0xb3, 0x97, - 0x4b, 0x9e, 0xf7, 0xa2, 0x10, 0xaf, 0xa6, 0x8c, 0xa7, 0x34, 0xd1, 0x11, - 0xee, 0xe7, 0x84, 0xab, 0x0c, 0x34, 0xf1, 0x95, 0x78, 0x4f, 0xf8, 0xe4, - 0xa2, 0x90, 0xa6, 0x73, 0x9c, 0xa6, 0x36, 0x82, 0xad, 0x88, 0x13, 0x16, - 0x8b, 0xf1, 0x0b, 0xb2, 0xdb, 0x73, 0x34, 0x7d, 0xdb, 0x06, 0x85, 0x76, - 0x1a, 0xfd, 0x33, 0x86, 0xb0, 0xd7, 0xa9, 0xef, 0x54, 0x0c, 0x95, 0x97, - 0x78, 0x7f, 0x6c, 0x32, 0x6d, 0x1e, 0x33, 0x6c, 0xd8, 0xb0, 0x97, 0xc0, - 0xba, 0x90, 0x1d, 0xec, 0x73, 0x48, 0x63, 0x94, 0xf3, 0x78, 0x16, 0x6c, - 0xae, 0xe0, 0x39, 0x80, 0x31, 0x3d, 0x81, 0x85, 0xad, 0x89, 0xba, 0xc7, - 0x30, 0xba, 0x92, 0x8b, 0xaf, 0x90, 0x41, 0x11, 0x16, 0x5f, 0xa8, 0x3e, - 0x22, 0xf1, 0xde, 0x0e, 0x76, 0xeb, 0x1d, 0x03, 0x09, 0xa3, 0x69, 0x05, - 0xcf, 0x6a, 0x6f, 0x2c, 0xf1, 0xce, 0x43, 0x59, 0x8d, 0x79, 0xf7, 0xdd, - 0x77, 0xb7, 0xd3, 0xc6, 0x27, 0xf0, 0x5b, 0x03, 0x89, 0x4f, 0xd5, 0xc7, - 0xe2, 0x25, 0x8d, 0x0b, 0xf5, 0xbb, 0xe1, 0x1f, 0x6e, 0xb1, 0xb4, 0xfe, - 0x93, 0xbf, 0x94, 0xec, 0xad, 0xd0, 0xf7, 0x18, 0xe7, 0x43, 0x50, 0x74, - 0x02, 0xd4, 0x5d, 0x4a, 0xac, 0x9f, 0xf2, 0xa2, 0xba, 0x28, 0x4f, 0x37, - 0xc9, 0xaf, 0x58, 0xde, 0x3c, 0x3b, 0x0e, 0x23, 0xd1, 0x8f, 0xb7, 0x95, - 0x56, 0xfe, 0x72, 0x09, 0xf4, 0xdd, 0x79, 0xba, 0xe1, 0xa8, 0xec, 0x3c, - 0x2e, 0xdf, 0x41, 0x32, 0xa4, 0x54, 0x77, 0x91, 0xda, 0x51, 0xa2, 0xee, - 0xf8, 0x55, 0xd4, 0xb9, 0xc7, 0x9e, 0x6f, 0x9d, 0x2b, 0x9a, 0xb1, 0x49, - 0xc7, 0x29, 0x86, 0x6b, 0x38, 0x25, 0x71, 0x35, 0xc6, 0xee, 0x2e, 0xde, - 0x47, 0x7d, 0x12, 0xff, 0xef, 0x21, 0xb5, 0xa3, 0xc2, 0x8e, 0x9d, 0xcf, - 0xed, 0x28, 0xa2, 0x3a, 0x29, 0xd3, 0x9d, 0x4c, 0x34, 0x4e, 0xe3, 0xe1, - 0xb9, 0xe3, 0xd8, 0x75, 0xc9, 0x45, 0x6e, 0x09, 0x9f, 0x62, 0x8e, 0xb0, - 0x20, 0xaf, 0x36, 0x8c, 0x44, 0x81, 0x2b, 0x84, 0xff, 0x07, 0x12, 0xe8, - 0xcb, 0x63, 0xf8, 0x27, 0xc1, 0x83, 0x4d, 0xe8, 0x83, 0x22, 0x76, 0x75, - 0x5f, 0xe5, 0x59, 0xb2, 0x4a, 0xfd, 0x29, 0xec, 0xb7, 0x22, 0x4b, 0xde, - 0x60, 0xdc, 0x17, 0x72, 0x04, 0xbf, 0x19, 0xcf, 0xc9, 0x50, 0xd8, 0x71, - 0x3c, 0x5b, 0xf8, 0x29, 0xae, 0x48, 0xed, 0xdb, 0xc2, 0x07, 0xe5, 0x24, - 0x63, 0x24, 0x4f, 0xc4, 0x3b, 0xaa, 0x67, 0x85, 0xf3, 0x0f, 0x19, 0xcc, - 0x86, 0x87, 0x35, 0x36, 0x57, 0x31, 0xd6, 0xc4, 0xcb, 0x01, 0x0c, 0x2e, - 0x95, 0xa9, 0xb1, 0x15, 0x83, 0x9c, 0xfd, 0x53, 0x7e, 0x1c, 0xcb, 0x4e, - 0xe1, 0xb8, 0xb4, 0xa9, 0x93, 0xe1, 0x1d, 0x19, 0x75, 0xc2, 0xc7, 0xf4, - 0xbb, 0xae, 0x4a, 0x6b, 0xf8, 0x57, 0xf7, 0xc6, 0x19, 0x3f, 0x5d, 0xdd, - 0xfe, 0x26, 0x3c, 0x9a, 0x6b, 0x16, 0x7c, 0xfc, 0x11, 0xfd, 0x15, 0x00, - 0xb3, 0x33, 0x49, 0xe0, 0x8c, 0xd7, 0x50, 0xc2, 0x44, 0xe4, 0xf3, 0xa9, - 0x0a, 0x23, 0xce, 0x07, 0xf8, 0x65, 0x60, 0x6f, 0x2f, 0x53, 0x18, 0x7d, - 0x78, 0x08, 0x97, 0x58, 0x16, 0x37, 0x25, 0xaf, 0xa5, 0x84, 0xce, 0x47, - 0xc6, 0x27, 0xe1, 0x17, 0x43, 0xff, 0xb5, 0x52, 0x1c, 0x30, 0xd5, 0xb8, - 0x96, 0x6c, 0x4a, 0x47, 0xbe, 0xbc, 0x7d, 0xef, 0xbd, 0xf7, 0x2e, 0x25, - 0x5d, 0x25, 0x8e, 0x6a, 0x3f, 0x0b, 0x3d, 0x87, 0xac, 0xab, 0xcc, 0xc9, - 0x91, 0xdf, 0x50, 0xc6, 0x46, 0x11, 0xc7, 0x18, 0xce, 0xc2, 0x61, 0x36, - 0xc6, 0xfc, 0x18, 0xf2, 0x2c, 0xe2, 0x04, 0xd6, 0xe3, 0x3c, 0x8b, 0x17, - 0x12, 0x90, 0xd5, 0x4f, 0x48, 0xb6, 0xc1, 0xa2, 0x32, 0xc4, 0x35, 0xf6, - 0xcc, 0x98, 0x34, 0x98, 0x1b, 0x3c, 0x72, 0x99, 0x27, 0x6e, 0x87, 0xa7, - 0x3b, 0xb2, 0x03, 0xba, 0x15, 0x19, 0xf8, 0x00, 0x71, 0x37, 0x40, 0x06, - 0x53, 0x6e, 0x4b, 0x38, 0xe5, 0x25, 0x52, 0x7d, 0xfd, 0xe2, 0xa5, 0x23, - 0x9f, 0x5f, 0x61, 0x7e, 0xc9, 0x47, 0xce, 0x5e, 0x2f, 0x9d, 0xa3, 0x44, - 0x0e, 0xc5, 0x3d, 0x94, 0x87, 0xf2, 0x32, 0xf9, 0x16, 0x0f, 0xf5, 0x3c, - 0xb1, 0x11, 0xd0, 0x80, 0x85, 0xde, 0xbe, 0xc8, 0xe2, 0xd5, 0xe0, 0xfd, - 0xcd, 0x97, 0x5f, 0x7e, 0xf9, 0x34, 0xf5, 0xd6, 0x02, 0xc5, 0x53, 0x44, - 0x75, 0xf7, 0x89, 0x27, 0x65, 0x85, 0x1e, 0x55, 0x37, 0xf1, 0xa7, 0x78, - 0xcd, 0xaf, 0xad, 0x71, 0xf0, 0xf2, 0x9b, 0xf4, 0xcf, 0x3d, 0x8c, 0xd7, - 0xd6, 0x2c, 0xd2, 0x26, 0xa2, 0x7b, 0xec, 0x87, 0xcc, 0xee, 0xa9, 0xd3, - 0x86, 0xf4, 0xeb, 0xed, 0xa4, 0x93, 0x2c, 0x2f, 0xe6, 0x38, 0x45, 0x74, - 0x22, 0x8b, 0xb9, 0x2f, 0x31, 0xaf, 0xb7, 0xfe, 0xe6, 0x9b, 0x6f, 0x92, - 0x51, 0xea, 0xbb, 0x31, 0x56, 0x3f, 0x22, 0xfe, 0xdd, 0x44, 0x2c, 0x16, - 0x5f, 0x46, 0x0e, 0xe1, 0x93, 0xd0, 0x53, 0xde, 0xc1, 0x30, 0x39, 0x91, - 0xfc, 0xeb, 0xe3, 0x57, 0x5b, 0xf7, 0xc8, 0xf9, 0xfb, 0xd8, 0x71, 0xaa, - 0x46, 0x9a, 0x98, 0x50, 0x01, 0x41, 0x14, 0xe8, 0xdb, 0xc8, 0xfb, 0x13, - 0xe5, 0xa9, 0xbc, 0x59, 0xb4, 0x69, 0x03, 0xbf, 0xbe, 0xca, 0x49, 0xa7, - 0x13, 0x8a, 0x55, 0x22, 0xf4, 0x80, 0x1e, 0xd3, 0x9b, 0x7e, 0x9a, 0x0b, - 0xbf, 0x5d, 0xc1, 0x89, 0xd2, 0x14, 0xb0, 0xac, 0x41, 0xfd, 0x4f, 0xa1, - 0xfe, 0x5f, 0xa3, 0x17, 0x0d, 0x20, 0x9a, 0xa9, 0x4f, 0x3c, 0x0b, 0xd7, - 0x9d, 0x29, 0xfb, 0x28, 0xf4, 0xae, 0x36, 0x7c, 0xfb, 0xc0, 0x99, 0x43, - 0xe8, 0xe7, 0x4a, 0xcc, 0x7b, 0x4d, 0x18, 0xab, 0x07, 0x70, 0x6d, 0xcc, - 0x29, 0xa4, 0x46, 0xa4, 0x31, 0x73, 0xa3, 0xbe, 0xf9, 0x73, 0x8f, 0xda, - 0xc6, 0xfc, 0xd5, 0xf1, 0xf9, 0xe7, 0x9f, 0xd7, 0xe9, 0xa4, 0xea, 0xf0, - 0xeb, 0xb1, 0xcc, 0x1f, 0x3d, 0x18, 0x07, 0xcd, 0x78, 0xf5, 0x44, 0xb2, - 0xa7, 0x2a, 0x14, 0x76, 0x9c, 0x2c, 0x3b, 0x1a, 0xbe, 0x19, 0xc1, 0x46, - 0x4e, 0x47, 0x5e, 0x83, 0x92, 0x91, 0xd7, 0x1e, 0xf9, 0x78, 0x27, 0xf3, - 0xf3, 0xb7, 0x44, 0x32, 0x6d, 0x55, 0xfc, 0xf8, 0xc7, 0x1e, 0x7b, 0xac, - 0x11, 0xf2, 0xad, 0x2e, 0x9b, 0x11, 0x29, 0x18, 0x6c, 0x47, 0x2b, 0x5f, - 0xca, 0xa9, 0x4f, 0x98, 0xa9, 0xb7, 0xe2, 0x19, 0x97, 0x40, 0x58, 0x23, - 0xf4, 0xb8, 0xba, 0xd4, 0x63, 0x7f, 0xea, 0xdb, 0x0c, 0x99, 0xde, 0x51, - 0x69, 0xa8, 0xff, 0x71, 0x44, 0x8a, 0x24, 0x4b, 0x4d, 0x7a, 0x5d, 0x83, - 0xb4, 0xe5, 0x62, 0xf0, 0x19, 0x89, 0x81, 0x74, 0x50, 0x9b, 0x36, 0x6d, - 0x24, 0xa3, 0xca, 0xe2, 0x71, 0x77, 0x7a, 0x27, 0x0f, 0x64, 0x78, 0x53, - 0x95, 0x0b, 0xff, 0x0c, 0x65, 0xac, 0x5e, 0x45, 0x3f, 0x34, 0xa1, 0x8d, - 0x77, 0x90, 0xf7, 0xf3, 0x6c, 0xc4, 0x0c, 0xe6, 0x15, 0x9a, 0xba, 0x84, - 0x1f, 0x43, 0xf8, 0x70, 0x12, 0x48, 0xde, 0x26, 0xe0, 0x77, 0x3c, 0x7e, - 0x3d, 0x79, 0x9d, 0xe7, 0x6d, 0xf8, 0xe1, 0xfd, 0x28, 0xf0, 0x11, 0x3f, - 0xdc, 0xca, 0x62, 0xef, 0x64, 0x8c, 0xb2, 0x53, 0x59, 0x5c, 0xac, 0x45, - 0x9b, 0x6b, 0x81, 0xe7, 0x19, 0xd4, 0x7f, 0x3a, 0x7d, 0x73, 0x29, 0xf9, - 0x1a, 0x9c, 0x12, 0x30, 0x2a, 0xfb, 0x28, 0x7f, 0x64, 0xc9, 0xbb, 0xf0, - 0xc3, 0x1b, 0x9c, 0xcc, 0x6c, 0x53, 0x06, 0x7f, 0x7a, 0xf9, 0xad, 0x12, - 0xfc, 0x71, 0x20, 0xaf, 0x9c, 0xbc, 0x43, 0x1e, 0x23, 0x94, 0x17, 0x79, - 0x8a, 0xef, 0xcc, 0xb8, 0x4c, 0x80, 0xbf, 0x7a, 0xe1, 0xdf, 0x83, 0x76, - 0x9e, 0x4a, 0x1d, 0x26, 0xc3, 0x0b, 0x97, 0xb1, 0xf0, 0xd8, 0x04, 0x79, - 0xd9, 0x0c, 0x7e, 0x3e, 0x97, 0x05, 0x42, 0xf1, 0x73, 0x98, 0x7f, 0xf0, - 0xbf, 0x82, 0x78, 0x63, 0xd1, 0xf3, 0x7a, 0xa2, 0x5b, 0xd5, 0x64, 0xa3, - 0xa1, 0x32, 0x32, 0xb2, 0xa7, 0x5e, 0x6b, 0x01, 0xb3, 0x9b, 0x88, 0x6b, - 0xfa, 0x2c, 0x9e, 0x9d, 0xda, 0x13, 0x59, 0x98, 0xec, 0x49, 0x19, 0xcd, - 0xf1, 0x0f, 0x30, 0x06, 0x62, 0xd0, 0xff, 0x1d, 0xde, 0x14, 0x7f, 0xc2, - 0x6f, 0x8d, 0x78, 0x3d, 0xa9, 0xba, 0xc2, 0x70, 0x06, 0x4f, 0xbf, 0xbe, - 0x8f, 0x17, 0x3f, 0xa8, 0x9e, 0xc2, 0x5c, 0x71, 0x99, 0x9f, 0xf4, 0x4a, - 0x5f, 0x5b, 0xc6, 0xfa, 0x8d, 0xd8, 0x1f, 0x2d, 0x9c, 0x1c, 0x5c, 0x3f, - 0xe0, 0xa4, 0xb0, 0x6b, 0x31, 0x84, 0xdb, 0xf2, 0xca, 0x5e, 0x5d, 0xf8, - 0xaa, 0x33, 0x8b, 0xca, 0xd7, 0x12, 0x45, 0xbc, 0xa1, 0x8f, 0x57, 0x76, - 0xa3, 0x7d, 0x4e, 0xff, 0x51, 0xaf, 0x9e, 0xf2, 0x53, 0x18, 0x7d, 0x70, - 0x1d, 0x63, 0xa8, 0xd3, 0xc7, 0x1f, 0x7f, 0x5c, 0xfb, 0xc8, 0x23, 0x8f, - 0xcc, 0x60, 0xbe, 0x3e, 0x9c, 0xb6, 0x0d, 0x63, 0x8c, 0x69, 0x5e, 0x76, - 0x9c, 0xee, 0xf1, 0x1b, 0xce, 0x9c, 0x7f, 0xb8, 0xe2, 0xe0, 0x99, 0xc4, - 0x47, 0xae, 0x93, 0x90, 0x05, 0xad, 0xe8, 0xa7, 0x1b, 0xe8, 0xd7, 0x83, - 0x43, 0x51, 0xc3, 0x17, 0x57, 0x7d, 0xda, 0xb0, 0x21, 0xa3, 0x31, 0xa6, - 0xf2, 0xaa, 0x30, 0x86, 0x0f, 0x10, 0x16, 0x1e, 0x4a, 0x21, 0xac, 0x1b, - 0xbc, 0xd6, 0x15, 0xfc, 0x6b, 0x84, 0x33, 0x29, 0x7e, 0x13, 0x83, 0xcc, - 0x71, 0xb0, 0x66, 0xbe, 0x90, 0xfd, 0x26, 0xbd, 0x40, 0x72, 0x7b, 0x77, - 0x9d, 0xf2, 0xc8, 0x44, 0x06, 0x6d, 0x52, 0x46, 0xa1, 0x32, 0x0c, 0x4f, - 0xee, 0x6e, 0xde, 0xfb, 0x4c, 0xfa, 0x20, 0xab, 0xcb, 0x17, 0x33, 0xf0, - 0x8b, 0x06, 0x0e, 0x1c, 0xb8, 0x92, 0x5a, 0x37, 0x80, 0xdc, 0x20, 0x24, - 0x32, 0xb9, 0x8c, 0x52, 0x38, 0x02, 0xf6, 0x4d, 0xc2, 0xd4, 0xa1, 0xc6, - 0x25, 0xe3, 0xe7, 0x1c, 0x69, 0x80, 0x31, 0xdf, 0xc5, 0x33, 0xd1, 0x04, - 0x70, 0x95, 0xe0, 0x90, 0xa0, 0x4e, 0x62, 0xe2, 0x7c, 0x46, 0xe9, 0x23, - 0x1c, 0x6b, 0x77, 0x25, 0x29, 0x76, 0x1b, 0xcf, 0x24, 0x35, 0x52, 0xe9, - 0x38, 0xb6, 0x27, 0xe1, 0x5b, 0x4c, 0x50, 0x2b, 0x26, 0x83, 0xb1, 0x26, - 0x03, 0xb1, 0x19, 0x2b, 0x68, 0x17, 0x23, 0x80, 0x3f, 0x45, 0x49, 0xc9, - 0xc2, 0xb0, 0xdd, 0x85, 0x42, 0x24, 0x85, 0xa4, 0xb2, 0xe2, 0x18, 0x47, - 0x1d, 0xaa, 0xc1, 0xe0, 0x6b, 0x18, 0x24, 0x59, 0x30, 0xf4, 0x40, 0xfc, - 0x9b, 0x32, 0xa8, 0x76, 0x30, 0x50, 0xa4, 0x98, 0x78, 0x8d, 0x38, 0xad, - 0xac, 0xe5, 0xb3, 0x72, 0x9c, 0x49, 0x19, 0x9f, 0x21, 0xb4, 0x26, 0x32, - 0x70, 0x3e, 0xc4, 0xef, 0x7e, 0x9f, 0x55, 0xda, 0x58, 0x14, 0x82, 0x7e, - 0xaa, 0x27, 0x13, 0xca, 0x2c, 0x26, 0xb2, 0x7e, 0xc4, 0x1f, 0x87, 0xc1, - 0xb3, 0x96, 0xeb, 0x14, 0xca, 0xbc, 0x9e, 0xfc, 0xdd, 0x78, 0x9a, 0x2a, - 0x15, 0xbb, 0xbe, 0xf5, 0xd6, 0x5b, 0x29, 0xc4, 0xcf, 0x47, 0xd0, 0x88, - 0xb9, 0x8f, 0x81, 0x84, 0x9f, 0x71, 0x95, 0x51, 0x32, 0x9e, 0x9b, 0x36, - 0x6d, 0x5a, 0x36, 0xf9, 0xe6, 0x33, 0x18, 0x5f, 0x27, 0xdf, 0xf7, 0x55, - 0x26, 0x46, 0x9b, 0x76, 0xc2, 0x1f, 0x25, 0xa2, 0x69, 0x6f, 0xf2, 0xa0, - 0x41, 0x83, 0x86, 0x2a, 0x0c, 0xfc, 0xc6, 0xe3, 0xef, 0xee, 0x93, 0x24, - 0x76, 0xa2, 0x9c, 0x23, 0x74, 0x28, 0x2f, 0xa3, 0x3c, 0x61, 0x2a, 0x2b, - 0x16, 0xc1, 0xa3, 0xc9, 0x72, 0x07, 0xbb, 0x31, 0x32, 0x98, 0x1c, 0x05, - 0x52, 0x01, 0x11, 0x9c, 0x26, 0xc4, 0x96, 0x4c, 0x84, 0xdb, 0xf8, 0xb0, - 0x4c, 0x1a, 0x83, 0xb3, 0x1b, 0xcf, 0xee, 0x7a, 0x87, 0x93, 0x61, 0x68, - 0x34, 0x04, 0xbf, 0x17, 0xa9, 0x7f, 0x26, 0x58, 0x66, 0xb1, 0x40, 0xb2, - 0x81, 0x7e, 0x9a, 0x4f, 0x84, 0xa7, 0x20, 0xad, 0xd6, 0x8a, 0x57, 0x84, - 0x53, 0x12, 0x3b, 0xd4, 0xaf, 0xb2, 0xc3, 0xbc, 0x16, 0xa1, 0xb9, 0xc1, - 0x8f, 0x14, 0xc6, 0x24, 0xf6, 0x22, 0x71, 0xd5, 0x36, 0xa5, 0x51, 0xda, - 0x43, 0xa1, 0xc1, 0xe0, 0xb4, 0x80, 0xbe, 0xde, 0x48, 0x11, 0xc2, 0x2a, - 0x83, 0x32, 0x9f, 0x43, 0x90, 0x6b, 0x52, 0x2e, 0xd5, 0x51, 0x4e, 0x12, - 0xbc, 0xf0, 0x81, 0x70, 0xc3, 0x30, 0x97, 0x90, 0x91, 0x32, 0x11, 0x8f, - 0xd0, 0x1f, 0x0c, 0x6f, 0x49, 0x50, 0x9c, 0xce, 0xf1, 0xf5, 0xfb, 0x51, - 0xfc, 0x8a, 0x78, 0x37, 0x7d, 0x35, 0xcf, 0xb3, 0x09, 0xcb, 0x64, 0xc1, - 0x4a, 0x42, 0xb1, 0x1d, 0x46, 0x7a, 0x3a, 0x82, 0xed, 0x3b, 0xee, 0xcd, - 0x84, 0x5c, 0x85, 0x09, 0x70, 0x27, 0xc2, 0x58, 0xca, 0x65, 0x2f, 0x16, - 0x2f, 0xfa, 0x30, 0xf1, 0xe4, 0x23, 0x74, 0x85, 0x6b, 0x15, 0xc8, 0xb8, - 0xf0, 0xb1, 0x6d, 0x76, 0x5c, 0xff, 0x05, 0xcf, 0x75, 0xa5, 0x1e, 0xc7, - 0xd2, 0xc7, 0xa7, 0x50, 0xef, 0xc7, 0x29, 0x3b, 0x9b, 0xe3, 0xbb, 0xbb, - 0x10, 0xe0, 0x46, 0xf1, 0x4f, 0x62, 0x22, 0x1d, 0xa7, 0x7a, 0x3e, 0xf2, - 0xc8, 0x23, 0x5f, 0x93, 0x49, 0x89, 0x71, 0x61, 0x32, 0x0e, 0x5d, 0xc3, - 0xf9, 0xfb, 0x1c, 0x0b, 0x57, 0xff, 0xb5, 0x92, 0xc2, 0x0c, 0x56, 0x45, - 0xbc, 0xbb, 0xad, 0xb1, 0x2f, 0xe7, 0x1c, 0x6b, 0x57, 0xbb, 0x99, 0x88, - 0xcf, 0x61, 0x7c, 0xf5, 0x71, 0x13, 0x63, 0xa2, 0xd7, 0x5f, 0xd1, 0xc2, - 0xbf, 0xe1, 0x63, 0xed, 0x9c, 0x48, 0xb9, 0x1a, 0x5f, 0x5f, 0x1e, 0x08, - 0xc5, 0xae, 0x82, 0xe2, 0xbf, 0x44, 0xf5, 0xe7, 0x88, 0xb7, 0xf8, 0xd6, - 0xe0, 0x15, 0xce, 0xcc, 0x73, 0x13, 0xae, 0x3f, 0x86, 0xe3, 0x40, 0xf0, - 0x39, 0xc9, 0xd4, 0x45, 0xf7, 0x28, 0x69, 0xce, 0x91, 0x6b, 0x26, 0xaa, - 0x54, 0xd2, 0x99, 0x09, 0xd6, 0x9d, 0x45, 0x1d, 0xf0, 0xcc, 0x47, 0xc1, - 0xd5, 0x38, 0xaf, 0xed, 0x0e, 0x28, 0xe3, 0x3e, 0xaa, 0x63, 0xed, 0x2c, - 0x90, 0xf4, 0x66, 0xe2, 0xc8, 0x45, 0xf9, 0x90, 0x5c, 0x79, 0x8d, 0x3c, - 0x25, 0x4b, 0xbc, 0xe3, 0xbd, 0xdc, 0xc7, 0xda, 0x31, 0xe6, 0x16, 0xc0, - 0x0f, 0xdb, 0x90, 0x57, 0x4b, 0xc9, 0x4f, 0x63, 0xbb, 0x0a, 0x27, 0x36, - 0xd6, 0x8d, 0x1c, 0x39, 0x72, 0x1d, 0x0a, 0xe4, 0x22, 0x78, 0x43, 0xc6, - 0xa4, 0xda, 0x53, 0x9d, 0xd3, 0x15, 0x6b, 0x50, 0x66, 0x64, 0xa4, 0x1e, - 0xc9, 0xd8, 0xd5, 0xb7, 0x2c, 0x8a, 0xe0, 0x67, 0xc9, 0x90, 0xf0, 0x31, - 0x6c, 0x94, 0x91, 0x55, 0x3c, 0x57, 0xe3, 0x7d, 0xfe, 0xa6, 0xc2, 0x9e, - 0x45, 0x55, 0xa5, 0x37, 0xfd, 0xcd, 0x6d, 0xd8, 0xd5, 0x83, 0xcf, 0x9d, - 0x63, 0xda, 0x28, 0x2c, 0x52, 0x04, 0xc2, 0xc7, 0xda, 0x51, 0x76, 0xa7, - 0xf1, 0x6c, 0xe4, 0x8c, 0x12, 0x24, 0xd2, 0xee, 0x6f, 0x95, 0x1f, 0x06, - 0x9f, 0x78, 0xbf, 0x4a, 0x05, 0xf2, 0x0f, 0x1f, 0x6b, 0x87, 0xaf, 0x97, - 0x91, 0x87, 0x94, 0x30, 0xc7, 0xd1, 0xfe, 0x2e, 0x6a, 0x0b, 0x0a, 0xbf, - 0xc6, 0xd0, 0xe1, 0x50, 0x2c, 0x24, 0xde, 0x3a, 0x96, 0xf9, 0x26, 0x53, - 0xe5, 0xa2, 0x5c, 0xae, 0x86, 0x1f, 0xaf, 0x63, 0xd1, 0xcf, 0x5d, 0x2f, - 0xa2, 0x44, 0x74, 0x65, 0xf1, 0x43, 0x79, 0x8e, 0xb5, 0xd7, 0xa4, 0x14, - 0x8d, 0x21, 0xe7, 0x68, 0x3b, 0x75, 0x2d, 0x44, 0x76, 0xb5, 0x34, 0x25, - 0xb3, 0xf0, 0x78, 0xa0, 0xea, 0x8f, 0x52, 0x28, 0x99, 0xde, 0x0e, 0xd2, - 0xf7, 0x44, 0xee, 0x51, 0xbd, 0x69, 0xdb, 0xbb, 0x3c, 0x27, 0x22, 0xef, - 0xfb, 0x30, 0xf6, 0x0a, 0xe9, 0xbf, 0x02, 0x14, 0xd6, 0xbe, 0xf8, 0xc5, - 0x33, 0x9f, 0xdc, 0xa5, 0x38, 0x8c, 0xd7, 0xc1, 0x3c, 0x9b, 0xf1, 0x21, - 0x59, 0x77, 0x1e, 0xf2, 0x3b, 0x53, 0xe5, 0xc8, 0x31, 0xd7, 0xed, 0xc4, - 0xef, 0x44, 0xc8, 0x28, 0xa2, 0xdc, 0x3a, 0x4e, 0x38, 0x1d, 0xc6, 0xfb, - 0xed, 0xdb, 0x95, 0x0f, 0xe3, 0xed, 0x54, 0x14, 0x76, 0xf3, 0x8f, 0x11, - 0x7f, 0x12, 0x56, 0xaa, 0x5c, 0xa7, 0x4f, 0x3b, 0x52, 0x9f, 0x5c, 0xe6, - 0x8f, 0x6c, 0xe4, 0xd6, 0xbf, 0x88, 0x1f, 0x49, 0xc6, 0x38, 0xc7, 0xda, - 0x31, 0x40, 0xb5, 0x18, 0x22, 0x2c, 0x4a, 0x73, 0x1a, 0x13, 0x0d, 0x59, - 0x34, 0x58, 0x1d, 0xaa, 0xd3, 0x79, 0xa5, 0x45, 0xf6, 0x84, 0xd5, 0x54, - 0x19, 0x21, 0x1e, 0xaf, 0xeb, 0x09, 0xd3, 0x63, 0x0c, 0xf3, 0xf2, 0xb3, - 0x9a, 0xb3, 0x59, 0xd8, 0xb8, 0x87, 0x67, 0xcd, 0x07, 0xb5, 0x79, 0x57, - 0x7e, 0xbc, 0xca, 0xa2, 0xed, 0xe5, 0x29, 0x4b, 0xf9, 0xed, 0xae, 0xab, - 0xca, 0x77, 0x1f, 0x86, 0x61, 0x48, 0x2e, 0x22, 0xa3, 0xd1, 0xd0, 0x1b, - 0xd0, 0x98, 0xa3, 0x8f, 0x3e, 0x7a, 0xa3, 0xea, 0xc3, 0x1c, 0xb0, 0x91, - 0x67, 0xa3, 0x47, 0x85, 0x8f, 0xb5, 0x33, 0xa7, 0xe7, 0x62, 0xd4, 0xcd, - 0x21, 0x6c, 0x38, 0x34, 0x14, 0x63, 0x6b, 0x81, 0xe6, 0x0c, 0xe9, 0x35, - 0xc8, 0x19, 0xf7, 0x58, 0x0d, 0x32, 0xaf, 0x38, 0xc7, 0xd1, 0xd1, 0xcd, - 0x32, 0x30, 0x72, 0xff, 0x20, 0xfe, 0x57, 0xd0, 0x17, 0xd0, 0x3c, 0xd2, - 0xfd, 0xc6, 0xb5, 0x29, 0xe4, 0xc8, 0x21, 0x74, 0x8b, 0x7a, 0x8c, 0x93, - 0x4c, 0xe4, 0xa5, 0xbe, 0xad, 0xb2, 0x00, 0xff, 0xa1, 0xd0, 0xbb, 0x2c, - 0x36, 0xcf, 0xc7, 0x00, 0x74, 0x3e, 0xe8, 0x87, 0x5c, 0xd1, 0x5c, 0x22, - 0xdc, 0x02, 0x77, 0xdd, 0x75, 0x57, 0x65, 0xea, 0xb2, 0x9e, 0x39, 0x28, - 0x9f, 0xfa, 0xac, 0xc5, 0x4b, 0x63, 0xfb, 0x53, 0xe6, 0xd6, 0x55, 0xc8, - 0xa0, 0x5c, 0xf8, 0x35, 0x9f, 0x79, 0xa1, 0xb3, 0xe2, 0xe2, 0x64, 0x60, - 0x69, 0x3e, 0x78, 0x12, 0x7a, 0x05, 0x9e, 0x75, 0x5e, 0x6f, 0x62, 0x21, - 0x49, 0x6d, 0x97, 0x3c, 0x7c, 0x29, 0x14, 0xd6, 0x9c, 0xab, 0xc6, 0x8a, - 0x5c, 0x32, 0xf5, 0xc9, 0x22, 0x7f, 0x7d, 0xf3, 0x67, 0x22, 0xcf, 0x03, - 0xa0, 0xd7, 0x39, 0x05, 0xe6, 0x7c, 0x10, 0x98, 0x3c, 0x7e, 0xe4, 0x59, - 0x7a, 0x93, 0x30, 0x0a, 0x1f, 0x6b, 0x47, 0xce, 0x16, 0xf2, 0x9e, 0xff, - 0x72, 0xfc, 0x3e, 0x84, 0x46, 0x70, 0x02, 0x12, 0x15, 0x6e, 0x51, 0xbe, - 0x30, 0x65, 0xec, 0xf4, 0xc6, 0xcf, 0x38, 0xf1, 0xbf, 0x0c, 0x93, 0x87, - 0xa0, 0x37, 0x90, 0x2b, 0x19, 0x8a, 0xc3, 0xe2, 0x47, 0x7b, 0x9e, 0x1d, - 0x4c, 0xb8, 0xba, 0x9d, 0xc6, 0x4f, 0x37, 0xe8, 0x01, 0xe8, 0x69, 0xe8, - 0x8d, 0x87, 0x1f, 0x7e, 0x78, 0xa5, 0xd2, 0xa0, 0xd7, 0xa8, 0xfe, 0x1a, - 0x7b, 0x6e, 0xe7, 0x3d, 0xd6, 0x1e, 0x04, 0xdb, 0x4b, 0x19, 0x92, 0xf9, - 0xcc, 0x43, 0xe9, 0xf4, 0xc7, 0x27, 0x44, 0x4e, 0x81, 0x4c, 0x7b, 0xdd, - 0x69, 0xc5, 0xcb, 0x91, 0x8e, 0xb5, 0xc7, 0x60, 0x04, 0xe9, 0x03, 0x8f, - 0x92, 0xcf, 0x69, 0x2c, 0xb8, 0x4e, 0xe6, 0xb4, 0xdd, 0x6c, 0xf2, 0x95, - 0x57, 0x11, 0xdf, 0xd1, 0xf8, 0x85, 0x8c, 0x3e, 0x45, 0x1f, 0xc8, 0x94, - 0xcc, 0xc0, 0xb8, 0xaa, 0xc5, 0x73, 0x32, 0xbc, 0xe1, 0x7c, 0x1c, 0x59, - 0xf8, 0xf0, 0xef, 0x15, 0x9a, 0x2f, 0x4a, 0xc5, 0x87, 0xb9, 0xa1, 0x8d, - 0xc6, 0x37, 0xe3, 0x22, 0x9b, 0xcd, 0x2a, 0xf1, 0xdb, 0x30, 0x68, 0x38, - 0xfc, 0x3a, 0x17, 0x3c, 0xb3, 0xe0, 0xb7, 0x4c, 0xd7, 0x6b, 0x6e, 0xc9, - 0xf0, 0xc6, 0x57, 0x2a, 0x9f, 0xf1, 0x95, 0x83, 0xf1, 0x37, 0x2b, 0x14, - 0x3f, 0x22, 0x7f, 0x46, 0xe2, 0x37, 0xbe, 0x1f, 0x35, 0x17, 0xbd, 0xcc, - 0x79, 0x5d, 0x8b, 0x85, 0xec, 0x31, 0xe4, 0xe3, 0xf0, 0x1b, 0xd7, 0x64, - 0x16, 0xee, 0x3e, 0x52, 0x19, 0xe8, 0xc0, 0xd9, 0x2c, 0x08, 0x2e, 0x61, - 0x21, 0x68, 0x3a, 0xfe, 0xe2, 0xc9, 0x19, 0xe8, 0xb7, 0xda, 0x50, 0x12, - 0x9e, 0xa6, 0xef, 0x92, 0xe0, 0xff, 0x25, 0xf0, 0x6e, 0x21, 0x0b, 0x72, - 0xf3, 0xf0, 0x1f, 0x09, 0x89, 0xa7, 0xa7, 0xb0, 0x81, 0xb5, 0x04, 0x83, - 0xf9, 0x31, 0xee, 0xcd, 0x7c, 0xa0, 0xbe, 0x3b, 0x17, 0x1a, 0xcc, 0xc2, - 0x85, 0xf3, 0x2a, 0x20, 0x7d, 0x24, 0x79, 0xac, 0x31, 0xa9, 0xbe, 0x15, - 0xc9, 0x5e, 0x30, 0xba, 0x43, 0x18, 0x4f, 0x9f, 0xbe, 0x4f, 0x94, 0x9f, - 0xea, 0x09, 0xe6, 0x9f, 0x93, 0x46, 0xfc, 0x59, 0x83, 0xf1, 0xe2, 0x7c, - 0xec, 0x15, 0x1d, 0xf0, 0x59, 0x9e, 0xdd, 0x7d, 0x1e, 0x8b, 0xdf, 0x2b, - 0x8a, 0x7f, 0xdb, 0x6d, 0xb7, 0x4d, 0x21, 0xec, 0x00, 0x8c, 0xed, 0x55, - 0xe8, 0x55, 0x9a, 0x7b, 0x6b, 0x40, 0x71, 0xcc, 0xcb, 0x2f, 0xc1, 0x0f, - 0x79, 0x1a, 0x9b, 0xdc, 0xab, 0x4e, 0xe2, 0xc5, 0xea, 0x8c, 0x8d, 0x6c, - 0x16, 0x8b, 0x64, 0x8f, 0xa9, 0x8f, 0x5b, 0xb1, 0x69, 0x34, 0x57, 0x7d, - 0x8e, 0x2e, 0xf3, 0x33, 0xaf, 0x2d, 0xc5, 0x89, 0xb8, 0x77, 0x5e, 0xa3, - 0xe3, 0x74, 0xb2, 0xfa, 0xb0, 0x25, 0xa4, 0xb2, 0xab, 0xb3, 0x59, 0xe5, - 0xc8, 0x3d, 0xf2, 0x15, 0x26, 0x1a, 0x0b, 0xc6, 0x85, 0xeb, 0xc3, 0x58, - 0xfb, 0x09, 0x4f, 0xd3, 0x66, 0x61, 0x25, 0x39, 0xff, 0x22, 0x64, 0x30, - 0x79, 0x99, 0x93, 0x78, 0xce, 0x6b, 0xc2, 0xc4, 0x95, 0x0c, 0xf0, 0x93, - 0xbb, 0x78, 0x07, 0x2a, 0xd3, 0xa6, 0x49, 0x6a, 0x23, 0x7a, 0xf3, 0x00, - 0x9e, 0x25, 0x0f, 0x4a, 0x73, 0xd1, 0x1c, 0x6b, 0x37, 0xe9, 0x13, 0x38, - 0x01, 0xf5, 0x88, 0xf2, 0x56, 0x19, 0x78, 0x9a, 0x3e, 0x35, 0xe1, 0xe1, - 0xab, 0x4e, 0xe2, 0xa2, 0x17, 0x9e, 0x0c, 0x1d, 0x0e, 0x7f, 0xc7, 0x85, - 0x03, 0x42, 0x37, 0xe8, 0x7f, 0x6e, 0xf9, 0xe9, 0x0d, 0xfe, 0xaf, 0x7d, - 0x4e, 0xc0, 0x70, 0x9a, 0x0b, 0xc3, 0x14, 0x22, 0xd4, 0x1f, 0xa4, 0x96, - 0x66, 0xc0, 0x98, 0x0a, 0x57, 0xc2, 0x08, 0x99, 0x28, 0x80, 0x58, 0xe5, - 0x17, 0xd3, 0xbb, 0x05, 0x55, 0xa2, 0xfc, 0x14, 0x86, 0xd2, 0x30, 0x8e, - 0x30, 0x31, 0xab, 0xd7, 0x25, 0xba, 0x8c, 0xf3, 0xf7, 0x09, 0xf4, 0x8b, - 0xe3, 0x4d, 0x13, 0x40, 0xd8, 0x1e, 0x81, 0x00, 0xc9, 0x43, 0xb1, 0xc8, - 0xc1, 0x60, 0xbc, 0x84, 0x08, 0xee, 0x72, 0x15, 0x3f, 0x86, 0x49, 0x4e, - 0xc7, 0xba, 0x1d, 0x27, 0xc3, 0xf6, 0x9e, 0x7b, 0xee, 0x49, 0x65, 0x35, - 0xf0, 0x55, 0xc2, 0x9a, 0x28, 0x5c, 0x91, 0x42, 0x2e, 0x88, 0xf2, 0xf6, - 0x26, 0xd9, 0x15, 0x30, 0x41, 0x8a, 0x29, 0xf7, 0x87, 0x6a, 0x21, 0x88, - 0xd2, 0x60, 0xf0, 0x3c, 0xee, 0xa5, 0x50, 0xbb, 0x5d, 0x1d, 0x14, 0x93, - 0x0c, 0x94, 0x3e, 0x7d, 0x6c, 0x69, 0x1b, 0xca, 0xea, 0x56, 0x04, 0x93, - 0xa3, 0xb0, 0x22, 0x00, 0x37, 0xa1, 0x18, 0x1f, 0xe2, 0x8a, 0x1c, 0x8f, - 0xa0, 0x79, 0x42, 0x95, 0x60, 0x91, 0x63, 0x39, 0x03, 0xa8, 0x80, 0x95, - 0xba, 0xf5, 0x18, 0xcd, 0x1b, 0x34, 0x08, 0xe5, 0x0f, 0xc3, 0x68, 0x92, - 0x32, 0x82, 0xc5, 0x95, 0x34, 0x7c, 0x1b, 0x43, 0x5d, 0xf4, 0x95, 0xf7, - 0x22, 0x84, 0xb3, 0x04, 0xb0, 0x06, 0xa4, 0xdb, 0xa9, 0x2d, 0xcd, 0x51, - 0x3c, 0xbe, 0x26, 0xaf, 0x02, 0xc5, 0x93, 0x43, 0x89, 0xca, 0x06, 0x9b, - 0x21, 0x84, 0x35, 0x86, 0x4c, 0xfe, 0x89, 0x28, 0x06, 0x57, 0x52, 0x77, - 0x7d, 0x99, 0x3d, 0x03, 0xe5, 0xfe, 0x34, 0xfa, 0x28, 0x06, 0xe6, 0xac, - 0xca, 0x44, 0x7f, 0x9b, 0x30, 0x55, 0x5a, 0x14, 0xc7, 0xcf, 0x48, 0xe3, - 0xd7, 0x17, 0x1a, 0xb0, 0x9a, 0xa4, 0x34, 0x58, 0xc3, 0x8a, 0x32, 0xf7, - 0x91, 0x9c, 0x0c, 0xcd, 0xbb, 0xa0, 0x87, 0x21, 0x19, 0x0b, 0xa6, 0x1e, - 0xdc, 0x3a, 0xce, 0xf9, 0x6b, 0x15, 0x60, 0xc9, 0x06, 0x8f, 0x8c, 0x41, - 0x83, 0x06, 0xad, 0xa7, 0x8f, 0x24, 0x4c, 0x06, 0x40, 0x07, 0x42, 0x55, - 0x21, 0xb7, 0x00, 0x51, 0x3f, 0x9f, 0x05, 0xbd, 0x09, 0x0d, 0x8f, 0x40, - 0x0a, 0x3b, 0x03, 0x72, 0xf3, 0x84, 0xf2, 0x50, 0x5e, 0x52, 0x82, 0x1f, - 0x61, 0x52, 0x9b, 0x83, 0xc1, 0xb0, 0x1e, 0x01, 0xae, 0x89, 0x2c, 0x8b, - 0x7e, 0xbe, 0x18, 0x7f, 0x6f, 0xdd, 0xf0, 0xe2, 0xc8, 0x06, 0x47, 0xa9, - 0xa8, 0xda, 0x54, 0x4d, 0x82, 0x28, 0x8f, 0xdb, 0xf0, 0xea, 0x0f, 0x49, - 0x10, 0x24, 0x61, 0xfc, 0x7d, 0xc5, 0x44, 0x99, 0xcd, 0x7d, 0x0a, 0x02, - 0x74, 0x0d, 0x86, 0x42, 0x2e, 0xf7, 0x12, 0xf6, 0xad, 0xe8, 0xe7, 0xcd, - 0xac, 0xee, 0xa6, 0x71, 0xdf, 0x1c, 0x81, 0xb0, 0x01, 0x85, 0x65, 0x3e, - 0xf7, 0x8e, 0x00, 0x61, 0x01, 0xc1, 0xf9, 0x4a, 0x3b, 0x8a, 0xf6, 0x26, - 0xfc, 0xf6, 0x83, 0xea, 0x31, 0x01, 0x39, 0xca, 0x07, 0x2b, 0x9a, 0xbd, - 0x79, 0x36, 0x2e, 0x6c, 0x7c, 0xaa, 0x5f, 0xdc, 0x0e, 0x5e, 0x2b, 0xe0, - 0x03, 0x1b, 0xa9, 0x4c, 0xf6, 0xaf, 0x13, 0xd9, 0x60, 0x1b, 0x36, 0x6e, - 0x39, 0x99, 0xf2, 0x04, 0xfe, 0x49, 0x26, 0xa3, 0x08, 0xd7, 0x70, 0xfe, - 0x3e, 0xc6, 0xb9, 0x92, 0xd4, 0x81, 0x8f, 0xd2, 0x55, 0x2e, 0x1f, 0xfb, - 0xea, 0xc6, 0xb3, 0x30, 0x72, 0x8c, 0x73, 0x77, 0x5d, 0xdc, 0xf7, 0xd4, - 0x4b, 0x78, 0xb8, 0x85, 0x70, 0xd8, 0x38, 0x67, 0xd2, 0x9c, 0x01, 0xe4, - 0x1f, 0x32, 0x09, 0x7f, 0xe0, 0x26, 0xf8, 0xaf, 0x35, 0x69, 0xe4, 0xaa, - 0x83, 0xe7, 0x36, 0xe5, 0xc7, 0x84, 0x73, 0x36, 0xcf, 0x8e, 0x20, 0x65, - 0x37, 0xa6, 0x1b, 0xe9, 0x9e, 0x37, 0x44, 0x7f, 0x5c, 0x41, 0x98, 0xea, - 0x12, 0xae, 0xbf, 0xbb, 0x0e, 0xde, 0xfb, 0x7f, 0xc2, 0x38, 0x97, 0xc1, - 0x4f, 0xbd, 0x9d, 0x77, 0xa2, 0x18, 0x67, 0x3b, 0x51, 0x74, 0x9a, 0x87, - 0xea, 0xcc, 0xa5, 0x98, 0xab, 0x90, 0x71, 0xce, 0x7b, 0xc6, 0x33, 0x51, - 0x92, 0x85, 0x75, 0x75, 0xc6, 0x74, 0x5d, 0x94, 0xa6, 0x02, 0x8e, 0x3c, - 0x4f, 0xf0, 0x1a, 0xe7, 0x6a, 0xbb, 0xf0, 0x20, 0x5e, 0x0a, 0x8a, 0x89, - 0x16, 0x93, 0x0a, 0x39, 0x05, 0x35, 0x9e, 0xe7, 0x78, 0xcf, 0x3b, 0xe7, - 0xd5, 0x91, 0xc5, 0x5d, 0x15, 0x17, 0x59, 0xb5, 0x8b, 0x70, 0xaf, 0x9c, - 0xc1, 0x2b, 0x50, 0x8b, 0x5d, 0xb5, 0x9d, 0x8a, 0x83, 0xa1, 0x29, 0x3e, - 0x4d, 0x34, 0xef, 0x9c, 0x33, 0x16, 0x66, 0x61, 0x14, 0xb7, 0x44, 0xfe, - 0xb5, 0xa4, 0xdd, 0xdd, 0xa1, 0xa1, 0x1a, 0x33, 0xbc, 0xa6, 0x90, 0xc7, - 0x98, 0xbe, 0x8e, 0xb8, 0xc9, 0x15, 0xc8, 0x3f, 0xde, 0xbc, 0x73, 0x8e, - 0xe2, 0xbf, 0x85, 0x85, 0xa2, 0xfe, 0xd4, 0x5f, 0x34, 0x14, 0x51, 0xa5, - 0x6f, 0x39, 0xe4, 0xf3, 0xca, 0xd5, 0xef, 0xe4, 0xed, 0x96, 0xd1, 0x35, - 0x91, 0x7b, 0x6f, 0x81, 0x4f, 0x3a, 0x3c, 0xe6, 0xc8, 0x43, 0xc6, 0xf8, - 0x4e, 0x78, 0xe7, 0x45, 0x2d, 0xd6, 0x12, 0xb7, 0x34, 0xb7, 0xa7, 0x8d, - 0x73, 0x95, 0x55, 0x8b, 0x85, 0x6d, 0xe7, 0xeb, 0xb2, 0xcc, 0x1b, 0x92, - 0x1d, 0x92, 0xd7, 0xfa, 0xca, 0xfd, 0x20, 0xe1, 0x88, 0xfc, 0x9d, 0xc7, - 0xb3, 0x8c, 0xd7, 0x38, 0x4e, 0xdb, 0xf4, 0x94, 0x1f, 0x06, 0xc3, 0x14, - 0x9e, 0xab, 0x31, 0xcf, 0xbd, 0x83, 0x02, 0x27, 0x43, 0x38, 0x87, 0xf8, - 0x52, 0xea, 0xab, 0x80, 0xf1, 0x6b, 0x8a, 0xc3, 0x87, 0xe0, 0x2e, 0xe5, - 0x39, 0x1e, 0x32, 0xae, 0x36, 0x63, 0x66, 0xac, 0xc2, 0xe4, 0xf8, 0xd0, - 0xd5, 0xbb, 0x04, 0xd4, 0x30, 0x81, 0x9e, 0x6b, 0x35, 0x5e, 0xf3, 0x79, - 0x05, 0xfe, 0x29, 0x40, 0x6e, 0xcd, 0xa7, 0xcf, 0x96, 0x33, 0x5f, 0xe6, - 0x63, 0x60, 0x49, 0x66, 0x48, 0x4e, 0xfa, 0x3a, 0xea, 0x9a, 0xc4, 0xbc, - 0xb1, 0x08, 0xfc, 0x0b, 0x78, 0xc5, 0x4a, 0x73, 0xba, 0x94, 0x1a, 0x5f, - 0xb9, 0x89, 0x7f, 0x79, 0x8c, 0x73, 0x95, 0x57, 0x89, 0x93, 0x16, 0x03, - 0xe9, 0x33, 0xf1, 0xe7, 0x4c, 0x9e, 0xdd, 0x32, 0x44, 0xe1, 0x91, 0x5c, - 0xa9, 0xc6, 0xf9, 0x95, 0x57, 0x5e, 0xa9, 0x57, 0xa4, 0xd2, 0x58, 0xfc, - 0x97, 0xac, 0x6d, 0x01, 0x09, 0x7f, 0xe1, 0x76, 0x32, 0x0b, 0x57, 0xe9, - 0x8c, 0xd3, 0xe5, 0x94, 0xeb, 0x9e, 0x2b, 0x08, 0xda, 0xab, 0x4e, 0x73, - 0x51, 0xcb, 0x10, 0x69, 0x8c, 0x69, 0x1e, 0x15, 0xff, 0x9e, 0xca, 0x22, - 0x42, 0x3e, 0x7c, 0x5d, 0x88, 0x21, 0x64, 0xf8, 0x39, 0x6c, 0x9c, 0x33, - 0x57, 0x68, 0xee, 0x39, 0x06, 0x12, 0xaf, 0xa8, 0x5f, 0x0f, 0xd3, 0x1c, - 0xa6, 0xbe, 0x66, 0x37, 0x4c, 0xf3, 0xb1, 0xda, 0x15, 0x60, 0x07, 0x59, - 0xbb, 0xcc, 0xb9, 0xf4, 0x67, 0x01, 0x0b, 0xe2, 0xe2, 0x81, 0x36, 0x90, - 0x49, 0x23, 0x25, 0x5a, 0x18, 0x18, 0xbe, 0x89, 0x61, 0xac, 0xdf, 0xa7, - 0x3c, 0x18, 0xc7, 0x1b, 0xf0, 0x3f, 0x1c, 0x52, 0xde, 0xaa, 0x57, 0x37, - 0x5e, 0x63, 0x74, 0xbe, 0xaf, 0x30, 0xf2, 0x3f, 0xc6, 0x79, 0x90, 0xf1, - 0x7c, 0xa3, 0xe2, 0x87, 0xea, 0xd3, 0x95, 0x78, 0x9a, 0x7b, 0x94, 0x7f, - 0x67, 0x8c, 0x93, 0x75, 0x0a, 0x63, 0x27, 0x52, 0x86, 0x84, 0x23, 0xbb, - 0xb9, 0xaa, 0x1f, 0xc5, 0x53, 0x75, 0x09, 0x77, 0x36, 0x54, 0x90, 0x1d, - 0x1f, 0xea, 0x39, 0xe4, 0x2f, 0x1d, 0x41, 0x98, 0x38, 0x8e, 0x38, 0xed, - 0x95, 0x07, 0xbb, 0x78, 0x92, 0x41, 0x9a, 0x17, 0x34, 0x67, 0xd6, 0x65, - 0x67, 0xf1, 0x61, 0xf9, 0xa3, 0xf3, 0x49, 0x07, 0x52, 0x1d, 0xc5, 0x77, - 0x61, 0xe3, 0x9c, 0xd3, 0x33, 0xe9, 0x3c, 0x9f, 0x01, 0x09, 0x3b, 0xe9, - 0x29, 0x07, 0x62, 0x40, 0xac, 0x55, 0x1a, 0x16, 0xbb, 0xc4, 0xd7, 0xa6, - 0x3e, 0xdc, 0x3a, 0xf7, 0xca, 0xb7, 0x31, 0x63, 0xcc, 0xf9, 0xde, 0x07, - 0x8b, 0x35, 0x1d, 0x78, 0x8e, 0xc4, 0xcb, 0x6a, 0x83, 0xe2, 0xab, 0xae, - 0xfb, 0xc1, 0x4b, 0x63, 0x94, 0x6f, 0x84, 0xf7, 0xdc, 0x1d, 0xe3, 0x9c, - 0x8d, 0x98, 0x0c, 0xe2, 0xd6, 0x66, 0x7c, 0x5d, 0x26, 0xc3, 0x9c, 0x79, - 0x7d, 0x17, 0x0b, 0xb4, 0x1f, 0xe3, 0xd7, 0x1c, 0x0a, 0xb7, 0x97, 0x7b, - 0xb7, 0x2b, 0xd5, 0x38, 0xd7, 0x37, 0x49, 0x54, 0x2e, 0x06, 0xf8, 0x7a, - 0x12, 0xb5, 0x85, 0x0e, 0xd5, 0x89, 0x56, 0x78, 0xb8, 0x80, 0xfb, 0xde, - 0x50, 0x53, 0x36, 0x81, 0x1c, 0xa3, 0x89, 0x8f, 0xaf, 0x1e, 0xc4, 0x73, - 0x25, 0x16, 0xe9, 0x3e, 0x57, 0x9a, 0x28, 0xf1, 0xd1, 0x07, 0x1c, 0x47, - 0x28, 0x3e, 0x1f, 0xca, 0x9c, 0x4d, 0xfa, 0xf6, 0x90, 0xb0, 0x16, 0x1d, - 0xca, 0x09, 0x46, 0x47, 0x8e, 0x11, 0x47, 0x3a, 0x87, 0xf8, 0x2d, 0xcc, - 0x9f, 0x7c, 0x38, 0x74, 0x0b, 0xcf, 0x47, 0x42, 0x86, 0xd7, 0xfc, 0xf8, - 0xb3, 0x2c, 0x7e, 0x73, 0x16, 0x0c, 0x5d, 0xfc, 0x46, 0x76, 0x81, 0x64, - 0x78, 0xcd, 0xf9, 0x22, 0x3f, 0x72, 0x51, 0x7d, 0x7c, 0x17, 0x24, 0x9d, - 0x56, 0xe5, 0x88, 0xf7, 0x74, 0xef, 0xee, 0xdb, 0xea, 0x9c, 0x88, 0x48, - 0x0d, 0xe9, 0x6b, 0x57, 0x86, 0xe2, 0x99, 0x31, 0xa6, 0x71, 0xd7, 0x10, - 0x72, 0xc6, 0x0a, 0x57, 0xf5, 0xb7, 0x74, 0xa4, 0xaa, 0x2c, 0x66, 0x74, - 0x50, 0xbb, 0xd1, 0x77, 0xd4, 0x0e, 0xe5, 0x29, 0x9e, 0x15, 0xa9, 0xcf, - 0x0d, 0x5f, 0x84, 0xf9, 0xcd, 0xa7, 0xef, 0x13, 0xe5, 0xa7, 0x3c, 0xc0, - 0xfc, 0x0b, 0xd2, 0x24, 0x43, 0x49, 0xcc, 0xfb, 0xd7, 0x69, 0xa1, 0x09, - 0x1b, 0x43, 0xe3, 0xcb, 0x6d, 0x3f, 0x55, 0x42, 0xee, 0xfe, 0x29, 0x5d, - 0x1c, 0x7d, 0xf4, 0x0a, 0xc2, 0xea, 0xa0, 0x5f, 0x3a, 0x1b, 0x2b, 0xe8, - 0xdf, 0x1d, 0x95, 0x9e, 0x71, 0xfd, 0x1b, 0x8b, 0xde, 0x5b, 0x99, 0x5b, - 0xd3, 0xb8, 0x9f, 0xab, 0xf4, 0x66, 0x7c, 0xb0, 0xe9, 0xf5, 0x3d, 0xcf, - 0xaa, 0x5f, 0x22, 0x74, 0x9a, 0x74, 0x53, 0x95, 0xad, 0x39, 0x12, 0x63, - 0xd4, 0xd9, 0x94, 0x78, 0xf4, 0xd1, 0x47, 0xb7, 0x12, 0x76, 0x6a, 0x28, - 0x0e, 0x97, 0x40, 0x02, 0x0b, 0x1b, 0x7d, 0xd1, 0x53, 0xf3, 0xa8, 0x53, - 0x3a, 0x1b, 0x49, 0xc2, 0xd0, 0x38, 0xa7, 0x3e, 0x6c, 0x1a, 0x15, 0xb0, - 0xe0, 0xd1, 0x0f, 0x4f, 0xe5, 0x2b, 0xa7, 0xb6, 0x8b, 0xf7, 0x55, 0x96, - 0xa8, 0xda, 0xb4, 0x69, 0xd3, 0x2e, 0x04, 0xdf, 0x42, 0x7d, 0x00, 0x96, - 0xe7, 0x1b, 0x20, 0xb5, 0xd5, 0xcf, 0x55, 0x46, 0x07, 0x5e, 0xce, 0xfc, - 0xab, 0x6f, 0x26, 0x79, 0xe7, 0x2b, 0xbf, 0xf8, 0xe5, 0x32, 0xce, 0x59, - 0x8c, 0xbb, 0x5c, 0x79, 0xab, 0x0c, 0x76, 0xd1, 0xd5, 0x4f, 0x25, 0x1c, - 0xed, 0xe9, 0x4d, 0x1c, 0x47, 0x8e, 0x09, 0x1f, 0xaa, 0xbd, 0x93, 0xc5, - 0xbf, 0x6f, 0xb0, 0xd9, 0x6e, 0x45, 0xef, 0x3f, 0x85, 0xf9, 0x66, 0x14, - 0x63, 0xf4, 0x19, 0x12, 0x1a, 0x9e, 0x28, 0x91, 0xc7, 0x9e, 0xf6, 0xd8, - 0x23, 0x05, 0xb1, 0x42, 0x76, 0x28, 0x46, 0x5f, 0x7b, 0x14, 0x82, 0x1d, - 0x08, 0x81, 0x8f, 0xa8, 0xa4, 0x94, 0x41, 0xb7, 0xd3, 0x31, 0x63, 0x67, - 0x60, 0x70, 0x8c, 0x24, 0x9f, 0x00, 0x29, 0x81, 0xc6, 0x15, 0x85, 0xfc, - 0x02, 0x00, 0xa1, 0xc9, 0x60, 0x8f, 0xd4, 0x09, 0xa3, 0xa7, 0x21, 0xef, - 0x8f, 0x7d, 0x8a, 0x82, 0x10, 0xc3, 0xbb, 0xeb, 0x7a, 0x9f, 0x59, 0x4c, - 0x9a, 0x6b, 0x0a, 0x0d, 0x5d, 0x93, 0x6e, 0xb8, 0xe1, 0x86, 0x7c, 0x8c, - 0xd9, 0xf5, 0x18, 0xe5, 0x3b, 0x99, 0x64, 0x32, 0x51, 0x2c, 0xf4, 0xbf, - 0xb0, 0xe7, 0xd0, 0x11, 0xed, 0x88, 0x53, 0x68, 0xe2, 0xa3, 0x38, 0xf7, - 0x61, 0x00, 0x5d, 0xc5, 0xca, 0xce, 0x16, 0x76, 0x31, 0xa4, 0x3c, 0x6d, - 0x84, 0xdc, 0xed, 0x30, 0x51, 0xcd, 0x35, 0x8f, 0x2f, 0x65, 0x8f, 0x81, - 0x81, 0x17, 0xa6, 0xa4, 0xa4, 0xcc, 0xe6, 0x5d, 0xc2, 0x59, 0x28, 0x9f, - 0xcb, 0x50, 0x22, 0x77, 0xc2, 0xf8, 0xfb, 0x71, 0x64, 0xe4, 0x53, 0x06, - 0xba, 0x51, 0x2c, 0x62, 0x10, 0xc8, 0x07, 0x28, 0x21, 0x65, 0x34, 0x64, - 0xa5, 0x79, 0x69, 0xc7, 0x8e, 0x1d, 0xa7, 0x9d, 0x7f, 0xfe, 0xf9, 0xa3, - 0xd9, 0x19, 0x5e, 0x2e, 0xc5, 0x95, 0x15, 0xd0, 0xeb, 0x30, 0xd6, 0x0e, - 0x31, 0x99, 0x7b, 0xaf, 0x7c, 0x11, 0xb7, 0x1a, 0x93, 0x75, 0x3f, 0x06, - 0x5d, 0x01, 0x06, 0x9c, 0x16, 0x17, 0x24, 0xf4, 0xdd, 0x4e, 0x7f, 0x41, - 0x93, 0x44, 0x5e, 0x6d, 0x51, 0x4a, 0x83, 0x7c, 0x78, 0x21, 0x1d, 0x61, - 0x96, 0x8d, 0xc2, 0x9e, 0xc8, 0x04, 0xdd, 0xf1, 0xaf, 0x31, 0x1d, 0x6e, - 0x4f, 0x1e, 0x13, 0xe7, 0x4f, 0xac, 0xe6, 0xad, 0xa5, 0x9e, 0xc9, 0x28, - 0x83, 0x5f, 0xa2, 0xd0, 0xeb, 0xff, 0x88, 0x37, 0xd1, 0x9e, 0x47, 0x10, - 0xec, 0x12, 0x7e, 0xfa, 0x5a, 0xb6, 0x14, 0x01, 0x3f, 0xa7, 0xc1, 0xf8, - 0x3c, 0xf4, 0x02, 0xa4, 0xc9, 0xb3, 0x2c, 0xa7, 0xba, 0x6a, 0xf1, 0x41, - 0xcc, 0xaf, 0x3c, 0xbd, 0xb8, 0x26, 0x30, 0xd1, 0xb5, 0x66, 0x00, 0xc5, - 0xb2, 0x0b, 0x93, 0xcc, 0x04, 0xbc, 0x9e, 0x3e, 0x93, 0xf0, 0x55, 0xfc, - 0x45, 0x90, 0xca, 0xd0, 0xc4, 0x63, 0x9c, 0xfa, 0xf9, 0x6b, 0x48, 0x71, - 0x6e, 0x8e, 0x40, 0x0a, 0x1b, 0x0b, 0xb9, 0x79, 0x42, 0x79, 0x28, 0xaf, - 0x3f, 0xa0, 0xc1, 0x7c, 0xc9, 0xfe, 0x5e, 0xfa, 0x70, 0x13, 0x65, 0xea, - 0x88, 0x50, 0x1c, 0x13, 0x4b, 0x6b, 0xfc, 0x8d, 0xc2, 0xc2, 0xed, 0x5f, - 0x4e, 0x5f, 0xd9, 0xe7, 0xa8, 0xd5, 0x44, 0x70, 0x3d, 0x9c, 0xc9, 0x6a, - 0x03, 0xc6, 0xb0, 0xda, 0xae, 0x3e, 0xc8, 0x84, 0x62, 0x59, 0x6d, 0x6d, - 0x44, 0xdd, 0x75, 0x1f, 0x83, 0x91, 0xdc, 0x40, 0x3b, 0x38, 0xdc, 0xff, - 0x08, 0x6d, 0xe6, 0x59, 0x7f, 0x39, 0xa6, 0x3a, 0xe4, 0x73, 0xe4, 0x17, - 0x79, 0x90, 0x2d, 0x61, 0xa7, 0x49, 0x39, 0x9e, 0x30, 0x4d, 0x1a, 0x01, - 0x14, 0x8d, 0x9f, 0x39, 0x9a, 0xae, 0x2f, 0x35, 0x17, 0xa1, 0x7c, 0xff, - 0x2c, 0x3f, 0x14, 0x2a, 0x09, 0x6a, 0xf7, 0x64, 0x23, 0xef, 0x00, 0x47, - 0x74, 0x77, 0xf6, 0xed, 0xdb, 0x77, 0xb3, 0x88, 0x63, 0x89, 0x3b, 0xd8, - 0x89, 0xcf, 0x66, 0x27, 0x7a, 0x3f, 0x78, 0xfa, 0x14, 0x16, 0xd0, 0x9a, - 0x11, 0x45, 0xd8, 0xc6, 0xb0, 0x40, 0xe3, 0xf0, 0x1e, 0xf5, 0xde, 0xc9, - 0xb3, 0x1b, 0x3b, 0x1e, 0xcb, 0xed, 0x0a, 0xa8, 0xab, 0xd3, 0x67, 0x28, - 0x38, 0xc5, 0xc6, 0x30, 0xe3, 0x2f, 0xc0, 0x57, 0x98, 0xb7, 0x42, 0x5b, - 0x5c, 0xf4, 0x27, 0xbb, 0x7f, 0x2b, 0x29, 0xa5, 0x8a, 0x5f, 0x49, 0x8c, - 0x81, 0x4e, 0x8c, 0x91, 0xb3, 0xbd, 0x34, 0x66, 0xcc, 0x98, 0x43, 0x89, - 0x2f, 0x6c, 0xf4, 0x9f, 0xaf, 0xba, 0x06, 0x58, 0x85, 0x17, 0x96, 0x1a, - 0xa7, 0xf1, 0x08, 0xdf, 0x33, 0x39, 0xbe, 0x77, 0x9b, 0x21, 0xc6, 0xf0, - 0x75, 0xf8, 0x9b, 0xc9, 0x83, 0xdb, 0x40, 0x80, 0x71, 0x9e, 0x76, 0xe9, - 0xa5, 0x97, 0x6e, 0x71, 0x93, 0xfc, 0x9c, 0xc0, 0x7f, 0xe0, 0x87, 0x7e, - 0x8c, 0x63, 0xa1, 0xa1, 0x26, 0x63, 0x36, 0x87, 0x71, 0x56, 0x8d, 0x49, - 0xff, 0xb2, 0x3d, 0x55, 0x0d, 0x1d, 0x21, 0x67, 0x67, 0xe3, 0x57, 0x64, - 0x47, 0x22, 0xb2, 0xad, 0x15, 0x3b, 0x39, 0x1d, 0x39, 0x3d, 0x11, 0xc3, - 0x02, 0xd0, 0xd4, 0xd0, 0xf1, 0x72, 0xbf, 0xa2, 0x32, 0x79, 0x07, 0x6e, - 0x18, 0xab, 0xfa, 0xdb, 0x90, 0xe9, 0x3d, 0xc0, 0x5c, 0x8a, 0x97, 0xdb, - 0xc5, 0x20, 0x2b, 0x9c, 0x49, 0x96, 0x1d, 0x2b, 0xf5, 0xb9, 0xd3, 0xef, - 0xee, 0x08, 0xdc, 0x17, 0x22, 0x37, 0x1c, 0xd9, 0x49, 0xf9, 0x52, 0x34, - 0xc2, 0x32, 0x9d, 0x93, 0x15, 0x1d, 0xd9, 0x7d, 0x5a, 0xc2, 0x24, 0xb9, - 0x04, 0x59, 0x32, 0x11, 0xba, 0x9c, 0xf9, 0x23, 0x8b, 0xf7, 0xe2, 0xa6, - 0x63, 0xa8, 0x8f, 0x21, 0x6e, 0x5e, 0x79, 0xf2, 0xa7, 0xae, 0x52, 0xa8, - 0xc2, 0xf9, 0xb3, 0xb0, 0xa0, 0x2f, 0xb3, 0x0e, 0xd4, 0xc9, 0x26, 0xe8, - 0x72, 0x94, 0xdf, 0x38, 0x76, 0xf7, 0x66, 0xb3, 0x18, 0xf1, 0x2f, 0xe2, - 0xb9, 0xfb, 0x79, 0x07, 0x73, 0x42, 0x7f, 0xfa, 0xfe, 0x59, 0x76, 0x4e, - 0x56, 0x22, 0xf7, 0xd3, 0x90, 0x9d, 0xb0, 0x4e, 0xf2, 0x2d, 0xf4, 0xc9, - 0x42, 0x26, 0x64, 0x29, 0x13, 0x46, 0xd9, 0xe2, 0x76, 0xaf, 0xbb, 0xf0, - 0xd1, 0x76, 0xe6, 0x89, 0x73, 0x28, 0x4d, 0xe3, 0x33, 0x11, 0x99, 0x7b, - 0x36, 0x4a, 0x83, 0x39, 0xd2, 0xae, 0x79, 0xb5, 0x00, 0x19, 0xbe, 0x9c, - 0xf1, 0x5c, 0xc0, 0xae, 0x5f, 0x3d, 0x9e, 0x93, 0x19, 0x2f, 0xdd, 0xc0, - 0x4c, 0x1f, 0x29, 0xd2, 0x3f, 0x9e, 0x1c, 0x83, 0x5f, 0x12, 0x6d, 0x6f, - 0x4a, 0xfb, 0xf4, 0x11, 0xbc, 0x79, 0x4a, 0x03, 0x19, 0xb7, 0x8b, 0x9d, - 0x84, 0x24, 0xc2, 0x9c, 0x67, 0x64, 0x9a, 0x14, 0x57, 0xc9, 0x5f, 0x3f, - 0x97, 0x0e, 0x6f, 0x0e, 0x41, 0x97, 0xfc, 0x93, 0x63, 0xbf, 0x07, 0xd1, - 0x67, 0xcd, 0x48, 0xbb, 0x9e, 0x71, 0xf5, 0x0e, 0x91, 0x23, 0xa5, 0x09, - 0x32, 0xdf, 0x3e, 0x8e, 0x3c, 0x68, 0xcd, 0x9c, 0xb1, 0x89, 0x45, 0x03, - 0xcd, 0x95, 0x7f, 0x42, 0x7e, 0x7c, 0xe2, 0x57, 0x66, 0x59, 0x7e, 0xd9, - 0x28, 0xfd, 0x1f, 0x60, 0x44, 0xec, 0x44, 0x76, 0x75, 0x82, 0x3f, 0x0f, - 0x2e, 0x2b, 0x41, 0x14, 0xe1, 0x41, 0x16, 0x1d, 0xaf, 0x06, 0xb3, 0xaa, - 0xcc, 0x33, 0x52, 0x98, 0x37, 0x41, 0xe2, 0x5f, 0x81, 0xf4, 0x0b, 0x6d, - 0x9e, 0x0e, 0x4f, 0x34, 0xa3, 0xac, 0x8b, 0x78, 0xfe, 0xbb, 0x78, 0x42, - 0x7d, 0xb6, 0x9c, 0x71, 0xb1, 0x02, 0x5e, 0x6c, 0x8c, 0x92, 0xdc, 0x1d, - 0x1d, 0xea, 0x3c, 0xf8, 0x5d, 0xaf, 0x8c, 0xe5, 0x41, 0x41, 0xe6, 0x15, - 0xa3, 0x3f, 0x10, 0xf5, 0x2f, 0xc7, 0x3c, 0xf5, 0x3b, 0x77, 0xa2, 0xed, - 0xd0, 0x0e, 0xe8, 0x0f, 0x78, 0x65, 0x22, 0x57, 0xbd, 0x73, 0x29, 0xde, - 0x70, 0xd2, 0x30, 0x4f, 0x1d, 0x44, 0x1e, 0xf1, 0x18, 0x9d, 0xe9, 0xf8, - 0x3f, 0x86, 0xff, 0x52, 0xc8, 0xa4, 0x51, 0x7f, 0xad, 0x80, 0xfe, 0x62, - 0x12, 0xd2, 0x30, 0x7f, 0x1d, 0xcb, 0xb3, 0xe6, 0xfc, 0x1f, 0xb8, 0x68, - 0x7e, 0x54, 0xde, 0x9a, 0xab, 0xe7, 0xb0, 0x98, 0x35, 0x9f, 0xab, 0xdb, - 0xe9, 0xfb, 0x36, 0x27, 0xc8, 0x83, 0x5d, 0xc8, 0xcd, 0xa4, 0xe9, 0x8d, - 0xbc, 0xbe, 0x1e, 0xba, 0x11, 0xe3, 0xe3, 0x74, 0xe4, 0x9c, 0xd2, 0xea, - 0xfb, 0x37, 0x87, 0x71, 0x31, 0x6d, 0xd0, 0x1c, 0xa8, 0xb9, 0x77, 0x17, - 0xf3, 0xa8, 0x53, 0x6e, 0xe8, 0xea, 0xf8, 0xe1, 0x9f, 0x0e, 0x19, 0x3e, - 0x8e, 0x61, 0x67, 0xb4, 0x10, 0x7d, 0xb1, 0x08, 0x1d, 0x4f, 0x7c, 0xa5, - 0xfe, 0x12, 0x3f, 0x6e, 0x63, 0xb1, 0x59, 0x6d, 0x08, 0xb0, 0xc0, 0x2b, - 0xb9, 0xa3, 0xf8, 0xc5, 0xf8, 0x0e, 0xfd, 0x74, 0x21, 0x7e, 0x93, 0xa1, - 0x2d, 0x90, 0xe6, 0xbe, 0x35, 0xd4, 0xe9, 0x57, 0xae, 0xfa, 0xce, 0xd0, - 0x01, 0x5c, 0xdc, 0x73, 0xaa, 0x74, 0x55, 0xe5, 0xbb, 0x8b, 0x63, 0xb9, - 0xc5, 0xf2, 0xc1, 0xcf, 0xcf, 0xa9, 0x0d, 0x8a, 0xaf, 0xba, 0x86, 0xdb, - 0xe1, 0x17, 0x51, 0x7e, 0xca, 0x13, 0x4c, 0xf2, 0xe8, 0x83, 0xd3, 0xd0, - 0xf3, 0xde, 0xc1, 0xb8, 0xca, 0x3c, 0xe5, 0x94, 0x53, 0x46, 0xa3, 0x0f, - 0xdc, 0x4d, 0xf0, 0x4a, 0xc8, 0xb4, 0x57, 0xd1, 0xcb, 0xed, 0x30, 0x30, - 0x36, 0x90, 0x68, 0x1d, 0x94, 0x0a, 0x0f, 0x39, 0x7f, 0x4d, 0xc7, 0xbd, - 0xe4, 0xc1, 0x16, 0xe6, 0x01, 0xf5, 0x71, 0x00, 0x3b, 0xa4, 0x2e, 0x97, - 0x30, 0x4f, 0x47, 0x89, 0x4f, 0x12, 0xc6, 0xca, 0xd1, 0x4a, 0x8f, 0xcc, - 0x19, 0xc2, 0x65, 0x09, 0xa4, 0x3e, 0x15, 0x2d, 0x62, 0x1e, 0x7e, 0x8b, - 0xab, 0xbe, 0xf1, 0xd1, 0x95, 0x8b, 0x8c, 0xda, 0xb0, 0x43, 0xc6, 0xcf, - 0xe5, 0x61, 0x01, 0x64, 0x78, 0xcd, 0x8f, 0x3f, 0xcb, 0xe2, 0x37, 0xa5, - 0x8f, 0xe8, 0xd0, 0x5d, 0x85, 0xdd, 0xbb, 0x90, 0xda, 0xae, 0x72, 0xb6, - 0x86, 0xee, 0xd5, 0x9f, 0xc6, 0xe9, 0x14, 0xee, 0x3c, 0xc9, 0x48, 0x4e, - 0x68, 0xbc, 0x0e, 0xe6, 0xaf, 0x51, 0xb7, 0x8e, 0x04, 0x2a, 0xee, 0x72, - 0x48, 0xd8, 0x49, 0x06, 0xc8, 0xa9, 0xef, 0x25, 0x7b, 0x75, 0xa2, 0x41, - 0x7d, 0xeb, 0xf4, 0x9d, 0x9e, 0x21, 0x37, 0x7f, 0x2a, 0x5e, 0x45, 0x5c, - 0x0e, 0xe3, 0xe5, 0x5b, 0x74, 0xa7, 0x9d, 0xf0, 0x41, 0x7d, 0x64, 0xf6, - 0xe1, 0x26, 0x13, 0x4e, 0x45, 0x1d, 0x8b, 0xdc, 0xad, 0x83, 0xf1, 0xad, - 0x13, 0xba, 0xe3, 0xf1, 0xcf, 0x00, 0x5f, 0x47, 0x07, 0xc4, 0xff, 0x58, - 0x9e, 0x93, 0x90, 0x83, 0xad, 0x90, 0xd3, 0x2b, 0x99, 0xeb, 0x52, 0x99, - 0xb3, 0x9b, 0xe3, 0x97, 0x88, 0x9f, 0xc2, 0x02, 0xcc, 0xbf, 0xd3, 0xb8, - 0x68, 0x3c, 0xe5, 0x40, 0x3f, 0xa2, 0x0b, 0xbe, 0x80, 0xfd, 0x92, 0x4d, - 0x39, 0x0f, 0xb1, 0xc8, 0xfa, 0x80, 0x4e, 0x00, 0xb0, 0x28, 0xfc, 0xbc, - 0xc2, 0x42, 0x71, 0xb8, 0x04, 0xf2, 0x98, 0x73, 0xa6, 0xb0, 0xf8, 0xb1, - 0x0e, 0x19, 0x53, 0x19, 0x03, 0xff, 0x1c, 0xfc, 0x1c, 0x1e, 0x71, 0xd5, - 0x67, 0x1b, 0x0b, 0x06, 0xaa, 0x8f, 0x78, 0x5e, 0x4e, 0x6d, 0xcf, 0x80, - 0x1c, 0x3c, 0xd0, 0x63, 0x1a, 0xf2, 0xc1, 0xe8, 0x37, 0xe8, 0x8b, 0x6c, - 0xbe, 0xa5, 0x33, 0x0c, 0xff, 0x0f, 0x21, 0x61, 0x18, 0x76, 0xe8, 0xa0, - 0x27, 0x23, 0xd7, 0xee, 0x01, 0xfb, 0x71, 0xc8, 0x84, 0x14, 0x16, 0x2b, - 0xd2, 0x68, 0xfb, 0x2c, 0x22, 0xec, 0x16, 0xdf, 0x87, 0x0b, 0xf8, 0xeb, - 0x26, 0x1f, 0x1d, 0xf8, 0x57, 0xf4, 0x99, 0x34, 0xca, 0x68, 0x06, 0x7f, - 0x8f, 0x53, 0x99, 0xd0, 0x29, 0xae, 0x78, 0xf1, 0xcc, 0x29, 0x97, 0xb1, - 0x18, 0x98, 0x8e, 0xdd, 0xb5, 0x96, 0x93, 0x7b, 0x9b, 0xd8, 0x2c, 0xcd, - 0x07, 0xef, 0x63, 0x98, 0x63, 0x5f, 0x60, 0x3e, 0xfe, 0x0a, 0x59, 0x73, - 0x12, 0xf6, 0x90, 0xda, 0x5a, 0x4c, 0x9f, 0x74, 0xe5, 0xb1, 0xc7, 0x6f, - 0xdd, 0x82, 0xa8, 0xa2, 0x99, 0xc7, 0xa5, 0xa4, 0xa4, 0xdc, 0x83, 0xa0, - 0x09, 0xb0, 0x42, 0xf2, 0x35, 0x99, 0xb8, 0x99, 0x3a, 0x9c, 0x27, 0xab, - 0x76, 0x8e, 0x62, 0x84, 0x32, 0x56, 0x35, 0xec, 0x19, 0xba, 0x31, 0x7e, - 0xc4, 0x51, 0xc7, 0x56, 0x94, 0xc1, 0xc3, 0xd9, 0xb2, 0x03, 0x59, 0x05, - 0xa5, 0x7d, 0x2c, 0xc2, 0xbd, 0x01, 0x46, 0xca, 0x0a, 0x8c, 0x9b, 0x07, - 0x09, 0xd4, 0xa0, 0xf3, 0xe6, 0x9d, 0xcb, 0xb1, 0x0f, 0x0d, 0xe2, 0xdf, - 0xa0, 0xda, 0x50, 0xb3, 0x41, 0x83, 0x06, 0x1d, 0x87, 0x01, 0xd4, 0x06, - 0xa5, 0x68, 0x14, 0x0a, 0x73, 0x33, 0x26, 0xb1, 0xad, 0xb4, 0xab, 0x06, - 0x0a, 0x9c, 0x76, 0x27, 0xf4, 0x95, 0xd8, 0x97, 0x89, 0x37, 0x13, 0x72, - 0x26, 0x10, 0xae, 0x91, 0x9c, 0xda, 0x7b, 0x0d, 0x24, 0x8c, 0x9d, 0x41, - 0x8e, 0x20, 0xa8, 0xca, 0xca, 0xd5, 0x85, 0x7c, 0xe1, 0x7a, 0x20, 0xc7, - 0x8b, 0x9a, 0xa1, 0x2c, 0x1f, 0xcc, 0x3b, 0x8f, 0x62, 0xc6, 0x18, 0x18, - 0xc1, 0xe9, 0x74, 0xfe, 0xda, 0x6d, 0x03, 0x2b, 0xe3, 0x57, 0xe0, 0xb7, - 0x08, 0xca, 0x87, 0x29, 0x1a, 0xc3, 0xb0, 0xdf, 0xc0, 0x58, 0x52, 0xb6, - 0xc4, 0x50, 0x12, 0xae, 0x5e, 0xe6, 0x0d, 0x52, 0xef, 0x8b, 0x18, 0x48, - 0xd5, 0x58, 0x31, 0x5b, 0x8b, 0x81, 0x37, 0x81, 0x38, 0x66, 0xd0, 0x70, - 0xcb, 0x67, 0x0b, 0x3b, 0x75, 0x8a, 0x47, 0x71, 0x9d, 0x40, 0x58, 0x4d, - 0x76, 0xc2, 0x56, 0xb1, 0x12, 0xfe, 0x0e, 0xde, 0xfb, 0xc3, 0x84, 0xa7, - 0x70, 0x3c, 0xbd, 0x23, 0x78, 0x4d, 0xe4, 0xb9, 0x2d, 0xa4, 0xbc, 0x55, - 0xdf, 0x54, 0x14, 0xb7, 0x01, 0x28, 0xf2, 0xfd, 0x51, 0x10, 0x6a, 0xb0, - 0xb8, 0x90, 0xcc, 0x40, 0xdf, 0xc9, 0xd1, 0x90, 0x4d, 0x2c, 0x30, 0x48, - 0x19, 0xae, 0x41, 0x7f, 0xad, 0x0a, 0xc5, 0xe5, 0x52, 0xcc, 0x09, 0x67, - 0x19, 0xa3, 0xd1, 0xba, 0xb2, 0xe2, 0x17, 0x31, 0x30, 0xa6, 0x20, 0x58, - 0x8e, 0x67, 0x31, 0x25, 0x85, 0x57, 0x14, 0x5a, 0xf7, 0xe8, 0xd1, 0xe3, - 0x5b, 0x9e, 0x3f, 0xa1, 0x3d, 0x83, 0xe8, 0xab, 0xf9, 0xde, 0x82, 0x50, - 0x64, 0xae, 0xc6, 0x40, 0xb8, 0x8c, 0xc9, 0x27, 0x3c, 0xf1, 0xb8, 0xe3, - 0x68, 0x62, 0x24, 0xad, 0xde, 0xaf, 0xd2, 0xea, 0x7d, 0x31, 0x47, 0x5f, - 0xb4, 0x23, 0xed, 0x83, 0xd0, 0xd9, 0xdc, 0x67, 0xa2, 0xc0, 0xef, 0xc4, - 0x00, 0x5f, 0xc6, 0x84, 0x24, 0x41, 0xe7, 0x75, 0x41, 0xde, 0x55, 0xef, - 0x8a, 0x62, 0xd7, 0x99, 0x55, 0xe8, 0xcd, 0x08, 0x81, 0x7f, 0x11, 0xe1, - 0x0b, 0x48, 0x13, 0xbf, 0xda, 0xa5, 0xbf, 0x86, 0xa9, 0x8c, 0x31, 0x24, - 0x7e, 0xd1, 0x87, 0x34, 0x02, 0x3c, 0x6b, 0xc2, 0xc8, 0xd2, 0x4e, 0x0c, - 0xc2, 0xb4, 0x2a, 0xca, 0xae, 0x94, 0x8b, 0x22, 0xea, 0xa2, 0xff, 0xaf, - 0xd7, 0x18, 0x90, 0x53, 0xd8, 0xf1, 0xba, 0x61, 0x27, 0xf1, 0x74, 0x2e, - 0xa2, 0xb0, 0x23, 0xac, 0x0f, 0x0f, 0xe2, 0x19, 0xf7, 0x84, 0x13, 0xc0, - 0xf0, 0x7f, 0x93, 0x15, 0x61, 0xf1, 0x94, 0x5c, 0x23, 0x76, 0x3a, 0xba, - 0x60, 0xd4, 0x1f, 0xcb, 0x11, 0xfe, 0x46, 0x2c, 0x82, 0x8d, 0xc4, 0xef, - 0x20, 0x05, 0xa0, 0x30, 0x39, 0xe3, 0x11, 0x21, 0xde, 0x80, 0x47, 0x5f, - 0x8c, 0x14, 0x2f, 0x4a, 0x17, 0xc4, 0x28, 0x48, 0x06, 0x73, 0xbd, 0x83, - 0xbc, 0x86, 0x34, 0xe1, 0x71, 0x46, 0x5b, 0x0b, 0x39, 0x01, 0x22, 0x4c, - 0x4c, 0xbb, 0x94, 0xa5, 0xc2, 0xb3, 0x20, 0x09, 0xf3, 0x12, 0x8e, 0xdd, - 0xbc, 0x2d, 0xf0, 0x9d, 0xea, 0x17, 0xce, 0x87, 0x7b, 0x3d, 0xa7, 0x42, - 0xaa, 0xab, 0xfe, 0x73, 0x3b, 0x93, 0xbf, 0xc8, 0xaa, 0x06, 0x5f, 0xd6, - 0x0b, 0xf9, 0xc5, 0xa2, 0xd8, 0x2c, 0xc4, 0xa0, 0x5f, 0xc2, 0xe9, 0x9d, - 0x9a, 0x2c, 0xce, 0xd5, 0x45, 0x69, 0x54, 0x58, 0x02, 0x14, 0x76, 0x8c, - 0xed, 0xa1, 0x1c, 0xfd, 0x9a, 0x8d, 0x87, 0x33, 0x26, 0xb9, 0xc6, 0x70, - 0xbc, 0x4b, 0x46, 0xff, 0xad, 0xd0, 0xdf, 0xee, 0x98, 0x94, 0x8b, 0x38, - 0x89, 0xf3, 0x33, 0x86, 0xee, 0x16, 0xea, 0x71, 0x2e, 0xca, 0xec, 0x7d, - 0x28, 0x6b, 0x9f, 0xb0, 0x00, 0xa5, 0x71, 0xbe, 0x5b, 0x0e, 0x1e, 0x2f, - 0xe4, 0x34, 0xd2, 0x04, 0xe4, 0xc6, 0xb5, 0xc8, 0x58, 0xbd, 0x93, 0x56, - 0x1b, 0x7e, 0x2e, 0x60, 0xb2, 0x9a, 0xc8, 0xe2, 0xdc, 0x59, 0x11, 0x32, - 0x77, 0xc6, 0x3e, 0x06, 0xd9, 0x87, 0x2c, 0xa0, 0x5c, 0xcf, 0x02, 0xe2, - 0xc3, 0x18, 0x04, 0xb7, 0x29, 0x2e, 0x3c, 0xac, 0x8b, 0xde, 0xed, 0xd4, - 0x3f, 0x67, 0x04, 0xc8, 0x33, 0x5e, 0x1e, 0x3e, 0x2e, 0x88, 0x12, 0x93, - 0xa0, 0x38, 0x28, 0x1c, 0x52, 0x90, 0xc2, 0x8e, 0x05, 0xc6, 0x7c, 0x8c, - 0xf1, 0x5d, 0x9c, 0x52, 0x72, 0x8e, 0x9a, 0x6b, 0xe1, 0x11, 0x9e, 0xfd, - 0x81, 0x08, 0x2f, 0x42, 0x5a, 0xf0, 0x2c, 0x8c, 0x36, 0x7f, 0x65, 0x4a, - 0x7a, 0x8d, 0xb3, 0xb0, 0x43, 0x96, 0xe5, 0xb3, 0xa8, 0xb6, 0x19, 0xc3, - 0x43, 0xdf, 0x69, 0xa8, 0xcf, 0x18, 0x4b, 0xb8, 0xfc, 0xf2, 0xcb, 0x07, - 0x30, 0x0e, 0xdc, 0x8a, 0x84, 0xe2, 0x8b, 0xb7, 0x54, 0xde, 0xd3, 0xc8, - 0xb1, 0x0f, 0x50, 0x50, 0xce, 0xe0, 0x15, 0x8f, 0xd3, 0xf9, 0x2b, 0xb8, - 0x56, 0x7c, 0x43, 0xa1, 0x3a, 0x13, 0xf2, 0x2b, 0x2c, 0x66, 0xfe, 0x4e, - 0xfb, 0x7f, 0x52, 0xe4, 0x3d, 0xe9, 0x50, 0x8c, 0xfd, 0xc6, 0x5b, 0x0e, - 0x8a, 0xcc, 0x17, 0xec, 0x7e, 0xff, 0x8b, 0xbf, 0x9c, 0x3b, 0x10, 0x99, - 0x53, 0x07, 0x99, 0x12, 0x07, 0x2f, 0xb7, 0x82, 0x1f, 0xb2, 0x91, 0xd7, - 0xa3, 0xa9, 0x83, 0x14, 0x2c, 0xd5, 0x3b, 0x1d, 0xe3, 0x23, 0x0b, 0xfc, - 0x6b, 0xb0, 0x33, 0x5e, 0x9b, 0xb9, 0xa9, 0x29, 0xf2, 0x69, 0x3c, 0xca, - 0x70, 0x26, 0xbb, 0x56, 0x67, 0xf0, 0x37, 0x5d, 0x4d, 0x59, 0x90, 0x69, - 0xc0, 0x18, 0xcf, 0xc7, 0xcf, 0xc1, 0xd4, 0xd4, 0x9f, 0x7c, 0xba, 0x33, - 0x66, 0xba, 0xf1, 0xea, 0x42, 0x16, 0xf3, 0x76, 0x1c, 0x8b, 0xba, 0x27, - 0x30, 0x3f, 0x1e, 0xcb, 0xfc, 0x20, 0xf9, 0xef, 0x75, 0xe2, 0x85, 0xd5, - 0x18, 0xa7, 0x6f, 0x60, 0xf4, 0x3c, 0x04, 0x1f, 0x49, 0x16, 0xa9, 0x9f, - 0xd4, 0xa7, 0x66, 0xfc, 0x14, 0x4b, 0xc3, 0x1c, 0xd1, 0x15, 0xc5, 0xef, - 0x56, 0x64, 0x50, 0x16, 0x65, 0x3c, 0x4e, 0xa0, 0xf8, 0xb8, 0x98, 0x8c, - 0x2a, 0x96, 0xa0, 0xfc, 0x0f, 0x2a, 0x77, 0x1d, 0x73, 0xf3, 0xb7, 0x17, - 0x5d, 0x74, 0xd1, 0xf9, 0xb4, 0xe5, 0x6e, 0x9e, 0x2f, 0x82, 0xbc, 0x73, - 0x62, 0x79, 0x72, 0x4e, 0x64, 0x97, 0xe8, 0x08, 0x8c, 0x6f, 0xfd, 0x05, - 0xeb, 0xdb, 0x24, 0x74, 0xcf, 0x5d, 0x69, 0xc8, 0xb4, 0xe7, 0x68, 0x77, - 0x7b, 0x3e, 0x86, 0xd9, 0x9b, 0xb0, 0x91, 0x90, 0xfa, 0x61, 0x6f, 0x3b, - 0x7d, 0x44, 0xeb, 0x42, 0x94, 0xc3, 0x47, 0x90, 0x69, 0x29, 0xc8, 0xd1, - 0x1c, 0xe4, 0xeb, 0x0e, 0x78, 0x27, 0xd7, 0x8c, 0x3b, 0x78, 0xbc, 0x84, - 0xfe, 0xc6, 0x98, 0x5b, 0x49, 0xc5, 0xdc, 0x73, 0xbf, 0x8e, 0x90, 0xff, - 0xae, 0xca, 0x22, 0x63, 0x1a, 0x73, 0x89, 0x15, 0xe1, 0x3a, 0xc9, 0x8f, - 0x3c, 0xd7, 0x73, 0x91, 0xce, 0xe6, 0xc5, 0xcf, 0xdd, 0xbf, 0xb1, 0xa4, - 0xdd, 0x5f, 0xf1, 0xc9, 0x5f, 0xfd, 0xe9, 0x6e, 0x7f, 0x0e, 0x7c, 0xb1, - 0x1c, 0xbf, 0xa3, 0x15, 0x1e, 0x72, 0x71, 0x2c, 0x72, 0x35, 0xd3, 0x3d, - 0x7f, 0xc9, 0xd9, 0x0a, 0x39, 0x74, 0xbf, 0x09, 0x60, 0x4e, 0xd5, 0xc2, - 0xb2, 0xfe, 0xfa, 0x2d, 0x80, 0xf1, 0x58, 0x13, 0xff, 0x12, 0x6d, 0x30, - 0x71, 0x4b, 0xb9, 0x16, 0x32, 0x4f, 0x6e, 0xe5, 0x34, 0x66, 0x1a, 0xba, - 0x49, 0x75, 0xe6, 0x82, 0x81, 0xd4, 0xef, 0x1d, 0xe6, 0xf3, 0x96, 0xc8, - 0xa8, 0x9b, 0x94, 0x37, 0xf3, 0xb0, 0x64, 0xbc, 0xc6, 0x4a, 0x31, 0x47, - 0xd8, 0x12, 0x3c, 0xdc, 0x46, 0x42, 0x1e, 0x46, 0x8e, 0xda, 0x1f, 0x20, - 0xbd, 0x0c, 0x49, 0xbf, 0xb1, 0xa9, 0xe0, 0xbd, 0xe2, 0x58, 0x58, 0x4b, - 0x84, 0x5e, 0x07, 0xa3, 0x18, 0xc6, 0x4d, 0x16, 0xf7, 0x0f, 0xb1, 0x88, - 0xae, 0x39, 0xd4, 0x8d, 0x7f, 0x45, 0xcb, 0xd6, 0x9c, 0xab, 0x7e, 0x2d, - 0x80, 0x55, 0xe8, 0x26, 0xe7, 0xeb, 0xee, 0xd2, 0x43, 0xf4, 0xf1, 0x4f, - 0x5d, 0xd5, 0xff, 0xd2, 0x21, 0xc2, 0x6d, 0x8e, 0x12, 0x9f, 0x38, 0x74, - 0x89, 0xba, 0xc2, 0x19, 0x79, 0x32, 0x99, 0xf4, 0x6e, 0x7e, 0xcb, 0x41, - 0x06, 0xe8, 0x88, 0x72, 0x80, 0x38, 0xf5, 0x09, 0x8b, 0x87, 0x9c, 0xb2, - 0xb8, 0x4a, 0xf7, 0x59, 0xe5, 0x7e, 0xe6, 0xde, 0x8f, 0x3f, 0xc5, 0xab, - 0xe5, 0xe1, 0x37, 0xb2, 0xf9, 0x8f, 0xa3, 0x5e, 0x5a, 0x3c, 0x52, 0xdb, - 0xdd, 0xfd, 0xef, 0xbe, 0x57, 0xe4, 0x6c, 0x74, 0xdf, 0xd7, 0x30, 0x68, - 0x0f, 0x42, 0xa7, 0xaf, 0x83, 0x4e, 0x7e, 0x1e, 0x3c, 0x7b, 0x3e, 0xf3, - 0x92, 0x5e, 0xd3, 0x18, 0xc8, 0x18, 0xfb, 0x44, 0x91, 0xfe, 0x26, 0xa7, - 0xba, 0x6d, 0xe5, 0x35, 0xb4, 0x09, 0xc8, 0xb4, 0xbe, 0x18, 0xcd, 0x5a, - 0x18, 0xd6, 0xbc, 0x13, 0xe4, 0x9b, 0x0e, 0xba, 0xd7, 0x5f, 0x90, 0x7e, - 0xc7, 0x65, 0x3b, 0x94, 0xc7, 0x69, 0x11, 0xe9, 0xf1, 0x0f, 0x52, 0xdf, - 0x23, 0xb0, 0x17, 0x7e, 0x61, 0xae, 0xaa, 0xcc, 0x3c, 0xf8, 0x1b, 0x98, - 0xe9, 0xef, 0x5f, 0x0f, 0xe4, 0x35, 0xe1, 0xe6, 0xcc, 0x1d, 0x47, 0xa3, - 0x6b, 0xea, 0x34, 0xf2, 0x04, 0xd2, 0x18, 0xf9, 0x9b, 0x06, 0x36, 0x6f, - 0x31, 0xd7, 0x75, 0xe7, 0xf5, 0xbe, 0x6e, 0xf8, 0x07, 0xd0, 0xa1, 0xa7, - 0xe2, 0xf7, 0x36, 0xb7, 0xc2, 0xcb, 0x38, 0xd5, 0x27, 0x0d, 0x19, 0x3b, - 0x1c, 0xbd, 0xfb, 0x21, 0xf2, 0xbf, 0x99, 0xe7, 0xe1, 0x90, 0xbe, 0x23, - 0xe3, 0xd4, 0x87, 0xc5, 0xd1, 0x6f, 0x78, 0x56, 0x7d, 0xbc, 0xb8, 0x06, - 0x98, 0x83, 0xab, 0xa2, 0x13, 0x7f, 0x29, 0xde, 0xe2, 0xc3, 0x9d, 0x3f, - 0x80, 0xe7, 0x33, 0xc4, 0xd3, 0x42, 0x9e, 0x3b, 0x6e, 0x02, 0xe3, 0xff, - 0x05, 0x70, 0x6e, 0x81, 0x7f, 0x80, 0x8d, 0xa4, 0xad, 0xcc, 0xd1, 0x2a, - 0x43, 0x3a, 0xde, 0x9e, 0xe0, 0x7d, 0x65, 0x2b, 0xa7, 0xbc, 0x52, 0xd1, - 0x01, 0xde, 0x86, 0x2f, 0x2f, 0xa3, 0x8c, 0x23, 0x78, 0x3e, 0x82, 0x85, - 0x85, 0xe5, 0x5c, 0xbf, 0x87, 0xc4, 0xbb, 0x71, 0x7c, 0x37, 0x63, 0x16, - 0x8b, 0xf3, 0x0b, 0xb9, 0xff, 0x85, 0x79, 0xb8, 0x3e, 0xa7, 0x4e, 0x0e, - 0xe7, 0xfe, 0x10, 0x5e, 0xe1, 0x69, 0x0a, 0xa6, 0x41, 0x6c, 0xbf, 0xa5, - 0xe0, 0x24, 0xfb, 0x36, 0xcc, 0xcb, 0xdc, 0xef, 0x55, 0xe7, 0x68, 0x5b, - 0xbb, 0x53, 0x02, 0xef, 0x15, 0xd7, 0x43, 0x39, 0x38, 0x15, 0xa5, 0x2b, - 0x3b, 0xf4, 0xbe, 0x43, 0x96, 0x4f, 0x7e, 0x85, 0x4c, 0x34, 0x52, 0x12, - 0xf4, 0x05, 0xdf, 0xfd, 0xb8, 0x84, 0x85, 0x81, 0xee, 0x19, 0xc4, 0x52, - 0xa2, 0xf5, 0xe5, 0x44, 0xc5, 0x71, 0x77, 0xa0, 0xbc, 0xcb, 0xe5, 0x30, - 0xb6, 0x13, 0x50, 0x34, 0x46, 0x33, 0xa9, 0xb5, 0xc7, 0x90, 0xdb, 0x88, - 0x00, 0xbf, 0x8b, 0x0c, 0x64, 0x7c, 0x1b, 0x06, 0x75, 0xe7, 0x27, 0xbf, - 0x39, 0xd0, 0x07, 0xd0, 0x10, 0xe8, 0x01, 0x56, 0xa0, 0xae, 0x81, 0x71, - 0xf5, 0x7e, 0x6e, 0x35, 0x18, 0xb1, 0x2b, 0x7e, 0xb1, 0x7c, 0x38, 0xe7, - 0x6a, 0x29, 0x3b, 0x28, 0xce, 0xb1, 0x74, 0xaa, 0xbe, 0x76, 0x39, 0x1d, - 0xfa, 0x83, 0x01, 0xf2, 0x4b, 0x4a, 0x4a, 0x4a, 0x65, 0xea, 0x1f, 0xc7, - 0xfd, 0x54, 0xfc, 0x16, 0x10, 0xdf, 0xb4, 0x4d, 0xed, 0x90, 0xe2, 0xa8, - 0x45, 0x01, 0x31, 0xb1, 0x48, 0x8c, 0x37, 0x0c, 0xd9, 0xab, 0x09, 0x51, - 0x2b, 0xc7, 0x9a, 0x20, 0x35, 0x59, 0x06, 0x98, 0x6c, 0xb6, 0xe8, 0x8a, - 0xb2, 0xa1, 0xfa, 0x68, 0x02, 0x14, 0x33, 0xa7, 0x41, 0x6b, 0x08, 0xfb, - 0x99, 0xab, 0x56, 0x22, 0xdb, 0x71, 0xf1, 0x9b, 0xcc, 0x12, 0xa9, 0xab, - 0xbe, 0xc6, 0xa8, 0x63, 0x64, 0x23, 0x88, 0xb3, 0x03, 0x2a, 0x86, 0x23, - 0xfd, 0xd4, 0x9d, 0xc1, 0xab, 0xaf, 0xb8, 0xa7, 0x21, 0x50, 0xaf, 0x22, - 0x5c, 0x4a, 0xd6, 0xfd, 0x28, 0xea, 0x37, 0xe9, 0x9d, 0x73, 0x06, 0x7a, - 0x4b, 0xfa, 0x50, 0xed, 0x35, 0x4e, 0x13, 0xd8, 0x47, 0x30, 0xf4, 0xf9, - 0x0c, 0xe0, 0x27, 0x19, 0x64, 0x23, 0x59, 0x00, 0x78, 0x92, 0xe3, 0xf9, - 0x37, 0xb2, 0x50, 0x90, 0x0c, 0xa3, 0x06, 0x30, 0x80, 0x64, 0x14, 0x17, - 0x98, 0x04, 0x7b, 0xf1, 0xaa, 0x01, 0x34, 0x9e, 0x41, 0x7e, 0x16, 0x83, - 0x6b, 0x20, 0xfd, 0x30, 0x97, 0x9d, 0x8e, 0xcd, 0xe0, 0x71, 0x22, 0x82, - 0x63, 0x1e, 0xd8, 0x8f, 0x66, 0xf5, 0x5f, 0x83, 0xc9, 0xb8, 0x44, 0x04, - 0xef, 0x81, 0x7c, 0x70, 0xa3, 0x21, 0xca, 0x56, 0x23, 0x3f, 0x52, 0x18, - 0x2b, 0x83, 0x07, 0x92, 0x20, 0x6c, 0xbc, 0xb1, 0x3b, 0x70, 0x24, 0x79, - 0x8d, 0x21, 0xcf, 0x39, 0x2c, 0x8a, 0xf4, 0xb9, 0xfd, 0xf6, 0xdb, 0x37, - 0xa9, 0x2c, 0x04, 0x60, 0x7f, 0x04, 0xdd, 0xd9, 0xc4, 0x9d, 0x08, 0xa9, - 0x2e, 0x6e, 0x17, 0x0b, 0xee, 0x7d, 0x24, 0x08, 0x59, 0x45, 0x7e, 0x9f, - 0x80, 0x2f, 0x20, 0xf5, 0xbb, 0xc1, 0x3f, 0x48, 0xff, 0xa5, 0xb3, 0xf3, - 0x94, 0x2c, 0x3f, 0x8c, 0xce, 0x5d, 0x2c, 0x84, 0x54, 0xe5, 0x3e, 0x40, - 0x5b, 0x3a, 0xc0, 0x67, 0x31, 0x94, 0xa7, 0x09, 0x2c, 0x80, 0xc1, 0xad, - 0x77, 0x55, 0x57, 0x73, 0x5b, 0xc8, 0x82, 0xcc, 0x11, 0xf4, 0x69, 0x0d, - 0xfa, 0xaa, 0x90, 0x93, 0x0a, 0x99, 0xbc, 0x83, 0x95, 0x2e, 0xd2, 0xbd, - 0xfc, 0x08, 0xab, 0x89, 0x02, 0xec, 0x6e, 0xb3, 0xb2, 0x08, 0xd0, 0x37, - 0x33, 0xb8, 0x8c, 0x86, 0x54, 0x0f, 0xf1, 0xf4, 0x2d, 0xfc, 0x35, 0xcd, - 0x93, 0xf0, 0x6d, 0x11, 0x06, 0x53, 0x4b, 0x0c, 0x75, 0x8d, 0xbf, 0x02, - 0x0c, 0x92, 0xb5, 0x5c, 0x03, 0x18, 0xe7, 0xed, 0xb9, 0xec, 0x96, 0x1c, - 0x60, 0xc5, 0xbf, 0x23, 0x93, 0x41, 0x2c, 0x0a, 0xae, 0xb0, 0x11, 0xdf, - 0x7a, 0x85, 0xeb, 0x18, 0xfc, 0x3e, 0x73, 0xd1, 0xe7, 0xdc, 0x8f, 0x85, - 0xdc, 0x4a, 0x1e, 0x8f, 0x7f, 0x39, 0x16, 0x8f, 0x9e, 0xe4, 0xee, 0x58, - 0xe8, 0x68, 0x17, 0xf5, 0xe1, 0x5e, 0x3b, 0x1c, 0x1a, 0xb3, 0xfa, 0xcb, - 0x2f, 0x95, 0x13, 0x60, 0x51, 0x40, 0x63, 0x42, 0xf5, 0xd7, 0xdf, 0xb6, - 0x8d, 0xc2, 0xf8, 0x3c, 0x11, 0x81, 0x7a, 0xaf, 0xc2, 0x10, 0xfe, 0xf2, - 0x37, 0xe3, 0x51, 0x5e, 0x01, 0x0c, 0xfa, 0xa9, 0x5c, 0x3e, 0x86, 0x3e, - 0x0a, 0xd1, 0xc7, 0x21, 0x3f, 0x1e, 0xf7, 0xbc, 0x93, 0x16, 0xac, 0x5c, - 0x19, 0x2f, 0x86, 0x1f, 0x8a, 0x15, 0x82, 0x0c, 0xc8, 0x87, 0xe7, 0x6e, - 0xa6, 0xee, 0x0f, 0xc3, 0x6f, 0x8b, 0x50, 0xa2, 0xe2, 0x99, 0xd8, 0x86, - 0x69, 0x31, 0xad, 0x58, 0xc4, 0x0a, 0x3c, 0x68, 0x77, 0x1c, 0x3c, 0xb0, - 0x31, 0x17, 0x64, 0x23, 0xbf, 0xba, 0xd2, 0xff, 0x47, 0xc2, 0xa3, 0x9a, - 0x84, 0xd7, 0x68, 0x71, 0xaa, 0x94, 0x2c, 0x33, 0xb5, 0xfb, 0x81, 0x5c, - 0xd0, 0xee, 0xe4, 0xc9, 0x18, 0xac, 0x4d, 0x34, 0xde, 0x43, 0xae, 0x88, - 0x05, 0x85, 0x3f, 0x19, 0x2b, 0x85, 0x4c, 0x5a, 0x89, 0x28, 0x13, 0x95, - 0x4d, 0x80, 0xb9, 0x22, 0x2f, 0x13, 0x50, 0xc0, 0x13, 0x29, 0x5b, 0x4a, - 0xb4, 0x64, 0x7a, 0x98, 0x1f, 0x58, 0x78, 0x5c, 0xc7, 0xae, 0xd7, 0xd3, - 0x18, 0x7c, 0x03, 0x98, 0xe0, 0x6f, 0xc4, 0x30, 0x3f, 0x83, 0xf0, 0x5b, - 0xa0, 0xd9, 0x90, 0xd3, 0xb7, 0xd1, 0xe6, 0x0f, 0x66, 0x85, 0xac, 0xe4, - 0x8b, 0x8f, 0xc3, 0xf9, 0x23, 0xc7, 0x36, 0x60, 0xb8, 0x9e, 0x09, 0x2f, - 0x9e, 0xcb, 0xe2, 0xe7, 0x32, 0x8d, 0x2f, 0x26, 0xfe, 0x07, 0x88, 0xe3, - 0x27, 0xa7, 0x84, 0x41, 0x3a, 0xb4, 0x18, 0xd2, 0xdf, 0x37, 0x9d, 0xc9, - 0xea, 0xfd, 0x3d, 0x18, 0xba, 0x1a, 0xbf, 0xfa, 0xfa, 0xec, 0xd5, 0x5c, - 0xfd, 0xe4, 0x2d, 0xde, 0xa5, 0xba, 0x22, 0xc6, 0x9b, 0x33, 0x89, 0xf3, - 0xfe, 0x66, 0x6d, 0x6f, 0x4c, 0x14, 0xc1, 0x3a, 0xf2, 0xa3, 0xfe, 0x8a, - 0x63, 0xfa, 0x41, 0x6d, 0x58, 0xc7, 0xdc, 0xb3, 0x0c, 0x1e, 0x88, 0xe1, - 0x28, 0xe1, 0xc9, 0x7c, 0xb5, 0xfa, 0x34, 0xd8, 0x47, 0x1f, 0xaf, 0x5b, - 0xa2, 0x30, 0xc8, 0xb4, 0x33, 0x1f, 0xc3, 0x7b, 0x3b, 0x72, 0xa3, 0x0a, - 0xff, 0x1c, 0xd2, 0x93, 0x7e, 0x8e, 0x61, 0x9e, 0xfb, 0x1a, 0xd9, 0xfe, - 0x25, 0xbb, 0x7f, 0x45, 0x2c, 0xf2, 0x9c, 0x46, 0x5f, 0xd7, 0xc1, 0x68, - 0xd1, 0xe2, 0x57, 0x58, 0x5e, 0xe1, 0x9f, 0xc4, 0x5c, 0xfd, 0x2a, 0xb2, - 0xb2, 0x00, 0x05, 0x6e, 0x04, 0xc7, 0x19, 0xc7, 0xab, 0x5f, 0x19, 0x2f, - 0xaf, 0xb9, 0x4e, 0x71, 0x91, 0xa4, 0x98, 0xcb, 0x24, 0xfe, 0xbb, 0x92, - 0x6f, 0xe4, 0x5d, 0x88, 0xcc, 0xfd, 0x84, 0xd0, 0xac, 0x62, 0x31, 0x42, - 0x0f, 0xe0, 0x56, 0x9d, 0xbc, 0x46, 0xb0, 0x2b, 0xa1, 0x57, 0xab, 0xbe, - 0xc5, 0x5b, 0x63, 0x2c, 0xd3, 0x2f, 0xee, 0x6e, 0xfa, 0x65, 0x82, 0xc9, - 0xeb, 0xc8, 0xf5, 0x6c, 0x64, 0xe6, 0x99, 0x28, 0xd7, 0x75, 0x77, 0x33, - 0xbf, 0x20, 0x47, 0xfd, 0xbf, 0x63, 0x41, 0x64, 0x30, 0xf9, 0x2c, 0x84, - 0xdc, 0xbc, 0xa2, 0x3e, 0x9a, 0xc2, 0xe2, 0xc4, 0xb3, 0xf4, 0xe5, 0x44, - 0xee, 0x77, 0x4b, 0x56, 0x92, 0x3e, 0x2a, 0x07, 0xff, 0x9e, 0x88, 0xae, - 0x34, 0x82, 0x9d, 0x9e, 0x7a, 0xf4, 0x5b, 0x2a, 0x3c, 0xb1, 0x98, 0xfe, - 0xfe, 0x83, 0xf1, 0xb8, 0x00, 0xf9, 0xef, 0xd4, 0x0f, 0xfe, 0x34, 0xbc, - 0x13, 0xce, 0x93, 0x79, 0x46, 0xf7, 0x86, 0x4f, 0x74, 0x5f, 0xc4, 0x02, - 0x95, 0x13, 0x9f, 0xc5, 0x4a, 0xc5, 0x57, 0xfd, 0x63, 0x59, 0x90, 0x71, - 0xf8, 0x1a, 0x83, 0x50, 0x61, 0xee, 0xf6, 0xf2, 0x58, 0xc2, 0xe9, 0xab, - 0xff, 0x8e, 0x27, 0xfd, 0xab, 0x31, 0xea, 0x2e, 0xb7, 0x90, 0xb1, 0xee, - 0x95, 0xe3, 0xb1, 0x2c, 0x38, 0x3b, 0x72, 0x17, 0xe3, 0x7c, 0x0b, 0x3c, - 0xbc, 0x12, 0x5a, 0x61, 0x88, 0xb6, 0xac, 0xc6, 0x38, 0x5c, 0xcd, 0x02, - 0xa4, 0x0c, 0x0e, 0x77, 0x5e, 0x25, 0x0a, 0x2e, 0xc5, 0x23, 0x9d, 0xd3, - 0x4f, 0xa3, 0x30, 0x04, 0xb2, 0x68, 0xc3, 0x2d, 0x28, 0xf9, 0x73, 0x68, - 0xbb, 0xbe, 0x16, 0xdd, 0x08, 0x99, 0xb4, 0x9e, 0xb1, 0x30, 0x82, 0xb4, - 0xde, 0x7a, 0xe9, 0x23, 0x8a, 0x1a, 0xdb, 0x6e, 0x7c, 0xb4, 0xe8, 0xe8, - 0x3c, 0x33, 0xfe, 0x8b, 0xcd, 0x15, 0xa5, 0x94, 0xbd, 0x47, 0x82, 0x54, - 0x1e, 0x0b, 0x03, 0x89, 0x6c, 0xd8, 0x64, 0xa0, 0x9f, 0x65, 0xb3, 0x6b, - 0xb7, 0x1f, 0x3a, 0xd5, 0x00, 0x32, 0xaf, 0x28, 0x26, 0xc5, 0xea, 0x85, - 0x8c, 0x37, 0xf2, 0xc5, 0xc9, 0x2f, 0xd4, 0xce, 0x62, 0x79, 0x7b, 0xdb, - 0x1c, 0x25, 0x3e, 0x31, 0xf0, 0x52, 0x21, 0xfd, 0x18, 0x60, 0xf3, 0x4a, - 0x65, 0xb8, 0xf1, 0x2c, 0x64, 0x51, 0x37, 0x97, 0xb2, 0x03, 0x2e, 0x7e, - 0x0b, 0xd7, 0x0b, 0xfe, 0x15, 0xc6, 0xee, 0xf8, 0x7e, 0xfc, 0x59, 0x5e, - 0x7e, 0x0b, 0xe7, 0xaf, 0x1b, 0xe6, 0xba, 0x12, 0x7d, 0x5c, 0x2c, 0xc2, - 0x5f, 0x0f, 0x92, 0x8b, 0x13, 0x75, 0x52, 0x8d, 0x45, 0xfd, 0x4f, 0x98, - 0x73, 0x53, 0xe9, 0x83, 0x34, 0x64, 0x5c, 0x6b, 0x64, 0xe7, 0xc7, 0xf0, - 0xfb, 0x4d, 0x84, 0xef, 0x15, 0x7e, 0x60, 0x1c, 0x97, 0x98, 0x33, 0x29, - 0x2b, 0x1b, 0x9e, 0x7d, 0x8b, 0x1d, 0xdc, 0x3c, 0x64, 0xda, 0x49, 0xcc, - 0xff, 0x95, 0x39, 0x65, 0x56, 0x95, 0xc5, 0xd9, 0xe3, 0x99, 0x23, 0xf3, - 0x58, 0xe4, 0x7e, 0x5b, 0x71, 0x20, 0xbd, 0x6a, 0xba, 0x14, 0x63, 0x3c, - 0x1b, 0x1b, 0xa7, 0x2d, 0x78, 0xf6, 0x46, 0x87, 0xd0, 0xeb, 0x1d, 0xdf, - 0xa1, 0x0f, 0x7e, 0x87, 0xce, 0x13, 0xe0, 0x55, 0xa4, 0x1e, 0xd8, 0x24, - 0xed, 0x88, 0x93, 0x85, 0x81, 0xbc, 0x8c, 0x34, 0x66, 0xf2, 0x2e, 0xe2, - 0xa3, 0x6f, 0x3b, 0xb0, 0xb9, 0xf5, 0x35, 0x7f, 0xd9, 0x1f, 0x01, 0x4e, - 0xd4, 0xd5, 0x45, 0x3e, 0x48, 0x97, 0x2a, 0xc6, 0x17, 0x2a, 0x8b, 0x85, - 0x8b, 0x0f, 0x28, 0x77, 0x17, 0x65, 0xb4, 0x63, 0xae, 0x3e, 0x88, 0x0d, - 0xc5, 0x2a, 0xaa, 0x0f, 0x86, 0x6a, 0x2e, 0xf3, 0xcd, 0x3b, 0x8a, 0x03, - 0x79, 0x5d, 0x0c, 0xf1, 0x86, 0xcb, 0x9e, 0x60, 0x1c, 0x2e, 0xa5, 0x3d, - 0xf7, 0x13, 0x41, 0xf6, 0x8e, 0x37, 0xff, 0x64, 0x5e, 0x11, 0x59, 0xce, - 0xe9, 0xe0, 0x3f, 0xd1, 0x33, 0xb2, 0x38, 0x91, 0x5c, 0x9b, 0x76, 0xb5, - 0x27, 0x9e, 0xe6, 0xe3, 0x3d, 0xed, 0xd2, 0x99, 0x6b, 0xdb, 0xa3, 0x6f, - 0xd7, 0x52, 0x59, 0x2a, 0x93, 0x45, 0xe9, 0xe5, 0x14, 0x22, 0x9d, 0x5c, - 0x2e, 0x07, 0xc3, 0x7c, 0x38, 0xd7, 0x17, 0xa0, 0xc9, 0x90, 0xe6, 0xb8, - 0x07, 0xa0, 0xb3, 0x90, 0xc3, 0x27, 0x33, 0x26, 0xfb, 0x32, 0x4f, 0x5e, - 0xc8, 0xf3, 0x0c, 0xc8, 0x60, 0xc9, 0xed, 0xde, 0x75, 0xbb, 0x3b, 0xd1, - 0xc4, 0xa0, 0x68, 0x38, 0x7f, 0x9f, 0x86, 0x52, 0xf3, 0x1b, 0x55, 0xfd, - 0x03, 0xf2, 0xab, 0x7c, 0x21, 0x0a, 0xfc, 0xaf, 0xac, 0x9a, 0xc9, 0xf8, - 0x54, 0x07, 0xb8, 0xcb, 0x8d, 0x65, 0x60, 0x74, 0x10, 0x53, 0x61, 0x1c, - 0x4a, 0x41, 0x73, 0x0f, 0x5c, 0x1e, 0xa3, 0x77, 0x4c, 0xd2, 0x31, 0x4c, - 0xa0, 0xef, 0x33, 0xa9, 0x75, 0x47, 0x21, 0xdb, 0xc2, 0xce, 0x6f, 0x7f, - 0x52, 0x8f, 0x87, 0x7c, 0x95, 0x89, 0x50, 0xce, 0xaa, 0xaf, 0x84, 0xb8, - 0xe2, 0x68, 0x50, 0x2f, 0x44, 0x60, 0xca, 0xa0, 0xd6, 0x3b, 0xeb, 0x9a, - 0xf4, 0x93, 0xf5, 0x61, 0x0b, 0x26, 0xc4, 0x3c, 0x3a, 0x30, 0xc0, 0xfb, - 0xe3, 0xf5, 0x51, 0x30, 0x1b, 0x8b, 0xd8, 0x51, 0x6a, 0x48, 0x9b, 0x82, - 0x08, 0xb8, 0x80, 0xee, 0x31, 0xec, 0x1b, 0x12, 0xbf, 0xba, 0xd2, 0x46, - 0x70, 0x62, 0xd0, 0x0c, 0x26, 0x38, 0x09, 0x34, 0xad, 0x86, 0x89, 0xb9, - 0x85, 0x45, 0x01, 0xef, 0x2c, 0x0b, 0xbb, 0x00, 0x8c, 0x7d, 0x90, 0x9e, - 0x75, 0x1f, 0x72, 0x79, 0xfc, 0xe7, 0xb1, 0x63, 0xcc, 0xa1, 0x64, 0xab, - 0x9e, 0x6e, 0xec, 0x9c, 0x28, 0x28, 0x29, 0x5d, 0x99, 0x98, 0x9a, 0x31, - 0x51, 0xa5, 0x93, 0x8f, 0x0c, 0x44, 0xef, 0xa0, 0xd1, 0xb2, 0xe9, 0xc9, - 0x8a, 0x8c, 0xe2, 0x3a, 0x8b, 0x8b, 0x48, 0x4a, 0xba, 0x06, 0xe5, 0x24, - 0xfc, 0xd4, 0x77, 0x32, 0x20, 0x4e, 0xe5, 0x62, 0x94, 0x51, 0xa7, 0xae, - 0x3c, 0x2b, 0xee, 0xcb, 0xd0, 0x43, 0xd0, 0x9b, 0x0c, 0xec, 0x4c, 0x3e, - 0xca, 0xd1, 0x9c, 0x5d, 0x86, 0x74, 0x8e, 0xc4, 0x68, 0x31, 0xa2, 0xc2, - 0xfd, 0x45, 0xda, 0xf2, 0x38, 0xb5, 0x7d, 0x0d, 0xf4, 0x16, 0x4a, 0xc9, - 0x85, 0xec, 0xca, 0x3c, 0x86, 0x61, 0x36, 0x97, 0x23, 0x33, 0x9b, 0x38, - 0x8e, 0xd4, 0x15, 0x63, 0xf5, 0x17, 0xae, 0x77, 0x10, 0x2e, 0x81, 0x2a, - 0xe5, 0x70, 0x02, 0x7f, 0x35, 0xf4, 0x0d, 0x8a, 0xcd, 0x38, 0x3f, 0x52, - 0x18, 0x86, 0xea, 0x0f, 0xc4, 0x95, 0xd3, 0xdf, 0x97, 0xdc, 0x83, 0xb1, - 0x31, 0x0d, 0x83, 0xe2, 0x18, 0x3e, 0x62, 0xb5, 0x91, 0xbc, 0xe7, 0xf0, - 0xc1, 0xb9, 0x47, 0x11, 0xd6, 0x17, 0x10, 0xfe, 0x6f, 0x48, 0x0b, 0x2b, - 0xaa, 0x83, 0xd7, 0xc5, 0x22, 0x44, 0xe7, 0x62, 0x9c, 0x4e, 0x67, 0xc7, - 0xef, 0x23, 0x02, 0x25, 0x5c, 0xdc, 0x82, 0x48, 0x86, 0xf0, 0x7a, 0xea, - 0x57, 0x99, 0x55, 0xf1, 0x00, 0xab, 0x72, 0x0b, 0xe1, 0xf7, 0x7a, 0x94, - 0x33, 0x1c, 0x5e, 0x1d, 0xc5, 0x8e, 0x4c, 0x1a, 0x0a, 0x73, 0x75, 0x78, - 0xeb, 0x05, 0x04, 0x9a, 0xfe, 0xd2, 0xed, 0x1b, 0x15, 0x40, 0xfc, 0x7e, - 0xba, 0x32, 0x61, 0x2c, 0xa1, 0x2d, 0x43, 0x39, 0x2a, 0xfa, 0xb6, 0x48, - 0xf7, 0xf2, 0x53, 0x18, 0xf5, 0xbd, 0x82, 0x8b, 0xe9, 0x2f, 0x79, 0xb9, - 0xbf, 0xa6, 0xae, 0xba, 0x8a, 0xa7, 0xb7, 0xf0, 0x0e, 0xda, 0x4c, 0xc6, - 0x44, 0x50, 0x8b, 0x37, 0x8c, 0x43, 0x19, 0x7d, 0x85, 0xac, 0x0c, 0x4e, - 0x92, 0x72, 0xc7, 0x24, 0x70, 0x0c, 0x0b, 0x3a, 0x8d, 0xf0, 0xab, 0xa8, - 0x8b, 0xe7, 0xd5, 0x88, 0xa7, 0x94, 0x98, 0x77, 0xa0, 0x96, 0x72, 0x71, - 0x78, 0xdb, 0x93, 0x99, 0x26, 0x42, 0xd5, 0xc7, 0x4d, 0xf2, 0xf3, 0x75, - 0xd4, 0x55, 0x63, 0x74, 0xe8, 0x1d, 0x00, 0x00, 0x24, 0x38, 0x49, 0x44, - 0x41, 0x54, 0x18, 0x6e, 0x81, 0xfe, 0x74, 0xd1, 0x56, 0xee, 0x4d, 0x9a, - 0x02, 0x26, 0xa3, 0x99, 0x3c, 0x07, 0xe0, 0xc5, 0x33, 0xb9, 0xc8, 0x00, - 0x16, 0xe6, 0x1a, 0xbf, 0x6b, 0x58, 0x50, 0x91, 0x41, 0xe8, 0xeb, 0x58, - 0xa0, 0x52, 0xfd, 0xdc, 0xf5, 0xc8, 0x09, 0xf9, 0xf9, 0xc6, 0xdf, 0x4d, - 0xcf, 0x20, 0x0b, 0x31, 0xfb, 0x2b, 0x0f, 0xe4, 0x86, 0xda, 0xe2, 0xe6, - 0x0b, 0x27, 0xeb, 0x90, 0x91, 0xac, 0xb6, 0xae, 0x41, 0x1e, 0xf4, 0x67, - 0x51, 0x29, 0x83, 0xc9, 0xfb, 0x50, 0x56, 0xd1, 0x6f, 0xc7, 0x6f, 0x4f, - 0x28, 0x07, 0xe9, 0x4c, 0xee, 0x1b, 0x90, 0x0f, 0x07, 0xb2, 0x22, 0xdf, - 0x1a, 0xf9, 0xb0, 0x92, 0x7c, 0x0d, 0x8e, 0x4e, 0x1d, 0x7c, 0x7e, 0x24, - 0x7f, 0x56, 0xb0, 0x7b, 0xae, 0x05, 0x9e, 0x20, 0x4a, 0xf0, 0xed, 0x18, - 0x67, 0x66, 0x9c, 0xab, 0x0d, 0x39, 0x5a, 0x64, 0xc2, 0xf0, 0x0d, 0xf2, - 0x91, 0x1a, 0x19, 0xd7, 0xee, 0x7a, 0x06, 0xe1, 0xcf, 0xe3, 0xe1, 0xe5, - 0x58, 0x16, 0x6b, 0xb5, 0xb8, 0x28, 0x59, 0x14, 0x6e, 0x37, 0x3c, 0xab, - 0x53, 0x22, 0x6f, 0x41, 0x1a, 0x53, 0x5a, 0x44, 0x92, 0xcc, 0xdf, 0x0e, - 0xb9, 0x65, 0x5e, 0x54, 0xf9, 0xf3, 0x2e, 0xb0, 0xbe, 0x40, 0x2b, 0x19, - 0x16, 0xce, 0x1f, 0x85, 0x51, 0xfd, 0xbb, 0x04, 0xfa, 0x8d, 0xdd, 0xb3, - 0x47, 0x98, 0x53, 0x72, 0x18, 0x77, 0x47, 0xb2, 0xa8, 0x78, 0x21, 0x7e, - 0x91, 0x9c, 0xda, 0x26, 0x23, 0x52, 0x7c, 0xf3, 0x29, 0x0b, 0x13, 0xaa, - 0x57, 0x00, 0xe3, 0xb6, 0x19, 0x97, 0xf0, 0xe2, 0x9d, 0xfc, 0xa2, 0x74, - 0x3a, 0xd9, 0xb1, 0x43, 0x71, 0x79, 0x45, 0xe9, 0x10, 0x2e, 0x6e, 0x99, - 0x1d, 0xc3, 0xf8, 0xef, 0xac, 0x30, 0xc6, 0xbc, 0xe2, 0x84, 0xeb, 0xce, - 0x7d, 0x16, 0xca, 0x90, 0xf3, 0xd5, 0x76, 0x78, 0xf2, 0x6c, 0x9d, 0xdc, - 0xd1, 0x9c, 0x09, 0x5f, 0x7c, 0x40, 0x98, 0x5b, 0xa6, 0xeb, 0x3f, 0xd6, - 0x37, 0x62, 0x90, 0xe8, 0x2f, 0xe7, 0xfa, 0x48, 0x51, 0x43, 0x61, 0x1a, - 0x4f, 0x99, 0x93, 0x99, 0xb3, 0xd2, 0xc1, 0xf8, 0x44, 0x94, 0xb3, 0x1a, - 0x28, 0xc7, 0xc2, 0xd5, 0xf4, 0x5b, 0x90, 0x13, 0x60, 0xfa, 0xba, 0x72, - 0x73, 0x8e, 0x29, 0xa6, 0x92, 0xfe, 0x45, 0x64, 0xd1, 0x20, 0xe6, 0xc8, - 0x9d, 0xc4, 0x6f, 0x4d, 0xb9, 0x37, 0x11, 0xd7, 0xdd, 0x8f, 0x3c, 0x3a, - 0x4e, 0xe9, 0x77, 0x88, 0x4f, 0x43, 0xbc, 0x2a, 0x83, 0xdf, 0x5d, 0xe7, - 0xbf, 0x62, 0xd1, 0x46, 0x14, 0x9e, 0x17, 0x50, 0x8c, 0xf7, 0x67, 0x91, - 0x29, 0x95, 0xf9, 0xf0, 0x11, 0x02, 0x34, 0x66, 0xfd, 0xe2, 0x9a, 0x34, - 0x15, 0xbd, 0x6a, 0xce, 0x36, 0x7f, 0xab, 0x96, 0x10, 0xc5, 0xdf, 0xaa, - 0x95, 0x55, 0x8e, 0xb0, 0x1d, 0x01, 0x0d, 0x81, 0xfc, 0x94, 0x43, 0xf1, - 0xf1, 0x4b, 0xd0, 0x7b, 0x90, 0xbb, 0x1f, 0x78, 0xdc, 0x2b, 0x2e, 0x01, - 0x65, 0xf2, 0x3a, 0xf0, 0x0e, 0x72, 0x4a, 0x6c, 0x39, 0x3c, 0x7c, 0x3d, - 0xa5, 0x68, 0x71, 0xb2, 0x2f, 0x74, 0x3d, 0x27, 0xe0, 0x9c, 0xb1, 0x02, - 0x7f, 0x94, 0xe8, 0x2f, 0x78, 0xbd, 0x01, 0x71, 0xdc, 0xfc, 0x16, 0x44, - 0xb9, 0x6e, 0x8e, 0x9f, 0x8c, 0x25, 0xd3, 0x1f, 0x85, 0x28, 0xf2, 0x8b, - 0xe5, 0x87, 0x22, 0xaf, 0xf8, 0x25, 0xf2, 0x51, 0x98, 0xcb, 0x89, 0x9f, - 0x25, 0xa3, 0x02, 0xcc, 0x55, 0x29, 0x5c, 0xdc, 0xf1, 0x75, 0x6a, 0xaa, - 0xbe, 0x2b, 0xae, 0x6e, 0x0b, 0x51, 0x6a, 0x1d, 0x19, 0xcc, 0x6b, 0x56, - 0x1a, 0x4b, 0xc7, 0x41, 0x47, 0xb9, 0xe8, 0x30, 0xee, 0x35, 0x06, 0xee, - 0x86, 0xfc, 0xf0, 0xc6, 0xbb, 0x4c, 0x97, 0xc1, 0xf7, 0x22, 0x3e, 0xe0, - 0x94, 0x55, 0x10, 0xe3, 0x36, 0x8d, 0x53, 0x0d, 0x6b, 0xe0, 0xe3, 0xe5, - 0xb4, 0x75, 0x06, 0x1b, 0x34, 0x77, 0x92, 0xfa, 0x17, 0xa8, 0xc4, 0x5c, - 0xe4, 0x67, 0xa0, 0x96, 0x59, 0xd2, 0x5e, 0x8c, 0x80, 0xee, 0x55, 0xc8, - 0x22, 0xe2, 0x6b, 0xe8, 0xab, 0xaf, 0xa3, 0x53, 0x65, 0x32, 0xef, 0x5f, - 0xc2, 0xc2, 0xc6, 0x3d, 0x14, 0xe9, 0xc6, 0xb8, 0x42, 0x35, 0x08, 0x8d, - 0xd7, 0x72, 0xa5, 0x8d, 0x12, 0x9f, 0x22, 0x16, 0x5d, 0x1d, 0xf9, 0x86, - 0x61, 0xdb, 0xc1, 0x53, 0xd7, 0x18, 0x16, 0x64, 0xe4, 0x27, 0x5d, 0xd3, - 0x2b, 0xdf, 0x74, 0x6a, 0xa2, 0x11, 0x41, 0x65, 0xf1, 0x67, 0x79, 0xf9, - 0x4d, 0xc5, 0x85, 0x9d, 0x59, 0x6c, 0x09, 0x7b, 0x44, 0xbe, 0x91, 0x7e, - 0x34, 0x15, 0xba, 0x0d, 0x79, 0x75, 0x16, 0x1b, 0x3e, 0x2f, 0xf3, 0x9a, - 0xc4, 0x4a, 0x2d, 0x44, 0x62, 0x8f, 0xa8, 0x0f, 0x12, 0x23, 0x25, 0xd5, - 0xd8, 0x8c, 0x14, 0x26, 0x7f, 0xf2, 0x70, 0x78, 0x8f, 0x39, 0xb7, 0xa6, - 0x27, 0x5e, 0x4c, 0x08, 0x03, 0x8f, 0xb7, 0xc3, 0xab, 0xb3, 0x31, 0x82, - 0xd7, 0x22, 0xbb, 0x2b, 0x71, 0x7a, 0xeb, 0x64, 0xf8, 0xe2, 0x04, 0x0c, - 0xf0, 0x24, 0x3e, 0xd8, 0xb8, 0x86, 0xc8, 0xf3, 0x20, 0xe5, 0x29, 0x79, - 0x9a, 0x85, 0xfd, 0xa1, 0xbf, 0xd5, 0x6d, 0x88, 0xbc, 0x3d, 0x5a, 0x8b, - 0xef, 0xf0, 0xcc, 0x2c, 0xe6, 0xb8, 0x5f, 0x68, 0x47, 0x8e, 0xfc, 0x28, - 0xa3, 0x31, 0xcf, 0x1a, 0x83, 0x6e, 0x79, 0x15, 0x24, 0xaf, 0x81, 0xd4, - 0xa9, 0x1d, 0xb6, 0x52, 0x06, 0x27, 0xc5, 0x32, 0xd0, 0x95, 0x3a, 0xb0, - 0xc0, 0xfd, 0x10, 0xf1, 0xbc, 0xed, 0x91, 0xdc, 0x5f, 0x8f, 0x3e, 0xf2, - 0x83, 0x9a, 0x8a, 0x1e, 0x73, 0x1d, 0x9b, 0x73, 0x4e, 0x7d, 0xa8, 0xe3, - 0x0a, 0xc2, 0xa4, 0xfb, 0x4b, 0x0e, 0xbb, 0x9d, 0xfe, 0x6d, 0x40, 0x7a, - 0xf4, 0x99, 0xbc, 0xda, 0xb9, 0x09, 0xbb, 0xe9, 0x3e, 0x02, 0xff, 0x80, - 0xbc, 0xf1, 0x94, 0x26, 0x13, 0xfd, 0xe0, 0x21, 0x36, 0x8e, 0x6e, 0xe7, - 0x75, 0xc7, 0xf7, 0x99, 0x7f, 0xf4, 0x51, 0xca, 0x5e, 0xd8, 0x30, 0xed, - 0x14, 0xb8, 0x27, 0x1d, 0xa7, 0x07, 0xda, 0x83, 0x69, 0x4f, 0xf4, 0xf3, - 0x0c, 0x95, 0xa5, 0x32, 0x91, 0xa9, 0x6a, 0x73, 0x66, 0xa8, 0x1c, 0xb5, - 0x55, 0x73, 0xa5, 0xe6, 0x36, 0x61, 0x2c, 0xfd, 0x50, 0xf6, 0x91, 0x64, - 0x9e, 0xea, 0x2f, 0x1b, 0x48, 0x7a, 0x8b, 0xd3, 0xa7, 0x5c, 0xff, 0x16, - 0xe7, 0x1e, 0x24, 0xe1, 0x02, 0x51, 0x1a, 0xf6, 0x47, 0x91, 0x9f, 0x2a, - 0xd2, 0x7d, 0x38, 0xc0, 0x73, 0xc3, 0x6a, 0x7b, 0x25, 0x56, 0x2d, 0xaf, - 0x61, 0x75, 0x37, 0x9f, 0x15, 0x18, 0x19, 0x70, 0x6a, 0x9c, 0x9f, 0xcb, - 0x83, 0x01, 0xa6, 0x02, 0x48, 0x16, 0x9d, 0xdc, 0x96, 0x0e, 0x68, 0x63, - 0x22, 0xd1, 0x81, 0x6d, 0x51, 0x56, 0x5a, 0xeb, 0x6b, 0xb4, 0xec, 0x1a, - 0x4c, 0xc1, 0xdf, 0xaf, 0x23, 0x4d, 0xf4, 0xd2, 0xae, 0x41, 0x26, 0x82, - 0xd7, 0xe9, 0xe0, 0xb3, 0xd9, 0x11, 0xd8, 0xc6, 0xce, 0xcc, 0x63, 0x44, - 0xfe, 0x18, 0xf2, 0xad, 0x13, 0xab, 0xfb, 0xb5, 0xfd, 0x32, 0x83, 0x19, - 0x1b, 0xb0, 0xf3, 0xd3, 0x84, 0x5d, 0xda, 0x22, 0x14, 0x17, 0x29, 0x79, - 0x85, 0x28, 0x1b, 0x13, 0x31, 0x40, 0xc6, 0x61, 0x08, 0xfc, 0x44, 0x9b, - 0x7f, 0x61, 0x77, 0x72, 0xba, 0x88, 0xfb, 0x99, 0x0c, 0x80, 0x42, 0x0c, - 0xbb, 0x22, 0xee, 0x67, 0xb1, 0xf0, 0x30, 0xde, 0xe4, 0x89, 0xa1, 0x58, - 0x03, 0xa3, 0xdd, 0xd9, 0x35, 0x33, 0x7e, 0xba, 0x32, 0x38, 0x9a, 0x61, - 0x10, 0xa5, 0x20, 0xb8, 0xf2, 0xc1, 0x41, 0x03, 0x4e, 0x8c, 0x51, 0x80, - 0xb1, 0x34, 0x15, 0x8c, 0xb2, 0x99, 0x2c, 0x5b, 0x60, 0xa0, 0x39, 0x93, - 0xa9, 0xe2, 0x33, 0xc8, 0x12, 0x58, 0xd9, 0x3a, 0x4c, 0x3b, 0x1c, 0x18, - 0xc3, 0x32, 0xa2, 0x15, 0xdf, 0xed, 0xe2, 0x51, 0xbc, 0x35, 0x08, 0x74, - 0x94, 0x6b, 0x02, 0x97, 0xb5, 0x90, 0x37, 0x4e, 0x1c, 0x3b, 0xb1, 0x8e, - 0x92, 0x84, 0x22, 0xd3, 0x90, 0xf0, 0x5c, 0xc8, 0xb8, 0x6c, 0x76, 0xc6, - 0x0e, 0xd0, 0x03, 0xcc, 0x2b, 0xec, 0x8b, 0x19, 0x7b, 0x3c, 0xcb, 0x4f, - 0x4c, 0x9c, 0xce, 0xeb, 0x02, 0x89, 0x2c, 0xc6, 0xbc, 0xcc, 0x0a, 0x78, - 0x90, 0x5d, 0xdc, 0x1f, 0xf0, 0xd3, 0x72, 0xba, 0xb7, 0x2c, 0xbc, 0xd0, - 0xe6, 0x76, 0xec, 0xe8, 0x0d, 0xf5, 0x72, 0x1e, 0xca, 0xf8, 0x61, 0xf5, - 0x32, 0x1e, 0x25, 0xfb, 0x3c, 0xe8, 0x1c, 0x2d, 0xb0, 0x94, 0x12, 0x5d, - 0x6d, 0x50, 0x5d, 0x52, 0xa1, 0x77, 0x58, 0x70, 0xb8, 0x80, 0x63, 0xfc, - 0x0f, 0x33, 0x21, 0xcf, 0xc6, 0x68, 0x4d, 0x05, 0xc3, 0xb6, 0xf8, 0x4b, - 0xa0, 0xaa, 0x7d, 0x63, 0x20, 0x4d, 0xd2, 0x37, 0x47, 0x20, 0x85, 0x7d, - 0x03, 0x29, 0xae, 0x8c, 0xe2, 0x36, 0x1c, 0x09, 0x4d, 0x25, 0xaf, 0xdf, - 0x78, 0xf7, 0xe4, 0x61, 0xf0, 0xbe, 0x00, 0xff, 0x61, 0x90, 0xf0, 0x94, - 0x10, 0x77, 0xf0, 0xe3, 0xea, 0x75, 0xb9, 0xf0, 0xed, 0x74, 0x8c, 0x9e, - 0xe1, 0xe0, 0xb7, 0x94, 0x40, 0xe1, 0xe5, 0x76, 0x05, 0x1c, 0xa5, 0x9e, - 0x83, 0xb2, 0x1d, 0x83, 0x00, 0x3a, 0x85, 0xf6, 0xbd, 0x87, 0xf1, 0xb2, - 0x03, 0x45, 0xe9, 0x68, 0x30, 0xcc, 0xe4, 0x78, 0xf1, 0x48, 0xfc, 0x36, - 0xb1, 0x13, 0x79, 0x04, 0x47, 0x6f, 0x96, 0x61, 0x18, 0xa8, 0x0f, 0x83, - 0xac, 0x9e, 0x9e, 0xc0, 0x2e, 0x95, 0x8c, 0xe9, 0xa7, 0x78, 0xee, 0x0f, - 0x3d, 0x18, 0xa2, 0xfe, 0xf2, 0x13, 0x7f, 0x12, 0xe7, 0x44, 0xfc, 0x22, - 0x4e, 0x20, 0x84, 0x05, 0xc8, 0x3b, 0x9e, 0x76, 0x5d, 0x4d, 0x9f, 0xe9, - 0x08, 0x5a, 0x2e, 0x4a, 0x93, 0x84, 0xb5, 0x3e, 0x1e, 0xf5, 0x0d, 0xef, - 0x5c, 0xed, 0xc4, 0xc0, 0xd2, 0xd1, 0xd6, 0x0f, 0xe1, 0xe3, 0x46, 0x8a, - 0x5f, 0x1e, 0x47, 0x5e, 0x0d, 0x18, 0x47, 0x9f, 0xa2, 0x10, 0x76, 0xa4, - 0x8d, 0x79, 0x4c, 0x28, 0x52, 0x60, 0xdd, 0x93, 0x41, 0x79, 0xb2, 0x2b, - 0x4f, 0xdc, 0x5c, 0xe4, 0xcd, 0xfb, 0x18, 0x88, 0xb9, 0xac, 0xe4, 0xb6, - 0xa2, 0x1e, 0xea, 0x63, 0x33, 0xb9, 0x14, 0x31, 0x39, 0x47, 0xea, 0xab, - 0xf2, 0x94, 0xb1, 0xdb, 0x71, 0x51, 0xb6, 0x1a, 0xb3, 0x08, 0xd4, 0x57, - 0x06, 0x16, 0x86, 0xa4, 0x56, 0x5d, 0x0b, 0x4a, 0xc9, 0x54, 0x13, 0xc2, - 0x24, 0xde, 0x7f, 0xfb, 0x90, 0xc5, 0x9c, 0x02, 0x30, 0x7d, 0x84, 0xf1, - 0xd6, 0xba, 0x94, 0xf8, 0xd1, 0x06, 0xe5, 0xb1, 0x02, 0x3e, 0x9f, 0x05, - 0xc1, 0x06, 0xf0, 0x4b, 0x0d, 0x26, 0x72, 0xd5, 0x23, 0x9a, 0x49, 0x26, - 0x83, 0x3e, 0x1d, 0x82, 0x61, 0xb8, 0x0b, 0xb9, 0x76, 0x32, 0x46, 0xaf, - 0xc1, 0x57, 0xe5, 0xe6, 0xb1, 0x48, 0x37, 0x4d, 0x37, 0x29, 0x29, 0x29, - 0xf7, 0x32, 0x59, 0xd7, 0xd7, 0xbd, 0x1c, 0xe3, 0xb1, 0x06, 0xf2, 0x4a, - 0xbc, 0x1a, 0x40, 0x7e, 0x4e, 0xe4, 0xa2, 0x76, 0x85, 0x1d, 0x7d, 0x23, - 0x0c, 0x34, 0x9e, 0x44, 0x1a, 0x7b, 0x7e, 0x98, 0x44, 0x95, 0x3f, 0xaf, - 0xd8, 0x48, 0x01, 0x2f, 0xc6, 0x6f, 0x21, 0x85, 0x54, 0x32, 0x49, 0xf9, - 0x7f, 0xcf, 0x2b, 0x38, 0x93, 0x25, 0x3b, 0x31, 0x20, 0x9e, 0x65, 0xdc, - 0xd5, 0xc2, 0xcf, 0x71, 0xf0, 0x6d, 0x1d, 0x73, 0xef, 0xba, 0x8a, 0x6f, - 0x32, 0x90, 0xf7, 0x75, 0xe5, 0xc7, 0x18, 0xd1, 0x82, 0x8a, 0xbb, 0xdd, - 0xf2, 0x8e, 0xc6, 0x15, 0xb0, 0x33, 0xb9, 0x48, 0x11, 0xd9, 0x1d, 0xbc, - 0x91, 0x13, 0x5c, 0xc9, 0x26, 0x91, 0xee, 0xf9, 0x8e, 0xc5, 0xf5, 0x7a, - 0x66, 0x51, 0xf5, 0x77, 0x2e, 0xee, 0xf6, 0xe7, 0x90, 0xee, 0x4b, 0xca, - 0xcd, 0x46, 0x69, 0xea, 0x02, 0x6f, 0x77, 0xc2, 0xd8, 0xce, 0xc2, 0xf0, - 0x1e, 0x4d, 0x3c, 0x37, 0x8e, 0xfa, 0x70, 0xd0, 0x4a, 0x76, 0x1f, 0x83, - 0x18, 0x6a, 0x5d, 0x88, 0xbf, 0x8e, 0x70, 0x29, 0x62, 0xdb, 0x88, 0xbf, - 0x18, 0x19, 0xa6, 0xd7, 0xb2, 0x2a, 0xb1, 0xe3, 0x2d, 0x3f, 0x27, 0x7f, - 0xfa, 0xa8, 0x11, 0xf3, 0x44, 0x7f, 0xf2, 0xca, 0x61, 0x9c, 0x0e, 0xc6, - 0x7f, 0x35, 0x34, 0x9f, 0x8f, 0x85, 0x8d, 0x40, 0x4e, 0x17, 0xa2, 0xb0, - 0x0d, 0x64, 0xfe, 0x08, 0xf7, 0x23, 0x61, 0x91, 0x9c, 0xef, 0xd8, 0x62, - 0x81, 0xe0, 0x34, 0x16, 0xb5, 0x2f, 0x67, 0xf7, 0x27, 0x83, 0xc5, 0xbe, - 0x01, 0x24, 0x5e, 0x0c, 0xb9, 0xdb, 0x16, 0x29, 0xbf, 0x8a, 0xfa, 0x97, - 0xf7, 0x6f, 0xd5, 0x4a, 0x2b, 0x47, 0x6d, 0xd2, 0xbc, 0x22, 0xf2, 0x6b, - 0x9f, 0x09, 0x2f, 0x6d, 0x1e, 0x28, 0x2d, 0xff, 0xf2, 0x86, 0x25, 0x20, - 0x03, 0x9a, 0x28, 0x11, 0x0b, 0xcb, 0x93, 0xb9, 0x4c, 0x82, 0x9c, 0xfe, - 0x65, 0x41, 0xe5, 0x28, 0xfa, 0x2a, 0xcc, 0x4f, 0xf8, 0x17, 0x73, 0xbc, - 0x12, 0x71, 0x04, 0x8b, 0x69, 0x95, 0x8c, 0x27, 0xe9, 0x13, 0xba, 0x74, - 0xe9, 0x72, 0x92, 0x64, 0x10, 0xba, 0x87, 0x0c, 0x11, 0xf5, 0x49, 0x01, - 0x73, 0xc1, 0x22, 0xe6, 0xad, 0x2c, 0x78, 0xac, 0x16, 0xbb, 0x5b, 0xfd, - 0xf0, 0x2b, 0x8d, 0xcf, 0x0b, 0xd0, 0x55, 0x7e, 0xd6, 0x06, 0x0a, 0x79, - 0x9d, 0xac, 0x3c, 0x4d, 0xfe, 0x3a, 0x25, 0x83, 0x3e, 0x73, 0x94, 0x79, - 0x0e, 0x5d, 0x0b, 0xe0, 0xa5, 0x71, 0xcc, 0xe7, 0xfa, 0x32, 0xfa, 0x99, - 0xdc, 0x0b, 0x3f, 0xf7, 0x42, 0xeb, 0x9f, 0xe8, 0x46, 0xfa, 0xa8, 0x97, - 0x0c, 0x73, 0x3f, 0xbc, 0x3d, 0xd9, 0xf9, 0x3e, 0x06, 0x39, 0x59, 0x72, - 0x09, 0x7c, 0x9e, 0x04, 0x6f, 0x0f, 0x65, 0xfe, 0x3d, 0x0f, 0x9d, 0xeb, - 0x78, 0x62, 0x9e, 0x0d, 0x7d, 0x0e, 0xf9, 0xea, 0x7d, 0xbe, 0x39, 0xfd, - 0x83, 0x9e, 0xcc, 0xcb, 0xd2, 0x17, 0x5e, 0x07, 0xdb, 0xc1, 0xe8, 0x61, - 0x9f, 0x71, 0xb2, 0x29, 0x17, 0x9d, 0xfa, 0x71, 0xe6, 0xb4, 0x33, 0xfe, - 0xc1, 0x6a, 0x95, 0x55, 0xb4, 0xfe, 0x2e, 0x79, 0xaa, 0x36, 0xa5, 0xe0, - 0xb7, 0xdb, 0x88, 0x1c, 0xd6, 0x19, 0xd1, 0x83, 0xe3, 0xe0, 0x87, 0x5b, - 0x14, 0x86, 0x2e, 0xfd, 0x33, 0x61, 0xc5, 0xf4, 0xa1, 0x68, 0xf9, 0xb3, - 0x9c, 0xfc, 0xe6, 0x57, 0xdf, 0x32, 0xf9, 0x8a, 0x3a, 0x4a, 0x3f, 0x57, - 0xfd, 0xb4, 0x88, 0x30, 0x07, 0x7a, 0x0a, 0xba, 0x46, 0x27, 0xb2, 0x58, - 0xf8, 0x92, 0x2c, 0x2c, 0x31, 0xce, 0x90, 0xd9, 0xd9, 0xcc, 0x1d, 0x85, - 0xd8, 0x2c, 0xd5, 0xe0, 0xbf, 0x48, 0xba, 0x57, 0x11, 0x8b, 0xf1, 0xeb, - 0x49, 0x1f, 0xe0, 0x83, 0x98, 0x87, 0x73, 0x09, 0xdb, 0x01, 0xd8, 0x28, - 0x55, 0x90, 0xff, 0x47, 0x2a, 0xcc, 0xc7, 0x65, 0xa0, 0x87, 0x8e, 0xd2, - 0x58, 0xc5, 0x28, 0xbf, 0x12, 0xba, 0x82, 0xb9, 0x4b, 0xff, 0xa6, 0xf4, - 0x1e, 0x71, 0xdd, 0xfc, 0x9c, 0xc7, 0x98, 0x5d, 0x88, 0x3c, 0xaf, 0x81, - 0x9e, 0xd0, 0x06, 0x9d, 0x51, 0x65, 0x69, 0x63, 0x62, 0x3b, 0xf7, 0x5b, - 0x90, 0xc3, 0x07, 0x11, 0x56, 0x0d, 0x43, 0x7d, 0x01, 0x7e, 0xe1, 0xb9, - 0x9e, 0x31, 0xd2, 0x07, 0xde, 0xba, 0x13, 0x3b, 0x22, 0x9b, 0x93, 0x53, - 0xcf, 0x20, 0xfb, 0x9f, 0x0f, 0xbd, 0x7f, 0x7e, 0x3f, 0x7a, 0x41, 0x0f, - 0xe2, 0x7a, 0x5d, 0x26, 0xf3, 0xff, 0x10, 0xf2, 0xd4, 0x5f, 0x04, 0x9f, - 0xc1, 0x06, 0xd4, 0xa5, 0x3a, 0x99, 0x45, 0xbf, 0x0e, 0x27, 0xa2, 0xbb, - 0x3e, 0x4e, 0x3a, 0xf4, 0x8c, 0x5e, 0xe4, 0x3f, 0x08, 0xe3, 0x37, 0x8d, - 0x9d, 0xf0, 0x27, 0xf1, 0x9c, 0x04, 0x15, 0x9b, 0x9f, 0x9d, 0x88, 0x7f, - 0xfd, 0xa8, 0x5e, 0xb3, 0xa1, 0x4f, 0xa0, 0xfe, 0x2c, 0x16, 0xaf, 0x94, - 0x37, 0xf9, 0x1f, 0xcd, 0x25, 0x8c, 0x97, 0xfc, 0x76, 0xd3, 0xc5, 0xb2, - 0x50, 0xa2, 0x3c, 0xb5, 0x38, 0xa9, 0x32, 0xa4, 0x4b, 0xab, 0x4c, 0xd9, - 0x52, 0x61, 0x6c, 0xb8, 0x8f, 0xc4, 0x2f, 0xd2, 0x25, 0xf6, 0xe6, 0x3c, - 0x46, 0xf6, 0xd1, 0xbb, 0x18, 0xb6, 0xf1, 0x1f, 0x84, 0x71, 0x1d, 0xa7, - 0x7b, 0x92, 0xfa, 0x19, 0x4c, 0x65, 0xfd, 0x7d, 0x9a, 0xb7, 0xc4, 0x9a, - 0xbc, 0x1f, 0x37, 0x1e, 0xa0, 0x0a, 0x30, 0x2c, 0x52, 0x51, 0x08, 0xfe, - 0xc5, 0x20, 0x78, 0x88, 0xfb, 0xf5, 0xec, 0xe0, 0x15, 0xf2, 0xee, 0xd0, - 0x8f, 0x24, 0xf0, 0xae, 0x32, 0x99, 0x3c, 0xca, 0xfa, 0x5a, 0x7b, 0x90, - 0x05, 0x82, 0x6b, 0x54, 0x61, 0xf2, 0x2c, 0x60, 0x11, 0x60, 0x1e, 0xc6, - 0xce, 0xc7, 0x94, 0xf5, 0x9e, 0x9b, 0x08, 0x3b, 0x31, 0x94, 0x61, 0x0c, - 0xc7, 0x96, 0x7f, 0x60, 0xf1, 0xe1, 0x17, 0x26, 0x90, 0x47, 0x18, 0x6c, - 0xfd, 0xa0, 0xcb, 0xf0, 0x7b, 0x0a, 0x3f, 0xe7, 0x6b, 0x86, 0x28, 0x51, - 0x52, 0x78, 0x1a, 0x41, 0x9a, 0xb4, 0x34, 0x08, 0x6b, 0x40, 0xaa, 0x9f, - 0x9b, 0x52, 0xd8, 0x95, 0xda, 0x45, 0x59, 0x1a, 0xe0, 0xcd, 0x43, 0x71, - 0x14, 0x3f, 0x86, 0x5d, 0xf4, 0x4b, 0x18, 0x64, 0x6b, 0xc8, 0xf3, 0x39, - 0xca, 0xb8, 0x89, 0xfc, 0xaf, 0x80, 0x9e, 0xc1, 0xa0, 0xdc, 0x89, 0x20, - 0x2e, 0xe2, 0x48, 0xc7, 0x7c, 0xe2, 0xd5, 0x85, 0x8c, 0xab, 0xc5, 0x49, - 0xc6, 0x89, 0xe0, 0x51, 0x08, 0x1e, 0x9b, 0xc0, 0xe7, 0x7e, 0xe8, 0x6a, - 0xd2, 0xfe, 0xa8, 0x76, 0xf1, 0xce, 0xb0, 0x04, 0xc8, 0x21, 0x50, 0x31, - 0xc6, 0x65, 0xe0, 0xb6, 0xa5, 0x1c, 0x7d, 0xdd, 0x5d, 0xca, 0x5b, 0x6f, - 0x28, 0x1e, 0xf2, 0xba, 0x78, 0x76, 0x23, 0x4f, 0xc7, 0x08, 0xce, 0x21, - 0xaa, 0x3e, 0xa4, 0xa2, 0x89, 0xf3, 0x16, 0xae, 0xf7, 0x52, 0xde, 0x74, - 0xe5, 0xaf, 0x89, 0x1a, 0x05, 0xfc, 0x04, 0x12, 0x86, 0xd3, 0x83, 0x57, - 0x17, 0xe2, 0xf4, 0xa3, 0x1e, 0x32, 0x9c, 0x07, 0x51, 0xaf, 0x95, 0x4a, - 0xcf, 0x87, 0x7e, 0xb4, 0x02, 0xdf, 0xcb, 0x1d, 0xd7, 0x5d, 0x20, 0x0a, - 0x66, 0x0b, 0xe5, 0x29, 0x47, 0x99, 0xc2, 0xa5, 0x34, 0x17, 0x94, 0xc2, - 0xa1, 0xb8, 0x94, 0x25, 0x05, 0x24, 0xa9, 0xb4, 0xc8, 0x9e, 0x30, 0x61, - 0xad, 0xf8, 0x0d, 0xa1, 0x0b, 0xa0, 0xd3, 0xa1, 0x48, 0x02, 0x93, 0xa0, - 0x88, 0x4e, 0x69, 0xce, 0x84, 0xce, 0x87, 0x1a, 0x40, 0xca, 0x53, 0x79, - 0x47, 0xe3, 0xf4, 0xaa, 0x83, 0xd3, 0x47, 0x28, 0xcc, 0xcf, 0x93, 0xc0, - 0x3b, 0x56, 0x34, 0x71, 0x1d, 0x03, 0xbe, 0xfa, 0xe2, 0xef, 0x1a, 0x56, - 0xf8, 0x9b, 0xf2, 0xfc, 0x10, 0xf4, 0x21, 0x74, 0x3f, 0x24, 0x25, 0xec, - 0x5a, 0xe8, 0x6d, 0xe8, 0x0c, 0x28, 0x89, 0xb8, 0x5d, 0x85, 0x07, 0xc6, - 0x7c, 0x1a, 0xcf, 0x8a, 0xef, 0xae, 0x8b, 0xee, 0x9b, 0x62, 0xf8, 0xed, - 0x52, 0x1c, 0x8e, 0x77, 0x76, 0xe3, 0x39, 0xfc, 0x35, 0x72, 0x04, 0xb2, - 0x3e, 0x5e, 0xf1, 0x22, 0xfd, 0xfa, 0x02, 0xfd, 0xf5, 0x31, 0xfd, 0xe5, - 0x7c, 0xd9, 0x94, 0x71, 0x50, 0xc8, 0xbb, 0xcd, 0x13, 0x89, 0x2b, 0x3e, - 0x96, 0xab, 0x8a, 0x12, 0xff, 0x3c, 0x63, 0xc5, 0xf9, 0x37, 0x00, 0xf8, - 0x72, 0x2b, 0x71, 0x46, 0xb1, 0x20, 0xf0, 0x2f, 0xd2, 0x3e, 0x8d, 0x90, - 0x1c, 0x4b, 0xda, 0x65, 0xc4, 0x53, 0x79, 0xe1, 0xfc, 0x99, 0x74, 0xc6, - 0x12, 0xfe, 0x3e, 0xe3, 0x64, 0x26, 0xe1, 0xce, 0x5f, 0x51, 0x51, 0x87, - 0x6c, 0x26, 0xab, 0xef, 0x89, 0x57, 0x2f, 0x14, 0x9f, 0xcb, 0x5f, 0x5f, - 0x6b, 0x27, 0x9e, 0x8e, 0xa0, 0x8f, 0x22, 0xef, 0xa1, 0x5e, 0xd2, 0x82, - 0x84, 0x22, 0x86, 0x5c, 0xf8, 0x6b, 0xed, 0xbc, 0x46, 0x71, 0x35, 0x7e, - 0xe1, 0x09, 0xdf, 0x44, 0xf0, 0x5c, 0xeb, 0xa0, 0x24, 0x4e, 0x42, 0xa8, - 0x3b, 0x5f, 0xda, 0x26, 0xef, 0xf1, 0xf0, 0xe8, 0x40, 0x78, 0xf6, 0x11, - 0x16, 0xbe, 0x26, 0x08, 0x1b, 0x26, 0xa1, 0x54, 0xd2, 0x54, 0x17, 0xe9, - 0x5e, 0x7e, 0x3e, 0x5f, 0x9b, 0x8f, 0x95, 0x9f, 0x27, 0xbe, 0x53, 0x14, - 0xca, 0xde, 0xa1, 0x8c, 0xd9, 0xd3, 0x18, 0xe3, 0x37, 0x81, 0x4b, 0x01, - 0xf9, 0x17, 0xe8, 0x1e, 0xbf, 0x53, 0x09, 0xd3, 0x58, 0x34, 0x4e, 0xdf, - 0x12, 0x78, 0x57, 0xf2, 0x84, 0xeb, 0x6b, 0xc4, 0x7b, 0x98, 0x7b, 0x7d, - 0xb9, 0xdf, 0xa9, 0x1b, 0x13, 0xe1, 0x76, 0x22, 0xaa, 0xad, 0xee, 0x36, - 0xd5, 0x21, 0x9f, 0x02, 0x16, 0x3f, 0x73, 0xf0, 0xaf, 0x1d, 0xca, 0x48, - 0xbc, 0xd3, 0x96, 0x63, 0x81, 0xcb, 0x55, 0x1f, 0x8c, 0xab, 0x69, 0x3c, - 0x9b, 0xf1, 0x1e, 0xfe, 0x5a, 0x3b, 0xab, 0xd3, 0xdf, 0xd3, 0x07, 0x23, - 0x29, 0xab, 0x98, 0x7c, 0x83, 0x0f, 0x3b, 0x85, 0xf2, 0xd1, 0x97, 0x80, - 0x73, 0x59, 0x31, 0x9e, 0xcd, 0xb3, 0xde, 0xa7, 0xbb, 0x53, 0xf9, 0x69, - 0xa2, 0x67, 0xf1, 0xef, 0x2c, 0xfc, 0x6a, 0xb1, 0xc0, 0xf3, 0xbb, 0xe2, - 0x70, 0xaf, 0xb2, 0xc3, 0xf8, 0x70, 0xef, 0x96, 0x49, 0x35, 0x58, 0x5c, - 0xf8, 0x50, 0xf2, 0x4a, 0x8e, 0xc5, 0xc3, 0x55, 0x84, 0x57, 0x83, 0x24, - 0x23, 0x4e, 0x46, 0xd9, 0x77, 0xfa, 0x9f, 0x7a, 0xac, 0x82, 0xe7, 0x9e, - 0x81, 0x9e, 0xe2, 0x7e, 0xb1, 0xe2, 0xb2, 0xf0, 0x24, 0xde, 0xd5, 0x84, - 0xaf, 0x36, 0x97, 0xf6, 0x57, 0x6a, 0x04, 0x97, 0x70, 0x65, 0xe6, 0x8f, - 0xdc, 0x93, 0x72, 0xa0, 0xf1, 0x92, 0x00, 0x45, 0xfa, 0x2b, 0x35, 0x95, - 0xdd, 0x95, 0x57, 0x41, 0xd2, 0x54, 0x27, 0xf8, 0xe2, 0x35, 0x9e, 0x85, - 0x71, 0x0c, 0x58, 0x7d, 0x08, 0xff, 0xae, 0xa2, 0xbe, 0x6f, 0xd3, 0xb7, - 0xfd, 0xe9, 0xb3, 0x9b, 0xc4, 0x3f, 0x3c, 0x3b, 0xf2, 0x50, 0x0a, 0x0c, - 0xca, 0xd1, 0xa5, 0xc4, 0xf5, 0x93, 0x27, 0x65, 0x7d, 0xad, 0x3d, 0x11, - 0xa5, 0xfb, 0x42, 0x64, 0xb2, 0x33, 0xb6, 0xc8, 0x73, 0x3e, 0x79, 0x0f, - 0x0a, 0xe5, 0xef, 0x7c, 0xc9, 0x98, 0x5d, 0x03, 0x29, 0x2d, 0x7d, 0x21, - 0xd5, 0xdf, 0xed, 0x6a, 0xb1, 0xb8, 0x3c, 0x4f, 0xf5, 0x95, 0x63, 0xf7, - 0x44, 0x7d, 0xe8, 0x9d, 0x17, 0x13, 0x99, 0x9f, 0x06, 0x28, 0x9c, 0x36, - 0x14, 0x71, 0xd2, 0xe7, 0x5d, 0xe2, 0x54, 0x86, 0x92, 0xf9, 0xda, 0xed, - 0x00, 0xd3, 0x5f, 0xbc, 0x3e, 0xf0, 0x01, 0x7e, 0x32, 0xd4, 0x62, 0x68, - 0xfb, 0x87, 0x8a, 0xcf, 0x4e, 0xd7, 0xcf, 0x3c, 0xd7, 0x87, 0x34, 0xae, - 0x1d, 0x7e, 0x63, 0x01, 0xc3, 0xf9, 0x9a, 0x37, 0xbc, 0xf8, 0x5e, 0xc8, - 0x8f, 0x4b, 0x31, 0x57, 0x56, 0x7b, 0x13, 0xc0, 0x50, 0x06, 0x97, 0xfe, - 0xf2, 0x2d, 0xd5, 0x6f, 0xee, 0x05, 0x03, 0xf1, 0xea, 0x30, 0x72, 0x75, - 0xcb, 0x32, 0x15, 0x52, 0xde, 0xaf, 0xb5, 0x2b, 0x8d, 0x9c, 0xf2, 0x69, - 0xc8, 0x29, 0x80, 0xd5, 0x2a, 0x17, 0xac, 0xcf, 0x0f, 0xf9, 0x29, 0xcc, - 0xcf, 0x95, 0xfa, 0xb5, 0x76, 0xbf, 0x04, 0xff, 0xa0, 0x5f, 0x15, 0x76, - 0x52, 0xbf, 0x52, 0xbb, 0x90, 0x33, 0x1b, 0x91, 0x9f, 0x77, 0xc3, 0xaf, - 0xd7, 0x80, 0xdf, 0x44, 0xe4, 0x74, 0x16, 0x0b, 0x21, 0xf9, 0x0a, 0xc3, - 0x10, 0xd2, 0xdc, 0x21, 0x17, 0xfe, 0x1a, 0x36, 0x3b, 0x9a, 0xfa, 0x47, - 0x93, 0xdf, 0x91, 0x83, 0x37, 0x91, 0xb6, 0x1f, 0x3c, 0x37, 0x59, 0x71, - 0x51, 0xa8, 0x77, 0x11, 0xaf, 0x33, 0x14, 0x96, 0x27, 0x6c, 0x36, 0x7c, - 0x81, 0x0c, 0x72, 0x06, 0x37, 0x69, 0x46, 0x73, 0x7f, 0x2f, 0x63, 0xf8, - 0x5e, 0xca, 0xf9, 0x80, 0x72, 0x16, 0x71, 0xba, 0xeb, 0x60, 0x65, 0x8e, - 0x53, 0x9a, 0xc3, 0x18, 0x73, 0xce, 0x3f, 0x72, 0x28, 0x4f, 0xf2, 0xbe, - 0x82, 0xeb, 0x75, 0xa4, 0x9b, 0x81, 0x21, 0xe9, 0xc8, 0x01, 0x5e, 0x13, - 0xfb, 0x9a, 0x78, 0x0e, 0xbf, 0x71, 0x3d, 0x48, 0x7f, 0x9f, 0x24, 0x5e, - 0x44, 0x16, 0x6e, 0x26, 0xdf, 0xc1, 0xc4, 0xbf, 0x09, 0xb9, 0xf5, 0x8a, - 0xe4, 0x24, 0xfe, 0x99, 0xe8, 0x6c, 0xcd, 0x88, 0xe7, 0x75, 0x49, 0xc8, - 0x8e, 0x61, 0xaa, 0x33, 0x8b, 0xc7, 0xe2, 0xc7, 0x48, 0xfa, 0x40, 0x25, - 0xf4, 0x90, 0xe1, 0xca, 0x1f, 0xb9, 0x96, 0x49, 0x9e, 0x73, 0xa1, 0x5f, - 0xa1, 0x29, 0xd4, 0xff, 0x7d, 0xf0, 0x3a, 0xde, 0x95, 0x71, 0x79, 0xbf, - 0x9e, 0x1d, 0x60, 0x61, 0x34, 0x8e, 0x36, 0x76, 0x03, 0x93, 0xd3, 0x30, - 0x84, 0xae, 0x65, 0xde, 0x73, 0xfe, 0x7d, 0x02, 0x5d, 0x65, 0x00, 0x79, - 0x9f, 0xa3, 0xfc, 0xe1, 0xf3, 0xfd, 0x5d, 0x65, 0x78, 0x6f, 0x4b, 0x2b, - 0x53, 0x71, 0xbd, 0x7f, 0xa5, 0xa6, 0xb1, 0xd8, 0x1c, 0xf9, 0x3c, 0x61, - 0xc3, 0x86, 0x0d, 0x79, 0xb4, 0x23, 0x03, 0x63, 0x27, 0x3c, 0xc7, 0xd0, - 0xaf, 0xc9, 0xd4, 0xa7, 0x3b, 0xf5, 0x39, 0x83, 0x5d, 0xd3, 0x1b, 0x88, - 0xa3, 0xbf, 0x79, 0xd5, 0xbf, 0x5c, 0xdc, 0x4a, 0x5d, 0xfa, 0x42, 0xbd, - 0xe0, 0x13, 0xe9, 0x2e, 0x31, 0xae, 0xaf, 0xb5, 0x6b, 0x4e, 0x56, 0x7f, - 0xd4, 0xe0, 0x75, 0xb9, 0xed, 0xcc, 0x5d, 0x3b, 0xb9, 0x97, 0x2c, 0xa9, - 0xa4, 0xbe, 0x12, 0xc6, 0xf4, 0xd1, 0x09, 0x3c, 0x57, 0xc1, 0xd8, 0xfe, - 0x5c, 0xcf, 0x9c, 0x96, 0x7a, 0x85, 0x67, 0xb7, 0xcc, 0xf3, 0xfb, 0xba, - 0xb8, 0xe4, 0x73, 0x0f, 0x9d, 0xba, 0x51, 0x1a, 0xfa, 0x76, 0x1c, 0xe5, - 0x5f, 0x23, 0xe2, 0xde, 0x99, 0x7b, 0x59, 0xbc, 0x95, 0xfc, 0xef, 0x05, - 0x29, 0x6e, 0x98, 0x3f, 0xd1, 0x91, 0x72, 0xa2, 0xe0, 0xcf, 0x52, 0xf9, - 0x0d, 0xbe, 0xc9, 0x52, 0xb9, 0x2e, 0x7e, 0xa3, 0x88, 0xff, 0x7c, 0xad, - 0x1d, 0x5d, 0xf9, 0x75, 0x9e, 0xdd, 0x6d, 0x50, 0x78, 0x31, 0xa7, 0xd7, - 0x5f, 0xc1, 0x6f, 0x33, 0xbc, 0xf2, 0xa6, 0xf8, 0x18, 0x6c, 0xcf, 0x00, - 0xdb, 0xbb, 0x19, 0x37, 0x3f, 0x29, 0x6f, 0x16, 0x18, 0xb5, 0x98, 0x64, - 0xe6, 0x65, 0x77, 0xda, 0x3a, 0xe8, 0x5e, 0xce, 0x7c, 0xc2, 0xf8, 0xf8, - 0x96, 0xf8, 0x17, 0x40, 0x17, 0x89, 0xb7, 0x89, 0x64, 0x64, 0x5b, 0x3c, - 0x0b, 0x68, 0x67, 0x51, 0xcf, 0x7c, 0xf8, 0xb3, 0x90, 0xb0, 0xf1, 0xe4, - 0x7d, 0x05, 0xf1, 0x74, 0x02, 0x6d, 0x29, 0x3a, 0x9a, 0x53, 0x7f, 0x30, - 0xff, 0x82, 0x34, 0xee, 0x05, 0x00, 0xb5, 0xbb, 0x3d, 0xfa, 0x54, 0x06, - 0x7d, 0x99, 0x0e, 0x7f, 0x65, 0x30, 0x4f, 0xa7, 0xe3, 0xd7, 0x0e, 0x12, - 0x7f, 0x18, 0x97, 0xc4, 0xb7, 0xaa, 0x1c, 0x1b, 0x8d, 0xf1, 0x94, 0xc7, - 0x2e, 0xf5, 0xa7, 0x04, 0x54, 0x81, 0xf4, 0x4d, 0x2b, 0xbd, 0xfe, 0xe9, - 0xfc, 0x9b, 0x12, 0x36, 0xc6, 0x7d, 0xf8, 0x39, 0xe3, 0x07, 0x7e, 0xae, - 0x0f, 0xee, 0x5b, 0x68, 0x67, 0x3e, 0x1b, 0xa4, 0x63, 0xf0, 0x17, 0xaf, - 0x34, 0x64, 0xe1, 0xfd, 0x6b, 0xfa, 0xad, 0x80, 0xb0, 0x8d, 0x9c, 0x46, - 0x74, 0xcf, 0xfd, 0x04, 0x3b, 0xae, 0x2e, 0xa7, 0x77, 0x16, 0x68, 0x9c, - 0x51, 0x7f, 0x7d, 0xb4, 0x54, 0x3c, 0xd4, 0x1a, 0x72, 0xd7, 0x47, 0x9b, - 0x0f, 0x0d, 0x29, 0x77, 0x1b, 0x6d, 0x2d, 0xe0, 0xdb, 0x4b, 0x93, 0xe0, - 0xb7, 0xeb, 0x84, 0x8b, 0x9b, 0xe0, 0xe1, 0x5a, 0x7f, 0x65, 0x59, 0xe2, - 0xb7, 0x32, 0x06, 0xbd, 0xa3, 0x43, 0xb3, 0x80, 0xde, 0x9f, 0x50, 0xef, - 0x9c, 0xe8, 0x4d, 0x50, 0xae, 0xaf, 0xb5, 0x93, 0xe7, 0x40, 0xf5, 0xa9, - 0xca, 0x20, 0x23, 0xcd, 0x93, 0xfb, 0xac, 0x4b, 0xe2, 0xfd, 0xaa, 0x47, - 0xd5, 0x19, 0x22, 0xdd, 0xd3, 0x12, 0x3f, 0x01, 0xe9, 0xfc, 0x7d, 0x1a, - 0x83, 0x31, 0xd2, 0xdf, 0xa7, 0x79, 0x01, 0xd0, 0x20, 0x3d, 0x81, 0x77, - 0xbb, 0x56, 0x21, 0xe8, 0x1c, 0x61, 0x2e, 0xc0, 0xb8, 0xcf, 0xe2, 0x6f, - 0x6e, 0xd6, 0x10, 0x76, 0x2a, 0x14, 0xa9, 0x53, 0xca, 0x32, 0xce, 0x13, - 0x31, 0x64, 0xde, 0x57, 0x7e, 0xa5, 0x39, 0x3e, 0x10, 0x24, 0xe5, 0x4c, - 0x65, 0x54, 0x83, 0x89, 0x75, 0x9c, 0xdb, 0x31, 0x70, 0x4c, 0x1a, 0xda, - 0x5b, 0xc8, 0xce, 0x42, 0x06, 0x4c, 0xbd, 0x89, 0x38, 0xd7, 0x42, 0xee, - 0x81, 0xc3, 0x63, 0x09, 0x57, 0x93, 0xd5, 0x28, 0xbf, 0xbf, 0x52, 0xd3, - 0x47, 0x88, 0xae, 0x63, 0x47, 0x63, 0xab, 0x30, 0x34, 0x0e, 0x61, 0xa0, - 0x5d, 0xd4, 0x0c, 0x14, 0xde, 0xb5, 0xe4, 0x74, 0x16, 0xe4, 0x6e, 0xaf, - 0xf0, 0xe9, 0xc3, 0xfb, 0xb6, 0xcb, 0xd9, 0xc5, 0x14, 0x3e, 0x4e, 0x42, - 0x0d, 0xb4, 0x41, 0x83, 0x06, 0xe9, 0x43, 0x30, 0x4f, 0x11, 0x2e, 0xc5, - 0xd8, 0xed, 0x62, 0x89, 0xfb, 0x6f, 0xe5, 0xcf, 0x6e, 0xcf, 0x3c, 0x02, - 0xea, 0xb8, 0x03, 0x5d, 0xf7, 0x12, 0x1a, 0xf5, 0xd8, 0x3d, 0xfb, 0x8e, - 0x55, 0xec, 0x74, 0x26, 0x33, 0xc7, 0x68, 0x50, 0x3a, 0x0c, 0xb8, 0x7c, - 0x8e, 0x56, 0xef, 0x62, 0x87, 0xfe, 0x43, 0xe2, 0xb8, 0x85, 0x51, 0x1c, - 0x3b, 0x93, 0x4f, 0x2a, 0x8e, 0x1c, 0xc6, 0x5a, 0x0e, 0x0a, 0xd0, 0x4e, - 0xfa, 0x4a, 0x75, 0xbf, 0x1b, 0xaa, 0x0a, 0xf9, 0xb9, 0x18, 0xde, 0xe9, - 0x38, 0x4a, 0x86, 0x00, 0x54, 0xc8, 0x87, 0x16, 0x8e, 0x20, 0x52, 0xb1, - 0x81, 0xec, 0x49, 0x14, 0xc7, 0xe9, 0x09, 0xe7, 0x6f, 0xe4, 0x38, 0x76, - 0x29, 0x3e, 0xf0, 0x2a, 0xa2, 0x9e, 0xe8, 0xbe, 0x8f, 0x6a, 0x9f, 0x84, - 0xb1, 0xc8, 0x08, 0x48, 0xdf, 0x88, 0x11, 0x3c, 0x77, 0x27, 0x7d, 0x35, - 0x14, 0xed, 0x95, 0xc2, 0xc8, 0x33, 0x59, 0xb8, 0x8b, 0xaa, 0xc5, 0x0e, - 0xc2, 0x18, 0x14, 0x9e, 0x02, 0xc6, 0xcb, 0x74, 0x94, 0x8f, 0x14, 0x02, - 0x6b, 0x40, 0x8e, 0x22, 0xc3, 0xd1, 0xe0, 0x1a, 0xec, 0x78, 0x75, 0xe7, - 0x59, 0xf5, 0x8f, 0x47, 0x01, 0x18, 0xae, 0xfc, 0xd8, 0x55, 0xff, 0x91, - 0x67, 0x19, 0x97, 0x5e, 0x57, 0x1d, 0xe5, 0x6d, 0x8a, 0xe2, 0xd0, 0x27, - 0x23, 0x08, 0xac, 0x6d, 0x8c, 0x4f, 0xf9, 0x19, 0xa7, 0x7e, 0x66, 0x91, - 0x28, 0x07, 0xc5, 0x4c, 0x27, 0x56, 0x64, 0x68, 0x77, 0x85, 0xe2, 0x42, - 0x99, 0xa9, 0x4f, 0x5a, 0x60, 0x44, 0x7c, 0xc2, 0xee, 0x7a, 0x1a, 0x0a, - 0x88, 0x26, 0x7b, 0x87, 0xe7, 0x34, 0x0e, 0x36, 0x6c, 0xd8, 0xb0, 0x0b, - 0xc3, 0x7d, 0x3d, 0x71, 0x54, 0xcf, 0xb0, 0xf1, 0xa6, 0xbc, 0xe1, 0x99, - 0x3c, 0xf8, 0x6e, 0x27, 0xc6, 0x59, 0x1a, 0xef, 0x9c, 0x6d, 0x25, 0x7c, - 0x14, 0x24, 0x45, 0x42, 0x93, 0x8b, 0x71, 0xa5, 0xfe, 0x95, 0x9a, 0xf2, - 0x61, 0x92, 0x7b, 0x80, 0xc8, 0xa6, 0x3e, 0xe5, 0x35, 0xce, 0x35, 0x5e, - 0xba, 0xb3, 0x4b, 0xfb, 0x3b, 0x47, 0x34, 0xb3, 0x99, 0xf4, 0x9c, 0x09, - 0x49, 0x75, 0xc7, 0x78, 0x4d, 0x63, 0xe5, 0x3d, 0x9b, 0x0f, 0x63, 0x4d, - 0x26, 0x8e, 0xc6, 0x4c, 0xb8, 0xfe, 0xe5, 0x30, 0xce, 0x75, 0x9a, 0xc3, - 0xf9, 0xbf, 0x5d, 0xd5, 0xd5, 0xeb, 0x98, 0xd0, 0x34, 0xde, 0x4c, 0xdd, - 0xab, 0x30, 0xae, 0xf4, 0x9a, 0x80, 0xa3, 0x34, 0x9b, 0xb8, 0x60, 0x9f, - 0x87, 0x1c, 0x10, 0x3e, 0x0f, 0x87, 0xea, 0xc1, 0x25, 0xec, 0xfc, 0x8c, - 0x73, 0x05, 0x4a, 0xe6, 0x5c, 0x86, 0x61, 0xed, 0xc8, 0x48, 0x14, 0x5f, - 0x33, 0xe9, 0x87, 0x8d, 0x73, 0x93, 0xbf, 0xf7, 0x4a, 0x7f, 0xdc, 0x4e, - 0x5a, 0xd5, 0xc9, 0x6d, 0x9c, 0x8b, 0x7f, 0x3a, 0x32, 0xd9, 0x17, 0x30, - 0x61, 0xca, 0x18, 0x17, 0xef, 0x55, 0x8b, 0xd2, 0x38, 0x57, 0x5e, 0xc7, - 0x70, 0x22, 0xc4, 0x51, 0x26, 0x5c, 0xc6, 0x39, 0xde, 0x81, 0x5a, 0xec, - 0x82, 0xbf, 0x85, 0x01, 0xb8, 0x4b, 0x0a, 0x97, 0xa9, 0x0b, 0xd8, 0x67, - 0x61, 0xec, 0xed, 0x20, 0xfc, 0x19, 0xc8, 0xf0, 0x6e, 0x79, 0x8d, 0xf3, - 0x88, 0xf9, 0xab, 0x1c, 0xea, 0x93, 0x0d, 0xdf, 0x0e, 0x51, 0x1d, 0x14, - 0x11, 0x17, 0xc9, 0x38, 0x57, 0x58, 0x75, 0x16, 0xa1, 0x5e, 0x45, 0x91, - 0x2a, 0x60, 0x3c, 0xe4, 0xa3, 0x44, 0x74, 0xc6, 0xaf, 0x0a, 0x0b, 0x26, - 0x5f, 0xa3, 0x3c, 0x39, 0xff, 0x5d, 0x6c, 0xea, 0xae, 0x2b, 0xfd, 0x9a, - 0x43, 0x9b, 0x76, 0x20, 0x0f, 0xbf, 0x20, 0x5e, 0x7d, 0x28, 0x08, 0x79, - 0x5d, 0x59, 0xc6, 0xaa, 0xd2, 0xec, 0xc7, 0x11, 0xd5, 0x6f, 0x51, 0xc0, - 0x32, 0xdd, 0x7c, 0x81, 0x12, 0x94, 0x87, 0xbc, 0x4d, 0xe7, 0xe8, 0xe1, - 0x27, 0xc4, 0xf1, 0x93, 0xd7, 0xc9, 0xec, 0x3c, 0x3d, 0xc4, 0x58, 0x74, - 0x16, 0x53, 0x38, 0x66, 0x79, 0x2f, 0xf1, 0xbc, 0xf3, 0x50, 0x1c, 0x3b, - 0xf2, 0xa7, 0xa9, 0xbe, 0xf0, 0x7d, 0x21, 0xbb, 0x27, 0x66, 0x2e, 0xd1, - 0xf8, 0xeb, 0x8c, 0xf2, 0xee, 0x8c, 0x05, 0x14, 0xef, 0x47, 0x78, 0x4e, - 0x62, 0x1e, 0xea, 0xaa, 0x71, 0xc1, 0x0e, 0x63, 0x3a, 0xcf, 0xa7, 0x40, - 0xee, 0x79, 0x87, 0x35, 0x88, 0xca, 0xf7, 0xa0, 0x30, 0xea, 0x0b, 0xbd, - 0x85, 0xc4, 0x3d, 0x8a, 0x70, 0xaf, 0x2b, 0xab, 0xbd, 0xb5, 0x54, 0x97, - 0xb2, 0x9c, 0xf0, 0x27, 0x63, 0xef, 0xbc, 0x51, 0x51, 0xe3, 0x5c, 0x75, - 0x2c, 0xcf, 0xdf, 0xaa, 0xed, 0x4b, 0xc6, 0xb9, 0xe6, 0x81, 0xf3, 0xd1, - 0x51, 0x76, 0x32, 0xed, 0x86, 0x15, 0x08, 0xc6, 0xd6, 0x2e, 0x16, 0x5f, - 0x96, 0xb2, 0xfb, 0xe6, 0x2c, 0x34, 0x7a, 0x8d, 0x73, 0xe9, 0x62, 0x7a, - 0xf7, 0x1a, 0xd9, 0xb1, 0x06, 0xa8, 0x9d, 0x85, 0x21, 0xf1, 0x9e, 0xfe, - 0x5d, 0x85, 0x93, 0x5b, 0xd2, 0x7d, 0xcc, 0x78, 0x14, 0x76, 0xe2, 0x95, - 0xc3, 0xd0, 0x09, 0x16, 0xa2, 0x3b, 0x89, 0x47, 0x1d, 0x9e, 0x51, 0x1f, - 0x32, 0x06, 0x32, 0xe1, 0x83, 0xcd, 0x9c, 0xb8, 0xea, 0x1d, 0x8a, 0xa7, - 0xf8, 0x35, 0xd8, 0x4d, 0x7c, 0x9d, 0xb9, 0x2b, 0x9d, 0x3a, 0x39, 0x72, - 0x8e, 0xf9, 0x2c, 0x07, 0x39, 0xbb, 0x82, 0x53, 0x1e, 0xb3, 0x95, 0xce, - 0x33, 0xff, 0x69, 0x6e, 0xbb, 0x8e, 0xfa, 0xae, 0xc7, 0x80, 0xcc, 0x30, - 0x73, 0x8b, 0x78, 0x00, 0x9d, 0x69, 0x07, 0x73, 0xd2, 0x46, 0xe6, 0x44, - 0x8d, 0x45, 0xcd, 0x43, 0x6e, 0x17, 0x95, 0x71, 0xce, 0xbb, 0xb3, 0xc9, - 0xe8, 0x0b, 0x43, 0x18, 0xd7, 0x3a, 0xb9, 0x58, 0x00, 0xff, 0xa6, 0x43, - 0xbb, 0x98, 0xb7, 0xc2, 0x65, 0xb1, 0xf8, 0x78, 0x39, 0x19, 0x6b, 0x2c, - 0x96, 0x66, 0x28, 0xfb, 0x19, 0x9f, 0x3a, 0x45, 0xd8, 0x48, 0x6d, 0x2a, - 0xcd, 0x21, 0x3f, 0x5e, 0x20, 0x6f, 0xf7, 0x9c, 0xc7, 0x63, 0xd8, 0x95, - 0x56, 0xa6, 0x22, 0x79, 0x8d, 0x73, 0xf9, 0x49, 0xde, 0x1e, 0x8a, 0x0e, - 0x38, 0x0f, 0xbd, 0x4f, 0x06, 0xd3, 0x3a, 0x64, 0xae, 0x8c, 0xa8, 0x20, - 0x8b, 0x5e, 0x5d, 0x4a, 0xab, 0x8b, 0xc2, 0x98, 0xc3, 0x1f, 0x54, 0x1e, - 0x7f, 0x83, 0x71, 0x4e, 0x31, 0x8e, 0x5e, 0xf0, 0x8c, 0x5e, 0x1f, 0x05, - 0x7f, 0x67, 0x7e, 0x50, 0x1d, 0x74, 0xcf, 0xe9, 0xaf, 0xad, 0xcc, 0x0d, - 0xc2, 0xa6, 0x86, 0x22, 0xe2, 0xc2, 0xc6, 0x39, 0xba, 0x61, 0x2a, 0xf3, - 0x7e, 0x6a, 0x14, 0xfc, 0x19, 0x91, 0xdf, 0x38, 0xfd, 0xe9, 0x2c, 0x5e, - 0x7b, 0xf8, 0x2d, 0xfc, 0x57, 0x6a, 0xd1, 0x18, 0xe7, 0xec, 0xf0, 0xee, - 0x87, 0xde, 0xb6, 0x99, 0x45, 0x90, 0x62, 0x73, 0x36, 0x63, 0x28, 0x97, - 0x53, 0xb7, 0x69, 0xbc, 0x96, 0xf5, 0x2c, 0xf5, 0xae, 0xe2, 0xd4, 0xbe, - 0xf8, 0x4f, 0x35, 0x36, 0x22, 0x46, 0xa1, 0x73, 0x84, 0xe7, 0x3c, 0xb5, - 0x9b, 0xbe, 0x92, 0xd1, 0x6a, 0xe4, 0xb4, 0x78, 0xae, 0x31, 0x9b, 0x21, - 0xb3, 0xf5, 0x3a, 0xac, 0xc2, 0xe5, 0x28, 0x2b, 0x9b, 0x05, 0xae, 0xd5, - 0x9c, 0x56, 0x99, 0xa3, 0x67, 0x1f, 0xe3, 0x5c, 0x25, 0xd5, 0xe4, 0x83, - 0xa6, 0x8e, 0x6e, 0xa7, 0x38, 0x2c, 0xbc, 0x4e, 0xc2, 0xcf, 0xe0, 0xa8, - 0x70, 0x39, 0x7d, 0x70, 0xf1, 0x68, 0xca, 0x74, 0x64, 0x03, 0xaf, 0x76, - 0x5c, 0x8f, 0x9f, 0x64, 0x86, 0x8c, 0x76, 0x67, 0xd1, 0x16, 0xa3, 0xb8, - 0x90, 0x93, 0x55, 0x66, 0xd7, 0x5e, 0x1f, 0x9c, 0x9e, 0xa8, 0xfc, 0x38, - 0x9d, 0xb1, 0x92, 0x78, 0x1d, 0x21, 0xf1, 0xad, 0x33, 0x5f, 0xb0, 0x19, - 0xb0, 0x4a, 0x61, 0x2c, 0x06, 0x8c, 0xc5, 0xcf, 0x3b, 0x1e, 0x93, 0x59, - 0x68, 0xb8, 0x4d, 0xf9, 0x29, 0x0e, 0xfa, 0xde, 0x37, 0xc4, 0x71, 0xcb, - 0x11, 0x1e, 0x03, 0x31, 0x2c, 0x76, 0xf4, 0x55, 0x78, 0x69, 0x8e, 0x4d, - 0xa7, 0x9e, 0xc4, 0xf5, 0x9b, 0x4f, 0x2b, 0x93, 0x7e, 0x92, 0xd2, 0xee, - 0xcd, 0xff, 0x39, 0x57, 0x19, 0x94, 0xbf, 0x4f, 0x1b, 0xe7, 0x52, 0x7a, - 0x7b, 0xa0, 0xf4, 0xae, 0xe2, 0xc8, 0xdc, 0x2a, 0xdd, 0x43, 0xf2, 0xf3, - 0x3a, 0x4d, 0xb2, 0x5a, 0xa1, 0x9a, 0x0e, 0xb5, 0x84, 0xbc, 0x9d, 0x8a, - 0x57, 0x09, 0x27, 0x81, 0x7d, 0x3a, 0x34, 0x81, 0x63, 0x17, 0xab, 0x19, - 0x20, 0xab, 0xb9, 0xd7, 0x6e, 0xde, 0x99, 0x50, 0x69, 0xa0, 0x49, 0x99, - 0x50, 0x9c, 0x39, 0x50, 0x3f, 0xc8, 0xbb, 0x58, 0xa0, 0x41, 0x71, 0x03, - 0x24, 0xc6, 0xdb, 0x08, 0xad, 0xf1, 0xa1, 0x85, 0xf8, 0x5d, 0x0d, 0x29, - 0xad, 0xe8, 0x4a, 0xe8, 0x07, 0x8e, 0xc1, 0xaf, 0xe2, 0xbd, 0xc0, 0x54, - 0x56, 0x90, 0x52, 0x31, 0x80, 0x65, 0xc0, 0x88, 0xf9, 0xce, 0x81, 0xa4, - 0xd4, 0xfb, 0x31, 0x12, 0xde, 0x61, 0xa7, 0x41, 0xf3, 0x19, 0x34, 0x19, - 0x32, 0x8a, 0xa2, 0x02, 0xc5, 0xf4, 0x1d, 0xa0, 0x0f, 0x18, 0x44, 0xcb, - 0x31, 0x8c, 0xd6, 0xaa, 0x0c, 0xf2, 0x5f, 0x8a, 0xdf, 0x17, 0xd0, 0x09, - 0x90, 0xb0, 0xf0, 0x3a, 0xb5, 0xa3, 0x17, 0xf4, 0x1d, 0xef, 0x06, 0xae, - 0x20, 0x9d, 0x3e, 0xdc, 0x34, 0x8f, 0x67, 0x19, 0x31, 0xfb, 0x41, 0xde, - 0xfa, 0x28, 0xfe, 0x1d, 0xd0, 0x7c, 0xe8, 0x0a, 0x48, 0xed, 0x8a, 0xe4, - 0x54, 0xa7, 0x03, 0xa1, 0x97, 0xd9, 0x21, 0x5f, 0x4c, 0xff, 0xae, 0x65, - 0x95, 0x76, 0x2d, 0x42, 0xf4, 0x0f, 0xfc, 0x9e, 0x80, 0x52, 0x20, 0x77, - 0x1f, 0xea, 0xef, 0x78, 0xae, 0x24, 0xce, 0x62, 0xb0, 0x51, 0x3d, 0x7e, - 0x27, 0xfc, 0x73, 0x48, 0xfd, 0xa0, 0xc1, 0xe9, 0xad, 0x0b, 0x5e, 0x8e, - 0x53, 0x1e, 0xcd, 0x53, 0x52, 0x52, 0x96, 0x22, 0x84, 0xd4, 0xde, 0x66, - 0x50, 0xa4, 0xb8, 0x4a, 0x90, 0x34, 0x6d, 0xda, 0x34, 0x67, 0x60, 0x62, - 0xf8, 0x0f, 0xe3, 0xd9, 0x4f, 0x20, 0xe2, 0xfd, 0x5f, 0xeb, 0xaa, 0x82, - 0xd3, 0x10, 0x8e, 0x2a, 0xa5, 0x82, 0xe5, 0xad, 0xd4, 0x52, 0x7d, 0xe2, - 0x75, 0x1a, 0x3f, 0xdd, 0xd9, 0xe9, 0x5d, 0x86, 0x91, 0x24, 0xe5, 0x21, - 0x0b, 0x41, 0x3d, 0x1d, 0xc5, 0x7a, 0x04, 0xd7, 0x19, 0xe8, 0xcd, 0xfa, - 0xe2, 0xed, 0x76, 0xe2, 0x28, 0x9e, 0xe9, 0x53, 0xe1, 0x7d, 0x11, 0x24, - 0xa1, 0xeb, 0x75, 0xf2, 0xd3, 0xae, 0x9e, 0xe2, 0xa8, 0xff, 0xeb, 0x41, - 0x1a, 0x8b, 0xa9, 0xd0, 0x1a, 0x68, 0x55, 0x88, 0xc4, 0xcf, 0xd3, 0xa0, - 0xd7, 0xa0, 0x2e, 0x90, 0x37, 0x2f, 0xf1, 0x84, 0x26, 0xff, 0xfb, 0xa0, - 0x1f, 0xe1, 0xd5, 0x95, 0xbc, 0xae, 0xb1, 0x8e, 0xf6, 0xac, 0xe0, 0x79, - 0x2a, 0xa4, 0x3c, 0x35, 0x0e, 0xcc, 0x58, 0x37, 0xf9, 0x6b, 0x2c, 0x8d, - 0x83, 0xde, 0x82, 0x2e, 0x81, 0xb4, 0xe2, 0xaa, 0xbc, 0xdc, 0xae, 0x26, - 0x0f, 0x3f, 0x40, 0x32, 0xf0, 0x55, 0xa7, 0xd5, 0x1e, 0x5a, 0xc0, 0xf3, - 0xd9, 0x90, 0x31, 0x14, 0xd4, 0xef, 0x4f, 0x43, 0xe2, 0x77, 0x19, 0x08, - 0x52, 0x54, 0xca, 0x72, 0x6a, 0x8f, 0x14, 0xbc, 0x51, 0x60, 0xbf, 0x90, - 0x31, 0xb6, 0x0e, 0xa3, 0x67, 0x39, 0xcf, 0x3f, 0x41, 0xc3, 0xa1, 0x0b, - 0x20, 0x8d, 0x09, 0x53, 0x7f, 0xe1, 0xd5, 0x01, 0x72, 0xd7, 0x55, 0xf7, - 0xf2, 0x53, 0x98, 0xda, 0xab, 0xb8, 0x72, 0xd5, 0xa1, 0xf7, 0x20, 0xb5, - 0x55, 0x79, 0x6e, 0x84, 0x36, 0x84, 0xee, 0x35, 0x66, 0x86, 0x42, 0xc2, - 0x46, 0x4e, 0x63, 0xf9, 0x4e, 0x14, 0xe0, 0x3f, 0x50, 0x76, 0xd7, 0x71, - 0x94, 0x6d, 0x03, 0x27, 0x55, 0xd6, 0xe2, 0x37, 0x05, 0xea, 0x07, 0x09, - 0x0b, 0xef, 0x18, 0xa8, 0x85, 0xdf, 0x2f, 0xd0, 0x84, 0x50, 0x38, 0x17, - 0xc7, 0x29, 0x5e, 0x1d, 0x48, 0xf9, 0x0b, 0x0b, 0xc9, 0x22, 0xb5, 0x53, - 0x65, 0xa9, 0x4d, 0xca, 0x37, 0x15, 0x12, 0xa6, 0x6e, 0x92, 0x0c, 0x38, - 0x05, 0x12, 0x9e, 0x2a, 0x4f, 0xbb, 0x26, 0x8f, 0x40, 0x92, 0xab, 0xca, - 0x4f, 0x75, 0xf9, 0x0a, 0x52, 0x98, 0xb0, 0x7e, 0x0c, 0x52, 0x1c, 0x3d, - 0x1b, 0x7c, 0x24, 0x5f, 0x6b, 0x43, 0x6e, 0xa7, 0xf0, 0xb7, 0x21, 0x61, - 0xf0, 0x2a, 0x64, 0xf0, 0x51, 0x3d, 0xc5, 0x77, 0x5a, 0xe9, 0x9e, 0xc1, - 0xb1, 0xf1, 0x54, 0x48, 0xf5, 0x11, 0xbf, 0xdd, 0x05, 0xa9, 0x4c, 0xd3, - 0x66, 0xf1, 0xf5, 0x49, 0x90, 0xda, 0xf3, 0x00, 0xe4, 0x27, 0xfb, 0xf0, - 0x2e, 0xe6, 0x4a, 0xe4, 0x8f, 0xd2, 0xba, 0x59, 0x4a, 0x02, 0x94, 0xc3, - 0xc2, 0xd5, 0xa1, 0xc4, 0x36, 0xf9, 0xab, 0x0f, 0x0f, 0x87, 0xd4, 0x87, - 0x2f, 0x42, 0xa6, 0x8e, 0xdc, 0x3a, 0x32, 0xad, 0x0d, 0xd7, 0x19, 0xd0, - 0xaf, 0x50, 0x7b, 0x48, 0x98, 0x5c, 0x06, 0x4d, 0x42, 0xfe, 0xaf, 0x41, - 0x16, 0xae, 0xe3, 0xef, 0xd6, 0xd6, 0x71, 0x44, 0x76, 0x35, 0x7e, 0xb3, - 0x20, 0xb5, 0xa9, 0x19, 0xe4, 0xe6, 0x13, 0x1e, 0xc3, 0x4e, 0x7d, 0xa7, - 0xf1, 0x31, 0x19, 0xd2, 0xbd, 0x9f, 0x8b, 0xc1, 0xb3, 0x05, 0xf4, 0x32, - 0xb2, 0x73, 0x11, 0x73, 0xe9, 0x3a, 0x16, 0x09, 0xd4, 0x6f, 0xea, 0xa7, - 0x27, 0xa0, 0x26, 0x90, 0xe2, 0x78, 0x9d, 0xfc, 0xda, 0x41, 0xe2, 0x3b, - 0xf1, 0x59, 0x5b, 0xc8, 0x1b, 0x4f, 0xed, 0x6e, 0x0e, 0x29, 0xce, 0x5c, - 0xa8, 0x31, 0x64, 0xb0, 0x50, 0xff, 0x69, 0x6c, 0x2e, 0x82, 0xba, 0x43, - 0xe2, 0xff, 0x2e, 0x90, 0xda, 0x2e, 0xfe, 0x56, 0x7f, 0xba, 0x9d, 0xd2, - 0x29, 0xbd, 0xf8, 0x50, 0x6d, 0xef, 0x08, 0x79, 0xdb, 0x5d, 0x56, 0x7b, - 0x55, 0xa6, 0xda, 0xb5, 0x09, 0x52, 0x1b, 0xd7, 0xf8, 0xd0, 0x6a, 0xfc, - 0xd4, 0x07, 0x5e, 0xbc, 0x76, 0xc7, 0x38, 0x17, 0x2e, 0xea, 0x5b, 0xb5, - 0xcd, 0xcd, 0x9b, 0x3c, 0x96, 0x70, 0xfb, 0x92, 0x71, 0xae, 0x3e, 0x91, - 0x6e, 0xf1, 0x10, 0x32, 0x65, 0x89, 0x64, 0x32, 0x46, 0xb7, 0x64, 0xb2, - 0xfa, 0xe8, 0x2c, 0xe8, 0x46, 0x48, 0x6d, 0xd6, 0xf8, 0x93, 0xd3, 0x9c, - 0x21, 0x3f, 0x8d, 0xbd, 0x23, 0xa0, 0x17, 0xd1, 0x35, 0x7e, 0x97, 0xce, - 0x81, 0x82, 0x2e, 0x1e, 0x79, 0x1a, 0x6a, 0x08, 0x29, 0x5f, 0xb7, 0x93, - 0xac, 0xd0, 0x38, 0x1a, 0x0a, 0x8f, 0xfe, 0x01, 0x8f, 0xae, 0xc5, 0xd0, - 0x56, 0xdf, 0x89, 0x0f, 0x46, 0x40, 0xe2, 0x5f, 0x61, 0x2c, 0xa7, 0xb4, - 0x8d, 0xa0, 0x67, 0x94, 0x67, 0x28, 0x6f, 0xf1, 0xde, 0xb3, 0xd0, 0x71, - 0xd0, 0x6c, 0xe8, 0x66, 0x48, 0x75, 0x91, 0x53, 0xfc, 0xaa, 0xd0, 0xa9, - 0xd0, 0x58, 0x0c, 0xfb, 0x65, 0x2c, 0x26, 0xac, 0x55, 0x7b, 0x78, 0xfe, - 0x0e, 0x1a, 0x0c, 0xd5, 0x87, 0xbc, 0x75, 0x92, 0xac, 0xbb, 0x14, 0x9a, - 0x07, 0xf5, 0x83, 0xc4, 0xbf, 0x5e, 0x17, 0x64, 0x07, 0xf0, 0x25, 0x29, - 0xf3, 0x9c, 0xb8, 0x5c, 0x23, 0x7d, 0x86, 0x08, 0x3f, 0x41, 0x3f, 0x42, - 0x33, 0x78, 0x05, 0x71, 0x03, 0x73, 0x6a, 0x11, 0x1f, 0xde, 0xd5, 0xf8, - 0x51, 0x7e, 0xca, 0xe3, 0x3a, 0x48, 0x79, 0x1a, 0x79, 0xca, 0xad, 0xe3, - 0x14, 0x2e, 0x3f, 0x85, 0x5d, 0x0f, 0xa9, 0xfe, 0xaa, 0xd3, 0x01, 0xd0, - 0x74, 0x68, 0x29, 0x24, 0xd9, 0xb7, 0x0e, 0xda, 0x08, 0xa9, 0x1f, 0xe4, - 0xa7, 0xb6, 0xdf, 0x04, 0x99, 0xf6, 0x72, 0x5b, 0xcc, 0x95, 0x65, 0x9c, - 0xd7, 0x22, 0xf6, 0x24, 0x48, 0x58, 0xb8, 0xc7, 0xa4, 0xea, 0xd3, 0x0b, - 0xfa, 0x0d, 0xfa, 0x1c, 0xda, 0x1f, 0x8a, 0x83, 0x34, 0x47, 0x69, 0xfc, - 0x98, 0xfa, 0xac, 0xe7, 0x5e, 0xf5, 0x51, 0xdd, 0xe4, 0x27, 0xfc, 0x85, - 0x5b, 0x25, 0xa8, 0x35, 0xa4, 0xf4, 0xb7, 0x43, 0xaa, 0x5f, 0x75, 0x68, - 0x14, 0xf4, 0x11, 0x24, 0xbe, 0x92, 0x9f, 0xfa, 0x4a, 0x71, 0x0e, 0x82, - 0x2a, 0x43, 0xe5, 0xc1, 0x87, 0xe8, 0x0e, 0x46, 0x1a, 0xf7, 0xb7, 0x42, - 0xd3, 0xf9, 0x16, 0xc1, 0x2a, 0x78, 0x67, 0x15, 0xf7, 0xaa, 0xa3, 0xca, - 0xad, 0x0b, 0x09, 0x47, 0xb9, 0xb0, 0x71, 0xce, 0x49, 0x97, 0xb7, 0x78, - 0x1e, 0x12, 0x05, 0x7f, 0x2a, 0x6d, 0x23, 0xc8, 0xcb, 0x6f, 0x2f, 0xb2, - 0x78, 0xfa, 0x86, 0xfa, 0xde, 0x63, 0x9c, 0x27, 0x11, 0xf7, 0x6a, 0x48, - 0xfd, 0x78, 0x3e, 0x24, 0x1c, 0x4b, 0x73, 0xc2, 0xe1, 0x6d, 0xea, 0xb1, - 0x10, 0xb9, 0xbc, 0x9a, 0x53, 0x24, 0x6b, 0x79, 0xed, 0x6b, 0x0d, 0x7a, - 0x84, 0xe6, 0xc0, 0x47, 0xa0, 0x06, 0x90, 0xa9, 0x3f, 0xb7, 0x61, 0x27, - 0xd9, 0x28, 0xf9, 0xfc, 0x01, 0x3a, 0xfa, 0x6a, 0xe6, 0xfa, 0xb5, 0x2c, - 0xe4, 0x8a, 0x27, 0xc6, 0x41, 0xee, 0x7e, 0xd4, 0x9c, 0xd7, 0x1d, 0xfa, - 0x96, 0x79, 0x25, 0x55, 0xe3, 0x85, 0xbc, 0x85, 0xf7, 0x60, 0xa8, 0x1b, - 0xa4, 0xfb, 0xeb, 0x21, 0x2f, 0xff, 0xa8, 0xde, 0x17, 0x40, 0xea, 0x53, - 0xd1, 0xb9, 0x90, 0x5f, 0x5b, 0x34, 0xf6, 0xd5, 0xe7, 0x1a, 0xdf, 0xea, - 0x43, 0x8d, 0x53, 0xf1, 0x89, 0xc6, 0xff, 0x22, 0x68, 0x26, 0xb4, 0x1f, - 0x24, 0x57, 0x05, 0x7a, 0x1e, 0x92, 0x8c, 0xbe, 0x18, 0x72, 0x97, 0x29, - 0x7e, 0xd1, 0x5c, 0xa8, 0x30, 0xd5, 0x4d, 0x71, 0xdd, 0x4e, 0x1f, 0xec, - 0x6e, 0xc9, 0xc2, 0x60, 0x1e, 0xe3, 0xa9, 0x00, 0xbc, 0xce, 0x24, 0x50, - 0x72, 0xc3, 0xed, 0x54, 0xee, 0x31, 0x90, 0xca, 0xdd, 0x00, 0x89, 0x27, - 0x97, 0x79, 0x68, 0x16, 0xcf, 0x5d, 0x20, 0xef, 0xdc, 0x82, 0x57, 0xa0, - 0xf2, 0x3b, 0xef, 0xbc, 0xf3, 0xad, 0xfa, 0x94, 0x85, 0x45, 0xe9, 0x3d, - 0xde, 0xfc, 0x15, 0xc7, 0xed, 0xca, 0xb5, 0x73, 0xce, 0x89, 0x00, 0x67, - 0xb3, 0x8b, 0xc5, 0x3c, 0x8d, 0x35, 0xf1, 0xfa, 0x3e, 0xed, 0xc4, 0xe8, - 0x62, 0x40, 0x91, 0xee, 0xfd, 0x9c, 0x18, 0x57, 0x83, 0x5e, 0x42, 0xc6, - 0x0f, 0x70, 0xbf, 0x34, 0xf2, 0x13, 0xf0, 0x1a, 0xd4, 0x2d, 0xa1, 0x16, - 0xa1, 0xfb, 0xb2, 0x3a, 0x83, 0x68, 0x0e, 0x83, 0x2a, 0x9d, 0x18, 0xcb, - 0x3b, 0x68, 0xf4, 0x2c, 0x26, 0xab, 0x03, 0x49, 0x28, 0xf8, 0x91, 0xc2, - 0x14, 0x47, 0x71, 0x45, 0xca, 0x47, 0x75, 0x4f, 0x81, 0x3a, 0x42, 0x87, - 0x40, 0x12, 0x06, 0x1a, 0x60, 0x7e, 0x83, 0x01, 0xef, 0x12, 0x4e, 0xf9, - 0x68, 0x90, 0x2b, 0x1f, 0x33, 0x89, 0x99, 0x48, 0x62, 0x58, 0x85, 0x49, - 0xb8, 0x76, 0x80, 0x0e, 0x85, 0x94, 0xbf, 0xfc, 0x34, 0x70, 0x23, 0x39, - 0x85, 0x29, 0xbf, 0x66, 0xd0, 0xc1, 0x90, 0x06, 0x98, 0xa9, 0x37, 0xb7, - 0xc5, 0x9c, 0xca, 0x17, 0xb3, 0x09, 0x17, 0xf5, 0x93, 0x9e, 0x4b, 0x73, - 0xea, 0xa7, 0xaa, 0x90, 0x04, 0x4f, 0x7b, 0x48, 0xfd, 0xab, 0x41, 0xae, - 0x01, 0xe9, 0xad, 0xbf, 0xf2, 0xaa, 0x06, 0x69, 0xe0, 0x0b, 0x1b, 0xc5, - 0x53, 0xdd, 0xa3, 0xe9, 0x2b, 0xb5, 0xa1, 0x2d, 0xd4, 0x06, 0x2a, 0xad, - 0xad, 0x04, 0x07, 0xaa, 0xb0, 0xe2, 0xbd, 0x81, 0xa3, 0xf0, 0x39, 0xdc, - 0x77, 0x83, 0x84, 0xdb, 0xbe, 0xe4, 0x84, 0x9b, 0xf8, 0x4d, 0x82, 0x47, - 0x78, 0x45, 0xea, 0x03, 0xf1, 0xdb, 0x89, 0x2c, 0x4a, 0xfd, 0xcc, 0x69, - 0x94, 0x54, 0x56, 0xf1, 0x56, 0xb2, 0x93, 0xb9, 0x96, 0x6f, 0x01, 0xac, - 0xe7, 0xdd, 0x9f, 0xcd, 0x7c, 0x31, 0x7c, 0x0a, 0xe1, 0xe2, 0xbd, 0x68, - 0xfa, 0x54, 0x71, 0xd4, 0xdf, 0xea, 0x77, 0xf5, 0xbf, 0xea, 0xa0, 0xb2, - 0xfd, 0xf8, 0x5e, 0xbc, 0xa4, 0x3e, 0x8f, 0x34, 0x46, 0x95, 0x97, 0xf8, - 0x4b, 0xf1, 0xc4, 0xab, 0xe2, 0xd3, 0x26, 0x90, 0xf2, 0x36, 0xed, 0x51, - 0x1c, 0x77, 0xfe, 0x1a, 0x4b, 0xaa, 0xab, 0xfc, 0x34, 0x56, 0x14, 0xee, - 0x75, 0xaa, 0x93, 0xe2, 0xf8, 0xd5, 0x49, 0x7e, 0xca, 0xc3, 0xcd, 0xb3, - 0xca, 0x43, 0xf5, 0x54, 0xb9, 0x65, 0xf1, 0x0c, 0x51, 0xc2, 0x4e, 0xed, - 0x92, 0x1c, 0xaa, 0x0f, 0x69, 0x9c, 0xb9, 0xeb, 0x6e, 0xf2, 0x37, 0xf5, - 0x57, 0xde, 0x7e, 0xfc, 0x25, 0x3f, 0x77, 0x7b, 0x79, 0x74, 0xda, 0x24, - 0x7e, 0x8f, 0x54, 0x7f, 0x85, 0x99, 0x76, 0xeb, 0xaa, 0x7e, 0x90, 0x02, - 0xac, 0x31, 0xdb, 0x05, 0x3a, 0x00, 0x12, 0xa6, 0xa6, 0x0e, 0xdc, 0x16, - 0x73, 0xc2, 0x47, 0xe1, 0xc2, 0x48, 0xf7, 0x6e, 0x67, 0xea, 0xeb, 0xc6, - 0x48, 0x7e, 0x6a, 0x67, 0xa4, 0xfa, 0x28, 0xae, 0x91, 0x5b, 0x06, 0x7b, - 0x8d, 0x6b, 0xa5, 0x33, 0x65, 0x99, 0x3a, 0xcb, 0x4f, 0x61, 0xa6, 0x6c, - 0x53, 0x9e, 0x30, 0x28, 0xad, 0x2e, 0x86, 0x1f, 0x88, 0xe6, 0x38, 0xa5, - 0x53, 0xbb, 0x55, 0x76, 0xeb, 0x10, 0xe9, 0xde, 0x4f, 0x5e, 0xa9, 0x6e, - 0xca, 0x5f, 0xf1, 0x95, 0x2e, 0x1a, 0xe7, 0xce, 0x5f, 0xf2, 0xe4, 0x54, - 0x76, 0x65, 0x36, 0x69, 0x12, 0x67, 0x87, 0x66, 0x26, 0x27, 0x7b, 0x94, - 0x9f, 0x71, 0xe2, 0x19, 0x3d, 0x8b, 0x87, 0xbc, 0xf9, 0x8b, 0x47, 0x84, - 0xb5, 0xc2, 0xd5, 0xd7, 0x0a, 0x57, 0xbf, 0xc8, 0xef, 0x00, 0x48, 0x7c, - 0x73, 0x18, 0xd4, 0x1c, 0x52, 0xfd, 0xcd, 0x98, 0xe2, 0xd6, 0xd7, 0x19, - 0x3c, 0x95, 0xde, 0x8b, 0x97, 0x3b, 0x81, 0xc2, 0x54, 0x1f, 0xc9, 0x4e, - 0xf1, 0x85, 0xda, 0xa0, 0xfe, 0x2b, 0x0b, 0x03, 0xd5, 0x57, 0xf5, 0x50, - 0x7d, 0x75, 0xef, 0xe7, 0xdc, 0x71, 0xdc, 0x75, 0x50, 0xdb, 0xd4, 0xaf, - 0x4a, 0x2f, 0x59, 0xad, 0xe7, 0xd2, 0xb0, 0x21, 0xd8, 0x69, 0x83, 0xd2, - 0xa8, 0x3c, 0xbf, 0xb1, 0x57, 0x56, 0x7b, 0x15, 0xae, 0xb4, 0x91, 0x78, - 0xd3, 0xf8, 0x2b, 0x8e, 0xbb, 0xae, 0x3c, 0xfe, 0x75, 0xac, 0x9d, 0x53, - 0x6c, 0x99, 0xc8, 0xc3, 0x4b, 0x38, 0xfe, 0x79, 0xa6, 0x88, 0x5d, 0x1c, - 0xf1, 0x5a, 0x34, 0x4e, 0x38, 0xa8, 0x1f, 0xbc, 0xbc, 0x19, 0x50, 0x1e, - 0x26, 0x3f, 0xe5, 0xcd, 0xb1, 0xca, 0x4c, 0x16, 0x41, 0x0b, 0x89, 0xab, - 0xfa, 0x54, 0xc8, 0xe9, 0x78, 0x31, 0x8b, 0x43, 0x87, 0x97, 0x87, 0x38, - 0x1d, 0x28, 0x5e, 0x2b, 0xaf, 0x53, 0xbf, 0x89, 0x4f, 0xa4, 0x33, 0x1c, - 0x0a, 0xa5, 0x40, 0x6a, 0xa7, 0xfa, 0x54, 0x73, 0x89, 0x9b, 0xf7, 0x14, - 0xd7, 0xc8, 0x70, 0xf1, 0xb7, 0x78, 0x4e, 0xb2, 0x48, 0x7c, 0xad, 0xb9, - 0xde, 0xc8, 0x01, 0x6e, 0x4b, 0x38, 0xe1, 0x27, 0xec, 0xc4, 0xa3, 0xed, - 0xa0, 0x36, 0x90, 0xf0, 0x91, 0xac, 0xf1, 0xf2, 0x9e, 0xca, 0x51, 0x5e, - 0xca, 0xd3, 0xe4, 0xad, 0xb2, 0x8c, 0xfc, 0xf4, 0x1b, 0xf7, 0xaa, 0xaf, - 0x78, 0xab, 0x31, 0x74, 0x08, 0x64, 0x74, 0x2c, 0xe5, 0xe3, 0xe5, 0x05, - 0xbc, 0x1c, 0x7e, 0x55, 0xfb, 0xc4, 0x2b, 0xba, 0xaa, 0x4c, 0xaf, 0xab, - 0x8c, 0x71, 0xbe, 0x93, 0x77, 0x61, 0xb3, 0x08, 0xb8, 0x10, 0x52, 0x9e, - 0xc2, 0x43, 0x24, 0x7d, 0xa9, 0x0f, 0xef, 0x97, 0x16, 0xf0, 0x1e, 0xed, - 0x56, 0xee, 0xd5, 0x0e, 0xe5, 0x61, 0xf2, 0xf4, 0xca, 0x63, 0x85, 0xc9, - 0x4f, 0xe5, 0xb9, 0xeb, 0x6f, 0xc6, 0x97, 0xe1, 0x5d, 0xef, 0xd5, 0xc8, - 0x09, 0xbf, 0xfa, 0x91, 0x55, 0x20, 0x99, 0xb9, 0xfd, 0x47, 0xc9, 0x2a, - 0x3e, 0xbc, 0xf5, 0x14, 0xcf, 0x46, 0x36, 0x2b, 0x4c, 0x4e, 0x6d, 0x17, - 0x2e, 0x22, 0x6f, 0x1e, 0x66, 0xbc, 0x2a, 0xcc, 0xf4, 0x81, 0xfc, 0x54, - 0xa6, 0xb7, 0x1e, 0xe6, 0x59, 0x61, 0x06, 0x2f, 0xa5, 0x71, 0xb7, 0x47, - 0xf9, 0x0b, 0x07, 0xb7, 0xfc, 0x57, 0x5b, 0x15, 0xc7, 0xc8, 0xc3, 0xf2, - 0xe2, 0x43, 0xd2, 0x30, 0xae, 0x2a, 0xbb, 0x2d, 0x24, 0xde, 0x71, 0xd7, - 0x83, 0x47, 0xc7, 0x85, 0x8d, 0x73, 0x3e, 0xb2, 0xfb, 0x1c, 0x3e, 0x8a, - 0x13, 0x0d, 0x7f, 0xaa, 0xde, 0x5e, 0x7e, 0xab, 0xad, 0x3c, 0x84, 0xeb, - 0xc8, 0x91, 0x23, 0xbf, 0x26, 0x5c, 0xed, 0x90, 0x53, 0xdc, 0x48, 0x6d, - 0x70, 0x22, 0x78, 0x7e, 0x14, 0x5f, 0x7c, 0x2f, 0x5e, 0x3e, 0x08, 0x3a, - 0x1c, 0x3a, 0x10, 0x12, 0xff, 0x44, 0x23, 0x9f, 0x85, 0x65, 0x33, 0xa8, - 0x33, 0xd4, 0x02, 0x12, 0x96, 0x5e, 0x7e, 0x56, 0x9f, 0xa9, 0x0f, 0x9b, - 0x43, 0x1a, 0x2f, 0xd2, 0x51, 0xd4, 0x1e, 0xd3, 0xbf, 0x6e, 0x7e, 0xc3, - 0xdb, 0x71, 0xaa, 0x97, 0xf8, 0x51, 0x18, 0x89, 0xbc, 0x7c, 0x83, 0x97, - 0xe3, 0x54, 0x96, 0xca, 0x54, 0x1c, 0xc3, 0x23, 0x0a, 0x30, 0x7c, 0xe2, - 0x95, 0x0f, 0x6a, 0xab, 0xc9, 0x4f, 0x65, 0x18, 0x67, 0xca, 0x53, 0x5e, - 0x8a, 0xe3, 0x0e, 0x53, 0x9c, 0x20, 0xba, 0x79, 0x3f, 0xe1, 0xcd, 0xae, - 0x76, 0x2a, 0xcf, 0x6a, 0x83, 0x37, 0x8e, 0xe2, 0x69, 0x9c, 0x2b, 0x7f, - 0xc3, 0x8f, 0xde, 0xab, 0xc2, 0x54, 0x37, 0x3f, 0x97, 0xcc, 0x69, 0x88, - 0xc1, 0xc8, 0x66, 0x9d, 0x40, 0xd0, 0xeb, 0x9f, 0x7a, 0x75, 0xe4, 0x78, - 0xbf, 0x88, 0x21, 0xbf, 0xa8, 0x8c, 0x73, 0xe5, 0x41, 0x5e, 0x0f, 0x93, - 0x67, 0x86, 0xf2, 0xe6, 0x54, 0xc1, 0xd3, 0xa4, 0x17, 0x8f, 0xec, 0xf3, - 0x4e, 0x9d, 0xef, 0x65, 0xb6, 0x3d, 0xd9, 0x28, 0xe5, 0xed, 0xd7, 0xc9, - 0x7b, 0xb2, 0x8c, 0x68, 0xf2, 0x52, 0x1d, 0xc4, 0xdc, 0xa2, 0xbd, 0x51, - 0x9f, 0x8a, 0xe6, 0xaf, 0x74, 0x7b, 0x1b, 0xff, 0x68, 0xf2, 0x57, 0x1c, - 0xf7, 0xe0, 0xe7, 0x31, 0x2a, 0xa7, 0x74, 0xd1, 0xe4, 0x5f, 0x83, 0xf7, - 0x93, 0x96, 0x70, 0xdc, 0x69, 0x1a, 0xf1, 0x25, 0x20, 0xf6, 0x45, 0x67, - 0xfa, 0xb8, 0xac, 0xba, 0x4b, 0xd0, 0xb6, 0x82, 0xae, 0x82, 0x9e, 0x81, - 0x46, 0x41, 0xff, 0x86, 0xee, 0x87, 0x3a, 0x42, 0x9a, 0x28, 0xff, 0x49, - 0x67, 0xda, 0xa1, 0xeb, 0xbe, 0xe8, 0xf6, 0xd6, 0x18, 0x8e, 0x16, 0x0b, - 0x33, 0x66, 0xff, 0xe9, 0x7a, 0x44, 0x5b, 0xdf, 0x3d, 0x19, 0x2f, 0xda, - 0xf1, 0x5e, 0xd1, 0x32, 0x95, 0x7f, 0x55, 0x76, 0xde, 0xee, 0xe4, 0x18, - 0xae, 0x73, 0x8c, 0x92, 0x93, 0x27, 0x8b, 0x59, 0x0d, 0x97, 0x22, 0xb3, - 0x3b, 0xce, 0xf0, 0xfc, 0xde, 0xee, 0xb3, 0xbd, 0x8d, 0xcf, 0xee, 0x60, - 0xf0, 0x4f, 0xa6, 0x75, 0x76, 0xce, 0xa5, 0xfc, 0xb9, 0x1d, 0x86, 0xcd, - 0xb1, 0x54, 0x6a, 0x77, 0xe4, 0x50, 0x50, 0x79, 0xb8, 0xf3, 0xd4, 0xfd, - 0x6e, 0x1a, 0xe7, 0x41, 0x5e, 0x1f, 0xea, 0xe4, 0xcd, 0xb3, 0xac, 0x67, - 0x8e, 0x26, 0xb7, 0xdf, 0x8d, 0xb6, 0x18, 0xfe, 0x2c, 0x2f, 0x16, 0x26, - 0x5d, 0x79, 0xfa, 0xb6, 0x3c, 0x3c, 0x5a, 0x5e, 0x9d, 0xc0, 0xd4, 0xa7, - 0xbc, 0xed, 0xf0, 0xab, 0x7f, 0x2d, 0xbd, 0x77, 0xcc, 0x51, 0xfc, 0x02, - 0x76, 0x62, 0x65, 0xf0, 0xbb, 0xf3, 0x0c, 0x72, 0x8c, 0xfe, 0x76, 0xf5, - 0x09, 0xb2, 0x41, 0x3b, 0x78, 0x32, 0xa2, 0xf6, 0xba, 0xa3, 0x38, 0x77, - 0x1d, 0x02, 0x1c, 0x5f, 0x6e, 0x85, 0x4d, 0x90, 0x25, 0xa3, 0xa0, 0x6b, - 0xd7, 0xae, 0x97, 0x50, 0x01, 0x19, 0x2f, 0xff, 0xcb, 0xae, 0x34, 0xde, - 0xf1, 0x1a, 0xe7, 0xd2, 0x83, 0x0c, 0x3f, 0x44, 0x8b, 0x89, 0xe1, 0xb7, - 0xc4, 0x08, 0xc6, 0x79, 0xb4, 0xf9, 0xf8, 0xc5, 0x53, 0xdd, 0x95, 0xbf, - 0xae, 0xe5, 0x71, 0xa6, 0x0d, 0xc5, 0xfa, 0xde, 0x27, 0x03, 0x13, 0xcf, - 0x27, 0xe8, 0xbf, 0xdb, 0x8b, 0x57, 0xe5, 0xf6, 0xe3, 0xf5, 0xbe, 0x2d, - 0x50, 0x61, 0x4a, 0x4a, 0xca, 0x63, 0xd4, 0xd6, 0x2c, 0x86, 0xec, 0xc9, - 0x8a, 0x4b, 0xef, 0x3d, 0xa6, 0x6f, 0xdf, 0xbe, 0xeb, 0x59, 0x44, 0x75, - 0xe6, 0x76, 0xbe, 0xb7, 0xf3, 0x07, 0x7e, 0x91, 0xc6, 0x4c, 0x34, 0xc6, - 0x79, 0x02, 0x8b, 0xb3, 0x0b, 0x25, 0x07, 0x78, 0x55, 0x39, 0x4b, 0x79, - 0xab, 0x0c, 0xe8, 0x9f, 0xd6, 0xb1, 0xa9, 0x42, 0x74, 0xae, 0xb4, 0x8a, - 0x6a, 0x85, 0x79, 0x6f, 0xba, 0xbd, 0x9d, 0x7f, 0xb4, 0x75, 0x2f, 0x22, - 0x62, 0x41, 0xb4, 0x91, 0x2b, 0x10, 0xaf, 0xa2, 0xf9, 0x2b, 0x9d, 0x68, - 0x6f, 0xb9, 0x68, 0xf1, 0x8f, 0x36, 0x9e, 0xb7, 0x9e, 0xd1, 0xa6, 0xcb, - 0xe3, 0x3d, 0x96, 0x37, 0x49, 0x3c, 0x1f, 0xda, 0xe5, 0xcd, 0x64, 0x1f, - 0x79, 0x8e, 0xb6, 0x8f, 0x73, 0x68, 0x8f, 0x8e, 0xfb, 0xac, 0x81, 0x34, - 0xf6, 0x34, 0x21, 0x28, 0x6d, 0x3e, 0xa4, 0xb0, 0xbd, 0xc9, 0x87, 0x64, - 0x5f, 0xa6, 0x8b, 0xb6, 0x1d, 0x65, 0x66, 0xf4, 0x0f, 0x45, 0xf8, 0x6f, - 0xc0, 0x6f, 0x6f, 0x8e, 0xd9, 0x7f, 0x08, 0xd6, 0xa8, 0x8a, 0x8d, 0x76, - 0xbc, 0x47, 0x95, 0x99, 0x4f, 0x24, 0xe5, 0xaf, 0xf7, 0x5d, 0xdf, 0x3b, - 0xfb, 0xec, 0xb3, 0xdb, 0xf1, 0xb1, 0xa8, 0x73, 0x39, 0x66, 0x97, 0xcd, - 0x47, 0xa1, 0xb4, 0xcb, 0x91, 0xed, 0x13, 0x3f, 0x5a, 0xaf, 0xbf, 0x8b, - 0xe7, 0xf7, 0x36, 0x3e, 0xd1, 0xb6, 0xf7, 0xbf, 0x2d, 0x5e, 0x21, 0x5f, - 0x00, 0x5f, 0xce, 0xab, 0x3e, 0xfa, 0x86, 0x81, 0x76, 0x42, 0x8b, 0xf8, - 0x9e, 0x40, 0x3a, 0xef, 0x48, 0x4a, 0x26, 0x4a, 0x59, 0xae, 0xe8, 0x98, - 0x8e, 0xb9, 0xf2, 0xca, 0x2b, 0xf3, 0x39, 0x52, 0xba, 0x88, 0xbc, 0xb5, - 0x5b, 0x15, 0xe4, 0xa8, 0x73, 0x32, 0x65, 0x6c, 0xe7, 0xbe, 0xa2, 0x7d, - 0x11, 0xc3, 0x7f, 0xf7, 0xea, 0x6f, 0x2e, 0x17, 0x90, 0xa7, 0x76, 0x99, - 0xca, 0x74, 0xb4, 0x25, 0x8d, 0x77, 0x9f, 0xa5, 0x9c, 0x8b, 0x2a, 0x22, - 0x1b, 0x2a, 0xca, 0x9f, 0x15, 0x49, 0x57, 0x1e, 0x5c, 0xca, 0xdb, 0x2f, - 0x15, 0xa9, 0x4f, 0x24, 0x7c, 0x8b, 0xf8, 0x1b, 0xb5, 0x55, 0xfc, 0xeb, - 0x40, 0x1b, 0xfe, 0x9b, 0x7e, 0x32, 0xdf, 0x11, 0xd1, 0xdf, 0xf4, 0x2e, - 0xa5, 0x6f, 0x6b, 0x80, 0x77, 0x67, 0x8e, 0xdd, 0x37, 0xd7, 0xc7, 0x6f, - 0xef, 0xba, 0xeb, 0xae, 0x8f, 0xc9, 0x20, 0x2f, 0x52, 0x26, 0x7b, 0xd0, - 0x3f, 0x88, 0x5c, 0xfa, 0x9c, 0x3a, 0x74, 0x82, 0x56, 0x91, 0x6f, 0x12, - 0x75, 0xd0, 0x62, 0x7b, 0xcc, 0xa0, 0x41, 0x83, 0xb6, 0xf3, 0xed, 0x96, - 0x99, 0xdc, 0x8b, 0x9f, 0xff, 0x97, 0x5d, 0x79, 0x78, 0x47, 0x38, 0x94, - 0x97, 0x1f, 0xca, 0xcb, 0x6f, 0xe5, 0xc1, 0xba, 0xbc, 0x75, 0x37, 0x79, - 0x47, 0xdb, 0x86, 0x68, 0xe3, 0x99, 0x7c, 0xff, 0xd1, 0x2b, 0xa7, 0x3a, - 0x13, 0xf8, 0x07, 0x9f, 0xef, 0x54, 0x09, 0xc6, 0xd3, 0x11, 0x8c, 0xab, - 0x24, 0xde, 0x7d, 0x5f, 0xc7, 0x09, 0xa0, 0x77, 0xf1, 0xda, 0x9d, 0xb9, - 0x36, 0x52, 0xbb, 0x34, 0x36, 0x7e, 0xe3, 0x9f, 0x3e, 0x6e, 0x83, 0xfa, - 0xf1, 0x0a, 0x4c, 0x33, 0x5e, 0x31, 0x58, 0x80, 0x9f, 0x16, 0xde, 0x73, - 0x23, 0x25, 0x2a, 0xc3, 0x3f, 0x99, 0x7f, 0x92, 0x58, 0xc0, 0x89, 0xac, - 0x18, 0x16, 0xf1, 0x56, 0x10, 0x77, 0x28, 0xf4, 0x1b, 0xb4, 0xcf, 0x8c, - 0xc3, 0xd2, 0x8c, 0xf3, 0x32, 0xda, 0x6e, 0x83, 0x2d, 0x02, 0x7b, 0x04, - 0x81, 0x4c, 0x72, 0x79, 0x0d, 0xd2, 0xa0, 0xa9, 0xe8, 0x40, 0xdc, 0x23, - 0x15, 0xf9, 0x9b, 0x32, 0xd1, 0x44, 0xb0, 0x37, 0x04, 0xdc, 0xdf, 0x54, - 0x7d, 0x5b, 0x8c, 0x45, 0xe0, 0x1f, 0x43, 0x40, 0x4a, 0xce, 0x9f, 0xec, - 0x46, 0x3d, 0xc8, 0xdf, 0x45, 0x6d, 0xe2, 0x5e, 0x93, 0xae, 0xe4, 0x87, - 0x75, 0xfb, 0x2e, 0x02, 0x3b, 0xf9, 0xfb, 0xa8, 0xf3, 0xa8, 0xbe, 0xfb, - 0xc8, 0xa3, 0x14, 0xf1, 0xc5, 0x50, 0x45, 0x95, 0x66, 0xa1, 0x51, 0xc8, - 0xee, 0xea, 0x7c, 0xe8, 0x12, 0xee, 0xcd, 0xae, 0x9b, 0xfc, 0x65, 0xac, - 0xed, 0xd4, 0x4d, 0x05, 0x5c, 0x21, 0x0b, 0x42, 0x8b, 0xa0, 0xcb, 0x48, - 0x1b, 0xad, 0xee, 0xa4, 0x79, 0x6d, 0x19, 0x24, 0xde, 0xb5, 0x6e, 0xcf, - 0x20, 0x90, 0xf5, 0xea, 0xab, 0xaf, 0x0e, 0xe6, 0xe3, 0xba, 0x8f, 0x62, - 0x34, 0x24, 0xf1, 0x2e, 0xfb, 0x81, 0x2c, 0x98, 0xb4, 0x65, 0xb7, 0x2d, - 0x17, 0x03, 0x22, 0x9e, 0x8f, 0xcd, 0x6d, 0xe0, 0x83, 0x6e, 0xfa, 0xd7, - 0x85, 0xd7, 0x29, 0x4e, 0x0b, 0x3e, 0x7b, 0xdb, 0x55, 0xe1, 0x1f, 0x16, - 0xe2, 0x78, 0x6f, 0x39, 0x8e, 0x6f, 0x8e, 0xb4, 0xc6, 0xa0, 0x89, 0xe3, - 0xa3, 0x77, 0x99, 0xec, 0xdc, 0x67, 0xf1, 0xe5, 0xed, 0x17, 0x28, 0x3c, - 0x15, 0xda, 0x1d, 0x5e, 0xde, 0xdb, 0xf5, 0xdf, 0xeb, 0xf9, 0xd3, 0x37, - 0xbb, 0xd8, 0x15, 0xcd, 0xe5, 0x75, 0x84, 0xf4, 0xdd, 0x2d, 0x4c, 0x79, - 0x28, 0x2f, 0x16, 0xbd, 0xf6, 0xd5, 0xcd, 0x9c, 0xdd, 0x85, 0x60, 0xaf, - 0xa6, 0x67, 0xc1, 0xbb, 0x1a, 0xef, 0xe1, 0x37, 0xe3, 0xbb, 0x39, 0x55, - 0x18, 0x4f, 0x79, 0x6f, 0xbc, 0xf1, 0xc6, 0x4e, 0x3e, 0xe2, 0x37, 0x90, - 0x42, 0x57, 0x43, 0x7b, 0x8b, 0x8f, 0x35, 0x8f, 0x7f, 0x09, 0x8d, 0xc3, - 0x98, 0xae, 0xc4, 0xc7, 0x0d, 0xb5, 0x6b, 0x9e, 0x01, 0xf9, 0xb9, 0x22, - 0xe4, 0xfa, 0x2e, 0x16, 0x5b, 0x4b, 0x5b, 0xb0, 0x49, 0x27, 0x8f, 0xbb, - 0x49, 0x2c, 0x9b, 0x42, 0x79, 0x8b, 0xb4, 0x01, 0xb6, 0xcf, 0x38, 0xad, - 0xe6, 0x5a, 0x67, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x81, - 0x7d, 0x05, 0x01, 0xcd, 0x5b, 0xda, 0x31, 0xd7, 0xe4, 0xac, 0x85, 0x2e, - 0x6b, 0xf8, 0x00, 0xc2, 0x3e, 0xec, 0xdc, 0xc6, 0xb3, 0x69, 0x86, 0x94, - 0xc0, 0xdd, 0xed, 0x57, 0xf1, 0x89, 0xdf, 0x51, 0xd5, 0xd2, 0x94, 0x3a, - 0x53, 0x7e, 0xa4, 0x6b, 0xa4, 0x3c, 0x23, 0xc5, 0x97, 0xff, 0x9e, 0x68, - 0x4b, 0x69, 0xf9, 0xff, 0x7f, 0x0b, 0x53, 0x1f, 0xe8, 0x78, 0x6d, 0x17, - 0xe8, 0x24, 0xa8, 0x71, 0xe8, 0x59, 0x8b, 0x2e, 0x7f, 0x42, 0x53, 0xa0, - 0xa9, 0x90, 0xde, 0x39, 0xdf, 0x5b, 0xc6, 0x04, 0x59, 0x87, 0x9d, 0x8e, - 0x69, 0x9f, 0x06, 0x1d, 0x03, 0xd5, 0x87, 0xb4, 0xd0, 0xa4, 0x63, 0xb4, - 0x63, 0x21, 0xd5, 0x25, 0x0d, 0xda, 0x5d, 0x5e, 0x26, 0x8b, 0x7d, 0xd6, - 0x09, 0x9f, 0xb3, 0xa0, 0xb3, 0xa1, 0x21, 0xd0, 0x64, 0xa8, 0xa2, 0x27, - 0x1a, 0x84, 0xed, 0x71, 0xd0, 0xf5, 0xd0, 0xa7, 0xd0, 0x67, 0xd0, 0x3e, - 0x65, 0x74, 0x51, 0xdf, 0xff, 0x76, 0xa7, 0x57, 0x41, 0x1e, 0x87, 0xf4, - 0x2d, 0x87, 0x2d, 0xd0, 0x57, 0xd0, 0x04, 0x48, 0x0b, 0x2b, 0x7f, 0x07, - 0x1f, 0x6b, 0x7c, 0x8b, 0x22, 0x8d, 0x5d, 0x9d, 0x84, 0x92, 0xe1, 0xad, - 0xf0, 0x67, 0xa0, 0x48, 0x46, 0xbc, 0x64, 0xbf, 0xea, 0xfb, 0x77, 0xd4, - 0x99, 0x62, 0xf6, 0xac, 0x13, 0x00, 0xd6, 0x59, 0x04, 0x2c, 0x02, 0x16, - 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, - 0xf6, 0x15, 0x04, 0x74, 0x7a, 0x41, 0x47, 0x5f, 0xb5, 0xb8, 0x23, 0x5d, - 0x56, 0x4a, 0xb8, 0x16, 0x5e, 0xb4, 0x5b, 0xf6, 0x77, 0x9e, 0xc2, 0x53, - 0xd9, 0xda, 0xe9, 0x13, 0xc9, 0x20, 0xd0, 0xb3, 0x59, 0x38, 0xac, 0xa8, - 0x11, 0x4a, 0x16, 0xff, 0x33, 0x4e, 0x78, 0xc8, 0x40, 0x17, 0xe9, 0x24, - 0xc3, 0xee, 0xf6, 0x8d, 0x70, 0xd6, 0x87, 0xbd, 0x64, 0x94, 0x8b, 0xf6, - 0x49, 0xe3, 0x8b, 0x7a, 0xff, 0xb7, 0x3a, 0xf5, 0x97, 0x3e, 0xf4, 0x28, - 0x5e, 0x96, 0x01, 0xac, 0x05, 0xf0, 0xdd, 0xed, 0x33, 0xb2, 0xd8, 0x63, - 0x4e, 0xf5, 0xd3, 0xe2, 0xbc, 0xfa, 0x5d, 0x3b, 0xe2, 0xb6, 0xff, 0x01, - 0xc1, 0x3a, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, - 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, - 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, 0xb0, 0x08, 0x58, - 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, 0x22, 0x60, 0x11, - 0xb0, 0x08, 0x58, 0x04, 0x2c, 0x02, 0x16, 0x01, 0x8b, 0x80, 0x45, 0xc0, - 0x22, 0xb0, 0x6f, 0x20, 0xf0, 0x7f, 0x59, 0x35, 0x36, 0x22, 0x2d, 0xcd, - 0x02, 0x61, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, - 0x60, 0x82 + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x36, + 0x08, 0x06, 0x00, 0x00, 0x00, 0xa5, 0x74, 0xe8, 0xab, 0x00, 0x00, 0x00, + 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, + 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, + 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, + 0x7a, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, + 0x80, 0xe8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, + 0x3a, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, + 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x6c, 0xe9, 0x49, 0x44, 0x41, 0x54, + 0x78, 0xda, 0xed, 0x9d, 0x77, 0x58, 0x54, 0x47, 0xf7, 0xc7, 0xbf, 0x77, + 0x97, 0xa5, 0xf7, 0x22, 0x45, 0x6c, 0x80, 0x8a, 0x08, 0xd8, 0xc0, 0xae, + 0x88, 0x0d, 0x4b, 0xec, 0x5d, 0xa3, 0x46, 0x63, 0x8d, 0xd8, 0x8d, 0xc6, + 0x12, 0x7b, 0x8b, 0xdd, 0xa0, 0xb1, 0x61, 0x8f, 0x3d, 0xd8, 0x1b, 0x22, + 0x8a, 0x0d, 0x0b, 0x45, 0x01, 0x15, 0xa5, 0x83, 0x54, 0xe9, 0xb0, 0xb0, + 0x6c, 0xbb, 0xf3, 0xfb, 0xe3, 0xde, 0x95, 0x65, 0x5d, 0x9a, 0x9a, 0xbc, + 0x6f, 0x7e, 0xef, 0xfd, 0x3c, 0xcf, 0x7d, 0x12, 0xd9, 0xb9, 0x73, 0xa7, + 0x9c, 0x39, 0x33, 0x67, 0xca, 0x19, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0xe3, 0x1f, 0x85, 0xff, 0x9f, 0x4e, 0x00, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0xc7, 0xff, 0x02, 0xfd, 0xfa, 0xf5, 0x1b, 0xe8, 0xe2, + 0xe2, 0xd2, 0xa2, 0xa0, 0xa0, 0xa0, 0x40, 0x28, 0x14, 0x16, 0x7f, 0x8b, + 0x38, 0xeb, 0xd4, 0xa9, 0x63, 0xd5, 0xb4, 0x69, 0xd3, 0x66, 0x22, 0x91, + 0x48, 0x54, 0x56, 0x56, 0x56, 0xf6, 0x4f, 0xe6, 0xc7, 0xc8, 0xc8, 0xc8, + 0xb8, 0x79, 0xf3, 0xe6, 0x2e, 0x72, 0xb9, 0x9c, 0x2e, 0x29, 0x29, 0x11, + 0x7e, 0xab, 0x78, 0xf5, 0xf4, 0xf4, 0xf4, 0x9b, 0x37, 0x6f, 0xee, 0xe2, + 0xec, 0xec, 0xdc, 0x42, 0x20, 0x10, 0x68, 0x16, 0x17, 0x17, 0x17, 0xc9, + 0xe5, 0x72, 0xf9, 0x97, 0xc4, 0x65, 0x61, 0x61, 0x61, 0xe9, 0xe8, 0xe8, + 0xe8, 0xf4, 0xa5, 0xe5, 0x43, 0x51, 0x14, 0xa5, 0xa7, 0xa7, 0xa7, 0x2f, + 0x95, 0x4a, 0x25, 0xb5, 0x79, 0x4f, 0x5f, 0x5f, 0xdf, 0x40, 0x22, 0x91, + 0xa8, 0x7d, 0xc7, 0xc5, 0xc5, 0xa5, 0x85, 0xb9, 0xb9, 0xb9, 0x45, 0x76, + 0x76, 0xf6, 0xc7, 0xda, 0xe4, 0xc1, 0xda, 0xda, 0xba, 0xae, 0xb5, 0xb5, + 0x75, 0x5d, 0x2b, 0x2b, 0x2b, 0x9b, 0xcc, 0xcc, 0xcc, 0xf4, 0x6f, 0x51, + 0xd6, 0x1c, 0x1c, 0xff, 0x26, 0x1c, 0x1c, 0x1c, 0x9a, 0x9a, 0x98, 0x98, + 0x98, 0xe5, 0xe7, 0xe7, 0xe7, 0xfe, 0xa7, 0xd3, 0xf2, 0x77, 0xa1, 0xf1, + 0x77, 0x44, 0xda, 0xb5, 0x6b, 0xd7, 0xee, 0x84, 0x10, 0xf2, 0xe8, 0xd1, + 0xa3, 0xfb, 0xea, 0x7e, 0x6f, 0xd6, 0xac, 0x99, 0x73, 0xa7, 0x4e, 0x9d, + 0xba, 0xc8, 0x64, 0x32, 0xd9, 0xa3, 0x47, 0x8f, 0x1e, 0xc4, 0xc7, 0xc7, + 0xc7, 0x54, 0x17, 0xa7, 0x89, 0x89, 0x89, 0x59, 0xdb, 0xb6, 0x6d, 0xdb, + 0xbf, 0x79, 0xf3, 0x26, 0x2a, 0x35, 0x35, 0x35, 0xa5, 0xb2, 0x70, 0x3a, + 0x3a, 0x3a, 0xba, 0xad, 0x5a, 0xb5, 0x72, 0x6b, 0xd9, 0xb2, 0x65, 0xab, + 0xd2, 0xd2, 0xd2, 0xd2, 0x90, 0x90, 0x90, 0xe7, 0x6f, 0xde, 0xbc, 0x89, + 0xac, 0x2c, 0x7c, 0xa3, 0x46, 0x8d, 0x1c, 0x5c, 0x5c, 0x5c, 0x5c, 0xed, + 0xed, 0xed, 0x1d, 0xb2, 0xb3, 0xb3, 0x3f, 0x86, 0x86, 0x86, 0x86, 0xbc, + 0x7b, 0xf7, 0xee, 0x4d, 0x8d, 0x0a, 0x4f, 0x43, 0x43, 0x30, 0x62, 0xc4, + 0x88, 0x31, 0x12, 0x89, 0x44, 0xec, 0xe7, 0xe7, 0x77, 0x1e, 0x00, 0x51, + 0xfe, 0xdd, 0xce, 0xce, 0xae, 0x71, 0xe3, 0xc6, 0x8d, 0x9b, 0xa8, 0x7b, + 0x37, 0x24, 0x24, 0xe4, 0x79, 0x5e, 0x5e, 0x5e, 0x4e, 0x65, 0x71, 0x1b, + 0x1a, 0x1a, 0x1a, 0xb5, 0x6c, 0xd9, 0xb2, 0x8d, 0xab, 0xab, 0x6b, 0x0b, + 0x89, 0x44, 0x22, 0xb9, 0x7b, 0xf7, 0xee, 0x9d, 0x84, 0x84, 0x84, 0x58, + 0xc5, 0xef, 0x4e, 0x4e, 0x4e, 0xce, 0xf5, 0xea, 0xd5, 0x6b, 0x50, 0x55, + 0xfa, 0x92, 0x93, 0x93, 0x93, 0xd4, 0xe5, 0xa5, 0x5b, 0xb7, 0x6e, 0x3d, + 0x5d, 0x5d, 0x5d, 0x5b, 0x00, 0xc0, 0xeb, 0xd7, 0xaf, 0xa3, 0xee, 0xdf, + 0xbf, 0x1f, 0x40, 0x08, 0x21, 0xea, 0xe2, 0xe0, 0xf1, 0x78, 0xfc, 0x4e, + 0x9d, 0x3a, 0x75, 0x75, 0x71, 0x71, 0x71, 0xcd, 0xc9, 0xc9, 0xc9, 0x79, + 0xfa, 0xf4, 0xe9, 0x93, 0x0f, 0x1f, 0x3e, 0x24, 0xd5, 0xa4, 0x7c, 0xfe, + 0x17, 0x70, 0x72, 0x72, 0x72, 0x6e, 0xde, 0xbc, 0xb9, 0xab, 0xad, 0xad, + 0xad, 0x6d, 0x71, 0x71, 0x71, 0x71, 0x6c, 0x6c, 0x6c, 0xcc, 0xc3, 0x87, + 0x0f, 0xef, 0x55, 0x56, 0x9e, 0x0a, 0x2c, 0x2c, 0x2c, 0x2c, 0xed, 0xed, + 0xed, 0x1d, 0xa2, 0xa2, 0xa2, 0x22, 0xaa, 0x1b, 0xd0, 0xf0, 0x78, 0x3c, + 0xfe, 0xb0, 0x61, 0xc3, 0x46, 0x12, 0x42, 0x88, 0x9f, 0x9f, 0xdf, 0x79, + 0x42, 0x08, 0xad, 0x1a, 0xa6, 0x65, 0xcb, 0x96, 0x6d, 0x2c, 0x2d, 0x2d, + 0xad, 0x14, 0xff, 0xa6, 0x69, 0x9a, 0xce, 0xcd, 0xcd, 0xcd, 0xc9, 0xcc, + 0xcc, 0xcc, 0x48, 0x4f, 0x4f, 0x4f, 0xad, 0x2e, 0x1f, 0x26, 0x26, 0x26, + 0x66, 0xae, 0xae, 0xae, 0x2d, 0x5d, 0x5c, 0x5c, 0x5c, 0x65, 0x32, 0x99, + 0x2c, 0x35, 0x35, 0xf5, 0xc3, 0x83, 0x07, 0x0f, 0xee, 0x15, 0x17, 0x17, + 0x17, 0xa9, 0xc6, 0x2f, 0x97, 0xcb, 0xe5, 0x09, 0x09, 0x09, 0xf1, 0x49, + 0x49, 0x49, 0xf1, 0x34, 0x4d, 0xd3, 0x95, 0xc5, 0xd9, 0xb5, 0x6b, 0xd7, + 0xee, 0x3a, 0x3a, 0x3a, 0x3a, 0x95, 0xfd, 0x1e, 0x11, 0x11, 0xf1, 0x52, + 0x79, 0x70, 0xd1, 0xbc, 0x79, 0x73, 0x17, 0x5b, 0x5b, 0xdb, 0xfa, 0x95, + 0x85, 0xff, 0xf0, 0xe1, 0x43, 0xf2, 0xdb, 0xb7, 0x6f, 0x5f, 0xab, 0xfe, + 0x9d, 0xcf, 0xe7, 0xf3, 0x1d, 0x1d, 0x1d, 0x9b, 0xb7, 0x69, 0xd3, 0xc6, + 0xdd, 0xd8, 0xd8, 0xd8, 0x38, 0x25, 0x25, 0x25, 0xf9, 0xfe, 0xfd, 0xfb, + 0x81, 0x85, 0x85, 0x85, 0xf9, 0xaa, 0xe5, 0xf3, 0xe8, 0xd1, 0xa3, 0xa0, + 0xd2, 0xd2, 0xd2, 0x12, 0xe5, 0xf7, 0x75, 0x75, 0x75, 0xf5, 0xba, 0x74, + 0xe9, 0xd2, 0x2d, 0x2b, 0x2b, 0x2b, 0xf3, 0xd5, 0xab, 0x57, 0x61, 0x8a, + 0xbf, 0xb7, 0x6f, 0xdf, 0xbe, 0x93, 0x91, 0x91, 0x91, 0xb1, 0xba, 0xb4, + 0x14, 0x14, 0x14, 0xe4, 0x3f, 0x7f, 0xfe, 0x3c, 0xb8, 0xba, 0x72, 0x35, + 0x35, 0x35, 0x35, 0x77, 0x77, 0x77, 0x6f, 0x97, 0x94, 0x94, 0x94, 0xf8, + 0xfe, 0xfd, 0xfb, 0xb7, 0xca, 0xbf, 0x75, 0xef, 0xde, 0xbd, 0xb7, 0x4c, + 0x26, 0x93, 0x3d, 0x7c, 0xf8, 0xf0, 0x9e, 0xea, 0x7b, 0xce, 0xce, 0xce, + 0x2d, 0xea, 0xd6, 0xad, 0x6b, 0xfb, 0xf6, 0xed, 0xdb, 0xd7, 0x1f, 0x3e, + 0x7c, 0x48, 0x06, 0x80, 0x36, 0x6d, 0xda, 0xb4, 0x35, 0x37, 0x37, 0xb7, + 0x08, 0x0a, 0x0a, 0x0a, 0x14, 0x8b, 0xc5, 0x55, 0x0e, 0x30, 0x3d, 0x3c, + 0x3c, 0x7a, 0x68, 0x6b, 0x6b, 0x6b, 0x27, 0x26, 0x26, 0x26, 0xc4, 0xc4, + 0xc4, 0x44, 0x2b, 0xff, 0xa6, 0xd0, 0x1d, 0x65, 0x65, 0x65, 0x65, 0x0f, + 0x1e, 0x3c, 0x08, 0x54, 0x2e, 0x9f, 0x98, 0x98, 0x98, 0xf7, 0x89, 0x89, + 0x89, 0x71, 0xca, 0xe1, 0x79, 0x3c, 0x1e, 0xbf, 0x57, 0xaf, 0x5e, 0x7d, + 0x32, 0x33, 0x33, 0x33, 0x22, 0x22, 0x22, 0xc2, 0x95, 0x7f, 0xd3, 0xd0, + 0xd0, 0x10, 0xb8, 0xb8, 0xb8, 0xb4, 0x68, 0xd3, 0xa6, 0x8d, 0x3b, 0x8f, + 0xc7, 0xe3, 0x3d, 0x7f, 0xfe, 0xfc, 0xe9, 0xeb, 0xd7, 0xaf, 0x23, 0x54, + 0x07, 0xd1, 0x66, 0x66, 0x66, 0x16, 0x6e, 0x6e, 0x6e, 0x6d, 0x15, 0xff, + 0xa6, 0x69, 0x9a, 0xce, 0xcc, 0xcc, 0xcc, 0x48, 0x4e, 0x4e, 0x4e, 0x2c, + 0x2a, 0x2a, 0x2a, 0xac, 0x2c, 0x1f, 0x35, 0x8d, 0xdf, 0xc0, 0xc0, 0xc0, + 0xb0, 0x63, 0xc7, 0x8e, 0x5d, 0x14, 0xff, 0x2e, 0x2b, 0x2b, 0x2b, 0x4b, + 0x4b, 0x4b, 0x4b, 0xfd, 0xf0, 0xe1, 0x43, 0x72, 0x55, 0x65, 0xc5, 0xe3, + 0xf1, 0xf8, 0x5d, 0xba, 0x74, 0xe9, 0xe6, 0xe0, 0xe0, 0xd0, 0x58, 0x57, + 0x57, 0x57, 0x37, 0x32, 0x32, 0x32, 0x22, 0x22, 0x22, 0x22, 0xbc, 0xa0, + 0xa0, 0x20, 0x5f, 0x39, 0x9c, 0x97, 0x97, 0x57, 0xff, 0xea, 0xea, 0x9a, + 0xa6, 0x69, 0x3a, 0x20, 0x20, 0xe0, 0x16, 0x00, 0xb4, 0x6b, 0xd7, 0xae, + 0xa3, 0xb1, 0xb1, 0xb1, 0x49, 0x40, 0x40, 0xc0, 0x6d, 0x9a, 0xa6, 0xe5, + 0xaa, 0xdf, 0xec, 0xd7, 0xaf, 0xdf, 0x80, 0xfc, 0xfc, 0xfc, 0xfc, 0x27, + 0x4f, 0x9e, 0x3c, 0x74, 0x76, 0x76, 0x76, 0xad, 0x5b, 0xb7, 0xae, 0x6d, + 0x68, 0x68, 0xe8, 0x8b, 0xdc, 0xdc, 0xdc, 0x6c, 0x75, 0x71, 0x5b, 0x58, + 0x58, 0x58, 0xb6, 0x6e, 0xdd, 0xda, 0x2d, 0x2d, 0x2d, 0x2d, 0xd5, 0xca, + 0xca, 0xca, 0x3a, 0x37, 0x37, 0x37, 0xe7, 0xe5, 0xcb, 0x97, 0xa1, 0x55, + 0xa5, 0xa7, 0x55, 0xab, 0x56, 0x6e, 0x66, 0x66, 0x66, 0xe6, 0x0f, 0x1f, + 0x3e, 0xbc, 0xef, 0xe9, 0xe9, 0xd9, 0xb3, 0xa4, 0xa4, 0xa4, 0xe4, 0xf1, + 0xe3, 0xc7, 0x41, 0xea, 0xc2, 0x76, 0xec, 0xd8, 0xb1, 0x8b, 0xbe, 0xbe, + 0xbe, 0x41, 0x60, 0x60, 0xe0, 0x9d, 0xa6, 0x4d, 0x9b, 0x3a, 0xd6, 0xab, + 0x57, 0xaf, 0x41, 0x54, 0x54, 0x54, 0x44, 0x65, 0xba, 0xc3, 0xc6, 0xc6, + 0xc6, 0xd6, 0xc5, 0xc5, 0xa5, 0x45, 0x4a, 0x4a, 0x4a, 0x72, 0x74, 0x74, + 0xf4, 0x9b, 0xf6, 0xed, 0xdb, 0x77, 0xac, 0xac, 0xad, 0x28, 0xa8, 0xac, + 0xcd, 0xf4, 0xea, 0xd5, 0xab, 0x2f, 0x8f, 0xc7, 0xe3, 0x29, 0xff, 0xed, + 0xc9, 0x93, 0x27, 0x0f, 0x55, 0x0d, 0xd7, 0xea, 0xc6, 0x15, 0xaa, 0xe8, + 0xeb, 0xeb, 0x1b, 0x74, 0xea, 0xd4, 0xa9, 0x6b, 0x65, 0x75, 0x54, 0x05, + 0xd4, 0x88, 0x11, 0x23, 0x46, 0xbf, 0x78, 0xf1, 0xe2, 0x79, 0x72, 0x72, + 0x72, 0x42, 0x4d, 0xbe, 0x55, 0x0b, 0x34, 0x2d, 0x2c, 0x2c, 0x3a, 0x1e, + 0x3b, 0x76, 0x6c, 0xc9, 0xb5, 0x6b, 0xd7, 0xee, 0x0d, 0x1c, 0x38, 0xb0, + 0x37, 0x80, 0x2f, 0x32, 0x38, 0x95, 0xe0, 0x4d, 0x98, 0x30, 0xc1, 0x7b, + 0xeb, 0xd6, 0xad, 0xcb, 0x87, 0x0e, 0x1d, 0x3a, 0xe9, 0xd2, 0xa5, 0x4b, + 0x27, 0x00, 0xd0, 0x5f, 0x19, 0x67, 0x8d, 0xbf, 0xdd, 0xbd, 0x7b, 0xf7, + 0x41, 0x17, 0x2f, 0x5e, 0x3c, 0xb6, 0x78, 0xf1, 0xe2, 0x8d, 0x5b, 0xb7, + 0x6e, 0xfd, 0xf5, 0x1b, 0x7c, 0x9b, 0x1a, 0x37, 0x6e, 0xdc, 0x0f, 0x3e, + 0x3e, 0x3e, 0x3b, 0x4d, 0x4c, 0x4c, 0x8c, 0x14, 0x7f, 0xbc, 0x77, 0xef, + 0xde, 0xe3, 0x1e, 0x3d, 0x7a, 0x78, 0x7c, 0x41, 0xfc, 0xbc, 0xb1, 0x63, + 0xc7, 0xce, 0xd8, 0xb5, 0x6b, 0xd7, 0xea, 0x51, 0xa3, 0x46, 0x4d, 0x3b, + 0x7f, 0xfe, 0xfc, 0xe1, 0x5a, 0xc6, 0x41, 0x5d, 0xba, 0x74, 0xe9, 0x7a, + 0xef, 0xde, 0xbd, 0xbb, 0xd7, 0xaf, 0x5f, 0xbf, 0x51, 0x4e, 0x4e, 0x4e, + 0x66, 0x4d, 0xde, 0x39, 0x74, 0xe8, 0xd0, 0xd1, 0x89, 0x13, 0x27, 0x8e, + 0x73, 0x76, 0x76, 0x6e, 0x11, 0x13, 0x13, 0xf3, 0x56, 0xe5, 0x77, 0x81, + 0xbf, 0xbf, 0xff, 0xdd, 0x92, 0x92, 0x12, 0x51, 0xe3, 0xc6, 0x8d, 0xed, + 0x00, 0xc8, 0xaa, 0xcb, 0xc3, 0xc8, 0x91, 0x23, 0xa7, 0xec, 0xd9, 0xb3, + 0x67, 0xbd, 0xe2, 0x0f, 0x32, 0x99, 0x4c, 0x2e, 0x10, 0x08, 0x74, 0x00, + 0x48, 0xbf, 0xb2, 0xbc, 0x39, 0x38, 0xfe, 0x2b, 0xe0, 0xf3, 0xf9, 0xfc, + 0x86, 0x0d, 0x1b, 0xda, 0xeb, 0xe9, 0xe9, 0xe9, 0x46, 0x46, 0x46, 0xbe, + 0xaa, 0x24, 0x98, 0xc6, 0xfe, 0xfd, 0xfb, 0x8f, 0x49, 0x24, 0x12, 0x59, + 0xbf, 0x7e, 0xfd, 0x3c, 0x51, 0x49, 0xdb, 0x69, 0xd1, 0xa2, 0x45, 0x2b, + 0xa1, 0x50, 0x58, 0x92, 0x94, 0x94, 0x14, 0xff, 0xa5, 0x93, 0x7a, 0xff, + 0xaf, 0x70, 0x74, 0x74, 0x6c, 0x49, 0xd3, 0x34, 0xfd, 0xc7, 0x1f, 0x7f, + 0x5c, 0x04, 0x20, 0x50, 0xf9, 0x99, 0xda, 0xbd, 0x7b, 0xf7, 0x3e, 0xa2, + 0xc2, 0xea, 0xd5, 0xab, 0x37, 0x02, 0xa0, 0x2a, 0x8b, 0xb3, 0x65, 0xcb, + 0x96, 0xee, 0xf1, 0xf1, 0xf1, 0x29, 0x84, 0x10, 0x32, 0x7d, 0xfa, 0xf4, + 0xe5, 0x50, 0xbf, 0xe2, 0x4f, 0x0d, 0x1b, 0x36, 0x6c, 0x74, 0x46, 0x46, + 0xc6, 0x47, 0xe5, 0xb8, 0x69, 0x9a, 0xa6, 0x0f, 0x1c, 0x38, 0x70, 0x94, + 0xa2, 0xa8, 0x0a, 0x9d, 0xbf, 0x9d, 0x9d, 0x5d, 0xe3, 0x73, 0xe7, 0xce, + 0x5d, 0x54, 0x4d, 0x0b, 0x4d, 0xd3, 0xf4, 0xe1, 0xc3, 0x87, 0x4f, 0xf2, + 0x78, 0xbc, 0xea, 0x76, 0x15, 0x50, 0xab, 0x56, 0xad, 0xfa, 0x8d, 0x10, + 0x42, 0x3e, 0x7e, 0xfc, 0x58, 0x08, 0x40, 0x4b, 0xe5, 0x77, 0xfe, 0xd6, + 0xad, 0x5b, 0x0f, 0x93, 0x4a, 0xe8, 0xde, 0xbd, 0xfb, 0x70, 0x00, 0x3c, + 0xd5, 0x48, 0xf9, 0x7c, 0xbe, 0xc6, 0xd6, 0xad, 0x5b, 0x77, 0xd1, 0x34, + 0x4d, 0x2b, 0x87, 0xf7, 0xf6, 0xf6, 0x5e, 0xa7, 0x94, 0x6f, 0x8d, 0x83, + 0x07, 0x0f, 0xfa, 0x91, 0x6a, 0xf0, 0xf1, 0xf1, 0x39, 0x0d, 0xa5, 0x09, + 0x18, 0x53, 0x53, 0x53, 0x8b, 0xe0, 0xe0, 0xe0, 0x17, 0xaa, 0xe1, 0x9e, + 0x3f, 0x7f, 0x1e, 0x66, 0x6e, 0x6e, 0x6e, 0xa9, 0x9a, 0x96, 0xba, 0x75, + 0xeb, 0xd6, 0x7f, 0xf8, 0xf0, 0xe1, 0x53, 0xe5, 0xb0, 0x72, 0xb9, 0x5c, + 0x3e, 0x7f, 0xfe, 0xfc, 0x5f, 0xaa, 0xaa, 0xaf, 0xff, 0x05, 0x9a, 0x36, + 0x6d, 0xea, 0x14, 0x15, 0x15, 0x15, 0xad, 0xae, 0xdc, 0xa3, 0xa2, 0xa2, + 0xde, 0xb9, 0xba, 0xba, 0xb6, 0x56, 0xf3, 0x1a, 0xf5, 0xe3, 0x8f, 0x3f, + 0xce, 0x88, 0x8d, 0x8d, 0x4d, 0x50, 0x84, 0x95, 0xc9, 0x64, 0xb2, 0xfb, + 0xf7, 0xef, 0x3f, 0xb2, 0xb1, 0xb1, 0xa9, 0x57, 0xd9, 0xb7, 0x3a, 0x77, + 0xee, 0xdc, 0x5b, 0x11, 0xbe, 0x7d, 0xfb, 0xf6, 0x9e, 0x6a, 0x82, 0x08, + 0x2e, 0x5e, 0xbc, 0x78, 0xbf, 0x32, 0x39, 0x88, 0x8c, 0x8c, 0x7c, 0x3b, + 0x62, 0xc4, 0x88, 0xb1, 0x50, 0x53, 0x67, 0xda, 0xda, 0xda, 0xba, 0x3e, + 0x3e, 0x3e, 0xfb, 0xd5, 0xbd, 0x57, 0x5a, 0x5a, 0x2a, 0xea, 0xd3, 0xa7, + 0xcf, 0xc0, 0xca, 0xe2, 0x2f, 0x29, 0x29, 0x29, 0xbd, 0x79, 0xf3, 0xe6, + 0x9d, 0x46, 0x8d, 0x1a, 0x39, 0xa8, 0x49, 0x93, 0x66, 0x52, 0x52, 0x52, + 0x56, 0x55, 0xf2, 0x39, 0x6a, 0xd4, 0xa8, 0x9f, 0x50, 0xde, 0x06, 0x34, + 0x0e, 0x1f, 0x3e, 0x7c, 0xa9, 0xaa, 0xf0, 0xfb, 0xf7, 0xef, 0xbf, 0x00, + 0x95, 0x09, 0x45, 0x17, 0x17, 0x97, 0x56, 0x31, 0x31, 0x31, 0xf1, 0xea, + 0xd2, 0xd6, 0xb5, 0x6b, 0xd7, 0x1e, 0xaa, 0xe5, 0xe3, 0xe0, 0xe0, 0xd0, + 0x5a, 0xa5, 0x1c, 0x28, 0x07, 0x07, 0x87, 0xd6, 0x84, 0x10, 0x72, 0xf1, + 0xe2, 0xc5, 0xfb, 0x28, 0xd7, 0x59, 0x82, 0x47, 0x8f, 0x1e, 0x45, 0xa8, + 0x4b, 0x07, 0x4d, 0xd3, 0xf4, 0xdd, 0xbb, 0x77, 0x43, 0xf0, 0xb9, 0x7e, + 0x53, 0x85, 0xe7, 0xe9, 0xe9, 0x39, 0x8c, 0x10, 0x42, 0x76, 0xee, 0xdc, + 0x79, 0x42, 0x25, 0xed, 0x9a, 0x05, 0x05, 0x05, 0xc2, 0xc4, 0xc4, 0xc4, + 0x4c, 0x00, 0x9a, 0xca, 0x2f, 0xb5, 0x68, 0xd1, 0xc2, 0xbd, 0xa4, 0xa4, + 0x44, 0xf4, 0xfa, 0xf5, 0xeb, 0x64, 0x03, 0x03, 0x83, 0xa6, 0x6c, 0x19, + 0x09, 0xfc, 0xfd, 0xfd, 0x9f, 0x11, 0x42, 0x88, 0xb5, 0xb5, 0x75, 0x63, + 0x54, 0xdd, 0xfe, 0x34, 0x53, 0x53, 0x53, 0x73, 0x08, 0x21, 0xc4, 0xcf, + 0xcf, 0x2f, 0x40, 0xe5, 0xbb, 0x1a, 0xfe, 0xfe, 0xfe, 0xc1, 0x84, 0x10, + 0x92, 0x9a, 0x9a, 0x9a, 0xc3, 0x7e, 0xfb, 0x53, 0xf9, 0x3c, 0x79, 0xf2, + 0xe4, 0xa5, 0x6a, 0x19, 0x6b, 0x6b, 0x6b, 0x9b, 0x10, 0x42, 0xc8, 0xb9, + 0x73, 0xe7, 0xee, 0x28, 0xff, 0x66, 0x6d, 0x6d, 0x6d, 0x1b, 0x12, 0x12, + 0xf2, 0x52, 0xb5, 0x7c, 0x1e, 0x3f, 0x7e, 0xfc, 0xdc, 0xd4, 0xd4, 0xd4, + 0x42, 0xb9, 0x1c, 0xbc, 0xbc, 0xbc, 0xc6, 0x54, 0x56, 0xaf, 0x57, 0xae, + 0x5c, 0xb9, 0xe9, 0xe4, 0xe4, 0xe4, 0xa2, 0x9a, 0x89, 0x5a, 0xc4, 0x4f, + 0xb9, 0xba, 0xba, 0x76, 0x55, 0x17, 0xb7, 0x50, 0x28, 0x2c, 0xd9, 0xb1, + 0x63, 0x87, 0x8f, 0xa1, 0xa1, 0xa1, 0xb1, 0x6a, 0xfc, 0x6d, 0xdb, 0xb6, + 0xed, 0xf8, 0xf6, 0xed, 0xdb, 0x58, 0x75, 0xef, 0x25, 0x26, 0x26, 0x26, + 0xdb, 0xdb, 0xdb, 0x2b, 0x26, 0x56, 0xb5, 0x48, 0x0d, 0x10, 0x8b, 0xc5, + 0x52, 0x30, 0xfd, 0x80, 0x20, 0x38, 0x38, 0xf8, 0x35, 0x21, 0x84, 0xe8, + 0xe8, 0xe8, 0x98, 0xaa, 0x69, 0x73, 0x26, 0x84, 0x10, 0x12, 0x1c, 0x1c, + 0xfc, 0x06, 0x80, 0xce, 0xac, 0x59, 0xb3, 0x36, 0x10, 0x42, 0xc8, 0xf2, + 0xe5, 0xcb, 0x7f, 0x83, 0x9a, 0x3e, 0x01, 0x00, 0x6f, 0xed, 0xda, 0xb5, + 0xbb, 0x09, 0x21, 0x64, 0xd6, 0xac, 0x59, 0xbf, 0x25, 0x24, 0x24, 0x64, + 0x3e, 0x7b, 0xf6, 0xec, 0x75, 0x35, 0xf2, 0x27, 0x78, 0xf8, 0xf0, 0xe1, + 0xcb, 0xa4, 0xa4, 0xa4, 0x2c, 0x00, 0x26, 0x37, 0x6e, 0xdc, 0x78, 0x4e, + 0xd3, 0x34, 0xdd, 0xb1, 0x63, 0xc7, 0xee, 0x6a, 0xca, 0xa1, 0x2b, 0x4d, + 0xd3, 0xf4, 0xa9, 0x53, 0xa7, 0xee, 0x02, 0xd0, 0xeb, 0xde, 0xbd, 0xfb, + 0x0f, 0x84, 0x10, 0x72, 0xed, 0xda, 0xb5, 0x7b, 0x50, 0xdf, 0xd7, 0xf2, + 0xaf, 0x5f, 0xbf, 0x7e, 0x9f, 0x10, 0x42, 0x3a, 0x77, 0xee, 0x3c, 0x16, + 0x80, 0x4e, 0x68, 0x68, 0xe8, 0xbb, 0xea, 0xca, 0x27, 0x38, 0x38, 0x58, + 0x5d, 0x9a, 0xb5, 0xc4, 0x62, 0xb1, 0x54, 0x35, 0xac, 0x8b, 0x8b, 0x4b, + 0x67, 0x15, 0x19, 0x17, 0x1c, 0x3c, 0x78, 0xf0, 0xaa, 0x5c, 0x2e, 0xa7, + 0x1d, 0x1c, 0x1c, 0x9a, 0xa3, 0x7a, 0x28, 0x17, 0x17, 0x97, 0xce, 0xaa, + 0xf1, 0x4a, 0x24, 0x12, 0x45, 0x1d, 0x55, 0x4a, 0x8b, 0x16, 0x2d, 0xda, + 0xb3, 0xfa, 0x20, 0x00, 0xdf, 0x7e, 0x77, 0xa1, 0x16, 0x80, 0xb1, 0x2b, + 0x56, 0xac, 0xc8, 0x22, 0x84, 0x90, 0xde, 0xbd, 0x7b, 0x0f, 0xff, 0x06, + 0x71, 0xea, 0x2c, 0x5a, 0xb4, 0xe8, 0x32, 0x21, 0x84, 0x0c, 0x19, 0x32, + 0x64, 0x0b, 0x54, 0xf4, 0xc9, 0xdf, 0x8c, 0xe6, 0x90, 0x21, 0x43, 0xb6, + 0x10, 0x42, 0xc8, 0xcf, 0x3f, 0xff, 0x7c, 0x05, 0x80, 0xce, 0xd7, 0x46, + 0x68, 0x61, 0x61, 0x51, 0x4f, 0x28, 0x14, 0x96, 0x65, 0x67, 0x67, 0x4b, + 0xe7, 0xcf, 0x9f, 0x9f, 0xd7, 0xb6, 0x6d, 0xdb, 0xf4, 0xef, 0xbe, 0xfb, + 0x2e, 0xb5, 0x7d, 0xfb, 0xf6, 0x97, 0x01, 0x18, 0x7e, 0x49, 0xf9, 0xcc, + 0x9d, 0x3b, 0xf7, 0x02, 0x21, 0x84, 0x8c, 0x1c, 0x39, 0x72, 0x17, 0xaa, + 0xa9, 0x7f, 0x35, 0x18, 0x9c, 0x3b, 0x77, 0x2e, 0x3e, 0x2f, 0x2f, 0x4f, + 0x66, 0x64, 0x64, 0xd4, 0x02, 0x35, 0x1b, 0xfb, 0xe8, 0xfb, 0xf8, 0xf8, + 0x84, 0x95, 0x96, 0x96, 0xca, 0xed, 0xed, 0xed, 0xbf, 0xc3, 0xe7, 0x72, + 0x64, 0x9a, 0x9e, 0x9e, 0x2e, 0x8e, 0x8d, 0x8d, 0x2d, 0x05, 0x60, 0x52, + 0x83, 0xf8, 0xb4, 0x29, 0x8a, 0x9a, 0x68, 0x62, 0x62, 0x12, 0xd9, 0xb8, + 0x71, 0xe3, 0x94, 0xe8, 0xe8, 0x68, 0x99, 0x54, 0x2a, 0xa5, 0x01, 0x98, + 0x7f, 0x6d, 0x79, 0x73, 0xd4, 0x8e, 0xb6, 0x6d, 0xdb, 0x76, 0x98, 0x33, + 0x67, 0xce, 0x02, 0xfc, 0x8f, 0x8f, 0x81, 0xbf, 0x31, 0xd4, 0xd4, 0xa9, + 0x53, 0x7f, 0x4a, 0x4b, 0x4b, 0xcb, 0x60, 0xfb, 0x8a, 0x08, 0x54, 0xde, + 0xbf, 0x19, 0x05, 0x04, 0x04, 0xa4, 0xdf, 0xba, 0x75, 0xeb, 0x03, 0x2a, + 0xd7, 0x07, 0x82, 0x67, 0xcf, 0x9e, 0x45, 0x11, 0x42, 0x48, 0x5a, 0x5a, + 0x5a, 0xc6, 0xd4, 0xa9, 0x53, 0x7f, 0xc2, 0xff, 0x78, 0x7d, 0x69, 0xf8, + 0xf8, 0xf8, 0xfc, 0x45, 0x08, 0x21, 0x8e, 0x8e, 0x8e, 0xfb, 0x00, 0xe8, + 0x29, 0xfd, 0x46, 0x2d, 0x5a, 0xb4, 0x68, 0x15, 0x3b, 0xc8, 0x13, 0x36, + 0x69, 0xd2, 0x24, 0xcd, 0xc9, 0xc9, 0x29, 0xed, 0xe2, 0xc5, 0x8b, 0x42, + 0x42, 0x08, 0x99, 0x32, 0x65, 0xca, 0x5c, 0x7c, 0x5e, 0x78, 0xd4, 0xc4, + 0x89, 0x13, 0xa7, 0x95, 0x96, 0x96, 0x96, 0xa5, 0xa5, 0xa5, 0x89, 0x09, + 0x21, 0x64, 0xfa, 0xf4, 0xe9, 0x27, 0x01, 0x68, 0xab, 0x7e, 0xd8, 0xd2, + 0xd2, 0xb2, 0x41, 0x76, 0x76, 0x76, 0x51, 0x58, 0x58, 0x58, 0xc9, 0x80, + 0x01, 0x03, 0xb2, 0x2c, 0x2d, 0x2d, 0x53, 0xfa, 0xf5, 0xeb, 0x97, 0xfd, + 0xfc, 0xf9, 0xf3, 0x32, 0x42, 0x08, 0xf9, 0xe9, 0xa7, 0x9f, 0x16, 0x2b, + 0xc5, 0xcf, 0xef, 0xdb, 0xb7, 0xef, 0x74, 0xa1, 0x50, 0x28, 0xdd, 0xb8, + 0x71, 0x63, 0xbe, 0xbb, 0xbb, 0x7b, 0xba, 0xb9, 0xb9, 0x79, 0xca, 0x90, + 0x21, 0x43, 0x72, 0x42, 0x42, 0x42, 0xc4, 0x84, 0x10, 0xb2, 0x68, 0xd1, + 0xa2, 0xd5, 0xa8, 0xa2, 0x32, 0x5b, 0xb5, 0x6a, 0xd5, 0x59, 0x22, 0x91, + 0xc8, 0x52, 0x53, 0x53, 0x65, 0x1f, 0x3f, 0x7e, 0x94, 0x02, 0x50, 0x1d, + 0x84, 0xe9, 0x1d, 0x3d, 0x7a, 0xf4, 0x15, 0x21, 0x84, 0x7c, 0xff, 0xfd, + 0xf7, 0xb9, 0xa3, 0x46, 0x8d, 0xca, 0x51, 0x3c, 0xa3, 0x47, 0x8f, 0xfe, + 0x50, 0xa7, 0x4e, 0x9d, 0x61, 0x50, 0x11, 0x3e, 0x3e, 0x9f, 0x2f, 0xf0, + 0xf7, 0xf7, 0x0f, 0x22, 0x84, 0x90, 0x23, 0x47, 0x8e, 0x14, 0xb6, 0x6d, + 0xdb, 0x36, 0x4d, 0x4f, 0x4f, 0x2f, 0xd1, 0xc2, 0xc2, 0xe2, 0x9d, 0xb9, + 0xb9, 0xf9, 0x6c, 0xa5, 0x7c, 0xeb, 0xb9, 0xbb, 0xbb, 0x1f, 0x19, 0x35, + 0x6a, 0x54, 0xc6, 0xc8, 0x91, 0x23, 0xb3, 0x95, 0x9f, 0x51, 0xa3, 0x46, + 0xe5, 0xec, 0xdb, 0xb7, 0xaf, 0x84, 0xcd, 0xf3, 0x6d, 0xa5, 0x3a, 0xe0, + 0x9d, 0x39, 0x73, 0xe6, 0x26, 0x21, 0x84, 0x6c, 0xd9, 0xb2, 0xa5, 0xd0, + 0xce, 0xce, 0x2e, 0xcd, 0xde, 0xde, 0x3e, 0x6d, 0xdb, 0xb6, 0x6d, 0x45, + 0x84, 0x10, 0x72, 0xf6, 0xec, 0xd9, 0x5b, 0xa8, 0xd8, 0x81, 0xf0, 0x6f, + 0xdf, 0xbe, 0xfd, 0x44, 0x2a, 0x95, 0xd2, 0xf3, 0xe7, 0xcf, 0xcf, 0xb5, + 0xb4, 0xb4, 0x4c, 0x71, 0x72, 0x72, 0x4a, 0xbd, 0x7a, 0xf5, 0xaa, 0x90, + 0x10, 0x42, 0x7e, 0xf8, 0xe1, 0x87, 0xff, 0x65, 0x61, 0xe7, 0x0b, 0x04, + 0x82, 0x96, 0x4f, 0x9e, 0x3c, 0xc9, 0xdf, 0xb0, 0x61, 0x43, 0x41, 0xb7, + 0x6e, 0xdd, 0xb2, 0x1a, 0x35, 0x6a, 0x94, 0xe6, 0xe1, 0xe1, 0x91, 0xb5, + 0x79, 0xf3, 0xe6, 0x42, 0xb9, 0x5c, 0x4e, 0x27, 0x25, 0x25, 0x65, 0x69, + 0x6b, 0x6b, 0x1b, 0x28, 0xbd, 0x43, 0xad, 0x5b, 0xb7, 0x6e, 0x9b, 0x5c, + 0x2e, 0xa7, 0x7f, 0xfb, 0xed, 0xb7, 0xa4, 0xae, 0x5d, 0xbb, 0xa6, 0xd8, + 0xd8, 0xd8, 0x24, 0x0e, 0x1c, 0x38, 0x30, 0xe5, 0xd5, 0xab, 0x57, 0xf9, + 0xa9, 0xa9, 0xa9, 0x59, 0x4d, 0x9a, 0x34, 0x51, 0x37, 0xe8, 0x14, 0xec, + 0xda, 0xb5, 0xeb, 0x92, 0x58, 0x2c, 0xa6, 0x65, 0x32, 0x19, 0xd9, 0xb6, + 0x6d, 0xdb, 0x05, 0x7c, 0xae, 0xb4, 0x0c, 0x2f, 0x5e, 0xbc, 0x98, 0x48, + 0x08, 0x21, 0x93, 0x26, 0x4d, 0xca, 0xeb, 0xdd, 0xbb, 0x77, 0xa6, 0x97, + 0x97, 0x57, 0xd6, 0xa8, 0x51, 0xa3, 0xb2, 0xb7, 0x6d, 0xdb, 0x56, 0x28, + 0x12, 0x89, 0xe4, 0x52, 0xa9, 0x54, 0xd6, 0xa9, 0x53, 0xa7, 0x9e, 0xca, + 0x2f, 0x99, 0x98, 0x98, 0x98, 0xbf, 0x7e, 0xfd, 0xfa, 0x3d, 0x21, 0x84, + 0x84, 0x84, 0x84, 0x94, 0xfd, 0xf0, 0xc3, 0x0f, 0xb9, 0x2d, 0x5b, 0xb6, + 0xcc, 0x18, 0x30, 0x60, 0x40, 0xf6, 0x8e, 0x1d, 0x3b, 0x8a, 0xef, 0xdd, + 0xbb, 0x57, 0xac, 0xab, 0xab, 0xfb, 0x1d, 0x00, 0x33, 0xe5, 0xf8, 0xfb, + 0xf7, 0xef, 0x9f, 0x35, 0x6f, 0xde, 0xbc, 0xbc, 0x33, 0x67, 0xce, 0x14, + 0xd2, 0x34, 0x4d, 0x84, 0x42, 0x61, 0xe9, 0xc8, 0x91, 0x23, 0xc7, 0xa3, + 0xa2, 0x3c, 0x98, 0x26, 0x25, 0x25, 0x95, 0x09, 0x85, 0x42, 0x7a, 0xe8, + 0xd0, 0xa1, 0xd9, 0x6a, 0x9e, 0x14, 0x5b, 0x5b, 0xdb, 0x69, 0x28, 0x1f, + 0x48, 0xea, 0x1f, 0x3e, 0x7c, 0xf8, 0x35, 0x3b, 0xc8, 0x2b, 0x54, 0x13, + 0x3e, 0xbd, 0x55, 0xab, 0x56, 0x07, 0xa1, 0xa4, 0x53, 0x3c, 0x3c, 0x3c, + 0x7a, 0x97, 0x94, 0x94, 0x94, 0x49, 0xa5, 0x52, 0x7a, 0xcd, 0x9a, 0x35, + 0x05, 0x9d, 0x3b, 0x77, 0xce, 0x6c, 0xd5, 0xaa, 0x55, 0xe6, 0xb4, 0x69, + 0xd3, 0xf2, 0xee, 0xdd, 0xbb, 0x57, 0xac, 0xad, 0xad, 0xdd, 0x13, 0x8c, + 0x31, 0xf9, 0xa9, 0x7c, 0x1c, 0x1c, 0x1c, 0x06, 0x40, 0x45, 0xce, 0x1d, + 0x1c, 0x1c, 0x06, 0xb0, 0x83, 0xf1, 0x44, 0x94, 0x2b, 0x7b, 0x43, 0x00, + 0x87, 0xf9, 0x7c, 0xfe, 0x5b, 0x73, 0x73, 0xf3, 0xa4, 0xbc, 0xbc, 0x3c, + 0xfa, 0xe3, 0xc7, 0x8f, 0x72, 0x73, 0x73, 0xf3, 0x24, 0x3e, 0x9f, 0xff, + 0x06, 0xc0, 0x7e, 0x00, 0xca, 0xf5, 0xab, 0x0e, 0x81, 0xa7, 0xa7, 0xe7, + 0x62, 0x42, 0x08, 0xd9, 0xb1, 0x63, 0xc7, 0x73, 0x54, 0xd4, 0x87, 0x66, + 0x05, 0x05, 0x05, 0xb2, 0xc4, 0xc4, 0xc4, 0x32, 0x28, 0xe9, 0x0e, 0x33, + 0x33, 0x33, 0xeb, 0x84, 0x84, 0x84, 0x8c, 0xdc, 0xdc, 0x5c, 0x99, 0xbd, + 0xbd, 0xfd, 0x1d, 0x00, 0x75, 0xd9, 0x72, 0x35, 0xba, 0x7d, 0xfb, 0x76, + 0x3a, 0x21, 0x84, 0x58, 0x5b, 0x5b, 0x77, 0x81, 0x7a, 0x23, 0xee, 0x53, + 0xd9, 0xa7, 0xa5, 0xa5, 0x89, 0x0b, 0x0a, 0x0a, 0xe8, 0xe4, 0xe4, 0x64, + 0x21, 0x2a, 0x76, 0x60, 0x46, 0x79, 0x79, 0x79, 0xe2, 0xc2, 0xc2, 0x42, + 0x3a, 0x2d, 0x2d, 0x4d, 0xcc, 0x7e, 0xfb, 0x53, 0xf9, 0x10, 0x42, 0x48, + 0xb7, 0x6e, 0xdd, 0x06, 0x29, 0xcb, 0xad, 0xb6, 0xb6, 0x76, 0x23, 0x56, + 0x6f, 0xc7, 0x29, 0xf2, 0xac, 0xa5, 0xa5, 0xa5, 0x97, 0x98, 0x98, 0x98, + 0x4e, 0x08, 0x21, 0x87, 0x0f, 0x1f, 0x16, 0x76, 0xea, 0xd4, 0x29, 0xcb, + 0xdd, 0xdd, 0x3d, 0x73, 0xe7, 0xce, 0x9d, 0x85, 0x84, 0x10, 0xf2, 0xfa, + 0xf5, 0xeb, 0x58, 0x0d, 0x0d, 0x0d, 0xc5, 0x20, 0x58, 0xd3, 0xcb, 0xcb, + 0x6b, 0x25, 0xab, 0x67, 0x44, 0xbd, 0x7b, 0xf7, 0xce, 0xea, 0xd7, 0xaf, + 0x5f, 0xd6, 0x94, 0x29, 0x53, 0x72, 0x6f, 0xdf, 0xbe, 0x5d, 0x4a, 0x08, + 0x21, 0xc9, 0xc9, 0xc9, 0x59, 0x26, 0x26, 0x26, 0x9f, 0x26, 0x08, 0x6b, + 0x19, 0xbf, 0x86, 0xab, 0xab, 0xeb, 0xf7, 0x84, 0x10, 0x12, 0x18, 0x18, + 0x28, 0xe9, 0xdd, 0xbb, 0x77, 0xd6, 0x80, 0x01, 0x03, 0xb2, 0x66, 0xcd, + 0x9a, 0x95, 0x1b, 0x1a, 0x1a, 0x2a, 0x62, 0xeb, 0xf6, 0xb6, 0x72, 0x99, + 0x99, 0x98, 0x98, 0x58, 0x65, 0x66, 0x66, 0xe6, 0x49, 0x24, 0x12, 0x7a, + 0xc3, 0x86, 0x0d, 0x85, 0x5e, 0x5e, 0x5e, 0xd9, 0xad, 0x5b, 0xb7, 0xce, + 0x9c, 0x36, 0x6d, 0x5a, 0xde, 0xe1, 0xc3, 0x87, 0x85, 0x37, 0x6e, 0xdc, + 0xc8, 0x01, 0xd0, 0x8c, 0x7d, 0xc7, 0x6c, 0xc8, 0x90, 0x21, 0x09, 0xca, + 0xf2, 0x58, 0x54, 0x54, 0x44, 0xe7, 0xe7, 0xe7, 0x57, 0x90, 0xed, 0x41, + 0x83, 0x06, 0xc5, 0xb2, 0xe5, 0x69, 0x1c, 0x1c, 0x1c, 0x9c, 0xc7, 0x1a, + 0xe7, 0xf6, 0x2a, 0xed, 0xe2, 0x53, 0x79, 0x06, 0x07, 0x07, 0xe7, 0x01, + 0xb0, 0xb2, 0xb2, 0xb2, 0x5a, 0x20, 0x97, 0xcb, 0x49, 0x68, 0x68, 0x68, + 0x1a, 0x00, 0x5d, 0x35, 0xf5, 0xa9, 0x17, 0x15, 0x15, 0x95, 0x25, 0x97, + 0xcb, 0x89, 0xa5, 0xa5, 0xe5, 0x9a, 0x80, 0x80, 0x80, 0xfc, 0x8f, 0x1f, + 0x3f, 0x96, 0x01, 0x30, 0xae, 0x42, 0x06, 0x8c, 0xe2, 0xe3, 0xe3, 0x85, + 0x41, 0x41, 0x41, 0xf9, 0x00, 0x1a, 0xd8, 0xd9, 0xd9, 0x9d, 0x11, 0x89, + 0x44, 0x74, 0x78, 0x78, 0x78, 0x1c, 0x8f, 0xc7, 0xfb, 0xd4, 0x7f, 0xf2, + 0x78, 0x3c, 0xad, 0x90, 0x90, 0x90, 0xf7, 0x85, 0x85, 0x85, 0x72, 0x4b, + 0x4b, 0xcb, 0xfd, 0x60, 0x0c, 0x85, 0x9e, 0xb7, 0x6e, 0xdd, 0x12, 0x12, + 0x42, 0x48, 0xdb, 0xb6, 0x6d, 0x7b, 0xaa, 0x46, 0xdc, 0xbe, 0x7d, 0xfb, + 0xde, 0x84, 0x10, 0x72, 0xe9, 0xd2, 0xa5, 0x22, 0x00, 0xdd, 0x00, 0x98, + 0xf7, 0xea, 0xd5, 0xeb, 0xc1, 0xc8, 0x91, 0x23, 0xb3, 0xd4, 0xf5, 0x47, + 0x67, 0xcf, 0x9e, 0x15, 0x11, 0x42, 0xc8, 0xc6, 0x8d, 0x1b, 0xa3, 0x01, + 0x18, 0xa9, 0x44, 0x67, 0x2e, 0x16, 0x8b, 0xe9, 0xb7, 0x6f, 0xdf, 0xca, + 0x9c, 0x9d, 0x9d, 0xd3, 0x9c, 0x9d, 0x9d, 0x53, 0x9d, 0x9d, 0x9d, 0xa3, + 0xb5, 0xb5, 0xb5, 0x3b, 0xa8, 0xb4, 0x53, 0x3d, 0x17, 0x17, 0x97, 0x43, + 0x84, 0x10, 0xb2, 0x73, 0xe7, 0xce, 0x33, 0xa8, 0xde, 0x68, 0xe6, 0x6b, + 0x6b, 0x6b, 0x77, 0x70, 0x76, 0x76, 0x8e, 0x66, 0xe3, 0x4c, 0x7b, 0xf3, + 0xe6, 0x8d, 0x4c, 0x22, 0x91, 0x54, 0x67, 0xd0, 0x68, 0xfc, 0xf9, 0xe7, + 0x9f, 0x01, 0x71, 0x71, 0x71, 0x12, 0x42, 0x08, 0x71, 0x73, 0x73, 0xeb, + 0x8e, 0x6f, 0x0b, 0xc5, 0x96, 0xf1, 0x8a, 0xdd, 0xbb, 0x77, 0xe7, 0x5d, + 0xbb, 0x76, 0x2d, 0x04, 0x5f, 0x6f, 0x4c, 0xeb, 0x2e, 0x5c, 0xb8, 0xf0, + 0x3a, 0x21, 0x84, 0x0c, 0x1e, 0x3c, 0x78, 0x07, 0x6a, 0x6f, 0x7c, 0x7e, + 0x0d, 0x5a, 0x83, 0x07, 0x0f, 0xde, 0xc1, 0xea, 0xed, 0x1b, 0x50, 0x2f, + 0xbf, 0xb5, 0x81, 0xd7, 0xbb, 0x77, 0xef, 0xc9, 0x84, 0x10, 0x72, 0xe0, + 0xc0, 0x81, 0x42, 0x00, 0x4b, 0x01, 0xf4, 0x01, 0x30, 0x14, 0x40, 0x27, + 0x54, 0x3f, 0x21, 0xaa, 0x0e, 0x9d, 0xb9, 0x73, 0xe7, 0x5e, 0x62, 0x8d, + 0xf3, 0x3d, 0x5f, 0x50, 0x3e, 0x06, 0x00, 0xf6, 0x68, 0x6a, 0x6a, 0x06, + 0x03, 0xa8, 0x8f, 0x9a, 0x8d, 0x7b, 0xf4, 0x00, 0xac, 0xd7, 0xd2, 0xd2, + 0x0a, 0x01, 0xe0, 0x8a, 0xcf, 0xe5, 0xd5, 0x2c, 0x3d, 0x3d, 0x5d, 0x1a, + 0x13, 0x13, 0x23, 0xc2, 0xe7, 0x63, 0x47, 0x75, 0x50, 0x6c, 0x9c, 0xf6, + 0x00, 0x3c, 0x43, 0x43, 0x43, 0x4b, 0xa4, 0x52, 0x29, 0x01, 0x60, 0x51, + 0x83, 0x77, 0x39, 0xbe, 0x1d, 0x02, 0x1f, 0x1f, 0x9f, 0x0b, 0x81, 0x81, + 0x81, 0x6f, 0xf1, 0x0d, 0x26, 0xa2, 0x38, 0x18, 0x3a, 0x76, 0xec, 0xd8, + 0x93, 0x10, 0x42, 0x12, 0x12, 0x12, 0xca, 0x46, 0x8c, 0x18, 0x91, 0xee, + 0xe4, 0xe4, 0x74, 0x05, 0x95, 0x1b, 0xde, 0xc6, 0x77, 0xef, 0xde, 0xcd, + 0xba, 0x75, 0xeb, 0x56, 0x3a, 0x3e, 0xef, 0x4f, 0x14, 0x18, 0x35, 0x6b, + 0xd6, 0xec, 0xea, 0x88, 0x11, 0x23, 0xd2, 0x13, 0x13, 0x13, 0xc5, 0xec, + 0xc4, 0x74, 0x4f, 0xfc, 0xaf, 0x62, 0x68, 0x68, 0x68, 0x53, 0x5c, 0x5c, + 0x2c, 0xb9, 0x73, 0xe7, 0x8e, 0x08, 0x40, 0x67, 0x54, 0x5c, 0x81, 0xd1, + 0x8d, 0x8d, 0x8d, 0xcd, 0x4e, 0x4e, 0x4e, 0x96, 0x69, 0x69, 0x69, 0x9d, + 0x04, 0xe0, 0x01, 0xc0, 0x53, 0x47, 0x47, 0xe7, 0x4c, 0x6a, 0x6a, 0xaa, + 0x2c, 0x22, 0x22, 0x22, 0x15, 0x15, 0x8d, 0x6e, 0x6a, 0xc5, 0x8a, 0x15, + 0x1b, 0x08, 0x21, 0xe4, 0xfa, 0xf5, 0xeb, 0xc5, 0x03, 0x06, 0x0c, 0xc8, + 0x60, 0x8d, 0xf3, 0x33, 0xf8, 0xbc, 0x51, 0xf0, 0x00, 0x34, 0xb2, 0xb3, + 0xb3, 0x0b, 0xd6, 0xd0, 0xd0, 0xf0, 0x07, 0x30, 0x0e, 0x40, 0x2b, 0x00, + 0x63, 0xba, 0x74, 0xe9, 0x12, 0x46, 0x08, 0x21, 0x77, 0xef, 0xde, 0x7d, + 0xa7, 0xf4, 0x9e, 0x00, 0x80, 0x97, 0xbe, 0xbe, 0xfe, 0x73, 0x00, 0x1b, + 0x01, 0xf4, 0x02, 0xe0, 0x02, 0x60, 0xbc, 0x87, 0x87, 0xc7, 0x4b, 0x42, + 0x08, 0x09, 0x0a, 0x0a, 0x8a, 0x43, 0x25, 0x8d, 0x4f, 0x53, 0x53, 0x53, + 0x2f, 0x22, 0x22, 0x22, 0xe1, 0xce, 0x9d, 0x3b, 0x25, 0xd7, 0xaf, 0x5f, + 0x17, 0x7d, 0xfc, 0xf8, 0x51, 0x86, 0xcf, 0x3b, 0x7c, 0x83, 0x6b, 0xd7, + 0xae, 0x25, 0x0b, 0x85, 0x42, 0x1a, 0xc0, 0x5c, 0x00, 0x13, 0x95, 0x9e, + 0x31, 0x00, 0x6c, 0x51, 0x71, 0x80, 0x4d, 0x8d, 0x18, 0x31, 0x62, 0x0a, + 0x21, 0x84, 0xac, 0x59, 0xb3, 0x26, 0x1f, 0xc0, 0x01, 0x00, 0x5e, 0x00, + 0xec, 0x00, 0x34, 0x06, 0x60, 0xad, 0x14, 0x5e, 0x00, 0xa0, 0x1d, 0x9b, + 0xcf, 0x09, 0x2a, 0xcf, 0x94, 0x7b, 0xf7, 0xee, 0x65, 0x16, 0x15, 0x15, + 0xd1, 0x06, 0x06, 0x06, 0x0b, 0x94, 0xf2, 0x60, 0x90, 0x97, 0x97, 0x57, + 0x96, 0x91, 0x91, 0x21, 0xd7, 0xd0, 0xd0, 0xd8, 0x0e, 0xa0, 0x03, 0x80, + 0x8e, 0x02, 0x81, 0x60, 0x47, 0x46, 0x46, 0x86, 0x3c, 0x2f, 0x2f, 0xaf, + 0x0c, 0x4a, 0x8d, 0xc1, 0xcd, 0xcd, 0xad, 0x3b, 0x21, 0x84, 0x04, 0x04, + 0x04, 0x88, 0x00, 0xfc, 0xc2, 0x96, 0xa7, 0x27, 0x9f, 0xcf, 0x3f, 0x93, + 0x9b, 0x9b, 0x2b, 0x8f, 0x89, 0x89, 0xc9, 0xe2, 0xf1, 0x78, 0x5f, 0xdb, + 0x11, 0x7f, 0x13, 0x0c, 0x0d, 0x0d, 0x8d, 0x97, 0x2e, 0x5d, 0xba, 0x72, + 0xd6, 0xac, 0x59, 0xf3, 0xf0, 0x65, 0x13, 0x06, 0xd4, 0x9c, 0x39, 0x73, + 0x16, 0x2c, 0x59, 0xb2, 0x64, 0x85, 0xbe, 0xbe, 0x7e, 0x4d, 0x66, 0xe6, + 0x29, 0x30, 0x9d, 0xe2, 0x9f, 0x00, 0xd6, 0x03, 0x18, 0x08, 0xc0, 0x1d, + 0xc0, 0x00, 0x00, 0x5b, 0xce, 0x9c, 0x39, 0x23, 0x22, 0x84, 0x90, 0x8e, + 0x1d, 0x3b, 0x0e, 0x52, 0xa4, 0x67, 0xc0, 0x80, 0x01, 0xa3, 0x65, 0x32, + 0x19, 0xfd, 0xfd, 0xf7, 0xdf, 0x7f, 0x00, 0xb0, 0x19, 0x40, 0x7f, 0xb6, + 0x4c, 0xc7, 0x19, 0x1a, 0x1a, 0x06, 0x84, 0x87, 0x87, 0x17, 0x9f, 0x3b, + 0x77, 0xee, 0x2e, 0x54, 0x56, 0x2d, 0x29, 0x8a, 0x32, 0x48, 0x49, 0x49, + 0x29, 0x0a, 0x0a, 0x0a, 0x92, 0x3e, 0x7d, 0xfa, 0x54, 0x96, 0x94, 0x94, + 0x54, 0x08, 0x40, 0x5f, 0x25, 0x3d, 0x46, 0x7e, 0x7e, 0x7e, 0x1f, 0x58, + 0xe3, 0x73, 0x13, 0x98, 0x81, 0xcc, 0x50, 0x00, 0x93, 0x00, 0xec, 0xdc, + 0xb7, 0x6f, 0x9f, 0x90, 0x10, 0x42, 0xb6, 0x6d, 0xdb, 0xf6, 0x17, 0xca, + 0x07, 0x37, 0xbc, 0x9d, 0x3b, 0x77, 0x1e, 0x23, 0x84, 0x90, 0xd3, 0xa7, + 0x4f, 0x8b, 0x34, 0x35, 0x35, 0x03, 0x01, 0xfc, 0x04, 0xa0, 0x07, 0x80, + 0xd1, 0x00, 0xb6, 0x00, 0x38, 0x01, 0xc6, 0x38, 0x34, 0x56, 0x8a, 0x7f, + 0x33, 0x18, 0xf9, 0x5d, 0x04, 0xe0, 0x44, 0x8f, 0x1e, 0x3d, 0x3e, 0x16, + 0x14, 0x14, 0xc8, 0xf3, 0xf3, 0xf3, 0x4b, 0x2c, 0x2c, 0x2c, 0x94, 0x57, + 0xff, 0xcd, 0x92, 0x92, 0x92, 0xc4, 0xf9, 0xf9, 0xf9, 0x72, 0x00, 0xd3, + 0x01, 0x8c, 0x55, 0x79, 0x46, 0x00, 0x68, 0x84, 0xf2, 0x41, 0x8b, 0x81, + 0xaf, 0xaf, 0x6f, 0x34, 0x21, 0x84, 0xb4, 0x6a, 0xd5, 0xea, 0x10, 0x80, + 0xef, 0x55, 0xc2, 0x8f, 0x02, 0xe0, 0xa6, 0x54, 0x3e, 0x9a, 0x61, 0x61, + 0x61, 0x71, 0x84, 0x10, 0xd2, 0xbf, 0x7f, 0xff, 0x2c, 0x00, 0x1b, 0xd8, + 0x32, 0xed, 0x01, 0x60, 0x36, 0x80, 0xa3, 0x60, 0xda, 0x0c, 0xa5, 0x52, + 0x3e, 0x83, 0xf1, 0xb9, 0x71, 0x3e, 0x98, 0x10, 0x42, 0xfc, 0xfc, 0xfc, + 0x3e, 0xa0, 0x5c, 0xd9, 0x53, 0x60, 0x8c, 0x1f, 0x2b, 0x00, 0x6d, 0xb3, + 0xb3, 0xb3, 0x65, 0x19, 0x19, 0x19, 0x32, 0xb6, 0x9e, 0xad, 0xd8, 0x70, + 0xd5, 0xc9, 0x9a, 0xc0, 0xd3, 0xd3, 0x73, 0x29, 0x6b, 0x50, 0x84, 0xaa, + 0xd4, 0x9b, 0x79, 0x41, 0x41, 0x81, 0x3c, 0x31, 0x31, 0x51, 0x0c, 0xc0, + 0x0c, 0x00, 0xf8, 0x7c, 0xbe, 0xe6, 0xdd, 0xbb, 0x77, 0x9f, 0xc9, 0x64, + 0x32, 0xba, 0x47, 0x8f, 0x1e, 0xf1, 0x00, 0x3a, 0x2a, 0xd5, 0x97, 0xd1, + 0xed, 0xdb, 0xb7, 0xb3, 0x58, 0xe3, 0xdc, 0x03, 0x55, 0x1b, 0xe7, 0x66, + 0x69, 0x69, 0x69, 0x92, 0x87, 0x0f, 0x1f, 0x4a, 0x08, 0x21, 0xc4, 0xca, + 0xca, 0xca, 0x49, 0xf1, 0x43, 0xe3, 0xc6, 0x8d, 0xdb, 0x13, 0x42, 0xc8, + 0xfd, 0xfb, 0xf7, 0x25, 0x69, 0x69, 0x69, 0x12, 0xf6, 0xdb, 0x46, 0x7e, + 0x7e, 0x7e, 0x1f, 0x52, 0x52, 0x52, 0xe8, 0xac, 0xac, 0x2c, 0xf9, 0x9d, + 0x3b, 0x77, 0x5e, 0xa1, 0xdc, 0x60, 0xa0, 0xb4, 0xb5, 0xb5, 0xed, 0x59, + 0xc3, 0x3a, 0x09, 0x8c, 0x8e, 0xa0, 0x7e, 0xf8, 0xe1, 0x87, 0x05, 0xac, + 0xc1, 0x5e, 0x06, 0xe0, 0x20, 0x2b, 0xfb, 0x7d, 0x95, 0xe5, 0x6d, 0xd4, + 0xa8, 0x51, 0xd3, 0xd9, 0x32, 0xd2, 0xf4, 0xf2, 0xf2, 0x5a, 0x43, 0x08, + 0x21, 0x9b, 0x37, 0x6f, 0x7e, 0xc7, 0xca, 0xd7, 0x70, 0xb6, 0x9e, 0x2e, + 0x9e, 0x3c, 0x79, 0x52, 0x44, 0x08, 0x21, 0xf3, 0xe6, 0xcd, 0xdb, 0xc0, + 0xe6, 0xab, 0xb6, 0xf1, 0x6b, 0xb8, 0xba, 0xba, 0x4e, 0x24, 0x84, 0x90, + 0x3f, 0xff, 0xfc, 0x33, 0x83, 0x95, 0x97, 0xd1, 0x00, 0x16, 0x99, 0x9a, + 0x9a, 0x3e, 0x2c, 0x2b, 0x2b, 0xa3, 0x09, 0x21, 0xa4, 0x69, 0xd3, 0xa6, + 0xee, 0x0a, 0xd9, 0x1f, 0x38, 0x70, 0xe0, 0x34, 0x42, 0x08, 0x39, 0x76, + 0xec, 0x58, 0x09, 0x80, 0xdf, 0xd8, 0xf4, 0xf4, 0x04, 0x30, 0x0b, 0xc0, + 0x1f, 0xec, 0x37, 0x15, 0x2b, 0x5a, 0x5a, 0x6c, 0x7b, 0x52, 0xc8, 0xe2, + 0xb4, 0xec, 0xec, 0x6c, 0x39, 0x2b, 0x0f, 0xd3, 0xd8, 0xbf, 0x8d, 0x01, + 0x30, 0x98, 0x0d, 0x6b, 0x12, 0x1c, 0x1c, 0x5c, 0xc0, 0x1a, 0xe7, 0xaa, + 0xbb, 0x1c, 0x3e, 0x95, 0x67, 0x70, 0x70, 0x70, 0x01, 0x5b, 0xfe, 0x2e, + 0xf7, 0xef, 0xdf, 0x2f, 0x23, 0x84, 0x90, 0x06, 0x0d, 0x1a, 0xb4, 0x54, + 0xad, 0xcc, 0xc6, 0x8d, 0x1b, 0xb7, 0x65, 0xeb, 0xac, 0x0c, 0x40, 0xe7, + 0xfd, 0xfb, 0xf7, 0x27, 0x11, 0x42, 0x88, 0xbe, 0xbe, 0x7e, 0x55, 0xc7, + 0x9a, 0x4c, 0x45, 0x22, 0x91, 0xfc, 0xd8, 0xb1, 0x63, 0x29, 0x60, 0xfa, + 0xa6, 0x0e, 0xab, 0x57, 0xaf, 0xce, 0x25, 0x84, 0x90, 0x19, 0x33, 0x66, + 0x2c, 0x61, 0xd3, 0x44, 0x4d, 0x9b, 0x36, 0xed, 0x67, 0x42, 0x08, 0x99, + 0x3d, 0x7b, 0x76, 0x3a, 0x80, 0x16, 0x6c, 0xdb, 0x30, 0x73, 0x75, 0x75, + 0xbd, 0x43, 0xd3, 0x34, 0xb9, 0x75, 0xeb, 0x96, 0xea, 0x0e, 0x11, 0xc1, + 0xdd, 0xbb, 0x77, 0x5f, 0xca, 0x64, 0x32, 0xe2, 0xe8, 0xe8, 0x78, 0x0d, + 0x8c, 0x61, 0xa1, 0x05, 0xa6, 0xaf, 0xfa, 0x1e, 0x2a, 0xfd, 0x51, 0xbd, + 0x7a, 0xf5, 0x7e, 0x29, 0x28, 0x28, 0x90, 0xbe, 0x7a, 0xf5, 0x4a, 0xaa, + 0xa9, 0xa9, 0xb9, 0x0e, 0x15, 0x27, 0xa8, 0x00, 0xc0, 0x42, 0x2c, 0x16, + 0xd3, 0x21, 0x21, 0x21, 0x25, 0x60, 0x8c, 0xb0, 0x4e, 0x60, 0xfa, 0x36, + 0x43, 0x95, 0x72, 0xd3, 0x00, 0xe0, 0x71, 0xef, 0xde, 0x3d, 0x51, 0x41, + 0x41, 0x41, 0x99, 0xbe, 0xbe, 0xbe, 0x15, 0xaa, 0x86, 0x62, 0xe3, 0x68, + 0xc7, 0xc6, 0xd9, 0x27, 0x24, 0x24, 0xa4, 0x84, 0x35, 0xce, 0x2b, 0x35, + 0x68, 0xea, 0xd7, 0xaf, 0xef, 0x2c, 0x95, 0x4a, 0xe5, 0xfd, 0xfa, 0xf5, + 0x4b, 0x0c, 0x08, 0x08, 0x10, 0xdd, 0xbe, 0x7d, 0xbb, 0x26, 0x3b, 0x64, + 0x6a, 0x8b, 0xa2, 0xff, 0xd8, 0x00, 0x60, 0x3b, 0xaa, 0x9f, 0xe4, 0xab, + 0x0e, 0x65, 0xe3, 0x7c, 0x3b, 0xfe, 0xdd, 0xc6, 0xb9, 0xe6, 0x0f, 0x3f, + 0xfc, 0xb0, 0x9b, 0x10, 0x42, 0xa6, 0x4d, 0x9b, 0xf6, 0x90, 0x2d, 0x27, + 0x01, 0x18, 0x7d, 0xf4, 0xa5, 0xc7, 0x30, 0xbf, 0xd6, 0x38, 0x57, 0xc8, + 0x52, 0x1d, 0xd4, 0x7c, 0x27, 0x05, 0x05, 0x46, 0xdf, 0x5b, 0x42, 0xbd, + 0xfc, 0xd4, 0xd6, 0x38, 0x57, 0x8e, 0xd7, 0x3c, 0x34, 0x34, 0xb4, 0x98, + 0x33, 0xce, 0xff, 0x23, 0xe8, 0xbf, 0x7d, 0xfb, 0x36, 0xe7, 0xde, 0xbd, + 0x7b, 0x99, 0xa8, 0xdc, 0x30, 0xe4, 0xa8, 0x1d, 0x82, 0xc5, 0x8b, 0x17, + 0x1f, 0x62, 0x17, 0x69, 0x93, 0x01, 0xfc, 0x08, 0xa0, 0x0d, 0x2a, 0x6f, + 0xef, 0x35, 0x31, 0xce, 0x35, 0xd8, 0x38, 0xa6, 0x4c, 0x9f, 0x3e, 0x3d, + 0x85, 0x10, 0x42, 0x96, 0x2c, 0x59, 0xe2, 0x8b, 0x6f, 0xaf, 0xcb, 0xff, + 0x15, 0xf0, 0xe6, 0xce, 0x9d, 0xbb, 0x9e, 0x10, 0x42, 0x06, 0x0c, 0x18, + 0xf0, 0x04, 0x2a, 0x0a, 0xa7, 0x6d, 0xdb, 0xb6, 0x5e, 0x84, 0x10, 0xb2, + 0x7f, 0xff, 0xfe, 0x8f, 0x60, 0x66, 0xff, 0x04, 0xec, 0xd3, 0xf8, 0xc0, + 0x81, 0x03, 0xd9, 0x84, 0x10, 0xe2, 0xea, 0xea, 0xaa, 0x7c, 0x3e, 0x4c, + 0xa7, 0x79, 0xf3, 0xe6, 0x1b, 0x36, 0x6e, 0xdc, 0x98, 0xcb, 0xe7, 0xf3, + 0xcf, 0xf7, 0xeb, 0xd7, 0x6f, 0x7f, 0x15, 0xc6, 0x39, 0xc0, 0x28, 0x6f, + 0x27, 0x30, 0x0a, 0x54, 0x0b, 0x8c, 0x12, 0xd5, 0x13, 0x08, 0x04, 0x43, + 0xa5, 0x52, 0x29, 0x79, 0xf5, 0xea, 0x55, 0x01, 0x2a, 0x56, 0xa4, 0x36, + 0x18, 0xc3, 0x43, 0x9f, 0x4d, 0x07, 0x0f, 0x80, 0xbe, 0x8e, 0x8e, 0xce, + 0x28, 0x9a, 0xa6, 0xc9, 0x8b, 0x17, 0x2f, 0xf2, 0xa1, 0x7e, 0x65, 0x82, + 0xda, 0xb8, 0x71, 0xe3, 0x1e, 0xa9, 0x54, 0x4a, 0xb7, 0x6a, 0xd5, 0xea, + 0x71, 0x40, 0x40, 0x40, 0x2e, 0xbb, 0x72, 0xae, 0x6a, 0x9c, 0x1b, 0x3d, + 0x7d, 0xfa, 0x34, 0x27, 0x36, 0x36, 0x56, 0xc2, 0x7e, 0x47, 0x4b, 0xe5, + 0x51, 0x1d, 0x5c, 0x6b, 0x3d, 0x7d, 0xfa, 0x34, 0x2e, 0x37, 0x37, 0x57, + 0xae, 0xaf, 0xaf, 0xbf, 0x99, 0xcd, 0x87, 0x00, 0x8c, 0x32, 0xe6, 0xe1, + 0x73, 0x43, 0x40, 0x43, 0x4d, 0x9c, 0xda, 0x2e, 0x2e, 0x2e, 0xdd, 0x09, + 0x21, 0x64, 0xcf, 0x9e, 0x3d, 0x79, 0x00, 0x1c, 0x94, 0xbe, 0x63, 0xf6, + 0xee, 0xdd, 0xbb, 0xb2, 0xc4, 0xc4, 0x44, 0x09, 0x18, 0xa3, 0x48, 0x03, + 0x80, 0x06, 0x8f, 0xc7, 0xb3, 0x4f, 0x4d, 0x4d, 0x95, 0xbe, 0x79, 0xf3, + 0xa6, 0x0c, 0xac, 0x91, 0x00, 0x40, 0x63, 0xe2, 0xc4, 0x89, 0x9b, 0xd8, + 0x1d, 0x04, 0xaf, 0xc1, 0x18, 0x23, 0x7c, 0x36, 0x3d, 0xf6, 0xc7, 0x8f, + 0x1f, 0x2f, 0x20, 0x84, 0x90, 0x76, 0xed, 0xda, 0xf5, 0x55, 0x27, 0x08, + 0x5a, 0x5a, 0x5a, 0x3a, 0x61, 0x61, 0x61, 0x11, 0xa1, 0xa1, 0xa1, 0xaf, + 0x34, 0x35, 0x35, 0xb5, 0x51, 0x0d, 0x14, 0x45, 0xf1, 0x1e, 0x3d, 0x7a, + 0x14, 0xfc, 0xfa, 0xf5, 0xeb, 0x77, 0x46, 0x46, 0x46, 0x35, 0xd9, 0xe2, + 0x05, 0x00, 0x30, 0x36, 0x36, 0x36, 0x5d, 0xb5, 0x6a, 0xd5, 0x86, 0xbc, + 0xbc, 0xbc, 0x82, 0xb2, 0xb2, 0x32, 0xe9, 0xb8, 0x71, 0xe3, 0xf6, 0x42, + 0xcd, 0xae, 0x8a, 0x1a, 0xa0, 0x3d, 0x71, 0xe2, 0xc4, 0x03, 0x62, 0xb1, + 0x58, 0x96, 0x9b, 0x9b, 0x9b, 0xff, 0xeb, 0xaf, 0xbf, 0xae, 0xab, 0x41, + 0x3a, 0x78, 0x60, 0xe4, 0x49, 0x0f, 0x8c, 0xec, 0xf1, 0xd9, 0xff, 0x5a, + 0x2d, 0x5e, 0xbc, 0x38, 0x9c, 0x10, 0x42, 0x3a, 0x74, 0xe8, 0xe0, 0xad, + 0xa8, 0xa7, 0x87, 0x0f, 0x1f, 0x46, 0x5f, 0xb8, 0x70, 0xa1, 0x00, 0x8c, + 0xa1, 0x6a, 0xd6, 0xba, 0x75, 0xeb, 0x8e, 0x63, 0xc6, 0x8c, 0xf9, 0xa1, + 0x4d, 0x9b, 0x36, 0x5d, 0xb4, 0xb5, 0xb5, 0x5b, 0x0f, 0x1e, 0x3c, 0x38, + 0x54, 0x2e, 0x97, 0xd3, 0x4d, 0x9a, 0x34, 0x71, 0x53, 0xfe, 0x48, 0x87, + 0x0e, 0x1d, 0xfa, 0x13, 0x42, 0xc8, 0xca, 0x95, 0x2b, 0x93, 0x57, 0xaf, + 0x5e, 0x9d, 0x4a, 0x08, 0x21, 0xee, 0xee, 0xee, 0xbd, 0x55, 0xd2, 0xa2, + 0x6c, 0x7c, 0x0e, 0x07, 0xd3, 0x3e, 0x34, 0xd9, 0xb2, 0xb0, 0xec, 0xd9, + 0xb3, 0xe7, 0x15, 0x42, 0x08, 0x39, 0x74, 0xe8, 0xd0, 0x2b, 0x36, 0xbd, + 0xb0, 0xb7, 0xb7, 0x6f, 0x21, 0x91, 0x48, 0xe4, 0x05, 0x05, 0x05, 0xb4, + 0xb1, 0xb1, 0xf1, 0x9f, 0xac, 0x4c, 0xe8, 0xb0, 0x75, 0xac, 0x05, 0xa6, + 0x5d, 0x18, 0x2a, 0xf2, 0xa9, 0x26, 0x7e, 0x5d, 0x56, 0x5e, 0x46, 0x2c, + 0x5b, 0xb6, 0x2c, 0x9b, 0x6d, 0xdb, 0xe7, 0x95, 0xe5, 0x4d, 0xc9, 0x38, + 0xb7, 0x51, 0x23, 0xab, 0x9a, 0xa8, 0xd8, 0x06, 0x3e, 0x19, 0xe7, 0xad, + 0x5b, 0xb7, 0x9e, 0xc9, 0xa6, 0x53, 0xf5, 0x9d, 0x4f, 0xca, 0x7a, 0xe0, + 0xc0, 0x81, 0xe3, 0x09, 0x21, 0xc4, 0xdf, 0xdf, 0xbf, 0x0c, 0x8c, 0x51, + 0x60, 0x8c, 0x72, 0x9d, 0xa2, 0xa3, 0x94, 0x76, 0xd5, 0xf2, 0x19, 0x8c, + 0x9a, 0x19, 0xe7, 0xca, 0x58, 0xb0, 0xc6, 0xb9, 0x14, 0xb5, 0x1b, 0x0c, + 0xd5, 0xc6, 0x38, 0xa7, 0x76, 0xec, 0xd8, 0x71, 0x90, 0x10, 0x42, 0xe6, + 0xcc, 0x99, 0x93, 0x0d, 0xc6, 0x58, 0x54, 0xd6, 0x73, 0xb5, 0x36, 0xce, + 0x0f, 0x1e, 0x3c, 0xf8, 0x91, 0xd5, 0xc7, 0xb3, 0xd8, 0xf0, 0xfc, 0xb1, + 0x63, 0xc7, 0xae, 0x90, 0x4a, 0xa5, 0x64, 0xef, 0xde, 0xbd, 0x99, 0x2a, + 0xc6, 0x79, 0x4a, 0x5a, 0x5a, 0x9a, 0x6c, 0xc9, 0x92, 0x25, 0xb9, 0xec, + 0x8a, 0x69, 0x2f, 0x36, 0x2e, 0x75, 0xc6, 0xb9, 0xf6, 0xd3, 0xa7, 0x4f, + 0xe3, 0x09, 0x21, 0xa4, 0x73, 0xe7, 0xce, 0xb7, 0xc0, 0x4c, 0x82, 0x68, + 0xb2, 0x65, 0x6f, 0xe9, 0xe2, 0xe2, 0x72, 0x86, 0x10, 0x42, 0x1e, 0x3e, + 0x7c, 0xf8, 0x5e, 0x51, 0xd7, 0x0a, 0xe3, 0x7c, 0xd3, 0xa6, 0x4d, 0xcf, + 0xc0, 0x18, 0xbd, 0x9a, 0x6c, 0xfe, 0xea, 0xf6, 0xed, 0xdb, 0xf7, 0x0e, + 0x21, 0x84, 0xf8, 0xfa, 0xfa, 0x3e, 0x65, 0xff, 0x56, 0xdb, 0xf8, 0x3f, + 0x19, 0xe7, 0x27, 0x4f, 0x9e, 0x8c, 0x67, 0xf3, 0xa4, 0xc5, 0xca, 0x50, + 0xcb, 0x33, 0x67, 0xce, 0x94, 0xb0, 0x5b, 0x7e, 0x7f, 0x56, 0xb4, 0xd3, + 0x1f, 0x7e, 0xf8, 0x61, 0x0f, 0xdb, 0x61, 0x87, 0x82, 0x19, 0x40, 0x2b, + 0xe2, 0xd7, 0x01, 0x63, 0x2c, 0x29, 0x1b, 0x87, 0x14, 0xfb, 0xbb, 0x42, + 0x0e, 0x6d, 0x94, 0xe4, 0x41, 0x59, 0xb6, 0x15, 0x13, 0x1a, 0xb5, 0x31, + 0xce, 0x4d, 0x00, 0x98, 0xfe, 0xf4, 0xd3, 0x4f, 0x51, 0xec, 0x04, 0xc5, + 0x36, 0x55, 0xf9, 0x5c, 0xbc, 0x78, 0xf1, 0x1e, 0x76, 0x27, 0x54, 0x14, + 0x80, 0xfa, 0x8b, 0x16, 0x2d, 0x7a, 0xc2, 0xf6, 0x97, 0x7d, 0x51, 0xc9, + 0x04, 0x91, 0x99, 0x99, 0x59, 0x53, 0x42, 0x08, 0x59, 0xb5, 0x6a, 0x55, + 0x28, 0x9b, 0x17, 0x03, 0x6d, 0x6d, 0xed, 0x75, 0xf1, 0xf1, 0xf1, 0xd2, + 0xdc, 0xdc, 0xdc, 0x12, 0x33, 0x33, 0x33, 0x5b, 0x33, 0x33, 0x33, 0xdb, + 0x9c, 0x9c, 0x1c, 0x61, 0x78, 0x78, 0xb8, 0x98, 0xcf, 0xe7, 0x2f, 0x44, + 0xb9, 0xe1, 0x2c, 0x00, 0xd0, 0xfd, 0xe4, 0xc9, 0x93, 0x42, 0x76, 0x92, + 0xf1, 0x93, 0x9e, 0xef, 0xd6, 0xad, 0xdb, 0x20, 0xb6, 0xad, 0x17, 0x01, + 0xe8, 0x82, 0xf2, 0x36, 0xa9, 0xd0, 0x1b, 0x9f, 0x1e, 0x8a, 0xa2, 0xf4, + 0x03, 0x03, 0x03, 0xc3, 0xc4, 0x62, 0x31, 0xed, 0xea, 0xea, 0xfa, 0x14, + 0xea, 0x57, 0x1d, 0x2d, 0xc4, 0x62, 0x31, 0x1d, 0x1a, 0x1a, 0x5a, 0xc4, + 0xb6, 0x2d, 0x0d, 0x36, 0xff, 0xea, 0xf2, 0x65, 0x36, 0x64, 0xc8, 0x90, + 0xe7, 0x84, 0x10, 0x32, 0x6b, 0xd6, 0xac, 0x55, 0xd5, 0xb4, 0x01, 0x45, + 0xbd, 0xf1, 0xd9, 0x38, 0x2d, 0x42, 0x43, 0x43, 0x8b, 0xaa, 0x31, 0xce, + 0xf9, 0x3b, 0x76, 0xec, 0x38, 0xf5, 0xfe, 0xfd, 0xfb, 0x32, 0x00, 0xd3, + 0x3b, 0x75, 0xea, 0xf4, 0x80, 0x10, 0x42, 0xba, 0x76, 0xed, 0xfa, 0x1d, + 0xbe, 0x3d, 0x8a, 0x95, 0x50, 0x83, 0xca, 0xea, 0xd0, 0xde, 0xde, 0xbe, + 0xc9, 0xda, 0xb5, 0x6b, 0x37, 0x05, 0x05, 0x05, 0x3d, 0x4e, 0x4c, 0x4c, + 0x4c, 0x7e, 0xfb, 0xf6, 0x6d, 0xcc, 0xad, 0x5b, 0xb7, 0x02, 0x86, 0x0d, + 0x1b, 0x36, 0x5a, 0xe5, 0x9d, 0x4f, 0xc6, 0x79, 0x9f, 0x3e, 0x7d, 0x36, + 0x8d, 0x1d, 0x3b, 0xf6, 0xc7, 0xeb, 0xd7, 0xaf, 0xfb, 0xc7, 0xc7, 0xc7, + 0x27, 0x5e, 0xbd, 0x7a, 0xf5, 0xd6, 0xa0, 0x41, 0x83, 0xaa, 0xda, 0x3a, + 0x4f, 0x7d, 0xff, 0xfd, 0xf7, 0x93, 0x2e, 0x5c, 0xb8, 0x70, 0x39, 0x32, + 0x32, 0xf2, 0xed, 0xdb, 0xb7, 0x6f, 0x63, 0x2e, 0x5c, 0xb8, 0x70, 0x79, + 0xe5, 0xca, 0x95, 0xeb, 0x6c, 0x6d, 0x6d, 0x3f, 0x9b, 0xfc, 0x19, 0x30, + 0x60, 0xc0, 0xd0, 0xab, 0x57, 0xaf, 0xde, 0x8a, 0x8f, 0x8f, 0x4f, 0xbc, + 0x7e, 0xfd, 0xba, 0xff, 0xe8, 0xd1, 0xa3, 0x27, 0xf5, 0xeb, 0xd7, 0xef, + 0xb7, 0xca, 0x8c, 0xf3, 0x7a, 0xf5, 0xea, 0x35, 0xdc, 0xbf, 0x7f, 0xff, + 0xe1, 0x17, 0x2f, 0x5e, 0x84, 0xc7, 0xc4, 0xc4, 0xc4, 0x5f, 0xbc, 0x78, + 0xf1, 0x6a, 0xaf, 0x5e, 0xbd, 0x3e, 0x1b, 0x37, 0x74, 0xec, 0xd8, 0xb1, + 0xeb, 0xce, 0x9d, 0x3b, 0xf7, 0x9c, 0x3f, 0x7f, 0xfe, 0x4a, 0x74, 0x74, + 0x74, 0x16, 0xbb, 0x3b, 0x26, 0xcb, 0xdf, 0xdf, 0x3f, 0xc8, 0xdf, 0xdf, + 0x3f, 0xd0, 0xdf, 0xdf, 0x3f, 0xd0, 0xc1, 0xc1, 0xa1, 0xa9, 0xea, 0x7b, + 0x83, 0x07, 0x0f, 0x1e, 0xe1, 0xef, 0xef, 0x1f, 0x18, 0x1f, 0x1f, 0x9f, + 0x18, 0x15, 0x15, 0x15, 0x7d, 0xe7, 0xce, 0x9d, 0x7b, 0x8a, 0xf0, 0xb7, + 0x6f, 0xdf, 0xbe, 0xcb, 0x96, 0xd3, 0x27, 0xe3, 0x7c, 0xd8, 0xb0, 0x61, + 0xbf, 0x0f, 0x1a, 0x34, 0x68, 0x8c, 0x9f, 0x9f, 0xdf, 0x95, 0xf8, 0xf8, + 0xf8, 0xc4, 0xe7, 0xcf, 0x9f, 0x87, 0x6d, 0xda, 0xb4, 0x69, 0x9b, 0xba, + 0x49, 0x79, 0x0f, 0x0f, 0x8f, 0x1e, 0x8a, 0xb8, 0x14, 0x8f, 0x9e, 0x9e, + 0x5e, 0x65, 0x13, 0x29, 0xd4, 0x8f, 0x3f, 0xfe, 0x38, 0x43, 0x35, 0xbc, + 0xbf, 0xbf, 0x7f, 0x60, 0xd7, 0xae, 0x5d, 0xd5, 0xed, 0xbe, 0xa8, 0xcc, + 0x38, 0xa7, 0x86, 0x0e, 0x1d, 0x3a, 0xca, 0xdf, 0xdf, 0x3f, 0x70, 0xcd, + 0x9a, 0x35, 0x95, 0x1d, 0xf7, 0x34, 0xa9, 0xca, 0x38, 0x37, 0x35, 0x35, + 0x35, 0xf7, 0xf7, 0xf7, 0x0f, 0x6c, 0xdc, 0xb8, 0x71, 0xb3, 0x75, 0xeb, + 0xd6, 0x6d, 0x8e, 0x8a, 0x8a, 0x8a, 0xde, 0xbc, 0x79, 0xf3, 0x76, 0x30, + 0x67, 0xef, 0x27, 0x86, 0x87, 0x87, 0x47, 0xde, 0xbf, 0x7f, 0xff, 0x51, + 0x93, 0x26, 0x4d, 0x9a, 0x29, 0x97, 0xe3, 0xed, 0xdb, 0xb7, 0xef, 0xea, + 0xe9, 0xe9, 0x19, 0x0e, 0x1a, 0x34, 0x68, 0x78, 0x4d, 0xca, 0x07, 0x00, + 0xdc, 0xdd, 0xdd, 0x3b, 0x9c, 0x3c, 0x79, 0xf2, 0x6c, 0x44, 0x44, 0xc4, + 0x9b, 0x88, 0x88, 0x88, 0x37, 0xc7, 0x8e, 0x1d, 0x3b, 0xe5, 0xec, 0xec, + 0xdc, 0x42, 0xb5, 0x6c, 0x86, 0x0f, 0x1f, 0x3e, 0xe6, 0xf6, 0xed, 0xdb, + 0x77, 0xb5, 0xb5, 0xb5, 0x75, 0x47, 0x8c, 0x18, 0x31, 0x56, 0x21, 0x43, + 0xd5, 0xc9, 0xa7, 0x42, 0xde, 0xe2, 0xe2, 0xe2, 0x12, 0xae, 0x5c, 0xb9, + 0x72, 0x73, 0xe8, 0xd0, 0xa1, 0xa3, 0xb4, 0xb5, 0xb5, 0x75, 0x6f, 0xdf, + 0xbe, 0x7d, 0x77, 0xf8, 0xf0, 0xe1, 0x63, 0x94, 0xcb, 0x67, 0xe0, 0xc0, + 0x81, 0xc3, 0x14, 0x75, 0xd4, 0xa0, 0x41, 0x03, 0xbb, 0x9d, 0x3b, 0x77, + 0xee, 0x09, 0x09, 0x09, 0x79, 0x19, 0x11, 0x11, 0xf1, 0xe6, 0xc4, 0x89, + 0x13, 0x67, 0xd4, 0xc9, 0x4f, 0xcf, 0x9e, 0x3d, 0xfb, 0x5c, 0xbc, 0x78, + 0xf1, 0xea, 0x9b, 0x37, 0x6f, 0xde, 0xc7, 0xc6, 0xc6, 0x26, 0x9c, 0x3f, + 0x7f, 0xfe, 0xd2, 0x92, 0x25, 0x4b, 0x56, 0x74, 0xec, 0xd8, 0xb1, 0x82, + 0xaf, 0x8a, 0x4e, 0x9d, 0x3a, 0x79, 0xac, 0x5b, 0xb7, 0x6e, 0xf3, 0xd5, + 0xab, 0x57, 0x03, 0x08, 0x21, 0x24, 0x37, 0x37, 0x57, 0x72, 0xfb, 0xf6, + 0xed, 0x07, 0xca, 0xf5, 0xcc, 0xe7, 0xf3, 0x3f, 0x8d, 0x4f, 0x14, 0x72, + 0xa9, 0xae, 0xee, 0xbb, 0x76, 0xed, 0xda, 0xdd, 0xdf, 0xdf, 0x3f, 0x70, + 0xc8, 0x90, 0x21, 0x23, 0x01, 0x50, 0x06, 0x06, 0x06, 0x46, 0xb7, 0x6e, + 0xdd, 0x0a, 0xd8, 0xb1, 0x63, 0x87, 0x4f, 0x25, 0xf5, 0x4d, 0xf9, 0xf8, + 0xf8, 0xec, 0xbf, 0x7e, 0xfd, 0xba, 0xbf, 0x9e, 0x9e, 0x9e, 0xe1, 0x95, + 0x2b, 0x57, 0x6e, 0xcc, 0x9b, 0x37, 0xef, 0x67, 0x45, 0x58, 0x0d, 0x0d, + 0x0d, 0xc1, 0xf5, 0xeb, 0xd7, 0xfd, 0x15, 0xe5, 0xab, 0x78, 0x67, 0xe6, + 0xcc, 0x99, 0x73, 0xae, 0x5c, 0xb9, 0x72, 0x83, 0xa2, 0x28, 0xfe, 0xec, + 0xd9, 0xb3, 0x17, 0xf8, 0xfb, 0xfb, 0x07, 0x0e, 0x18, 0x30, 0x60, 0xa8, + 0xba, 0x32, 0xf6, 0xf7, 0xf7, 0x0f, 0x9c, 0x3d, 0x7b, 0xf6, 0x02, 0x00, + 0x94, 0xbe, 0xbe, 0xbe, 0xe1, 0xf5, 0xeb, 0xd7, 0xfd, 0x77, 0xed, 0xda, + 0xb5, 0xb7, 0xba, 0xf4, 0xe8, 0xea, 0xea, 0x2a, 0xc6, 0x34, 0xd4, 0xe9, + 0xd3, 0xa7, 0x2f, 0xa8, 0x93, 0x7f, 0x75, 0xe5, 0xa3, 0x82, 0xce, 0xaa, + 0x55, 0xab, 0xee, 0x10, 0x42, 0x48, 0xef, 0xde, 0xbd, 0xf7, 0x81, 0x19, + 0x83, 0x55, 0x35, 0x09, 0x56, 0x13, 0xe3, 0x1c, 0x6c, 0x1c, 0xc6, 0x5e, + 0x5e, 0x5e, 0x87, 0xd8, 0xbe, 0xf0, 0x0e, 0xbe, 0x7e, 0xf2, 0xf0, 0xdf, + 0x07, 0x45, 0x51, 0xba, 0xb1, 0xb1, 0xb1, 0xd9, 0x71, 0x71, 0x71, 0x52, + 0x1e, 0x8f, 0x37, 0x1a, 0x15, 0x67, 0x27, 0x35, 0xc6, 0x8d, 0x1b, 0xb7, + 0x81, 0x10, 0x42, 0x7e, 0xfc, 0xf1, 0xc7, 0x7b, 0xa8, 0x38, 0x53, 0x6c, + 0x38, 0x65, 0xca, 0x94, 0x20, 0x76, 0x25, 0x64, 0x25, 0xca, 0x3b, 0x7b, + 0x0d, 0x00, 0xad, 0x01, 0xfc, 0x0c, 0xa0, 0xe1, 0xa0, 0x41, 0x83, 0xb6, + 0x54, 0x63, 0x9c, 0x03, 0x9f, 0x77, 0xd6, 0x54, 0xbb, 0x76, 0xed, 0x86, + 0xb0, 0x83, 0x89, 0x34, 0x7c, 0x7e, 0xb6, 0x47, 0x55, 0xf0, 0x78, 0xe3, + 0xc7, 0x8f, 0x5f, 0xcc, 0x6e, 0xc1, 0x8b, 0x87, 0x1a, 0xe3, 0xbc, 0x6d, + 0xdb, 0xb6, 0xdd, 0x65, 0x32, 0x19, 0xbd, 0x66, 0xcd, 0x9a, 0x8f, 0x00, + 0x86, 0x3e, 0x7e, 0xfc, 0x38, 0xaf, 0x12, 0xe3, 0xdc, 0x24, 0x2e, 0x2e, + 0xae, 0xe4, 0xf1, 0xe3, 0xc7, 0x45, 0xa8, 0xc1, 0xcc, 0x68, 0xc3, 0x86, + 0x0d, 0x5b, 0x12, 0x42, 0xc8, 0x91, 0x23, 0x47, 0xf2, 0xc0, 0xac, 0x94, + 0x57, 0x37, 0xf0, 0x50, 0x87, 0x86, 0xaf, 0xaf, 0xef, 0x75, 0x42, 0x08, + 0x69, 0xd6, 0xac, 0xd9, 0x71, 0x95, 0x72, 0x36, 0xdd, 0xbe, 0x7d, 0x7b, + 0x1a, 0x21, 0x84, 0x0c, 0x1a, 0x34, 0xe8, 0x07, 0x36, 0xef, 0xd4, 0xe4, + 0xc9, 0x93, 0x17, 0x12, 0x42, 0xc8, 0xfa, 0xf5, 0xeb, 0x93, 0x95, 0xca, + 0x47, 0x7b, 0xd1, 0xa2, 0x45, 0xe7, 0x09, 0x21, 0x64, 0xe0, 0xc0, 0x81, + 0xc7, 0x51, 0x51, 0xa0, 0x0d, 0xc7, 0x8e, 0x1d, 0x7b, 0x9f, 0xad, 0xaf, + 0xb5, 0xf8, 0x7c, 0x76, 0x8b, 0x6a, 0xd6, 0xac, 0x59, 0x17, 0xc2, 0xd2, + 0xb4, 0x69, 0xd3, 0x8e, 0xa8, 0x66, 0x85, 0xd1, 0xca, 0xca, 0xca, 0x51, + 0x11, 0xbe, 0x7d, 0xfb, 0xf6, 0x83, 0xab, 0x0b, 0x6f, 0x6e, 0x6e, 0x5e, + 0x67, 0xc3, 0x86, 0x0d, 0x5b, 0x0b, 0x0b, 0x0b, 0x8b, 0x85, 0x42, 0xa1, + 0x78, 0xfb, 0xf6, 0xed, 0x59, 0xd6, 0xd6, 0xd6, 0xaf, 0xc1, 0xac, 0x5e, + 0x69, 0x81, 0x59, 0x11, 0x9a, 0x15, 0x1c, 0x1c, 0xfc, 0xa2, 0xaa, 0x67, + 0xf2, 0xe4, 0xc9, 0x8a, 0x95, 0x37, 0x2d, 0x00, 0xdf, 0xdb, 0xda, 0xda, + 0xbe, 0xd9, 0xb5, 0x6b, 0x57, 0x56, 0x49, 0x49, 0x89, 0xa4, 0xa0, 0xa0, + 0xa0, 0x68, 0xdd, 0xba, 0x75, 0xbf, 0x99, 0x9a, 0x9a, 0xd6, 0xea, 0x4c, + 0x17, 0x45, 0x51, 0xfa, 0x8f, 0x1e, 0x3d, 0x4a, 0x16, 0x0a, 0x85, 0xb4, + 0x86, 0x86, 0x46, 0x2f, 0x00, 0x82, 0x36, 0x6d, 0xda, 0x74, 0x27, 0x84, + 0x10, 0x4f, 0x4f, 0xcf, 0x9b, 0x02, 0x81, 0xa0, 0xee, 0xa9, 0x53, 0xa7, + 0x2e, 0x10, 0x42, 0x48, 0x76, 0x76, 0x76, 0x11, 0x21, 0x84, 0xa4, 0xa4, + 0xa4, 0xa4, 0x53, 0x14, 0x35, 0x21, 0x3b, 0x3b, 0x5b, 0x36, 0x73, 0xe6, + 0xcc, 0xdf, 0x50, 0xae, 0x98, 0x04, 0xdb, 0xb7, 0x6f, 0xf7, 0x23, 0x84, + 0x90, 0x16, 0x2d, 0x5a, 0x1c, 0x71, 0x73, 0x73, 0x3b, 0x41, 0x08, 0x21, + 0x5b, 0xb6, 0x6c, 0x39, 0x87, 0x8a, 0x33, 0x80, 0x55, 0x19, 0x9f, 0x5a, + 0xbb, 0x77, 0xef, 0xbe, 0xc5, 0x2a, 0xbe, 0x8b, 0x60, 0x0c, 0x44, 0xfe, + 0xf4, 0xe9, 0xd3, 0x37, 0x12, 0x42, 0xc8, 0x6f, 0xbf, 0xfd, 0x96, 0x0b, + 0xa0, 0x39, 0xaa, 0x56, 0x86, 0x55, 0xc5, 0x6f, 0xa4, 0xaf, 0xaf, 0xbf, + 0x56, 0x26, 0x93, 0x11, 0x95, 0x55, 0x7d, 0x65, 0xe3, 0xbc, 0x26, 0x65, + 0xa8, 0x6c, 0x9c, 0x4f, 0x45, 0xd5, 0xab, 0x24, 0x9a, 0x3b, 0x76, 0xec, + 0xb8, 0x4e, 0x08, 0x21, 0xa3, 0x47, 0x8f, 0x7e, 0x81, 0xea, 0x0d, 0xe6, + 0xaf, 0x35, 0xce, 0xcd, 0x95, 0x8c, 0x31, 0x33, 0xd4, 0x9c, 0x1a, 0x1b, + 0xe7, 0xdf, 0x7f, 0xff, 0xfd, 0x74, 0xd6, 0x40, 0x2d, 0x02, 0xb0, 0x10, + 0x9f, 0x6f, 0xe9, 0xaa, 0xb5, 0x71, 0xbe, 0x7d, 0xfb, 0xf6, 0xf7, 0x09, + 0x09, 0x09, 0xb2, 0xb5, 0x6b, 0xd7, 0xfe, 0x05, 0x76, 0xb2, 0x66, 0xe7, + 0xce, 0x9d, 0x77, 0xc2, 0xc2, 0xc2, 0xc4, 0x3e, 0x3e, 0x3e, 0x31, 0xaa, + 0xc6, 0x79, 0x51, 0x51, 0x91, 0xdc, 0xc0, 0xc0, 0xe0, 0xf7, 0xfc, 0xfc, + 0x7c, 0xf9, 0x95, 0x2b, 0x57, 0x82, 0xc1, 0x4e, 0x0e, 0xaa, 0x31, 0xce, + 0x8d, 0x0b, 0x0b, 0x0b, 0xa5, 0x85, 0x85, 0x85, 0x34, 0x80, 0xef, 0x50, + 0x51, 0x16, 0x35, 0x00, 0x74, 0xcb, 0xca, 0xca, 0x92, 0x17, 0x17, 0x17, + 0x4b, 0xc1, 0xe8, 0x50, 0xe5, 0x95, 0xf3, 0x60, 0x54, 0x5c, 0x3d, 0xd5, + 0xea, 0xd3, 0xa7, 0xcf, 0x26, 0x42, 0x08, 0xf9, 0xfd, 0xf7, 0xdf, 0x23, + 0xc0, 0xe8, 0xac, 0xda, 0xc6, 0xaf, 0xbc, 0x72, 0x1e, 0xa7, 0x52, 0x76, + 0xc6, 0xf7, 0xef, 0xdf, 0xcf, 0x62, 0x75, 0xe2, 0x5c, 0x45, 0x39, 0xb4, + 0x6c, 0xd9, 0x72, 0x15, 0x21, 0x84, 0xc4, 0xc4, 0xc4, 0xe4, 0xea, 0xe8, + 0xe8, 0xd4, 0x76, 0xf5, 0xa9, 0x3a, 0x79, 0xa8, 0xad, 0x71, 0xae, 0x63, + 0x65, 0x65, 0xf5, 0xab, 0x5c, 0x2e, 0x27, 0x0f, 0x1e, 0x3c, 0x88, 0x47, + 0xc5, 0xfe, 0x4d, 0xf7, 0xe9, 0xd3, 0xa7, 0xc9, 0xec, 0x96, 0xf6, 0xe5, + 0x60, 0x0c, 0xd4, 0xe3, 0xec, 0x2a, 0xe9, 0x52, 0x30, 0x13, 0xac, 0x1a, + 0x21, 0x21, 0x21, 0x2f, 0x5f, 0xbd, 0x7a, 0xf5, 0x9a, 0x9d, 0x0c, 0xe5, + 0xb9, 0xba, 0xba, 0x0e, 0x20, 0x84, 0x90, 0x09, 0x13, 0x26, 0x5c, 0x64, + 0xcb, 0x9b, 0x02, 0xd0, 0xb0, 0x6f, 0xdf, 0xbe, 0x6f, 0x09, 0x21, 0x64, + 0xdf, 0xbe, 0x7d, 0xe7, 0xf6, 0xef, 0xdf, 0x7f, 0x9e, 0xa6, 0x69, 0xd2, + 0xb6, 0x6d, 0xdb, 0xa7, 0x60, 0x26, 0x19, 0x94, 0xd3, 0x69, 0xd2, 0xb0, + 0x61, 0xc3, 0xb3, 0x62, 0xb1, 0x98, 0xbe, 0x7b, 0xf7, 0xee, 0x4b, 0xb6, + 0x0e, 0x34, 0x1f, 0x3e, 0x7c, 0xf8, 0x56, 0x28, 0x14, 0xd2, 0xd6, 0xd6, + 0xd6, 0x87, 0x51, 0xf5, 0xc0, 0x88, 0x9a, 0x3b, 0x77, 0xee, 0xaf, 0x84, + 0x10, 0xb2, 0x78, 0xf1, 0xe2, 0x6c, 0x00, 0xdd, 0xa1, 0x7e, 0xd5, 0x42, + 0xd9, 0x38, 0xaf, 0x6e, 0x42, 0x54, 0x8b, 0xc7, 0xe3, 0x8d, 0x4f, 0x4a, + 0x4a, 0x92, 0xbe, 0x7d, 0xfb, 0x36, 0x93, 0xa2, 0xa8, 0xda, 0x0c, 0xb4, + 0x4c, 0xaa, 0x33, 0xce, 0x8d, 0x8d, 0x8d, 0x6d, 0x8b, 0x8b, 0x8b, 0xc5, + 0xb3, 0x67, 0xcf, 0x7e, 0x0f, 0xa0, 0x1e, 0x80, 0xef, 0x02, 0x02, 0x02, + 0x84, 0x0f, 0x1f, 0x3e, 0x7c, 0x83, 0x7f, 0xf6, 0x1c, 0x37, 0x00, 0x68, + 0x5c, 0xb9, 0x72, 0x25, 0x48, 0x2a, 0x95, 0xca, 0x83, 0x82, 0x82, 0xb2, + 0x0f, 0x1d, 0x3a, 0x94, 0x19, 0x14, 0x14, 0x54, 0x20, 0x93, 0xc9, 0x68, + 0x42, 0x08, 0x99, 0x39, 0x73, 0xa6, 0xf2, 0x99, 0xd7, 0x4f, 0xc6, 0xf9, + 0xd5, 0xab, 0x57, 0x5f, 0xe5, 0xe5, 0xe5, 0x95, 0x5c, 0xb8, 0x70, 0x21, + 0xe9, 0xc4, 0x89, 0x13, 0x99, 0x99, 0x99, 0x99, 0x22, 0x9a, 0xa6, 0x69, + 0x6f, 0x6f, 0xef, 0x9f, 0xa1, 0xd2, 0xaf, 0x6a, 0x6b, 0x6b, 0xeb, 0x06, + 0x04, 0x04, 0x3c, 0x20, 0x84, 0x90, 0xbc, 0xbc, 0x3c, 0xf1, 0xbd, 0x7b, + 0xf7, 0xf2, 0xfc, 0xfd, 0xfd, 0x73, 0xf3, 0xf2, 0xf2, 0xc4, 0x22, 0x91, + 0x48, 0x6a, 0x6c, 0x6c, 0xec, 0x82, 0x72, 0x3d, 0x43, 0xcd, 0x98, 0x31, + 0x63, 0x1e, 0xeb, 0xc8, 0x51, 0x74, 0xe2, 0xc4, 0x89, 0x4c, 0x3f, 0x3f, + 0xbf, 0xe4, 0xc2, 0xc2, 0xc2, 0xd2, 0xeb, 0xd7, 0xaf, 0x47, 0xa8, 0x33, + 0xce, 0x3d, 0x3c, 0x3c, 0x7a, 0xe5, 0xe5, 0xe5, 0x15, 0xb2, 0xb2, 0x9e, + 0x7f, 0xed, 0xda, 0xb5, 0x5c, 0xa9, 0x54, 0x4a, 0xd3, 0x34, 0x4d, 0xff, + 0xf2, 0xcb, 0x2f, 0xab, 0x95, 0xd2, 0x23, 0xe8, 0xdf, 0xbf, 0xff, 0x02, + 0x5f, 0x5f, 0xdf, 0x70, 0x5f, 0x5f, 0xdf, 0xf7, 0x0f, 0x1f, 0x3e, 0x2c, + 0x26, 0x84, 0x90, 0xc7, 0x8f, 0x1f, 0x17, 0xfb, 0xfa, 0xfa, 0x26, 0xf8, + 0xfa, 0xfa, 0xc6, 0xfb, 0xfa, 0xfa, 0xbe, 0xaf, 0x5f, 0xbf, 0x7e, 0x77, + 0x94, 0xeb, 0x6e, 0x6a, 0xf6, 0xec, 0xd9, 0x8b, 0x09, 0x21, 0x24, 0x32, + 0x32, 0x32, 0x7f, 0xe9, 0xd2, 0xa5, 0x09, 0x87, 0x0f, 0x1f, 0x4e, 0x2f, + 0x2c, 0x2c, 0x94, 0x12, 0x42, 0xc8, 0xf1, 0xe3, 0xc7, 0x13, 0x17, 0x2c, + 0x58, 0xf0, 0x04, 0x8c, 0x2e, 0xf8, 0x64, 0x9c, 0x5f, 0xb8, 0x70, 0x21, + 0xac, 0xac, 0xac, 0x4c, 0x7a, 0xe3, 0xc6, 0x8d, 0x0f, 0xa7, 0x4e, 0x9d, + 0xca, 0x52, 0x84, 0xbf, 0x7b, 0xf7, 0x6e, 0x30, 0x2a, 0xea, 0x54, 0x41, + 0xf3, 0xe6, 0xcd, 0x27, 0x6c, 0xdd, 0xba, 0x35, 0xf2, 0xe8, 0xd1, 0xa3, + 0x09, 0x99, 0x99, 0x99, 0x65, 0x84, 0x10, 0x62, 0x64, 0x64, 0x54, 0x99, + 0xbf, 0x0f, 0xad, 0x1e, 0x3d, 0x7a, 0xac, 0xdb, 0xb4, 0x69, 0x53, 0xa4, + 0x8f, 0x8f, 0x4f, 0xcc, 0xf1, 0xe3, 0xc7, 0x13, 0x5f, 0xbd, 0x7a, 0x95, + 0xcf, 0xae, 0xd6, 0xaf, 0xc6, 0xe7, 0xb2, 0xaf, 0xce, 0x38, 0xa7, 0x86, + 0x0f, 0x1f, 0x3e, 0x5e, 0x2a, 0x95, 0xca, 0x1e, 0x3c, 0x78, 0x90, 0xa9, + 0xaf, 0xaf, 0x3f, 0x1f, 0xea, 0xc7, 0xba, 0x55, 0x19, 0xe7, 0x94, 0xb5, + 0xb5, 0x75, 0x1b, 0x42, 0x08, 0xb9, 0x71, 0xe3, 0xc6, 0xb3, 0x98, 0x98, + 0x98, 0x9c, 0xd8, 0xd8, 0xd8, 0x12, 0x42, 0x08, 0x59, 0xb7, 0x6e, 0xdd, + 0xee, 0xb8, 0xb8, 0xb8, 0xac, 0x4b, 0x97, 0x2e, 0x65, 0x10, 0x42, 0x48, + 0x40, 0x40, 0xc0, 0x0b, 0x30, 0xfa, 0x54, 0x73, 0xee, 0xdc, 0xb9, 0x87, + 0xd8, 0x09, 0xfc, 0x0b, 0x65, 0x65, 0x65, 0x92, 0x1a, 0x94, 0x0f, 0x35, + 0x7d, 0xfa, 0xf4, 0xb9, 0x12, 0x89, 0x44, 0x9a, 0x96, 0x96, 0x56, 0x72, + 0xea, 0xd4, 0xa9, 0x8c, 0x33, 0x67, 0xce, 0x64, 0x64, 0x64, 0x64, 0x94, + 0x94, 0x96, 0x96, 0x96, 0x8d, 0x1a, 0x35, 0x6a, 0x82, 0x52, 0x39, 0x69, + 0x2d, 0x5a, 0xb4, 0xe8, 0x18, 0x3b, 0xbe, 0xf5, 0xcb, 0xcd, 0xcd, 0x2d, + 0x3e, 0x77, 0xee, 0x5c, 0x62, 0x35, 0xf2, 0xa9, 0x4e, 0xde, 0x92, 0x0a, + 0x0a, 0x0a, 0x4a, 0x0e, 0x1f, 0x3e, 0xfc, 0x17, 0x2b, 0x6f, 0xc7, 0x51, + 0x6e, 0x67, 0x68, 0xce, 0x9a, 0x35, 0x6b, 0x1f, 0x21, 0x84, 0xf4, 0xe8, + 0xd1, 0x63, 0x6c, 0x5c, 0x5c, 0x5c, 0x6a, 0x5a, 0x5a, 0x5a, 0x71, 0x50, + 0x50, 0x50, 0x6e, 0x7c, 0x7c, 0xbc, 0x48, 0x2a, 0x95, 0xca, 0x4d, 0x4c, + 0x4c, 0xdc, 0x95, 0xe5, 0x67, 0xec, 0xd8, 0xb1, 0x93, 0x09, 0x21, 0xe4, + 0xc3, 0x87, 0x0f, 0x25, 0x7e, 0x7e, 0x7e, 0x1f, 0x4f, 0x9e, 0x3c, 0x99, + 0x15, 0x17, 0x17, 0x57, 0x44, 0x08, 0x21, 0xbb, 0x76, 0xed, 0x3a, 0xaf, + 0x54, 0x67, 0x82, 0xa9, 0x53, 0xa7, 0x6e, 0xf6, 0xf5, 0xf5, 0x0d, 0x39, + 0x76, 0xec, 0x58, 0x02, 0x21, 0x84, 0xa4, 0xa7, 0xa7, 0xcb, 0x0e, 0x1f, + 0x3e, 0x9c, 0xc8, 0xca, 0x66, 0xbc, 0xaf, 0xaf, 0xef, 0x3b, 0x3e, 0x9f, + 0xaf, 0xe8, 0x0b, 0x3e, 0x95, 0xa7, 0x9a, 0xba, 0x17, 0x8c, 0x1c, 0x39, + 0x72, 0x35, 0x3b, 0x11, 0xeb, 0xcb, 0xa6, 0xdf, 0x32, 0x20, 0x20, 0x20, + 0x55, 0x26, 0x93, 0xd1, 0xac, 0x3f, 0x99, 0x0a, 0xd4, 0xaf, 0x5f, 0xdf, + 0x89, 0xa6, 0x69, 0x72, 0xf3, 0xe6, 0xcd, 0x14, 0x00, 0xf6, 0x2f, 0x5e, + 0xbc, 0xc8, 0x7a, 0xf4, 0xe8, 0x91, 0x62, 0x67, 0x2f, 0xe5, 0xe6, 0xe6, + 0xd6, 0x4b, 0x31, 0x7e, 0xee, 0xd4, 0xa9, 0xd3, 0x00, 0xb6, 0x1c, 0x75, + 0x02, 0x02, 0x02, 0xde, 0xbe, 0x78, 0xf1, 0x22, 0x13, 0x40, 0x1d, 0x53, + 0x53, 0xd3, 0xe9, 0x29, 0x29, 0x29, 0xc2, 0x9c, 0x9c, 0x9c, 0x22, 0x1b, + 0x1b, 0x1b, 0x3b, 0x45, 0xdc, 0x36, 0x36, 0x36, 0x76, 0xb9, 0xb9, 0xb9, + 0xc5, 0xc9, 0xc9, 0xc9, 0x42, 0x53, 0x53, 0xd3, 0xe9, 0x6c, 0x9c, 0x75, + 0x2e, 0x5f, 0xbe, 0x9c, 0x48, 0xd3, 0x34, 0xb1, 0xb3, 0xb3, 0x73, 0xad, + 0x2c, 0x3d, 0x37, 0x6e, 0xdc, 0x48, 0x66, 0xe5, 0x8f, 0x02, 0x60, 0xb0, + 0x7d, 0xfb, 0xf6, 0x10, 0xa5, 0xf2, 0x88, 0xf7, 0xf5, 0xf5, 0x8d, 0x3f, + 0x7c, 0xf8, 0x70, 0x42, 0x59, 0x59, 0x99, 0xbc, 0xac, 0xac, 0x4c, 0xc6, + 0xe7, 0xf3, 0x2b, 0x1b, 0x07, 0xea, 0xad, 0x5e, 0xbd, 0xfa, 0x3e, 0x3b, + 0x46, 0x5d, 0x83, 0xea, 0x75, 0x6d, 0x4d, 0x8d, 0x73, 0x00, 0xd0, 0xec, + 0xd3, 0xa7, 0xcf, 0x7a, 0x42, 0x08, 0x59, 0xbd, 0x7a, 0xf5, 0x7d, 0x7c, + 0xbe, 0x73, 0xeb, 0xff, 0x3d, 0x54, 0xff, 0xfe, 0xfd, 0xbf, 0x67, 0x05, + 0x2e, 0x11, 0xe5, 0xdb, 0x49, 0x15, 0x68, 0x2d, 0x58, 0xb0, 0xe0, 0x0c, + 0x21, 0x84, 0x0c, 0x1d, 0x3a, 0xf4, 0x20, 0x2a, 0x2a, 0x1c, 0x9d, 0x61, + 0xc3, 0x86, 0x1d, 0x62, 0x57, 0x8c, 0x4e, 0x42, 0xc5, 0xa8, 0x07, 0xa3, + 0xec, 0xb5, 0x07, 0x0f, 0x1e, 0xbc, 0xad, 0x06, 0xc6, 0xb9, 0x2a, 0x82, + 0xb5, 0x6b, 0xd7, 0x9e, 0x62, 0x0d, 0xc9, 0xdb, 0x50, 0xb3, 0x7d, 0xcc, + 0xd8, 0xd8, 0xd8, 0xa4, 0x41, 0x83, 0x06, 0x76, 0xa3, 0x46, 0x8d, 0xfa, + 0xfe, 0xf4, 0xe9, 0xd3, 0x7e, 0x85, 0x85, 0x85, 0xa2, 0x83, 0x07, 0x0f, + 0x16, 0xeb, 0xeb, 0xeb, 0x6f, 0x84, 0x4a, 0x45, 0x6a, 0x6b, 0x6b, 0x1b, + 0x46, 0x47, 0x47, 0xa7, 0x84, 0x87, 0x87, 0x8b, 0x04, 0x02, 0xc1, 0x1a, + 0x00, 0x0d, 0x42, 0x42, 0x42, 0x0a, 0x2a, 0x31, 0xce, 0x4d, 0x0b, 0x0b, + 0x0b, 0x65, 0x09, 0x09, 0x09, 0xa5, 0x7f, 0xfe, 0xf9, 0xe7, 0xc5, 0x3b, + 0x77, 0xee, 0xdc, 0xfb, 0xf3, 0xcf, 0x3f, 0xcf, 0x2d, 0x5a, 0xb4, 0x68, + 0xa9, 0x9a, 0x59, 0x48, 0x7e, 0x97, 0x2e, 0x5d, 0x26, 0x11, 0x42, 0xc8, + 0xf2, 0xe5, 0xcb, 0xc3, 0x86, 0x0d, 0x1b, 0x36, 0xe9, 0xd6, 0xad, 0x5b, + 0x01, 0x29, 0x29, 0x29, 0xa9, 0x41, 0x41, 0x41, 0x8f, 0xa7, 0x4c, 0x99, + 0x32, 0x13, 0xa8, 0x7e, 0xbb, 0xb6, 0xb9, 0xb9, 0x79, 0x23, 0x91, 0x48, + 0x24, 0x63, 0xb7, 0xa2, 0xab, 0x1e, 0x2b, 0xd0, 0x33, 0x30, 0x30, 0xd8, + 0x11, 0x14, 0x14, 0x54, 0x26, 0x91, 0x48, 0x64, 0xbb, 0x76, 0xed, 0xda, + 0x7f, 0xe4, 0xc8, 0x91, 0xd3, 0x84, 0x10, 0x72, 0xec, 0xd8, 0xb1, 0x62, + 0x6d, 0x6d, 0x6d, 0xe5, 0x2d, 0x87, 0x3a, 0x43, 0x87, 0x0e, 0x3d, 0x4a, + 0x08, 0x21, 0x7b, 0xf7, 0xee, 0xbd, 0xab, 0x52, 0x27, 0xda, 0xab, 0x56, + 0xad, 0xba, 0x4e, 0x08, 0x21, 0x8b, 0x16, 0x2d, 0x3a, 0x03, 0x35, 0x8e, + 0xf0, 0x00, 0xb4, 0xde, 0xb8, 0x71, 0x63, 0xc1, 0x86, 0x0d, 0x1b, 0x0a, + 0x00, 0xb4, 0x44, 0xd5, 0x86, 0x1f, 0x0f, 0x40, 0xe3, 0x15, 0x2b, 0x56, + 0xe4, 0xed, 0xd8, 0xb1, 0xa3, 0x48, 0x20, 0x10, 0x74, 0x43, 0x25, 0x86, + 0x99, 0xa5, 0xa5, 0xa5, 0xcd, 0xd6, 0xad, 0x5b, 0x77, 0x0b, 0x85, 0xc2, + 0xd2, 0xfc, 0xfc, 0x7c, 0xd1, 0xba, 0x75, 0xeb, 0x32, 0xcc, 0xcc, 0xcc, + 0x5e, 0x83, 0xd9, 0x96, 0xda, 0x82, 0x95, 0x15, 0x0a, 0x80, 0xf6, 0x98, + 0x31, 0x63, 0xf6, 0xfe, 0xf5, 0xd7, 0x5f, 0xa9, 0x7e, 0x7e, 0x7e, 0x19, + 0xea, 0x9e, 0xbf, 0xfe, 0xfa, 0x2b, 0x75, 0xe4, 0xc8, 0x91, 0xbb, 0xd9, + 0xf4, 0x53, 0xec, 0xbb, 0xad, 0x00, 0x6c, 0x31, 0x37, 0x37, 0x7f, 0xb3, + 0x7e, 0xfd, 0xfa, 0xcc, 0x82, 0x82, 0x82, 0xb2, 0xe2, 0xe2, 0xe2, 0x92, + 0xcd, 0x9b, 0x37, 0xef, 0xa8, 0x53, 0xa7, 0x4e, 0x75, 0xdb, 0x28, 0xa1, + 0xa9, 0xa9, 0xa9, 0x7d, 0xf8, 0xf0, 0xe1, 0xb3, 0xec, 0x2c, 0xdd, 0x47, + 0x30, 0x3b, 0x26, 0x04, 0x3f, 0xfe, 0xf8, 0xe3, 0x96, 0xe2, 0xe2, 0x62, + 0x39, 0x80, 0x41, 0xd3, 0xa7, 0x4f, 0x5f, 0x4a, 0xd3, 0x34, 0xe9, 0xde, + 0xbd, 0x7b, 0x32, 0x80, 0x97, 0x97, 0x2f, 0x5f, 0x2e, 0x7d, 0xfb, 0xf6, + 0x6d, 0x09, 0x00, 0xe7, 0x67, 0xcf, 0x9e, 0x09, 0x37, 0x6d, 0xda, 0xe4, + 0x8f, 0xf2, 0xd5, 0x7f, 0xfd, 0xa4, 0xa4, 0xa4, 0xc2, 0xe4, 0xe4, 0x64, + 0x19, 0x80, 0x9e, 0x14, 0x45, 0x79, 0x7d, 0xf8, 0xf0, 0x41, 0x96, 0x90, + 0x90, 0x50, 0x80, 0x8a, 0x86, 0xde, 0x27, 0xe3, 0x73, 0xc4, 0x88, 0x11, + 0xcb, 0x3a, 0x74, 0xe8, 0xe0, 0xd1, 0xa1, 0x43, 0x87, 0x2e, 0x7d, 0xfa, + 0xf4, 0xf9, 0x6e, 0xf9, 0xf2, 0xe5, 0x1b, 0xf3, 0xf2, 0xf2, 0xca, 0x8e, + 0x1e, 0x3d, 0x5a, 0x4c, 0x51, 0xd4, 0x10, 0xb0, 0xc6, 0xc9, 0xd6, 0xad, + 0x5b, 0x03, 0x08, 0x21, 0xe4, 0xfb, 0xef, 0xbf, 0xbf, 0x81, 0xea, 0xb7, + 0x55, 0x56, 0x65, 0xdc, 0xf2, 0x00, 0x34, 0x49, 0x49, 0x49, 0x91, 0xc9, + 0xe5, 0x72, 0xa2, 0xa5, 0xa5, 0x65, 0xcd, 0xfe, 0xdd, 0x2c, 0x29, 0x29, + 0x49, 0x5c, 0x5c, 0x5c, 0x2c, 0xef, 0xd1, 0xa3, 0xc7, 0x88, 0x1e, 0x3d, + 0x7a, 0x78, 0x29, 0x3f, 0xdd, 0xba, 0x75, 0x53, 0x3d, 0xff, 0x53, 0x1b, + 0xe3, 0x5c, 0xff, 0xd2, 0xa5, 0x4b, 0x31, 0x84, 0x10, 0xe2, 0xe6, 0xe6, + 0xb6, 0x0e, 0xd5, 0xef, 0x96, 0xf8, 0x94, 0xfe, 0x09, 0x13, 0x26, 0xac, + 0xe9, 0xd1, 0xa3, 0x47, 0x3f, 0xa5, 0xb4, 0xf4, 0x1b, 0x3f, 0x7e, 0xfc, + 0x9a, 0xff, 0xa4, 0x71, 0xee, 0xec, 0xec, 0xdc, 0x4b, 0x24, 0x12, 0x49, + 0x9e, 0x3c, 0x79, 0x22, 0x12, 0x08, 0x04, 0x7f, 0x80, 0xd1, 0x25, 0xaa, + 0xed, 0xbd, 0xd6, 0xc6, 0xb9, 0x8f, 0x8f, 0xcf, 0x9b, 0xd3, 0xa7, 0x4f, + 0xe7, 0xdd, 0xba, 0x75, 0x2b, 0x16, 0x4c, 0xdb, 0xd6, 0x7f, 0xf2, 0xe4, + 0x49, 0xda, 0x9e, 0x3d, 0x7b, 0xd2, 0xf6, 0xed, 0xdb, 0xf7, 0x4e, 0xd5, + 0x38, 0x67, 0x0d, 0x97, 0x0e, 0x6b, 0xd7, 0xae, 0xcd, 0xa4, 0x69, 0xfa, + 0x93, 0x53, 0x2e, 0x55, 0xe3, 0x5c, 0x4f, 0x4f, 0xaf, 0x01, 0x21, 0x84, + 0xbc, 0x7f, 0xff, 0x5e, 0x02, 0x46, 0xd7, 0xab, 0x62, 0x19, 0x15, 0x15, + 0x55, 0x46, 0x08, 0x21, 0x86, 0x86, 0x86, 0x76, 0xa8, 0xc6, 0x38, 0xf7, + 0xf1, 0xf1, 0xb9, 0x4d, 0x08, 0x21, 0x93, 0x27, 0x4f, 0xf6, 0x07, 0xa0, + 0xff, 0x05, 0xf1, 0x57, 0x6a, 0x9c, 0x37, 0x6e, 0xdc, 0xd8, 0x9d, 0xa6, + 0x69, 0x12, 0x1f, 0x1f, 0x2f, 0x03, 0xb3, 0xc5, 0x59, 0xb1, 0x92, 0xda, + 0xe5, 0xd4, 0xa9, 0x53, 0xa5, 0xac, 0x81, 0x9e, 0x3c, 0x79, 0xf2, 0xe4, + 0x19, 0xba, 0xba, 0xba, 0x35, 0xed, 0xb8, 0xbf, 0xb5, 0x71, 0xce, 0x03, + 0xbb, 0xb5, 0x5d, 0x2e, 0x97, 0xd3, 0x75, 0xea, 0xd4, 0xf9, 0x34, 0x40, + 0xb3, 0xb1, 0xb1, 0x71, 0xa2, 0x69, 0x9a, 0xdc, 0xbb, 0x77, 0x4f, 0x04, + 0xc0, 0x19, 0x80, 0x8e, 0x8b, 0x8b, 0xcb, 0x62, 0x42, 0x08, 0x59, 0xb0, + 0x60, 0xc1, 0x49, 0x00, 0x5a, 0x6d, 0xdb, 0xb6, 0xf5, 0x92, 0xc9, 0x64, + 0xb4, 0x58, 0x2c, 0x96, 0xb3, 0x8e, 0x46, 0x05, 0x7d, 0xfb, 0xf6, 0x5d, + 0xc4, 0xae, 0xfa, 0x6e, 0x41, 0x79, 0xfb, 0xd0, 0x02, 0x30, 0xea, 0xe2, + 0xc5, 0x8b, 0xa5, 0x72, 0xb9, 0x9c, 0x96, 0xcb, 0xe5, 0x34, 0x7b, 0xae, + 0xb7, 0x2f, 0x3e, 0x37, 0x1e, 0xf8, 0x00, 0xda, 0xee, 0xdc, 0xb9, 0x33, + 0x9f, 0x8d, 0x67, 0x80, 0x97, 0x97, 0xd7, 0x48, 0x42, 0x08, 0x59, 0xb3, + 0x66, 0x4d, 0x36, 0xaa, 0xd1, 0xeb, 0x8e, 0x8e, 0x8e, 0xad, 0x4b, 0x4b, + 0x4b, 0x25, 0x8f, 0x1f, 0x3f, 0x2e, 0xa3, 0x28, 0x6a, 0x19, 0x2a, 0xd7, + 0x31, 0xb5, 0x31, 0xce, 0x29, 0x00, 0x36, 0x8b, 0x17, 0x2f, 0x4e, 0x66, + 0x07, 0x72, 0xa3, 0x6a, 0x58, 0x5f, 0x40, 0xf5, 0xc6, 0x39, 0x6f, 0xe9, + 0xd2, 0xa5, 0xdb, 0x0b, 0x0b, 0x0b, 0x65, 0x06, 0x06, 0x06, 0x8b, 0xc1, + 0xee, 0x0c, 0xea, 0xd4, 0xa9, 0xd3, 0x5d, 0x76, 0x45, 0xba, 0x36, 0xdf, + 0xfa, 0x16, 0x18, 0xd4, 0xaf, 0x5f, 0xff, 0x58, 0x9d, 0x3a, 0x75, 0xde, + 0x01, 0xb8, 0x0a, 0xe6, 0x98, 0xdb, 0x75, 0x77, 0x77, 0xf7, 0x4c, 0x42, + 0x08, 0x79, 0xfb, 0xf6, 0x6d, 0x26, 0xca, 0xc7, 0x41, 0x9f, 0x8c, 0xf3, + 0xbc, 0xbc, 0x3c, 0x49, 0xc3, 0x86, 0x0d, 0x5f, 0x01, 0x38, 0x0e, 0xe0, + 0xa8, 0xb5, 0xb5, 0xf5, 0x9b, 0x0f, 0x1f, 0x3e, 0xc8, 0x0a, 0x0b, 0x0b, + 0x45, 0xc6, 0xc6, 0xc6, 0xca, 0x6d, 0x89, 0x5a, 0xb5, 0x6a, 0xd5, 0x0e, + 0x42, 0x08, 0x39, 0x73, 0xe6, 0x4c, 0x89, 0xbe, 0xbe, 0xfe, 0x5b, 0x00, + 0xd7, 0x00, 0x5c, 0x06, 0x10, 0x69, 0x6d, 0x6d, 0x1d, 0x0e, 0xa0, 0x01, + 0x5b, 0xe6, 0x30, 0x34, 0x34, 0xb4, 0xcc, 0xcf, 0xcf, 0x2f, 0x4d, 0x4d, + 0x4d, 0x95, 0xd9, 0xd8, 0xd8, 0xbc, 0x01, 0x73, 0x6c, 0xe8, 0x64, 0xd3, + 0xa6, 0x4d, 0x5f, 0x17, 0x15, 0x15, 0x49, 0x55, 0x8d, 0x73, 0x81, 0x40, + 0xa0, 0x17, 0x1b, 0x1b, 0x9b, 0x9e, 0x9f, 0x9f, 0x2f, 0xb3, 0xb7, 0xb7, + 0x4f, 0x05, 0xe0, 0x0f, 0xc0, 0xcf, 0xc2, 0xc2, 0x22, 0x29, 0x3a, 0x3a, + 0x5a, 0x22, 0x91, 0x48, 0x64, 0xcd, 0x9a, 0x35, 0x53, 0xec, 0x12, 0xd3, + 0x04, 0x73, 0xa4, 0x64, 0x33, 0x80, 0x3d, 0x93, 0x26, 0x4d, 0x8a, 0x26, + 0x84, 0x90, 0x29, 0x53, 0xa6, 0xbc, 0x03, 0x73, 0xc4, 0xe4, 0x77, 0xf6, + 0x37, 0x7b, 0x94, 0xeb, 0x3d, 0x9d, 0x82, 0x82, 0x02, 0x51, 0x41, 0x41, + 0x81, 0x5c, 0x20, 0x10, 0xdc, 0x03, 0xb0, 0x1a, 0xc0, 0xfe, 0x29, 0x53, + 0xa6, 0x7c, 0x64, 0xc7, 0x7b, 0x0f, 0x00, 0xcc, 0x64, 0xcb, 0xe8, 0x93, + 0x71, 0x2e, 0x95, 0x4a, 0xe9, 0x4e, 0x9d, 0x3a, 0xc5, 0x03, 0x38, 0x07, + 0xe0, 0x84, 0x8e, 0x8e, 0xce, 0xbb, 0x37, 0x6f, 0xde, 0xc8, 0x08, 0xa9, + 0xb0, 0x5b, 0x08, 0x60, 0x64, 0xdb, 0x05, 0xc0, 0xaf, 0x00, 0x0e, 0xdc, + 0xbc, 0x79, 0xb3, 0x84, 0x35, 0xce, 0x5d, 0xa1, 0x7e, 0x2c, 0x26, 0x00, + 0xe3, 0x7f, 0x61, 0x39, 0x80, 0xad, 0x00, 0x0e, 0xcc, 0x9d, 0x3b, 0x37, + 0x91, 0x35, 0xd0, 0x7e, 0xc7, 0xe7, 0xe3, 0x24, 0x55, 0xe3, 0x9c, 0x1a, + 0x31, 0x62, 0xc4, 0x04, 0xa9, 0x54, 0x2a, 0xbb, 0x73, 0xe7, 0x8e, 0x50, + 0x57, 0x57, 0xf7, 0x2f, 0x30, 0xbb, 0xd9, 0xd4, 0xe9, 0xf9, 0xaa, 0x8c, + 0x73, 0x9e, 0xb5, 0xb5, 0x75, 0x57, 0x76, 0xd2, 0xa2, 0x48, 0x47, 0x47, + 0xe7, 0xa1, 0xa1, 0xa1, 0xe1, 0x4b, 0x85, 0x7f, 0xe1, 0x16, 0x2d, 0x5a, + 0x3c, 0x03, 0xe0, 0x77, 0xfc, 0xf8, 0xf1, 0x52, 0x99, 0x4c, 0x46, 0xf3, + 0xf9, 0x7c, 0x53, 0xb6, 0x7c, 0x2e, 0x2a, 0xca, 0xa7, 0x73, 0xe7, 0xce, + 0xb1, 0xd5, 0x95, 0x4f, 0xfd, 0xfa, 0xf5, 0x1d, 0x4b, 0x4b, 0x4b, 0x25, + 0x61, 0x61, 0x61, 0x65, 0x26, 0x26, 0x26, 0xaf, 0x00, 0x1c, 0x03, 0x70, + 0xdc, 0xc2, 0xc2, 0x22, 0x22, 0x22, 0x22, 0x42, 0x54, 0x50, 0x50, 0x50, + 0xaa, 0x74, 0xcc, 0x4d, 0x67, 0xd1, 0xa2, 0x45, 0xd7, 0x14, 0x93, 0x40, + 0xf5, 0xea, 0xd5, 0x0b, 0x63, 0xc3, 0x57, 0x2a, 0x9f, 0x55, 0xc8, 0x5b, + 0x44, 0x51, 0x51, 0x91, 0x84, 0x95, 0xb7, 0xeb, 0x28, 0x9f, 0x0c, 0xd2, + 0x99, 0x35, 0x6b, 0xd6, 0x79, 0x42, 0x08, 0x29, 0x2e, 0x2e, 0x2e, 0x5b, + 0xb8, 0x70, 0x61, 0x0c, 0x8f, 0xc7, 0x7b, 0x0e, 0xe0, 0x06, 0x80, 0x17, + 0x06, 0x06, 0x06, 0x2f, 0xd9, 0xf2, 0x54, 0xd4, 0x9d, 0xf6, 0xa3, 0x47, + 0x8f, 0x62, 0x4a, 0x4a, 0x4a, 0x68, 0x2b, 0x2b, 0xab, 0x48, 0x00, 0xa7, + 0xd8, 0x6f, 0x3c, 0xb6, 0xb4, 0xb4, 0x8c, 0x31, 0x35, 0x35, 0xdd, 0x80, + 0xf2, 0x7e, 0x4a, 0x0b, 0xc0, 0x48, 0x00, 0x5b, 0xb4, 0xb5, 0xb5, 0x8f, + 0xb1, 0x93, 0x15, 0x22, 0xb6, 0x4d, 0xfe, 0xce, 0x3e, 0x1b, 0x51, 0x3e, + 0x76, 0xf8, 0x54, 0x9e, 0x6a, 0xea, 0x5e, 0x6b, 0xe4, 0xc8, 0x91, 0xbf, + 0xb3, 0xb6, 0xd2, 0x25, 0x56, 0x3e, 0x8d, 0xc7, 0x8d, 0x1b, 0xf7, 0x8c, + 0x1d, 0x53, 0x6f, 0x57, 0xa9, 0x73, 0xfe, 0xb2, 0x65, 0xcb, 0xf6, 0xb0, + 0x71, 0x3d, 0x06, 0xd0, 0xf0, 0x8f, 0x3f, 0xfe, 0x48, 0x2a, 0x28, 0x28, + 0x90, 0x80, 0x9d, 0x98, 0x9e, 0x33, 0x67, 0xce, 0xef, 0x51, 0x51, 0x51, + 0xd2, 0xd4, 0xd4, 0x54, 0xd9, 0xc2, 0x85, 0x0b, 0x0f, 0xb0, 0xb2, 0x68, + 0x94, 0x9d, 0x9d, 0x5d, 0xb6, 0x67, 0xcf, 0x9e, 0x44, 0x56, 0xbe, 0x9a, + 0x74, 0xee, 0xdc, 0x39, 0x42, 0x26, 0x93, 0xd1, 0xfe, 0xfe, 0xfe, 0x4f, + 0x29, 0x8a, 0xd2, 0xa0, 0x28, 0x4a, 0xe3, 0xce, 0x9d, 0x3b, 0xcf, 0x64, + 0x32, 0x19, 0xdd, 0xb1, 0x63, 0xc7, 0x57, 0x28, 0x5f, 0x14, 0x34, 0xea, + 0xd3, 0xa7, 0xcf, 0x5d, 0x42, 0x08, 0xd9, 0xb8, 0x71, 0xe3, 0x51, 0xa8, + 0x2c, 0x66, 0x28, 0xd2, 0x33, 0x7c, 0xf8, 0xf0, 0x47, 0x4a, 0x79, 0xd6, + 0x03, 0xb0, 0x0c, 0xc0, 0x6e, 0xa5, 0x32, 0xf1, 0x59, 0xba, 0x74, 0xe9, + 0x4b, 0xb6, 0x6f, 0x4f, 0x45, 0xe5, 0x8b, 0x28, 0x7a, 0xab, 0x57, 0xaf, + 0x0e, 0x62, 0x75, 0xfa, 0x6a, 0x7c, 0x7b, 0xe3, 0x7c, 0x2d, 0x6b, 0x9c, + 0x07, 0xa1, 0x0a, 0xe3, 0xdc, 0xd8, 0xd8, 0xd8, 0xd4, 0xcb, 0xcb, 0xab, + 0xbf, 0x9b, 0x9b, 0x5b, 0x3b, 0x75, 0xab, 0xfc, 0x96, 0x96, 0x96, 0xd6, + 0xf8, 0x17, 0xa2, 0xe9, 0xef, 0xef, 0x1f, 0x21, 0x14, 0x0a, 0x69, 0x23, + 0x23, 0xa3, 0x15, 0xf8, 0x7c, 0xeb, 0x80, 0xee, 0xe6, 0xcd, 0x9b, 0xef, + 0xb1, 0xb3, 0x5a, 0x1b, 0xa0, 0x22, 0xac, 0x3d, 0x7a, 0xf4, 0xd8, 0x40, + 0x08, 0x21, 0xeb, 0xd7, 0xaf, 0x0f, 0x80, 0x7a, 0xc3, 0x5b, 0x4b, 0x61, + 0x9c, 0x4f, 0x9b, 0x36, 0xed, 0x34, 0x6a, 0x68, 0x9c, 0x3b, 0x3b, 0x3b, + 0xb7, 0x17, 0x89, 0x44, 0xd2, 0x67, 0xcf, 0x9e, 0x89, 0x29, 0x8a, 0x1a, + 0x8f, 0xcf, 0x15, 0x24, 0x6f, 0xcb, 0x96, 0x2d, 0x7b, 0x15, 0xb3, 0x4e, + 0x22, 0x91, 0x48, 0x36, 0x73, 0xe6, 0xcc, 0x0f, 0x3a, 0x3a, 0x3a, 0x7b, + 0xc1, 0x6c, 0xc1, 0xab, 0x30, 0x53, 0xb8, 0x6d, 0xdb, 0xb6, 0x83, 0x62, + 0xb1, 0x58, 0xee, 0xe2, 0xe2, 0xf2, 0x08, 0xcc, 0xcc, 0xba, 0x69, 0x58, + 0x58, 0x58, 0x51, 0x25, 0xc6, 0xb9, 0xf9, 0xc3, 0x87, 0x0f, 0x4b, 0x72, + 0x73, 0x73, 0x65, 0xaf, 0x5e, 0xbd, 0xca, 0x7b, 0xfe, 0xfc, 0x79, 0x6e, + 0x6e, 0x6e, 0x6e, 0x19, 0x3b, 0xeb, 0x96, 0xe5, 0xec, 0xec, 0xdc, 0x52, + 0x29, 0xac, 0x60, 0xf4, 0xe8, 0xd1, 0x9b, 0x08, 0x21, 0xe4, 0xfa, 0xf5, + 0xeb, 0xf1, 0x52, 0xa9, 0x54, 0xee, 0xef, 0xef, 0x9f, 0xbe, 0x7f, 0xff, + 0xfe, 0x8c, 0x82, 0x82, 0x02, 0x09, 0x21, 0x84, 0xec, 0xd8, 0xb1, 0xe3, + 0x0f, 0x54, 0x6d, 0xa0, 0xf3, 0x96, 0x2d, 0x5b, 0xb6, 0x8b, 0x5d, 0x51, + 0x79, 0x86, 0xcf, 0x57, 0xeb, 0x79, 0x00, 0xec, 0xcd, 0xcc, 0xcc, 0x6e, + 0xe4, 0xe7, 0xe7, 0xcb, 0x15, 0x79, 0x0e, 0x0e, 0x0e, 0x2e, 0xe3, 0xf1, + 0x78, 0xfb, 0xc0, 0x9c, 0x81, 0xff, 0x34, 0xd3, 0x69, 0x66, 0x66, 0xf6, + 0x63, 0x5e, 0x5e, 0x9e, 0x3c, 0x3d, 0x3d, 0xbd, 0xc4, 0xd3, 0xd3, 0x73, + 0x20, 0x45, 0x51, 0x3c, 0x7d, 0x7d, 0x7d, 0x83, 0xa9, 0x53, 0xa7, 0xce, + 0x13, 0x89, 0x44, 0x52, 0x42, 0x08, 0xf1, 0xf6, 0xf6, 0xbe, 0x58, 0x49, + 0x5d, 0x18, 0x81, 0xe9, 0xa4, 0x96, 0xa1, 0x66, 0xde, 0x55, 0xf5, 0xc1, + 0x9c, 0x61, 0x5e, 0x05, 0x76, 0x8b, 0xaf, 0xca, 0xef, 0xd4, 0xd8, 0xb1, + 0x63, 0x7f, 0x28, 0x2d, 0x2d, 0x2d, 0xcb, 0xce, 0xce, 0x2e, 0x59, 0xb2, + 0x64, 0x49, 0xba, 0x81, 0x81, 0xc1, 0x2b, 0x30, 0x1d, 0xb2, 0x13, 0x98, + 0x81, 0x5f, 0x85, 0xd5, 0x62, 0x30, 0x67, 0x44, 0x0f, 0x82, 0x19, 0xa4, + 0xa8, 0x7b, 0x0e, 0xa2, 0xfc, 0x8c, 0xa8, 0x02, 0x3e, 0x1b, 0x97, 0x33, + 0x80, 0xb5, 0x86, 0x86, 0x86, 0xaf, 0x96, 0x2d, 0x5b, 0x96, 0x9e, 0x9b, + 0x9b, 0x5b, 0x5a, 0x52, 0x52, 0x22, 0x1a, 0x39, 0x72, 0xe4, 0xf7, 0x95, + 0xd5, 0x81, 0x9e, 0x9e, 0x9e, 0x41, 0x60, 0x60, 0xe0, 0x13, 0x9a, 0xa6, + 0xc9, 0xaf, 0xbf, 0xfe, 0x9a, 0x07, 0x60, 0x25, 0x18, 0x45, 0xa0, 0xbd, + 0x66, 0xcd, 0x9a, 0x6b, 0xd1, 0xd1, 0xd1, 0x65, 0x00, 0x1a, 0x85, 0x86, + 0x86, 0xa6, 0xb0, 0x47, 0x1d, 0x46, 0x02, 0x68, 0x12, 0x18, 0x18, 0xf8, + 0xf1, 0xf9, 0xf3, 0xe7, 0x45, 0x00, 0xec, 0xfd, 0xfc, 0xfc, 0x32, 0xce, + 0x9c, 0x39, 0xf3, 0x9a, 0x7d, 0x0f, 0xee, 0xee, 0xee, 0xbd, 0xd9, 0x15, + 0xc5, 0x2c, 0x30, 0xc7, 0x1c, 0x2c, 0x7d, 0x7c, 0x7c, 0x3e, 0x12, 0x42, + 0x48, 0x9b, 0x36, 0x6d, 0x94, 0x07, 0x12, 0x9f, 0x8c, 0x4f, 0x55, 0x24, + 0x12, 0x89, 0xdc, 0xdb, 0xdb, 0xfb, 0x83, 0xb6, 0xb6, 0xf6, 0x7e, 0xa5, + 0xb2, 0xfd, 0x64, 0xdc, 0x76, 0xec, 0xd8, 0x71, 0x13, 0x6a, 0x61, 0xdc, + 0xaa, 0x31, 0xce, 0x01, 0xc0, 0xfc, 0xd1, 0xa3, 0x47, 0x42, 0x42, 0x08, + 0x71, 0x74, 0x74, 0xec, 0xc6, 0x7e, 0xc3, 0x2c, 0x29, 0x29, 0x49, 0x4c, + 0x2a, 0xa1, 0xa4, 0xa4, 0xa4, 0x0c, 0x15, 0x95, 0xf0, 0x27, 0xe3, 0xfc, + 0xfa, 0xf5, 0xeb, 0x2f, 0x4e, 0x9e, 0x3c, 0x79, 0xee, 0xe4, 0xc9, 0x93, + 0x67, 0x95, 0x1f, 0xa5, 0x6d, 0x69, 0x46, 0x2f, 0x5f, 0xbe, 0xcc, 0x23, + 0x84, 0x10, 0x2b, 0x2b, 0xab, 0x61, 0x60, 0x0d, 0xf9, 0xce, 0x9d, 0x3b, + 0x77, 0xdb, 0xb2, 0x65, 0xcb, 0x4e, 0xc5, 0x33, 0x61, 0xc2, 0x84, 0xc9, + 0x50, 0x39, 0x73, 0x5e, 0x15, 0xff, 0x09, 0xe3, 0x3c, 0x23, 0x23, 0x43, + 0x1a, 0x15, 0x15, 0x95, 0x42, 0x08, 0x21, 0xcf, 0x9f, 0x3f, 0x2f, 0xe4, + 0xf3, 0xf9, 0xaa, 0x0e, 0xc4, 0x3e, 0xd5, 0xc1, 0x97, 0x18, 0xe7, 0x73, + 0xe6, 0xcc, 0x09, 0xcd, 0xc9, 0xc9, 0x29, 0x03, 0x60, 0xa4, 0xa1, 0xa1, + 0x61, 0x21, 0x12, 0x89, 0xe4, 0xdf, 0x7f, 0xff, 0x7d, 0xa0, 0x1a, 0xe3, + 0xfc, 0x03, 0x21, 0x84, 0x00, 0x68, 0x64, 0x66, 0x66, 0xb6, 0x45, 0x28, + 0x14, 0xd2, 0xa7, 0x4f, 0x9f, 0xbe, 0x0b, 0x40, 0xa0, 0x62, 0x9c, 0x1b, + 0x39, 0x38, 0x38, 0x78, 0xb0, 0xba, 0xa3, 0x18, 0xea, 0x77, 0x05, 0x99, + 0xde, 0xbf, 0x7f, 0xbf, 0x90, 0x10, 0x42, 0x9a, 0x35, 0x6b, 0xd6, 0x0b, + 0x80, 0x96, 0xc2, 0x38, 0xdf, 0xb3, 0x67, 0x4f, 0x98, 0xb5, 0xb5, 0x75, + 0x63, 0x3b, 0x3b, 0xbb, 0xc6, 0x5d, 0xba, 0x74, 0xf1, 0xdc, 0xbb, 0x77, + 0xef, 0x51, 0x9a, 0xa6, 0x49, 0x64, 0x64, 0xa4, 0x54, 0x53, 0x53, 0x73, + 0x06, 0x00, 0x9d, 0x2f, 0x88, 0x5f, 0xa0, 0x30, 0xce, 0x43, 0x42, 0x42, + 0x72, 0xe6, 0xcf, 0x9f, 0xbf, 0x72, 0xe9, 0xd2, 0xa5, 0x2b, 0x0f, 0x1c, + 0x38, 0x70, 0x34, 0x3f, 0x3f, 0xbf, 0x38, 0x25, 0x25, 0x45, 0xe6, 0xe1, + 0xe1, 0x11, 0x85, 0x8a, 0x3a, 0xda, 0x84, 0xcf, 0xe7, 0x1f, 0x5a, 0xbf, + 0x7e, 0xbd, 0xb0, 0xa4, 0xa4, 0x44, 0x4e, 0x08, 0x21, 0xf9, 0xf9, 0xf9, + 0x85, 0xdb, 0xb6, 0x6d, 0xdb, 0xdd, 0xa0, 0x41, 0x03, 0x3b, 0x54, 0xcd, + 0xb7, 0x36, 0xce, 0x01, 0xa5, 0xad, 0xed, 0x53, 0xa6, 0x4c, 0x59, 0xc9, + 0xd6, 0x2f, 0x6f, 0xe6, 0xcc, 0x99, 0xeb, 0x09, 0x21, 0x64, 0xe6, 0xcc, + 0x99, 0x91, 0x6c, 0x58, 0x0d, 0x3d, 0x3d, 0xbd, 0x1e, 0xac, 0x5e, 0x78, + 0x0c, 0xc0, 0x70, 0xc5, 0x8a, 0x15, 0x47, 0xc2, 0xc2, 0xc2, 0x24, 0x4f, + 0x9e, 0x3c, 0x11, 0xff, 0xf6, 0xdb, 0x6f, 0x7f, 0x01, 0xd0, 0x9f, 0x3a, + 0x75, 0xea, 0x1f, 0x84, 0x10, 0x52, 0xaf, 0x5e, 0xbd, 0x09, 0xa8, 0x68, + 0x78, 0x9b, 0xb9, 0xbb, 0xbb, 0xdf, 0x52, 0xc8, 0x7c, 0xd3, 0xa6, 0x4d, + 0x4f, 0xa2, 0x72, 0xc7, 0x72, 0x86, 0x66, 0x66, 0x66, 0x7b, 0x0a, 0x0b, + 0x0b, 0xe5, 0x41, 0x41, 0x41, 0xaf, 0x5f, 0xbc, 0x78, 0x11, 0x9f, 0x95, + 0x95, 0x25, 0x33, 0x30, 0x30, 0xd8, 0x84, 0x2a, 0x26, 0xf4, 0x34, 0x34, + 0x34, 0xb4, 0x43, 0x42, 0x42, 0xde, 0x15, 0x17, 0x17, 0xcb, 0x1b, 0x35, + 0x6a, 0x14, 0x80, 0xcf, 0x27, 0xeb, 0x95, 0xa9, 0x8d, 0x71, 0x0e, 0x00, + 0xba, 0xa6, 0xa6, 0xa6, 0x6b, 0x4a, 0x4b, 0x4b, 0xe9, 0xeb, 0xd7, 0xaf, + 0x87, 0xa2, 0xe6, 0x2b, 0xda, 0x55, 0x1a, 0xe7, 0x5a, 0x5a, 0x5a, 0xa6, + 0xe9, 0xe9, 0xe9, 0x45, 0x3b, 0x77, 0xee, 0xcc, 0x42, 0xf9, 0x71, 0x30, + 0x01, 0x80, 0xfe, 0x01, 0x01, 0x01, 0xc2, 0x90, 0x90, 0x90, 0x78, 0x8a, + 0xa2, 0xfe, 0xc9, 0xb3, 0xdc, 0x7c, 0x30, 0x83, 0xe5, 0xc6, 0x60, 0x9d, + 0x36, 0x82, 0x91, 0xdf, 0x01, 0xef, 0xde, 0xbd, 0x93, 0x49, 0x24, 0x12, + 0x9a, 0xc7, 0xe3, 0x29, 0xe4, 0xf9, 0x93, 0x71, 0xbe, 0x77, 0xef, 0xde, + 0x3c, 0x30, 0x13, 0xf3, 0x26, 0x60, 0xea, 0xb5, 0xed, 0xb2, 0x65, 0xcb, + 0xd2, 0x59, 0xb9, 0x5a, 0xc6, 0xe6, 0x0b, 0x1a, 0x1a, 0x1a, 0x46, 0xa5, + 0xa5, 0xa5, 0x92, 0x8f, 0x1f, 0x3f, 0xca, 0xf5, 0xf5, 0xf5, 0x4f, 0x02, + 0x70, 0x54, 0x7a, 0xc7, 0x82, 0x2d, 0x83, 0x4f, 0xfe, 0x49, 0x26, 0x4f, + 0x9e, 0xfc, 0x0b, 0x21, 0x84, 0xac, 0x5c, 0xb9, 0x32, 0x03, 0xcc, 0x24, + 0x97, 0x31, 0x9b, 0xae, 0x6e, 0x07, 0x0f, 0x1e, 0x2c, 0x50, 0x31, 0xce, + 0xa9, 0xb1, 0x63, 0xc7, 0xce, 0x52, 0x4a, 0x8f, 0x07, 0x98, 0x76, 0x62, + 0x02, 0xc0, 0x6d, 0xe3, 0xc6, 0x8d, 0x69, 0x84, 0x10, 0xb2, 0x62, 0xc5, + 0x8a, 0x03, 0x50, 0xf2, 0x21, 0x02, 0x46, 0xa6, 0x2c, 0x26, 0x4d, 0x9a, + 0x74, 0x8a, 0x4d, 0xef, 0x39, 0x36, 0x2d, 0x06, 0x60, 0x77, 0x7c, 0x29, + 0x0a, 0xa7, 0x6e, 0xdd, 0xba, 0xae, 0xac, 0xce, 0x2e, 0x06, 0xd0, 0x14, + 0x4c, 0x9f, 0x69, 0x61, 0x6b, 0x6b, 0xbb, 0x8a, 0x10, 0x42, 0x8e, 0x1d, + 0x3b, 0xf6, 0x8c, 0x4d, 0x63, 0x85, 0x6d, 0xed, 0xa7, 0x4e, 0x9d, 0x12, + 0x82, 0xe9, 0xf7, 0xcd, 0xc1, 0xe8, 0x7a, 0xa7, 0x0d, 0x1b, 0x36, 0xa4, + 0x12, 0x42, 0xc8, 0x84, 0x09, 0x13, 0x36, 0x41, 0xe5, 0x66, 0x0b, 0x36, + 0x5e, 0xdb, 0x9b, 0x37, 0x6f, 0x66, 0xb1, 0xc6, 0x79, 0x55, 0xde, 0xda, + 0x35, 0xd9, 0xf0, 0xfa, 0x00, 0xea, 0xcc, 0x9d, 0x3b, 0xf7, 0x3a, 0x6b, + 0x54, 0xa9, 0x3b, 0xe7, 0x6e, 0x96, 0x9e, 0x9e, 0x2e, 0x8d, 0x88, 0x88, + 0x28, 0x01, 0x60, 0x36, 0x72, 0xe4, 0xc8, 0x89, 0x52, 0xa9, 0x54, 0x76, + 0xed, 0xda, 0xb5, 0x62, 0x4d, 0x4d, 0xcd, 0x0b, 0x60, 0x26, 0x22, 0x2a, + 0x9b, 0xfc, 0xaa, 0xce, 0x38, 0xf7, 0x20, 0x84, 0x90, 0x3f, 0xfe, 0xf8, + 0x23, 0x1d, 0x8c, 0x53, 0xcb, 0x56, 0x09, 0x09, 0x09, 0xb2, 0xac, 0xac, + 0x2c, 0x39, 0x18, 0xff, 0x4a, 0x0d, 0x7e, 0xfd, 0xf5, 0xd7, 0x97, 0x84, + 0x10, 0x62, 0x61, 0x61, 0xd1, 0x1c, 0x80, 0x6e, 0x2d, 0xcb, 0x87, 0xbf, + 0x6d, 0xdb, 0xb6, 0x13, 0x84, 0x10, 0x32, 0x60, 0xc0, 0x80, 0x97, 0x60, + 0x1c, 0xde, 0x19, 0xb3, 0x4f, 0xab, 0xa1, 0x43, 0x87, 0x46, 0x11, 0x42, + 0xc8, 0xba, 0x75, 0xeb, 0xf6, 0xb3, 0xf2, 0xf6, 0x49, 0x3e, 0x77, 0xed, + 0xda, 0x95, 0x03, 0xc6, 0xdf, 0x51, 0x55, 0xf2, 0x59, 0xa5, 0xbc, 0x1d, + 0x38, 0x70, 0x20, 0x5f, 0x45, 0xde, 0x00, 0xc6, 0x38, 0xbf, 0x40, 0x08, + 0x21, 0x37, 0x6e, 0xdc, 0x10, 0x82, 0x19, 0x4f, 0xda, 0xb2, 0xdf, 0x31, + 0x63, 0xff, 0x5f, 0xb9, 0x6e, 0x8d, 0xce, 0x9e, 0x3d, 0xfb, 0x81, 0xa6, + 0x69, 0xe2, 0xe6, 0xe6, 0xf6, 0x23, 0x1b, 0x4e, 0xd1, 0xc6, 0x1a, 0x83, + 0xd9, 0x49, 0xf4, 0x69, 0xd7, 0x08, 0x98, 0x31, 0x92, 0x81, 0xb6, 0xb6, + 0x76, 0x0b, 0xd6, 0x38, 0xcf, 0x61, 0xe3, 0x34, 0x50, 0x92, 0x4f, 0x85, + 0x5c, 0x54, 0xe5, 0xe3, 0x40, 0x6b, 0xe4, 0xc8, 0x91, 0x7b, 0x58, 0xe3, + 0xfc, 0x32, 0xd8, 0x63, 0x5c, 0x3a, 0x3a, 0x3a, 0x33, 0x0a, 0x0a, 0x0a, + 0xe4, 0x91, 0x91, 0x91, 0x19, 0xa8, 0x68, 0x3f, 0xe9, 0x46, 0x47, 0x47, + 0x67, 0xe7, 0xe5, 0xe5, 0xc9, 0x35, 0x35, 0x35, 0x27, 0x03, 0x30, 0x9f, + 0x3c, 0x79, 0x72, 0x00, 0x21, 0x84, 0x34, 0x68, 0xd0, 0xa0, 0x35, 0x00, + 0x9d, 0xb3, 0x67, 0xcf, 0x86, 0x9f, 0x38, 0x71, 0x22, 0xf7, 0xe2, 0xc5, + 0x8b, 0x45, 0x17, 0x2e, 0x5c, 0x88, 0x00, 0xa0, 0xab, 0x68, 0x1f, 0x93, + 0x26, 0x4d, 0xba, 0xc3, 0xa6, 0x4f, 0x0b, 0xc0, 0xc0, 0x5f, 0x7f, 0xfd, + 0x35, 0x8f, 0x10, 0x42, 0xe6, 0xcf, 0x9f, 0xbf, 0x72, 0xe1, 0xc2, 0x85, + 0x6b, 0x08, 0x21, 0x64, 0xe9, 0xd2, 0xa5, 0xb9, 0x60, 0x7c, 0xba, 0x7c, + 0xda, 0x85, 0x00, 0x60, 0x78, 0x5c, 0x5c, 0x9c, 0x34, 0x23, 0x23, 0x43, + 0x28, 0x10, 0x08, 0x4c, 0x54, 0xd3, 0x93, 0x9d, 0x9d, 0x2d, 0xd7, 0xd4, + 0xd4, 0x9c, 0xa4, 0xf4, 0x8e, 0xf2, 0x31, 0x1d, 0x03, 0x00, 0x86, 0xbd, + 0x7b, 0xf7, 0x1e, 0x2b, 0x97, 0xcb, 0xe9, 0x3f, 0xfe, 0xf8, 0xa3, 0x08, + 0x8c, 0x3f, 0xa3, 0xca, 0xec, 0x36, 0xbd, 0x5b, 0xb7, 0x6e, 0xc5, 0xcb, + 0xe5, 0x72, 0x62, 0x6d, 0x6d, 0xad, 0xda, 0x5f, 0xa9, 0xa3, 0x56, 0xc6, + 0xb9, 0x8d, 0x8d, 0xcd, 0x0f, 0x72, 0xb9, 0x9c, 0xdc, 0xba, 0x75, 0x2b, + 0x9e, 0xa2, 0x28, 0x7d, 0x75, 0x81, 0xba, 0x75, 0xeb, 0xd6, 0x2b, 0x2f, + 0x2f, 0xaf, 0x40, 0xd1, 0x2f, 0x16, 0x14, 0x14, 0x14, 0x5e, 0xb9, 0x72, + 0xe5, 0xe6, 0x4f, 0x3f, 0xfd, 0x34, 0xd7, 0xcb, 0xcb, 0xeb, 0xbb, 0x13, + 0x27, 0x4e, 0x9c, 0x59, 0xb5, 0x6a, 0xd5, 0x36, 0x7c, 0xd9, 0x8e, 0xe6, + 0x2f, 0xe2, 0x9b, 0xdc, 0x73, 0xee, 0xe8, 0xe8, 0xd8, 0xaa, 0x57, 0xaf, + 0x5e, 0xae, 0xfb, 0xf7, 0xef, 0xcf, 0x2f, 0x2c, 0x2c, 0x3c, 0x0f, 0x40, + 0xf5, 0x5e, 0x59, 0x4a, 0x2c, 0x16, 0x6b, 0x00, 0x80, 0x40, 0x20, 0x90, + 0xa1, 0xe2, 0x7d, 0xe0, 0x84, 0xfd, 0x1b, 0xa4, 0x52, 0xa9, 0xe2, 0xec, + 0xf7, 0x57, 0x63, 0x61, 0x61, 0x61, 0x73, 0xf9, 0xf2, 0x65, 0x3f, 0x91, + 0x48, 0xc4, 0x9b, 0x30, 0x61, 0xc2, 0x63, 0x42, 0xc8, 0x1d, 0x00, 0x12, + 0x95, 0x60, 0xda, 0x67, 0xce, 0x9c, 0x91, 0x45, 0x44, 0x44, 0xa4, 0x9b, + 0x99, 0x99, 0xe9, 0x35, 0x6d, 0xda, 0x94, 0xb7, 0x61, 0xc3, 0x06, 0xf3, + 0x5f, 0x7f, 0xfd, 0x75, 0xc4, 0xf8, 0xf1, 0xe3, 0x6f, 0x04, 0x06, 0x06, + 0x7e, 0xba, 0x4f, 0xbd, 0x73, 0xe7, 0xce, 0x5e, 0xf3, 0xe7, 0xcf, 0x9f, + 0xf2, 0xeb, 0xaf, 0xbf, 0x66, 0x47, 0x45, 0x45, 0xad, 0x04, 0x90, 0x89, + 0xcf, 0x1d, 0x73, 0x29, 0x23, 0xed, 0xda, 0xb5, 0xeb, 0x75, 0x30, 0xc6, + 0xe3, 0x47, 0x00, 0x72, 0x0d, 0x0d, 0x0d, 0x9b, 0x39, 0x73, 0xe6, 0xd8, + 0x6e, 0xdf, 0xbe, 0xbd, 0xce, 0xa9, 0x53, 0xa7, 0xfc, 0x5a, 0xb6, 0x6c, + 0xd9, 0x8c, 0x10, 0x22, 0x01, 0xc0, 0xab, 0x5b, 0xb7, 0x6e, 0x43, 0x00, + 0x70, 0x72, 0x72, 0xb2, 0x71, 0x70, 0x70, 0x88, 0x4d, 0x4e, 0x4e, 0x7e, + 0x0d, 0x20, 0x77, 0xc1, 0x82, 0x05, 0x5d, 0x83, 0x83, 0x83, 0xed, 0xe7, + 0xcc, 0x99, 0x33, 0x63, 0xdf, 0xbe, 0x7d, 0x87, 0x62, 0x63, 0x63, 0x5f, + 0xaa, 0xfb, 0x98, 0x40, 0x20, 0x30, 0xfc, 0xe9, 0xa7, 0x9f, 0x26, 0xa5, + 0xa4, 0xa4, 0xc8, 0xaf, 0x5e, 0xbd, 0xba, 0x17, 0x40, 0x89, 0x4a, 0x10, + 0xda, 0xc1, 0xc1, 0x41, 0xfb, 0xe2, 0xc5, 0x8b, 0xcd, 0x34, 0x35, 0x35, + 0x29, 0x6f, 0x6f, 0x6f, 0x61, 0x8b, 0x16, 0x2d, 0x34, 0x7e, 0xfc, 0xf1, + 0x47, 0xed, 0xbb, 0x77, 0xef, 0xb6, 0x1e, 0x33, 0x66, 0x0c, 0xb2, 0xb2, + 0xb2, 0x14, 0xf5, 0x22, 0xcd, 0xcd, 0xcd, 0x7d, 0xf4, 0xd3, 0x4f, 0x3f, + 0xa5, 0x1e, 0x3d, 0x7a, 0xb4, 0xde, 0xbd, 0x7b, 0xf7, 0xae, 0x24, 0x26, + 0x26, 0xa6, 0xd4, 0xa9, 0x53, 0xc7, 0xa2, 0xa4, 0xa4, 0x44, 0xb6, 0x67, + 0xcf, 0x1e, 0xe1, 0xa2, 0x45, 0x8b, 0x8c, 0x53, 0x53, 0x53, 0xf3, 0x2a, + 0xc9, 0x7b, 0x11, 0x80, 0x9d, 0xec, 0xff, 0x8b, 0x6a, 0x50, 0x5d, 0x25, + 0x60, 0x66, 0xc8, 0x29, 0x00, 0xa5, 0x2a, 0xf2, 0x01, 0x30, 0xd7, 0x4e, + 0x35, 0x2d, 0x28, 0x28, 0xe0, 0x9b, 0x9a, 0x9a, 0x6a, 0x36, 0x68, 0xd0, + 0x20, 0xda, 0xcc, 0xcc, 0xec, 0x97, 0xe2, 0xe2, 0xe2, 0x67, 0x6c, 0x78, + 0xd5, 0x3b, 0x4b, 0x25, 0x60, 0x66, 0x4c, 0xef, 0x56, 0xf3, 0x5d, 0xb1, + 0x8a, 0x4c, 0xc8, 0x01, 0x14, 0x03, 0x78, 0x0b, 0x60, 0x8b, 0x85, 0x85, + 0xc5, 0x93, 0x86, 0x0d, 0x1b, 0x6e, 0xd6, 0xd7, 0xd7, 0xb7, 0xca, 0xc9, + 0xc9, 0x91, 0x17, 0x16, 0x16, 0x36, 0x05, 0xa3, 0x38, 0x2a, 0xc8, 0x11, + 0x9f, 0xcf, 0x17, 0xdc, 0xbe, 0x7d, 0xfb, 0x9e, 0x9b, 0x9b, 0x5b, 0xab, + 0x11, 0x23, 0x46, 0x64, 0xf8, 0xf9, 0xf9, 0xed, 0x63, 0xf3, 0x53, 0x0a, + 0x40, 0xb7, 0x7e, 0xfd, 0xfa, 0x75, 0xd3, 0xd3, 0xd3, 0x4b, 0x01, 0xf0, + 0x9a, 0x34, 0x69, 0x62, 0x7d, 0xeb, 0xd6, 0xad, 0x42, 0x00, 0x0f, 0x00, + 0x88, 0xcd, 0xcc, 0xcc, 0x34, 0xb3, 0xb3, 0xb3, 0x25, 0x00, 0x64, 0x52, + 0xa9, 0xb4, 0x8c, 0xa6, 0x69, 0x85, 0xbf, 0x04, 0xc1, 0x88, 0x11, 0x23, + 0x7e, 0x04, 0x00, 0x7f, 0x7f, 0xff, 0xa7, 0xec, 0x75, 0xe1, 0xe4, 0xf6, + 0xed, 0xdb, 0x4f, 0xbd, 0xbd, 0xbd, 0x07, 0x8e, 0x18, 0x31, 0x62, 0x72, + 0x58, 0x58, 0xd8, 0x7d, 0xa8, 0xdc, 0xf1, 0x38, 0x6d, 0xda, 0xb4, 0xc2, + 0xf4, 0xf4, 0x74, 0x31, 0x00, 0x34, 0x6a, 0xd4, 0x48, 0xb3, 0x47, 0x8f, + 0x1e, 0x9a, 0x1b, 0x37, 0x6e, 0xac, 0xb3, 0x60, 0xc1, 0x82, 0xef, 0x86, + 0x0c, 0x19, 0x72, 0x38, 0x22, 0x22, 0x22, 0x17, 0x00, 0x4f, 0x24, 0x12, + 0x69, 0x02, 0x80, 0xb6, 0xb6, 0x76, 0x21, 0xbe, 0xfe, 0x9e, 0x5d, 0xb9, + 0x81, 0x81, 0x01, 0x01, 0x80, 0xbc, 0xbc, 0xbc, 0x0a, 0x6d, 0xb8, 0xa4, + 0xa4, 0x04, 0xe3, 0xc7, 0x8f, 0xcf, 0x55, 0xae, 0x53, 0x42, 0x08, 0xa1, + 0x69, 0x3a, 0x17, 0x4c, 0xfb, 0xf9, 0x4c, 0x86, 0x7a, 0xf6, 0xec, 0xd9, + 0x86, 0xa6, 0xe9, 0xd6, 0xaa, 0x72, 0xb0, 0x67, 0xcf, 0x9e, 0xcb, 0x71, + 0x71, 0x71, 0x71, 0x00, 0x78, 0x65, 0x65, 0x65, 0x7c, 0x00, 0xd0, 0xd4, + 0xd4, 0x2c, 0x62, 0xeb, 0x5f, 0xd0, 0xa6, 0x4d, 0x9b, 0x21, 0x3f, 0xff, + 0xfc, 0xf3, 0x1c, 0x45, 0xf8, 0x4b, 0x97, 0x2e, 0x85, 0x9c, 0x38, 0x71, + 0xe2, 0xb4, 0x72, 0x1c, 0x73, 0xe7, 0xce, 0x2d, 0xca, 0xc8, 0xc8, 0xa8, + 0x50, 0x7f, 0xd6, 0xd6, 0xd6, 0x9a, 0xbb, 0x77, 0xef, 0xfe, 0x92, 0x2b, + 0x7a, 0xbe, 0x1a, 0x2b, 0x2b, 0x2b, 0x8d, 0xb8, 0xb8, 0x38, 0x13, 0x5f, + 0x5f, 0x5f, 0xf1, 0x94, 0x29, 0x53, 0x0c, 0xe7, 0xcd, 0x9b, 0x37, 0x71, + 0xfb, 0xf6, 0xed, 0xab, 0xbe, 0x51, 0xf4, 0xf4, 0xf3, 0xe7, 0xcf, 0x43, + 0xcc, 0xcc, 0xcc, 0xda, 0xd8, 0xd9, 0xd9, 0x35, 0x31, 0x32, 0x32, 0x32, + 0xd5, 0xd6, 0xd6, 0xe6, 0x3d, 0x7d, 0xfa, 0xf4, 0x49, 0xe7, 0xce, 0x9d, + 0x2b, 0x3b, 0xe7, 0x57, 0x9a, 0x9b, 0x9b, 0x7b, 0x6c, 0xff, 0xfe, 0xfd, + 0x93, 0xe7, 0xcd, 0x9b, 0xd7, 0x7d, 0xe5, 0xca, 0x95, 0xae, 0xa9, 0xa9, + 0xa9, 0x05, 0x4a, 0xbf, 0xf3, 0xca, 0xca, 0xca, 0x74, 0xd8, 0xb2, 0x27, + 0xf8, 0xbc, 0xad, 0x02, 0x00, 0xad, 0xa9, 0xa9, 0x49, 0x03, 0x40, 0x59, + 0x59, 0x99, 0x2e, 0x94, 0xe4, 0x61, 0xd6, 0xac, 0x59, 0xad, 0x67, 0xcd, + 0x9a, 0x15, 0xa3, 0x1c, 0xf8, 0xca, 0x95, 0x2b, 0xa2, 0xf9, 0xf3, 0xe7, + 0x87, 0x4b, 0x24, 0x92, 0xeb, 0x00, 0xa4, 0xb5, 0x89, 0x5f, 0x2e, 0x97, + 0x2b, 0xfb, 0x16, 0x80, 0x9b, 0x9b, 0x9b, 0x99, 0x9b, 0x9b, 0xdb, 0x1a, + 0xc5, 0xbf, 0x5f, 0xbe, 0x7c, 0x59, 0xe6, 0xe9, 0xe9, 0xf9, 0xb2, 0xb0, + 0xb0, 0x70, 0x2d, 0x18, 0xbd, 0xa4, 0xa0, 0x40, 0x2e, 0x97, 0xaf, 0x5c, + 0xb1, 0x62, 0x45, 0xfa, 0x8e, 0x1d, 0x3b, 0xc6, 0x4d, 0x9b, 0x36, 0xcd, + 0x62, 0xea, 0xd4, 0xa9, 0x3a, 0x0b, 0x17, 0x2e, 0x9c, 0x33, 0x6b, 0xd6, + 0xac, 0x19, 0xde, 0xde, 0xde, 0xf3, 0x0f, 0x1f, 0x3e, 0xbc, 0xaf, 0x92, + 0xef, 0xff, 0x1d, 0x88, 0x2e, 0x5e, 0xbc, 0x78, 0xde, 0xc7, 0xc7, 0xc7, + 0x79, 0xc8, 0x90, 0x21, 0x23, 0x7c, 0x7d, 0x7d, 0xb7, 0x00, 0xa0, 0x86, + 0x0c, 0x19, 0x32, 0x4c, 0x2e, 0x97, 0xe3, 0xe2, 0xc5, 0x8b, 0x67, 0xc1, + 0xf4, 0xab, 0xf2, 0x92, 0x92, 0x92, 0xf8, 0x8c, 0x8c, 0x0c, 0xb9, 0x8d, + 0x8d, 0x8d, 0x25, 0x00, 0x9d, 0x5e, 0xbd, 0x7a, 0x75, 0x0b, 0x0e, 0x0e, + 0xce, 0x29, 0x2d, 0x2d, 0x95, 0x79, 0x79, 0x79, 0x75, 0x5e, 0xb2, 0x64, + 0x89, 0xb6, 0xad, 0xad, 0x6d, 0x03, 0x89, 0x44, 0x42, 0xd2, 0xd2, 0xd2, + 0x22, 0x51, 0xb1, 0x7d, 0x17, 0x7b, 0x7b, 0x7b, 0x6b, 0x4b, 0xa5, 0x52, + 0x08, 0x04, 0x02, 0x2c, 0x5a, 0xb4, 0xc8, 0x6c, 0xea, 0xd4, 0xa9, 0x25, + 0x95, 0xa4, 0x49, 0x98, 0x9b, 0x9b, 0xbb, 0xef, 0xb7, 0xdf, 0x7e, 0x1b, + 0xbe, 0x61, 0xc3, 0x86, 0xe6, 0x00, 0xe0, 0xed, 0xed, 0xfd, 0xa1, 0xb8, + 0xb8, 0xf8, 0x08, 0x3e, 0xef, 0x5f, 0x14, 0x50, 0x2b, 0x56, 0xac, 0xd8, + 0xe8, 0xe6, 0xe6, 0xd6, 0x74, 0xda, 0xb4, 0x69, 0x19, 0x89, 0x89, 0x89, + 0x2b, 0x01, 0x64, 0x7f, 0xc3, 0x72, 0x2c, 0xcb, 0xcb, 0xcb, 0x3b, 0x7b, + 0xf2, 0xe4, 0xc9, 0x39, 0x53, 0xa7, 0x4e, 0x6d, 0xe3, 0xe0, 0xe0, 0xe0, + 0x12, 0x17, 0x17, 0x17, 0xf6, 0x95, 0x71, 0x52, 0xe3, 0xc7, 0x8f, 0x9f, + 0x6a, 0x69, 0x69, 0x69, 0xe0, 0xe3, 0xe3, 0x73, 0x06, 0x40, 0x16, 0x18, + 0x9d, 0x42, 0x03, 0x78, 0xb6, 0x66, 0xcd, 0x9a, 0xe7, 0x8f, 0x1e, 0x3d, + 0xea, 0x3e, 0x74, 0xe8, 0xd0, 0x71, 0x7e, 0x7e, 0x7e, 0x47, 0xbf, 0x61, + 0x5e, 0xaa, 0x42, 0x0e, 0x20, 0x9e, 0xa2, 0x28, 0xca, 0xc9, 0xc9, 0xa9, + 0x79, 0xc3, 0x86, 0x0d, 0x1b, 0xd5, 0xad, 0x5b, 0xd7, 0x56, 0x57, 0x57, + 0xb7, 0x0e, 0x00, 0xa9, 0x40, 0x20, 0xd0, 0xe6, 0xf1, 0x78, 0x9a, 0x34, + 0x5d, 0xb1, 0xeb, 0x7b, 0xf3, 0xe6, 0x4d, 0x14, 0x80, 0x28, 0x00, 0x85, + 0xec, 0x9f, 0xde, 0xbe, 0x7c, 0xf9, 0xf2, 0x1e, 0x80, 0x71, 0xf6, 0xf6, + 0xf6, 0x9d, 0xc1, 0x0c, 0xbc, 0xcb, 0x1a, 0x35, 0x6a, 0xd4, 0x5c, 0x47, + 0x47, 0x47, 0x70, 0xfd, 0xfa, 0xf5, 0x22, 0xa1, 0x50, 0xb8, 0x01, 0x40, + 0x2c, 0x2a, 0xca, 0x49, 0x2e, 0xca, 0xfb, 0x55, 0x4d, 0x07, 0x07, 0x87, + 0x2e, 0x00, 0x10, 0x1a, 0x1a, 0x7a, 0x1f, 0x4c, 0xff, 0xa8, 0xb8, 0x83, + 0xfe, 0x55, 0x64, 0x64, 0xe4, 0x6b, 0x30, 0x4e, 0xf7, 0x14, 0x68, 0xba, + 0xb8, 0xb8, 0xf4, 0x01, 0x00, 0x1d, 0x1d, 0x9d, 0x8f, 0x4b, 0x96, 0x2c, + 0xe9, 0x05, 0xc6, 0x3f, 0x01, 0x00, 0x68, 0xd9, 0xd8, 0xd8, 0x14, 0x00, + 0xb0, 0x71, 0x74, 0x74, 0x6c, 0xcb, 0xa6, 0x47, 0x06, 0xa6, 0x4f, 0x95, + 0x80, 0xb9, 0xb3, 0x5b, 0x0a, 0x00, 0x14, 0x45, 0x49, 0xd9, 0xef, 0xa8, + 0x8e, 0x27, 0x79, 0x1f, 0x3f, 0x7e, 0xa4, 0x8b, 0x8b, 0x8b, 0x89, 0x93, + 0x93, 0x13, 0x61, 0xeb, 0xab, 0x04, 0x40, 0x99, 0xb3, 0xb3, 0x73, 0x3e, + 0x00, 0x14, 0x16, 0x16, 0xea, 0xb2, 0xf9, 0xa9, 0x50, 0x57, 0xa1, 0xa1, + 0xa1, 0xd1, 0x00, 0x1e, 0xa2, 0xbc, 0xdf, 0x91, 0xbf, 0x7a, 0xf5, 0x2a, + 0x04, 0x40, 0x5d, 0x53, 0x53, 0xd3, 0x86, 0x60, 0xc6, 0xc4, 0x8a, 0x3e, + 0x55, 0xc6, 0x3e, 0x1a, 0x35, 0xac, 0x73, 0x45, 0x1e, 0x14, 0xf5, 0x57, + 0xdd, 0xfd, 0xe3, 0xa4, 0xb0, 0xb0, 0x50, 0xfa, 0xdd, 0x77, 0xdf, 0x0d, + 0x3c, 0x7d, 0xfa, 0xb4, 0xef, 0xe5, 0xcb, 0x97, 0x4b, 0xc6, 0x8c, 0x19, + 0x73, 0x4d, 0x2a, 0x95, 0x2e, 0x07, 0x90, 0x82, 0xaf, 0xbc, 0x2f, 0x3e, + 0x2f, 0x2f, 0x2f, 0x03, 0x40, 0x1a, 0x00, 0xcd, 0xcc, 0xcc, 0xcc, 0x32, + 0x43, 0x43, 0x43, 0x0d, 0x00, 0x91, 0x00, 0x84, 0x22, 0x91, 0x28, 0x1b, + 0x00, 0x74, 0x75, 0x75, 0x2d, 0x00, 0x24, 0xd5, 0xb2, 0x7c, 0xf8, 0x4e, + 0x4e, 0x4e, 0x9d, 0x00, 0x20, 0x38, 0x38, 0x78, 0x1f, 0x80, 0x18, 0xa5, + 0x3a, 0x7a, 0x17, 0x1c, 0x1c, 0x7c, 0x08, 0xc0, 0x6e, 0x17, 0x17, 0x17, + 0x0f, 0xa8, 0x4c, 0xfc, 0x47, 0x47, 0x47, 0x47, 0x00, 0x78, 0x83, 0x72, + 0x5d, 0xac, 0x4e, 0x3e, 0x51, 0x95, 0xbc, 0x45, 0x45, 0x45, 0xbd, 0x41, + 0x45, 0x79, 0xab, 0xc0, 0xfd, 0xfb, 0xf7, 0x13, 0x01, 0x9c, 0x04, 0x33, + 0xee, 0x56, 0xd4, 0x1b, 0xa5, 0x52, 0x87, 0x64, 0xdf, 0xbe, 0x7d, 0x91, + 0x83, 0x07, 0x0f, 0xae, 0xfb, 0xe4, 0xc9, 0x93, 0xfd, 0x67, 0xcf, 0x9e, + 0xed, 0x79, 0xe8, 0xd0, 0xa1, 0x03, 0x8f, 0x1f, 0x3f, 0x7e, 0xc0, 0xe6, + 0x5d, 0xb9, 0xef, 0x21, 0x6c, 0xfe, 0xc4, 0x00, 0x84, 0x4a, 0x7f, 0x13, + 0x2a, 0xa5, 0xeb, 0x6b, 0x10, 0x8b, 0x44, 0xa2, 0xdb, 0xe7, 0xce, 0x9d, + 0x2b, 0x9c, 0x36, 0x6d, 0x9a, 0x55, 0xcb, 0x96, 0x2d, 0xdb, 0xbd, 0x7a, + 0xf5, 0xea, 0x3e, 0x00, 0xb4, 0x6d, 0xdb, 0xb6, 0x8b, 0xa3, 0xa3, 0xa3, + 0xf9, 0x9e, 0x3d, 0x7b, 0xf2, 0x24, 0x12, 0xc9, 0x5d, 0x00, 0x25, 0xa1, + 0xa1, 0xa1, 0x4f, 0x01, 0xf4, 0x6c, 0xd1, 0xa2, 0x45, 0x97, 0xe4, 0xe4, + 0xe4, 0xc4, 0x4e, 0x9d, 0x3a, 0x35, 0xd9, 0xbe, 0x7d, 0xfb, 0x3b, 0x5d, + 0x5d, 0x5d, 0x9d, 0x19, 0x33, 0x66, 0xd8, 0x03, 0xd0, 0x6a, 0xd9, 0xb2, + 0x65, 0x17, 0x00, 0x08, 0x09, 0x09, 0x09, 0x06, 0x23, 0x87, 0x62, 0x00, + 0x0f, 0xd6, 0xaf, 0x5f, 0xbf, 0xab, 0x5b, 0xb7, 0x6e, 0x4b, 0x37, 0x6d, + 0xda, 0xf4, 0x2b, 0x45, 0x51, 0xd4, 0xdd, 0xbb, 0x77, 0x45, 0x9b, 0x37, + 0x6f, 0xde, 0x09, 0x76, 0x3c, 0xca, 0xa6, 0x47, 0x0a, 0xe0, 0xf1, 0xfe, + 0xfd, 0xfb, 0xd3, 0xb6, 0x6e, 0xdd, 0xda, 0x60, 0xe0, 0xc0, 0x81, 0x23, + 0xfc, 0xfc, 0xfc, 0x0e, 0x01, 0x20, 0x8a, 0xf4, 0xec, 0xda, 0xb5, 0x2b, + 0x87, 0x4d, 0x8f, 0x42, 0xde, 0x09, 0x94, 0xfa, 0x84, 0x86, 0x0d, 0x1b, + 0x3a, 0x9e, 0x39, 0x73, 0xe6, 0xc0, 0xb3, 0x67, 0xcf, 0xca, 0xe6, 0xce, + 0x9d, 0x7b, 0x0c, 0xcc, 0x4e, 0x8c, 0x0a, 0xed, 0xd8, 0xcb, 0xcb, 0xab, + 0x7f, 0xb3, 0x66, 0xcd, 0x9a, 0x0f, 0x1a, 0x34, 0x68, 0x70, 0xd7, 0xae, + 0x5d, 0x1b, 0x1d, 0x38, 0x70, 0xa0, 0x28, 0x23, 0x23, 0x23, 0x0c, 0x5f, + 0x3f, 0x1e, 0x55, 0x46, 0x96, 0x9e, 0x9e, 0x1e, 0x72, 0xf0, 0xe0, 0xc1, + 0xa2, 0xe9, 0xd3, 0xa7, 0xdb, 0xdd, 0xbf, 0x7f, 0x3f, 0xe0, 0xf2, 0xe5, + 0xcb, 0x97, 0xde, 0xbd, 0x7b, 0xf7, 0xf6, 0xf6, 0xed, 0xdb, 0xd7, 0xd9, + 0x30, 0x02, 0x4f, 0x4f, 0xcf, 0x89, 0xfb, 0xf6, 0xed, 0x13, 0x9e, 0x3e, + 0x7d, 0xba, 0xb8, 0x49, 0x93, 0x26, 0x02, 0x2f, 0x2f, 0x2f, 0x41, 0xf7, + 0xee, 0xdd, 0x3b, 0x0f, 0x1c, 0x38, 0xb0, 0x2f, 0x00, 0x24, 0x26, 0x26, + 0x16, 0x6d, 0xdf, 0xbe, 0x7d, 0x2f, 0x98, 0xc9, 0x88, 0x9a, 0xd8, 0x34, + 0x5f, 0xcd, 0xb7, 0x30, 0xce, 0x35, 0xbc, 0xbd, 0xbd, 0x17, 0x53, 0x14, + 0x05, 0x1f, 0x1f, 0x9f, 0x1b, 0x00, 0x32, 0xa0, 0x46, 0xa9, 0x64, 0x66, + 0x66, 0x16, 0x01, 0x80, 0xb1, 0xb1, 0xb1, 0xba, 0xad, 0xe5, 0x06, 0x00, + 0x90, 0x95, 0x95, 0x55, 0x8c, 0x6f, 0xd0, 0xf1, 0xe9, 0xe8, 0xe8, 0xe8, + 0x5f, 0xbd, 0x7a, 0xf5, 0x56, 0xbd, 0x7a, 0xf5, 0xac, 0x7b, 0xf7, 0xee, + 0x9d, 0x10, 0x13, 0x13, 0xb3, 0x02, 0x4c, 0x67, 0xa3, 0x1a, 0xb7, 0xe4, + 0xe5, 0xcb, 0x97, 0x27, 0x5f, 0xbe, 0x7c, 0x19, 0x0e, 0x66, 0x76, 0xcd, + 0x6e, 0xd3, 0xa6, 0x4d, 0x5d, 0x43, 0x43, 0x43, 0x1d, 0xcf, 0x9e, 0x3d, + 0x7b, 0xa6, 0x51, 0xa3, 0x46, 0x76, 0x42, 0xa1, 0x30, 0x57, 0x57, 0x57, + 0xd7, 0xf8, 0xe8, 0xd1, 0xa3, 0x47, 0x42, 0x42, 0x42, 0xca, 0x36, 0x6f, + 0xde, 0xec, 0x03, 0x20, 0x14, 0xd5, 0x2b, 0xde, 0x22, 0x30, 0x9e, 0x7c, + 0x35, 0x14, 0xe5, 0x21, 0x93, 0xc9, 0x0c, 0x76, 0xec, 0xd8, 0x31, 0xf6, + 0xbb, 0xef, 0xbe, 0x5b, 0xe3, 0xe9, 0xe9, 0x69, 0xd7, 0xa8, 0x51, 0x23, + 0x97, 0x84, 0x84, 0x84, 0x30, 0x00, 0x3c, 0xb1, 0x58, 0xac, 0x05, 0x00, + 0x9b, 0x37, 0x6f, 0xce, 0x48, 0x4e, 0x4e, 0x9e, 0x0c, 0xe0, 0x1d, 0x00, + 0x59, 0x69, 0x69, 0xa9, 0xed, 0xa5, 0x4b, 0x97, 0x6e, 0xb6, 0x68, 0xd1, + 0xa2, 0x41, 0xbb, 0x76, 0xed, 0xbe, 0x8b, 0x8d, 0x8d, 0x55, 0x1d, 0x6c, + 0x01, 0xcc, 0x59, 0xa5, 0x71, 0x75, 0xeb, 0xd6, 0x35, 0x5c, 0xb6, 0x6c, + 0x59, 0x2a, 0x4d, 0xd3, 0x81, 0x50, 0x31, 0x20, 0x29, 0x8a, 0x12, 0x04, + 0x06, 0x06, 0x06, 0xea, 0xe8, 0xe8, 0x98, 0xb8, 0xb9, 0xb9, 0x25, 0x45, + 0x47, 0x47, 0x1f, 0x01, 0x50, 0xef, 0xe4, 0xc9, 0x93, 0xdf, 0xdd, 0xb8, + 0x71, 0xa3, 0x75, 0x40, 0x40, 0xc0, 0x3d, 0x57, 0x57, 0xd7, 0x66, 0x6c, + 0xdc, 0x34, 0x80, 0x0f, 0x67, 0xcf, 0x9e, 0x5d, 0xfd, 0xf2, 0xe5, 0xcb, + 0x95, 0x43, 0x87, 0x0e, 0x35, 0xb6, 0xb3, 0xb3, 0xd3, 0x79, 0xf3, 0xe6, + 0x4d, 0xe1, 0xa5, 0x4b, 0x97, 0xb2, 0xa6, 0x4d, 0x9b, 0xc6, 0x03, 0x60, + 0x9c, 0x9e, 0x9e, 0x9e, 0x04, 0xf5, 0x1d, 0x08, 0x01, 0x63, 0x98, 0xd6, + 0x94, 0xea, 0xc2, 0x93, 0x9b, 0x37, 0x6f, 0x3e, 0xb6, 0xb3, 0xb3, 0xeb, + 0x3d, 0x65, 0xca, 0x94, 0x46, 0x3f, 0xff, 0xfc, 0x73, 0xd3, 0xa9, 0x53, + 0xa7, 0xde, 0x3e, 0x73, 0xe6, 0xcc, 0x5f, 0x9b, 0x36, 0x6d, 0x5a, 0x1f, + 0x1d, 0x1d, 0xfd, 0x5a, 0xf5, 0x85, 0xe9, 0xd3, 0xa7, 0x4f, 0x9d, 0x34, + 0x69, 0xd2, 0x44, 0x54, 0x3e, 0xcb, 0x4d, 0x0e, 0x1d, 0x3a, 0x74, 0xf8, + 0xf0, 0xe1, 0xc3, 0x07, 0x54, 0x7f, 0x68, 0xde, 0xbc, 0xb9, 0xf3, 0xd2, + 0xa5, 0x4b, 0x57, 0x8c, 0x1e, 0x3d, 0x7a, 0x58, 0x6a, 0x6a, 0x6a, 0xe9, + 0xbc, 0x79, 0xf3, 0x0a, 0x8f, 0x1c, 0x39, 0x12, 0x27, 0x16, 0x8b, 0x83, + 0xd5, 0xc4, 0x43, 0xb5, 0x6c, 0xd9, 0xd2, 0xa3, 0x73, 0xe7, 0xce, 0x6e, + 0x0b, 0x16, 0x2c, 0xf8, 0xe8, 0xe7, 0xe7, 0xb7, 0x0c, 0xcc, 0xd6, 0xc0, + 0x42, 0x36, 0x5f, 0x3c, 0x4d, 0x4d, 0x4d, 0x3d, 0x9a, 0xa6, 0xa5, 0x00, + 0x28, 0x91, 0x48, 0x84, 0xc2, 0xc2, 0xc2, 0x7c, 0x00, 0x22, 0x3e, 0x9f, + 0xaf, 0xd5, 0xb4, 0x69, 0x53, 0x03, 0xf6, 0x2e, 0x62, 0x62, 0x64, 0x64, + 0xa4, 0x11, 0x13, 0x13, 0xa3, 0x50, 0xf6, 0x5a, 0xc3, 0x86, 0x0d, 0xeb, + 0x0d, 0x00, 0xd7, 0xaf, 0x5f, 0x1f, 0x04, 0x40, 0xf9, 0x7a, 0x2b, 0x0c, + 0x1f, 0x3e, 0xdc, 0xeb, 0x97, 0x5f, 0x7e, 0xd1, 0x82, 0x8a, 0x71, 0x7e, + 0xff, 0xfe, 0xfd, 0x83, 0x4a, 0x83, 0xd5, 0xba, 0x7b, 0xf6, 0xec, 0x71, + 0x1f, 0x3f, 0x7e, 0x7c, 0x97, 0x13, 0x27, 0x4e, 0xd4, 0x3d, 0x72, 0xe4, + 0xc8, 0xa9, 0x36, 0x6d, 0xda, 0x34, 0x07, 0x80, 0xe4, 0xe4, 0xe4, 0x22, + 0x00, 0xa8, 0x5f, 0xbf, 0x7e, 0x55, 0xab, 0x5a, 0x35, 0x85, 0xb2, 0xb3, + 0xb3, 0xd3, 0x29, 0x2a, 0x2a, 0x22, 0x1f, 0x3f, 0x7e, 0x4c, 0x81, 0x52, + 0x3b, 0x93, 0x4a, 0xa5, 0xf4, 0xa5, 0x4b, 0x97, 0x96, 0xa1, 0x62, 0x27, + 0x46, 0xc0, 0x28, 0x38, 0xb5, 0x03, 0xfc, 0x8e, 0x1d, 0x3b, 0xe6, 0x84, + 0x87, 0x87, 0x17, 0xa1, 0x62, 0x7b, 0x2d, 0x02, 0xf0, 0x81, 0x4d, 0x2b, + 0x49, 0x49, 0x49, 0x29, 0x6d, 0xdf, 0xbe, 0xbd, 0xa1, 0x95, 0x95, 0x95, + 0x65, 0x4a, 0x4a, 0x0a, 0x05, 0x80, 0xbf, 0x6f, 0xdf, 0xbe, 0xe8, 0x63, + 0xc7, 0x8e, 0xc5, 0xd4, 0xab, 0x57, 0xcf, 0x24, 0x2a, 0x2a, 0xca, 0x82, + 0x10, 0xa2, 0x70, 0xf4, 0xf5, 0x89, 0x9b, 0x37, 0x6f, 0x1e, 0x8d, 0x8b, + 0x8b, 0x7b, 0x89, 0x72, 0xb9, 0xe5, 0x39, 0x38, 0x38, 0xb4, 0xda, 0xbd, + 0x7b, 0xf7, 0xdc, 0xaf, 0x2c, 0x83, 0x2f, 0x22, 0x2b, 0x2b, 0x8b, 0x74, + 0xef, 0xde, 0xfd, 0xa9, 0x86, 0x86, 0x46, 0x4e, 0xf7, 0xee, 0xdd, 0x47, + 0xae, 0x5b, 0xb7, 0xee, 0x97, 0x2b, 0x57, 0xae, 0xfc, 0x15, 0x17, 0x17, + 0x17, 0xf9, 0xb5, 0x71, 0x13, 0x42, 0xe8, 0xf0, 0xf0, 0xf0, 0x40, 0x89, + 0x44, 0x32, 0xdd, 0xdd, 0xdd, 0xbd, 0xb7, 0xb1, 0xb1, 0xb1, 0x59, 0x76, + 0x76, 0xb6, 0x3c, 0x3e, 0x3e, 0xfe, 0x1e, 0x98, 0x9d, 0x25, 0xea, 0xa0, + 0x01, 0x7c, 0xd8, 0xbe, 0x7d, 0xfb, 0x39, 0x6f, 0x6f, 0xef, 0x99, 0x4b, + 0x96, 0x2c, 0x59, 0x35, 0x63, 0xc6, 0x8c, 0x79, 0x00, 0xc0, 0xe3, 0xf1, + 0x00, 0x80, 0x64, 0x66, 0x66, 0x66, 0x10, 0x42, 0x60, 0x66, 0x66, 0x56, + 0xd9, 0x0c, 0x37, 0x65, 0x6e, 0x6e, 0xae, 0x49, 0x08, 0x41, 0x5a, 0x5a, + 0x5a, 0x9a, 0xf2, 0x0f, 0xf7, 0xee, 0xdd, 0x93, 0x5d, 0xbb, 0x76, 0xad, + 0x58, 0x22, 0x91, 0x90, 0xe4, 0xe4, 0x64, 0xd9, 0xfb, 0xf7, 0xef, 0xa5, + 0x71, 0x71, 0x71, 0xf7, 0xc1, 0x6c, 0x87, 0xcb, 0x04, 0x40, 0xd7, 0x34, + 0x7e, 0x00, 0xc8, 0xcb, 0xcb, 0x2b, 0x54, 0xfe, 0xe1, 0xe2, 0xc5, 0x8b, + 0x32, 0x6f, 0x6f, 0xef, 0x8f, 0x7c, 0x3e, 0x1f, 0x41, 0x41, 0x41, 0x56, + 0xcd, 0x9a, 0x35, 0xd3, 0x34, 0x33, 0x33, 0x5b, 0x5d, 0x58, 0x58, 0xa8, + 0x3c, 0x90, 0x00, 0x18, 0xd9, 0xca, 0x04, 0xb0, 0x35, 0x2f, 0x2f, 0xef, + 0xec, 0xe6, 0xcd, 0x9b, 0x07, 0x6f, 0xde, 0xbc, 0x79, 0xd0, 0xa8, 0x51, + 0xa3, 0x9a, 0xec, 0xdf, 0xbf, 0xdf, 0xe8, 0xd0, 0xa1, 0x43, 0x7b, 0x5e, + 0xbd, 0x7a, 0x15, 0x15, 0x16, 0x16, 0xf6, 0xe8, 0x5b, 0xd7, 0x39, 0x45, + 0x51, 0xea, 0xda, 0x9b, 0x38, 0x33, 0x33, 0xf3, 0xf2, 0xa3, 0x47, 0x8f, + 0x96, 0xf5, 0xec, 0xd9, 0xd3, 0xc9, 0xc0, 0xc0, 0xc0, 0x9c, 0xcf, 0xe7, + 0x6b, 0x74, 0xeb, 0xd6, 0xad, 0xc9, 0x83, 0x07, 0x0f, 0xca, 0xb2, 0xb2, + 0xb2, 0xae, 0x82, 0x19, 0x3c, 0x11, 0x00, 0xc2, 0xf8, 0xf8, 0x78, 0x91, + 0xad, 0xad, 0xad, 0xb1, 0x81, 0x81, 0x81, 0x59, 0x87, 0x0e, 0x1d, 0x1a, + 0xec, 0xdd, 0xbb, 0xf7, 0xae, 0x50, 0x28, 0x2c, 0x5d, 0xbc, 0x78, 0xf1, + 0x60, 0x2b, 0x2b, 0xab, 0x06, 0x75, 0xeb, 0xd6, 0xb5, 0x4e, 0x49, 0x49, + 0x91, 0xd1, 0x34, 0x9d, 0x09, 0x25, 0x1d, 0xdd, 0xb1, 0x63, 0x47, 0xcf, + 0xf1, 0xe3, 0xc7, 0x77, 0xdb, 0xb2, 0x65, 0x8b, 0xc8, 0xce, 0xce, 0x4e, + 0x63, 0xf2, 0xe4, 0xc9, 0x7d, 0x0e, 0x1e, 0x3c, 0xd8, 0x25, 0x24, 0x24, + 0xe4, 0x5e, 0x25, 0xb2, 0x90, 0xbc, 0x6b, 0xd7, 0xae, 0x03, 0xcb, 0x97, + 0x2f, 0xff, 0x55, 0x2a, 0x95, 0xe2, 0xc0, 0x81, 0x03, 0xbb, 0xc1, 0x0c, + 0xf8, 0xd5, 0x1a, 0x0e, 0xee, 0xee, 0xee, 0x1e, 0xcb, 0x97, 0x2f, 0x9f, + 0x7b, 0xf3, 0xe6, 0x4d, 0xd1, 0xa1, 0x43, 0x87, 0x36, 0x82, 0x31, 0x06, + 0x64, 0xf8, 0x76, 0xd0, 0x00, 0xd2, 0xf6, 0xec, 0xd9, 0x73, 0x7b, 0xda, + 0xb4, 0x69, 0xa3, 0xbd, 0xbd, 0xbd, 0x7f, 0x9e, 0x37, 0x6f, 0xde, 0x38, + 0x7c, 0xdd, 0x80, 0x4e, 0xcb, 0xda, 0xda, 0xba, 0xfd, 0x9a, 0x35, 0x6b, + 0x3e, 0x26, 0x24, 0x24, 0x1c, 0x46, 0xc5, 0xbe, 0xa8, 0xe8, 0xf1, 0xe3, + 0xc7, 0x3b, 0x36, 0x6e, 0xdc, 0xe8, 0xda, 0xb4, 0x69, 0xd3, 0x5e, 0x60, + 0xb6, 0xbf, 0x8a, 0xbf, 0xec, 0x33, 0xb5, 0x82, 0x1a, 0x35, 0x6a, 0xd4, + 0xd8, 0xf5, 0xeb, 0xd7, 0xaf, 0x75, 0x70, 0x70, 0x68, 0x54, 0x5a, 0x5a, + 0x2a, 0x4e, 0x4d, 0x4d, 0x2d, 0x28, 0x28, 0x28, 0x90, 0x58, 0x59, 0x59, + 0x09, 0x00, 0x80, 0xa2, 0xa8, 0xcf, 0xc6, 0x6f, 0xb9, 0xb9, 0xb9, 0x89, + 0xa8, 0x28, 0xe7, 0x92, 0xec, 0xec, 0xec, 0x28, 0x00, 0xb0, 0xb1, 0xb1, + 0xb1, 0x05, 0x33, 0xf1, 0xcb, 0xb7, 0xb3, 0xb3, 0x6b, 0x03, 0x00, 0x29, + 0x29, 0x29, 0xe9, 0x60, 0xc6, 0x6c, 0xaa, 0xe5, 0xa7, 0x5c, 0xbf, 0xfc, + 0xba, 0x75, 0xeb, 0xd6, 0x03, 0x80, 0xec, 0xec, 0xec, 0x48, 0x95, 0xfc, + 0x8b, 0x3f, 0x7e, 0xfc, 0x18, 0x8f, 0x8a, 0xc6, 0x92, 0x46, 0xa3, 0x46, + 0x8d, 0xec, 0x00, 0x60, 0xfc, 0xf8, 0xf1, 0x4d, 0xc0, 0x5c, 0x87, 0x56, + 0x21, 0x6f, 0x32, 0x99, 0x0c, 0x7a, 0x7a, 0x7a, 0x26, 0xf8, 0xb2, 0x31, + 0x28, 0x2d, 0x95, 0x4a, 0x73, 0x2f, 0x5e, 0xbc, 0x58, 0x34, 0x71, 0xe2, + 0x44, 0xa3, 0xf5, 0xeb, 0xd7, 0xaf, 0x39, 0x7b, 0xf6, 0xec, 0x91, 0x86, + 0x0d, 0x1b, 0x36, 0x5e, 0xbe, 0x7c, 0xb9, 0xb7, 0x4c, 0x26, 0xc3, 0x9f, + 0x7f, 0xfe, 0xf9, 0x12, 0x6a, 0xc6, 0x92, 0x99, 0x99, 0x99, 0xca, 0x86, + 0x24, 0x00, 0x48, 0x29, 0x8a, 0xca, 0x60, 0xff, 0x5f, 0x1b, 0xff, 0xf0, + 0xf5, 0xb0, 0x75, 0xeb, 0xd6, 0xd5, 0x3a, 0x77, 0xee, 0xdc, 0x7e, 0x3e, + 0x9f, 0xcf, 0x33, 0x32, 0x32, 0x12, 0x11, 0x42, 0x7e, 0xc5, 0x37, 0x30, + 0xcc, 0x01, 0xa0, 0xac, 0xac, 0xac, 0x18, 0x4c, 0xbd, 0xca, 0x09, 0x21, + 0x52, 0x91, 0x48, 0x44, 0xc0, 0x8c, 0x5b, 0x09, 0x3b, 0xf1, 0x01, 0x94, + 0x1f, 0xeb, 0xab, 0x4d, 0xf9, 0x68, 0x34, 0x68, 0xd0, 0xc0, 0x42, 0x26, + 0x93, 0x21, 0x37, 0x37, 0xf7, 0x21, 0x2a, 0xca, 0x9b, 0xf8, 0xe3, 0xc7, + 0x8f, 0x41, 0x84, 0x10, 0x34, 0x6a, 0xd4, 0xc8, 0x0a, 0xcc, 0x62, 0xc6, + 0xa7, 0xb1, 0x72, 0x4e, 0x4e, 0x4e, 0x12, 0x2a, 0x8e, 0x9d, 0xd5, 0xc9, + 0x27, 0x6a, 0x29, 0x6f, 0x15, 0x48, 0x4f, 0x4f, 0x57, 0x18, 0xf3, 0x15, + 0x8c, 0x71, 0xd5, 0xe2, 0x79, 0xf0, 0xe0, 0xc1, 0x1f, 0xee, 0xee, 0xee, + 0xcd, 0x57, 0xad, 0x5a, 0x65, 0x3e, 0x6e, 0xdc, 0xb8, 0x51, 0x13, 0x26, + 0x4c, 0x18, 0xfd, 0xea, 0xd5, 0xab, 0xd7, 0xab, 0x57, 0xaf, 0x5e, 0x73, + 0xe5, 0xca, 0x95, 0xbf, 0xbe, 0x45, 0xfd, 0xd6, 0x10, 0x02, 0x20, 0xf7, + 0xe8, 0xd1, 0xa3, 0x81, 0xd3, 0xa6, 0x4d, 0x1b, 0x3e, 0x71, 0xe2, 0xc4, + 0x9f, 0x5e, 0xbd, 0x7a, 0xf5, 0x08, 0x00, 0x35, 0x61, 0xc2, 0x84, 0x9f, + 0x00, 0xe0, 0xe8, 0xd1, 0xa3, 0xfe, 0x00, 0xf2, 0x01, 0x48, 0xdf, 0xbe, + 0x7d, 0x1b, 0x28, 0x12, 0x89, 0x56, 0xb8, 0xb8, 0xb8, 0xb4, 0x8f, 0x88, + 0x88, 0x78, 0x66, 0x6b, 0x6b, 0xab, 0x17, 0x12, 0x12, 0x12, 0xae, 0xad, + 0xad, 0xad, 0xb3, 0x61, 0xc3, 0x06, 0x27, 0x5b, 0x5b, 0x5b, 0xfb, 0x96, + 0x2d, 0x5b, 0x76, 0x2a, 0x2d, 0x2d, 0x25, 0xd1, 0xd1, 0xd1, 0x81, 0x28, + 0xd7, 0xbf, 0x45, 0x84, 0x90, 0x43, 0x8b, 0x17, 0x2f, 0xf6, 0x0c, 0x0d, + 0x0d, 0xed, 0x06, 0x00, 0xac, 0x73, 0xd1, 0xc3, 0xf8, 0x7c, 0x7c, 0x56, + 0x74, 0xf4, 0xe8, 0xd1, 0xe3, 0xeb, 0xd7, 0xaf, 0xff, 0x75, 0xfa, 0xf4, + 0xe9, 0xb3, 0xfd, 0xfc, 0xfc, 0x8e, 0x03, 0xa0, 0x95, 0xd2, 0x73, 0x93, + 0x4d, 0xcf, 0x67, 0x6d, 0x4c, 0x47, 0x47, 0xc7, 0xe0, 0xe2, 0xc5, 0x8b, + 0x57, 0x24, 0x12, 0x89, 0xd6, 0x88, 0x11, 0x23, 0xee, 0x4b, 0xa5, 0xd2, + 0x6d, 0x28, 0x9f, 0xf0, 0x50, 0xa0, 0xb9, 0x71, 0xe3, 0xc6, 0x5d, 0xad, + 0x5b, 0xb7, 0x76, 0x00, 0x00, 0x6f, 0x6f, 0xef, 0xdc, 0xbd, 0x7b, 0xf7, + 0x1e, 0x07, 0x33, 0xc6, 0xfb, 0x6a, 0xd9, 0x57, 0x82, 0x06, 0xf0, 0x61, + 0xe6, 0xcc, 0x99, 0x87, 0xa3, 0xa2, 0xa2, 0x26, 0xee, 0xdd, 0xbb, 0xb7, + 0xbd, 0x87, 0x87, 0x47, 0xfb, 0x97, 0x2f, 0x5f, 0xc6, 0xdf, 0xbe, 0x7d, + 0x5b, 0xb1, 0x60, 0xab, 0xb1, 0x75, 0xeb, 0xd6, 0x30, 0xa1, 0x50, 0x18, + 0x0d, 0xe0, 0xd9, 0x9b, 0x37, 0x6f, 0xac, 0x2e, 0x5d, 0xba, 0xd4, 0x0e, + 0x40, 0x4b, 0x5b, 0x5b, 0xdb, 0x06, 0xc6, 0xc6, 0xc6, 0xd4, 0xdb, 0xb7, + 0x6f, 0x63, 0x69, 0x9a, 0xbe, 0x81, 0xea, 0xed, 0xbe, 0x6f, 0xc6, 0x57, + 0x1b, 0xe7, 0x46, 0x46, 0x46, 0x96, 0x13, 0x27, 0x4e, 0x1c, 0x10, 0x10, + 0x10, 0x50, 0x16, 0x1d, 0x1d, 0x7d, 0x00, 0xea, 0x67, 0x15, 0xe8, 0xac, + 0xac, 0xac, 0x4c, 0x00, 0xa8, 0x53, 0xa7, 0x4e, 0x1d, 0xa8, 0x6c, 0xf3, + 0xb3, 0xb4, 0xb4, 0xb4, 0x04, 0x00, 0x36, 0xcc, 0x57, 0x19, 0xe7, 0x1a, + 0x1a, 0x1a, 0x9a, 0x17, 0x2e, 0x5c, 0xb8, 0xda, 0xae, 0x5d, 0x3b, 0xd7, + 0xef, 0xbf, 0xff, 0x3e, 0xe3, 0xc1, 0x83, 0x07, 0x8b, 0x00, 0x84, 0x43, + 0xfd, 0x00, 0x41, 0x06, 0xe0, 0x15, 0x98, 0x99, 0x66, 0x1e, 0x00, 0xcd, + 0xd4, 0xd4, 0xd4, 0x66, 0xd7, 0xae, 0x5d, 0xbb, 0x31, 0x65, 0xca, 0x14, + 0x53, 0x57, 0x57, 0x57, 0x8f, 0xe0, 0xe0, 0xe0, 0x2b, 0xa3, 0x47, 0x8f, + 0x9e, 0xea, 0xe0, 0xe0, 0x60, 0xad, 0xab, 0xab, 0x2b, 0x89, 0x88, 0x88, + 0x98, 0x48, 0x08, 0x19, 0x0b, 0x00, 0x14, 0x45, 0xf1, 0x1d, 0x1c, 0x1c, + 0xf4, 0x04, 0x02, 0x01, 0x2f, 0x2a, 0x2a, 0xea, 0x09, 0x4d, 0xd3, 0xb2, + 0x16, 0x2d, 0x5a, 0x38, 0xa3, 0x7c, 0xd6, 0xad, 0x50, 0xe5, 0x7b, 0x05, + 0x00, 0x8e, 0x45, 0x46, 0x46, 0x4e, 0xf7, 0xf4, 0xf4, 0x6c, 0xd8, 0xb0, + 0x61, 0xc3, 0x36, 0x09, 0x09, 0x09, 0xaf, 0x00, 0x20, 0x25, 0x25, 0x25, + 0x07, 0x00, 0x04, 0x02, 0xc1, 0x2b, 0xb0, 0xb3, 0x9b, 0xec, 0x3b, 0x29, + 0x61, 0x61, 0x61, 0x4f, 0x01, 0x34, 0xb0, 0xb6, 0xb6, 0x76, 0x66, 0xeb, + 0x4c, 0xb5, 0x23, 0xd5, 0x9a, 0x3b, 0x77, 0xee, 0x02, 0xb1, 0x58, 0x4c, + 0x0e, 0x1d, 0x3a, 0x74, 0x82, 0xfd, 0x4e, 0x85, 0x72, 0x74, 0x73, 0x73, + 0xf3, 0xac, 0x5f, 0xbf, 0xbe, 0xe5, 0xae, 0x5d, 0xbb, 0x72, 0xa2, 0xa3, + 0xa3, 0xa7, 0x00, 0x08, 0x01, 0x20, 0x78, 0xf4, 0xe8, 0xd1, 0xed, 0xe3, + 0xc7, 0x8f, 0x1f, 0xf6, 0xf6, 0xf6, 0x6e, 0xdc, 0xba, 0x75, 0x6b, 0x8f, + 0xf0, 0xf0, 0x70, 0xc5, 0x20, 0xad, 0x0c, 0xc0, 0xf9, 0xf7, 0xef, 0xdf, + 0xbf, 0xdd, 0xb4, 0x69, 0x53, 0x37, 0x30, 0x1e, 0xdb, 0x93, 0x00, 0x84, + 0x3a, 0x39, 0x39, 0x1d, 0x93, 0xc9, 0x64, 0x88, 0x8f, 0x8f, 0x7f, 0x8d, + 0x6f, 0x3b, 0xcb, 0x55, 0x19, 0x12, 0x00, 0x77, 0xcb, 0xca, 0xca, 0x5e, + 0xef, 0xd9, 0xb3, 0x67, 0xf0, 0xc1, 0x83, 0x07, 0x47, 0x4c, 0x9c, 0x38, + 0xd1, 0x6e, 0xe9, 0xd2, 0xa5, 0x7d, 0xdf, 0xbc, 0x79, 0x33, 0xf2, 0xd2, + 0xa5, 0x4b, 0xd7, 0x37, 0x6e, 0xdc, 0xb8, 0x21, 0x2c, 0x2c, 0xec, 0xb9, + 0xa2, 0x3c, 0x8a, 0x8b, 0x8b, 0x9d, 0xd2, 0xd3, 0xd3, 0x95, 0xb7, 0x26, + 0xa9, 0x42, 0x0b, 0x85, 0x42, 0x27, 0x30, 0xc6, 0x9b, 0x18, 0x60, 0x3c, + 0x8f, 0x2e, 0x5b, 0xb6, 0x6c, 0xf9, 0xa0, 0x41, 0x83, 0xfa, 0x25, 0x26, + 0x26, 0x16, 0xcf, 0x98, 0x31, 0x23, 0xeb, 0xf8, 0xf1, 0xe3, 0x09, 0x52, + 0xa9, 0xf4, 0x1c, 0x80, 0x2b, 0x60, 0x66, 0xe8, 0x55, 0x77, 0x5f, 0xf0, + 0x5b, 0xb7, 0x6e, 0xed, 0x55, 0x5a, 0x5a, 0x4a, 0xee, 0xdc, 0xb9, 0x73, + 0x1a, 0x15, 0x0d, 0x73, 0x00, 0xa0, 0x12, 0x13, 0x13, 0x85, 0x6e, 0x6e, + 0x6e, 0xd6, 0x00, 0x48, 0x50, 0x50, 0x50, 0x71, 0xf3, 0xe6, 0xcd, 0x0d, + 0x00, 0xc0, 0xd9, 0xd9, 0xb9, 0x85, 0xb6, 0xb6, 0x36, 0xcf, 0xdc, 0xdc, + 0x5c, 0x00, 0x00, 0x8e, 0x8e, 0x8e, 0x26, 0xa7, 0x4e, 0x9d, 0x7a, 0x05, + 0x80, 0x6e, 0xdd, 0xba, 0x75, 0x7b, 0x3b, 0x3b, 0x3b, 0xe3, 0xf0, 0xf0, + 0x70, 0x3a, 0x38, 0x38, 0xb8, 0x8c, 0x10, 0x42, 0xb3, 0x32, 0xc7, 0xeb, + 0xd8, 0xb1, 0xa3, 0x76, 0xeb, 0xd6, 0xad, 0x4d, 0x5a, 0xb5, 0x6a, 0xd5, + 0x8e, 0x9d, 0x75, 0x56, 0xe6, 0x05, 0x98, 0x5d, 0x03, 0x34, 0x9b, 0xf7, + 0x93, 0xe7, 0xcf, 0x9f, 0x1f, 0xb5, 0x7b, 0xf7, 0xee, 0xdf, 0x5b, 0xb7, + 0x6e, 0xdd, 0x58, 0x4f, 0x4f, 0xaf, 0x4e, 0x49, 0x49, 0x49, 0x41, 0x62, + 0x62, 0x62, 0x2a, 0x00, 0x17, 0x37, 0x37, 0x37, 0xd7, 0x63, 0xc7, 0x8e, + 0x7d, 0xd5, 0x6e, 0x95, 0x56, 0xad, 0x5a, 0xb5, 0x36, 0x30, 0x30, 0xe0, + 0x87, 0x85, 0x85, 0x89, 0xc1, 0x28, 0x61, 0x55, 0xe5, 0x7a, 0x1d, 0xcc, + 0xe4, 0x98, 0x32, 0x44, 0x4d, 0x59, 0x2a, 0xd8, 0x0c, 0xe0, 0x0c, 0x2a, + 0xca, 0x16, 0x0d, 0xa6, 0x03, 0x91, 0x01, 0xa0, 0x93, 0x93, 0x93, 0xf3, + 0x00, 0x58, 0x39, 0x3a, 0x3a, 0x3a, 0xbf, 0x78, 0xf1, 0x82, 0x07, 0x40, + 0x2c, 0x91, 0x48, 0xce, 0x48, 0x24, 0x92, 0x3b, 0xc6, 0xc6, 0xc6, 0x1e, + 0x00, 0x8e, 0x40, 0xfd, 0x2d, 0x07, 0x4f, 0xd8, 0xf2, 0x51, 0xc4, 0xcd, + 0x07, 0x33, 0x18, 0xff, 0x5b, 0x8c, 0x73, 0x3e, 0x9f, 0xcf, 0x07, 0x00, + 0x99, 0x4c, 0xa6, 0x56, 0xaf, 0x89, 0x44, 0x22, 0x99, 0x54, 0x2a, 0x9d, + 0x2d, 0x95, 0x4a, 0xe9, 0x69, 0xd3, 0xa6, 0xb9, 0xde, 0xbd, 0x7b, 0xb7, + 0xb9, 0xaf, 0xaf, 0xef, 0x31, 0x4f, 0x4f, 0xcf, 0x76, 0x84, 0x90, 0xaf, + 0xea, 0x08, 0x28, 0x8a, 0xa2, 0xa5, 0x52, 0xe9, 0x9b, 0xf0, 0xf0, 0xf0, + 0x32, 0x77, 0x77, 0x77, 0x0f, 0x63, 0x63, 0x63, 0x83, 0x67, 0xcf, 0x9e, + 0x15, 0x83, 0x19, 0xfc, 0x55, 0xa5, 0x67, 0x4b, 0x33, 0x32, 0x32, 0x0e, + 0x1d, 0x39, 0x72, 0x64, 0xec, 0x94, 0x29, 0x53, 0xfa, 0xaf, 0x5d, 0xbb, + 0x76, 0x87, 0x4c, 0xf6, 0x49, 0x7d, 0x12, 0x99, 0x4c, 0x96, 0x9d, 0x9d, + 0x9d, 0x4d, 0x5b, 0x5b, 0x5b, 0x6b, 0xe9, 0xea, 0xea, 0xea, 0x95, 0x96, + 0x96, 0xe6, 0x2b, 0xbf, 0x2c, 0x10, 0x08, 0x34, 0x6d, 0x6c, 0x6c, 0xb4, + 0x72, 0x72, 0x72, 0x68, 0x89, 0x44, 0x52, 0xc1, 0x38, 0x0c, 0x09, 0x09, + 0x49, 0xdb, 0xb5, 0x6b, 0xd7, 0x01, 0x30, 0xfa, 0x2d, 0x03, 0x8c, 0x4e, + 0x89, 0x07, 0x33, 0xf9, 0x22, 0x67, 0xcb, 0xaa, 0x46, 0xf1, 0xe7, 0xe7, + 0xe7, 0xd3, 0x79, 0x79, 0x79, 0xa9, 0xca, 0xf1, 0x8b, 0x44, 0xa2, 0x8c, + 0x8c, 0x8c, 0x8c, 0xe1, 0x00, 0x04, 0x0b, 0x17, 0x2e, 0x3c, 0x72, 0xf9, + 0xf2, 0xe5, 0x26, 0x3e, 0x3e, 0x3e, 0xcb, 0xfb, 0xf7, 0xef, 0xef, 0xaf, + 0x26, 0x9f, 0x8a, 0xd5, 0x8f, 0xf7, 0x60, 0x26, 0x07, 0x8e, 0x9d, 0x3b, + 0x77, 0xae, 0x7f, 0xb3, 0x66, 0xcd, 0xb6, 0xac, 0x5a, 0xb5, 0xca, 0x64, + 0xd0, 0xa0, 0x41, 0x53, 0x59, 0xdd, 0x5b, 0x5b, 0xe3, 0x92, 0xe4, 0xe6, + 0xe6, 0x4a, 0x01, 0xc0, 0xdc, 0xdc, 0xdc, 0xec, 0xc3, 0x87, 0x0f, 0x71, + 0xca, 0x3f, 0x5a, 0x58, 0x58, 0x98, 0x03, 0x40, 0x5e, 0x5e, 0x9e, 0x54, + 0xa9, 0x1e, 0x68, 0x00, 0x69, 0xe7, 0xcf, 0x9f, 0x8f, 0xf3, 0xf0, 0xf0, + 0x70, 0xf6, 0xf4, 0xf4, 0xec, 0xaf, 0xa9, 0xa9, 0xa9, 0x25, 0x10, 0x08, + 0x78, 0x17, 0x2e, 0x5c, 0x88, 0x41, 0x45, 0x83, 0x58, 0x16, 0x1b, 0x1b, + 0x9b, 0xdf, 0xb3, 0x67, 0x4f, 0x8b, 0xce, 0x9d, 0x3b, 0xf7, 0xd0, 0xd0, + 0xd0, 0xe0, 0x05, 0x06, 0x06, 0xde, 0x28, 0x2d, 0x2d, 0x2d, 0x2a, 0x2b, + 0x2b, 0x1b, 0xd4, 0xab, 0x57, 0xaf, 0x81, 0xf5, 0xea, 0xd5, 0x33, 0x4f, + 0x4a, 0x4a, 0x2a, 0x81, 0x52, 0x1b, 0xe3, 0xf1, 0x78, 0xda, 0x3e, 0x3e, + 0x3e, 0x7b, 0xb3, 0xb2, 0xb2, 0xe4, 0x1b, 0x36, 0x6c, 0x38, 0x51, 0xa7, + 0x4e, 0x9d, 0xfa, 0x83, 0x06, 0x0d, 0xea, 0xe3, 0xe3, 0xe3, 0xf3, 0x47, + 0x87, 0x0e, 0x1d, 0x5c, 0xd9, 0x5d, 0x5c, 0x9f, 0xc9, 0x42, 0x69, 0x69, + 0xe9, 0xc9, 0xd2, 0xd2, 0xd2, 0x15, 0x32, 0x99, 0x8c, 0xc8, 0x64, 0xb2, + 0xbf, 0x50, 0xc9, 0xca, 0x81, 0x8e, 0x8e, 0x8e, 0xd1, 0x89, 0x13, 0x27, + 0x4e, 0x14, 0x16, 0x16, 0x92, 0xc9, 0x93, 0x27, 0xdf, 0x06, 0x70, 0x1e, + 0xb5, 0x9b, 0xa4, 0xad, 0x29, 0xa5, 0x51, 0x51, 0x51, 0xfb, 0xef, 0xdf, + 0xbf, 0x3f, 0x78, 0xd2, 0xa4, 0x49, 0x43, 0x56, 0xac, 0x58, 0x61, 0x21, + 0x14, 0x0a, 0x33, 0xbf, 0x22, 0x3e, 0x6a, 0xdd, 0xba, 0x75, 0xfe, 0x00, + 0x1e, 0x03, 0x88, 0x46, 0x45, 0xbd, 0x23, 0x05, 0xf0, 0x78, 0xf9, 0xf2, + 0xe5, 0xdb, 0xc1, 0xe8, 0xb0, 0x7f, 0x64, 0x5b, 0xa3, 0xa7, 0xa7, 0x67, + 0xdf, 0xd3, 0xa7, 0x4f, 0x9f, 0x88, 0x8e, 0x8e, 0x16, 0xb5, 0x6f, 0xdf, + 0xfe, 0xc3, 0xf3, 0xe7, 0xcf, 0xf3, 0xd9, 0xef, 0x8b, 0xef, 0xdd, 0xbb, + 0x67, 0xe9, 0xe9, 0xe9, 0xc9, 0x67, 0x8f, 0xa1, 0x54, 0xc0, 0xc8, 0xc8, + 0x08, 0xa8, 0xa8, 0x7f, 0x89, 0x91, 0x91, 0x91, 0x1c, 0x00, 0x72, 0x72, + 0x72, 0x08, 0x9b, 0x7e, 0x7e, 0x4e, 0x4e, 0x8e, 0x06, 0x00, 0x98, 0x9a, + 0x9a, 0xca, 0x51, 0x7d, 0x1f, 0xce, 0xcb, 0xcb, 0x63, 0x16, 0x52, 0x0d, + 0x0c, 0x0c, 0x54, 0x77, 0x3e, 0xd2, 0xda, 0xda, 0xda, 0xaa, 0x93, 0x15, + 0xfc, 0xec, 0xec, 0x6c, 0x0a, 0x00, 0x3a, 0x77, 0xee, 0x9c, 0xc3, 0x1e, + 0xdb, 0x52, 0x7e, 0x47, 0x03, 0x8c, 0x5e, 0xf6, 0xc7, 0x97, 0x8f, 0xf7, + 0x84, 0x53, 0xa6, 0x4c, 0x39, 0xa3, 0xa3, 0xa3, 0x33, 0x71, 0xf9, 0xf2, + 0xe5, 0x73, 0x96, 0x2f, 0x5f, 0x3e, 0x07, 0x00, 0x62, 0x63, 0x63, 0x4b, + 0x87, 0x0e, 0x1d, 0x9a, 0x1e, 0x12, 0x12, 0x72, 0x02, 0x6a, 0x26, 0x51, + 0xe4, 0x72, 0x79, 0x21, 0x3e, 0xef, 0x9f, 0x14, 0xff, 0xfe, 0x47, 0x0d, + 0x73, 0x00, 0x94, 0xad, 0xad, 0xad, 0xd6, 0xaa, 0x55, 0xab, 0x0a, 0x8c, + 0x8d, 0x8d, 0xe9, 0x25, 0x4b, 0x96, 0xd4, 0xf9, 0xfd, 0xf7, 0xdf, 0x57, + 0xff, 0xf4, 0xd3, 0x4f, 0x13, 0xbf, 0x45, 0xe4, 0x72, 0xb9, 0x5c, 0xa1, + 0x5f, 0x94, 0x75, 0x8c, 0x6a, 0x79, 0x53, 0x2a, 0xef, 0xd4, 0xa4, 0x7c, + 0x78, 0x59, 0x59, 0x59, 0xb4, 0x93, 0x93, 0x13, 0x0c, 0x0c, 0x0c, 0xa4, + 0xc5, 0xc5, 0xc5, 0xca, 0xe1, 0x69, 0x23, 0x23, 0x23, 0x09, 0x45, 0x51, + 0x8a, 0x9d, 0x98, 0x15, 0xda, 0x8b, 0x99, 0x99, 0x19, 0x85, 0xea, 0xe5, + 0x13, 0xb5, 0x94, 0x37, 0x55, 0xd4, 0xe5, 0x41, 0x15, 0x09, 0x80, 0x7b, + 0x51, 0x51, 0x51, 0x13, 0x87, 0x0f, 0x1f, 0x3e, 0xa9, 0x7e, 0xfd, 0xfa, + 0x9e, 0xd3, 0xa7, 0x4f, 0x37, 0x9e, 0x39, 0x73, 0x66, 0xd3, 0xcb, 0x97, + 0x2f, 0x5f, 0x98, 0x32, 0x65, 0xca, 0xec, 0xc3, 0x87, 0x0f, 0xef, 0xc5, + 0xdf, 0xb0, 0x4b, 0xc6, 0xc4, 0xc4, 0x44, 0xdd, 0xb9, 0xe7, 0xb2, 0x67, + 0xcf, 0x9e, 0x1d, 0x8a, 0x8e, 0x8e, 0x1e, 0x34, 0x7a, 0xf4, 0xe8, 0x7e, + 0x8b, 0x16, 0x2d, 0xd2, 0xe3, 0xf1, 0x78, 0xfc, 0xd1, 0xa3, 0x47, 0xf7, + 0x8e, 0x8c, 0x8c, 0x94, 0x86, 0x87, 0x87, 0x1f, 0x06, 0xbb, 0x73, 0x4a, + 0x26, 0x93, 0xc5, 0xbe, 0x7c, 0xf9, 0xb2, 0xac, 0x69, 0xd3, 0xa6, 0xcd, + 0xdc, 0xdd, 0xdd, 0x7b, 0x49, 0x24, 0x12, 0x12, 0x16, 0x16, 0xe6, 0xaf, + 0xa9, 0xa9, 0xa9, 0x43, 0xd3, 0xf4, 0xf7, 0x6d, 0xda, 0xb4, 0xe9, 0xee, + 0xec, 0xec, 0xec, 0xfc, 0xf2, 0xe5, 0x4b, 0x91, 0x5c, 0x2e, 0x8f, 0x43, + 0x79, 0xff, 0x45, 0x78, 0x3c, 0x5e, 0xc1, 0xd6, 0xad, 0x5b, 0xcd, 0x25, + 0x12, 0x09, 0x28, 0x8a, 0xc2, 0xd6, 0xad, 0x5b, 0x2d, 0xbc, 0xbc, 0xbc, + 0xf2, 0xd4, 0xe8, 0x92, 0xb2, 0xdc, 0xdc, 0xdc, 0xb3, 0xe7, 0xce, 0x9d, + 0x9b, 0x37, 0x7e, 0xfc, 0x78, 0x67, 0x3b, 0x3b, 0xbb, 0xe6, 0x29, 0x29, + 0x29, 0x89, 0xa3, 0x47, 0x8f, 0xee, 0x1d, 0x16, 0x16, 0x26, 0x89, 0x8c, + 0x8c, 0x3c, 0x82, 0xcf, 0x77, 0xb4, 0x00, 0x00, 0xef, 0xc0, 0x81, 0x03, + 0xc7, 0x9d, 0x9d, 0x9d, 0x1b, 0x7b, 0x7a, 0x7a, 0x46, 0xa7, 0xa7, 0xa7, + 0x2f, 0x05, 0x90, 0xae, 0xa6, 0x1c, 0x75, 0x26, 0x4d, 0x9a, 0x14, 0xdf, + 0xa8, 0x51, 0x23, 0xa3, 0xa1, 0x43, 0x87, 0xea, 0xef, 0xd9, 0xb3, 0xc7, + 0xac, 0x57, 0xaf, 0x5e, 0xae, 0x83, 0x07, 0x0f, 0x16, 0xe2, 0xdb, 0x23, + 0xbc, 0x72, 0xe5, 0x8a, 0xeb, 0xc0, 0x81, 0x03, 0x4d, 0x4f, 0x9c, 0x38, + 0x21, 0xba, 0x78, 0xf1, 0xa2, 0x30, 0x21, 0x21, 0x41, 0xe1, 0x78, 0x55, + 0x02, 0x40, 0x2c, 0x14, 0x0a, 0x8f, 0xa3, 0x7c, 0x27, 0x2d, 0x0f, 0x8c, + 0x9f, 0x0f, 0xad, 0xd4, 0xd4, 0x54, 0xab, 0xd4, 0xd4, 0x54, 0x5d, 0x00, + 0xc9, 0x60, 0xc6, 0xb6, 0xdf, 0x72, 0xa2, 0xb9, 0x4a, 0xbe, 0xb6, 0xa3, + 0xe1, 0x4d, 0x9a, 0x34, 0xe9, 0x27, 0x7d, 0x7d, 0x7d, 0xc1, 0xee, 0xdd, + 0xbb, 0xc3, 0xc1, 0x6c, 0x3f, 0x51, 0x97, 0x78, 0xfa, 0xe9, 0xd3, 0xa7, + 0x21, 0x72, 0xb9, 0x1c, 0x1e, 0x1e, 0x1e, 0xae, 0x2a, 0xdf, 0xe5, 0x7b, + 0x78, 0x78, 0xb4, 0xa0, 0x69, 0x1a, 0xa1, 0xa1, 0xa1, 0xca, 0x2b, 0x5a, + 0xb5, 0x86, 0xa2, 0x28, 0xde, 0x91, 0x23, 0x47, 0x4e, 0xf7, 0xef, 0xdf, + 0xdf, 0xd3, 0xdb, 0xdb, 0x3b, 0xe7, 0xf4, 0xe9, 0xd3, 0x2b, 0xc1, 0x6c, + 0x6d, 0xae, 0x6a, 0x1b, 0x82, 0x0c, 0x4c, 0xa5, 0x88, 0xc0, 0x34, 0xea, + 0x68, 0x81, 0x40, 0x90, 0x0b, 0x00, 0x65, 0x65, 0x65, 0x16, 0x60, 0x1c, + 0x8f, 0xd4, 0x0b, 0x09, 0x09, 0x91, 0xa6, 0xa7, 0xa7, 0xa3, 0xac, 0xac, + 0xcc, 0x4a, 0x2c, 0x16, 0xdb, 0x8a, 0xc5, 0x62, 0xdb, 0xb2, 0xb2, 0x32, + 0x1b, 0x9a, 0xa6, 0x29, 0x42, 0x08, 0xca, 0xca, 0xca, 0x6c, 0x24, 0x12, + 0x89, 0x0d, 0xaa, 0x3e, 0x03, 0x41, 0x00, 0x94, 0x58, 0x59, 0x59, 0x49, + 0x01, 0x20, 0x3e, 0x3e, 0xbe, 0x8c, 0x2d, 0x0b, 0xf9, 0xfb, 0xf7, 0xef, + 0xdf, 0x02, 0xc0, 0x80, 0x01, 0x03, 0x9a, 0x43, 0x65, 0x70, 0xd0, 0xa5, + 0x4b, 0x17, 0x03, 0x00, 0x48, 0x4a, 0x4a, 0x12, 0xab, 0xab, 0xb3, 0x76, + 0xed, 0xda, 0x79, 0xb4, 0x6b, 0xd7, 0xce, 0xee, 0xdc, 0xb9, 0x73, 0xc2, + 0x9c, 0x9c, 0x9c, 0xd3, 0xf8, 0xbc, 0xd1, 0x68, 0xb4, 0x6d, 0xdb, 0xb6, + 0x3f, 0x00, 0x84, 0x85, 0x85, 0x85, 0x01, 0x08, 0x03, 0x63, 0xe8, 0xe4, + 0x01, 0x08, 0x0a, 0x0d, 0x0d, 0x0d, 0x07, 0x80, 0xf6, 0xed, 0xdb, 0x0f, + 0x40, 0xf9, 0x84, 0x8d, 0x62, 0x9b, 0x4a, 0x18, 0x00, 0x1f, 0x30, 0x8e, + 0x51, 0x0e, 0x36, 0x68, 0xd0, 0xa0, 0xf4, 0xbb, 0xef, 0xbe, 0xb3, 0xbf, + 0x70, 0xe1, 0x82, 0x30, 0x37, 0x37, 0xf7, 0xcd, 0xd7, 0xd4, 0x57, 0x2d, + 0x11, 0x83, 0x31, 0x2a, 0x0e, 0x49, 0x24, 0x92, 0xb1, 0x87, 0x0e, 0x1d, + 0xda, 0xd0, 0xb8, 0x71, 0xe3, 0x88, 0xc9, 0x93, 0x27, 0x67, 0xb9, 0xb8, + 0xb8, 0x78, 0x84, 0x86, 0x86, 0x3e, 0x9b, 0x35, 0x6b, 0x96, 0xc2, 0x83, + 0x2d, 0x39, 0x7d, 0xfa, 0x74, 0xe0, 0xd0, 0xa1, 0x43, 0x6f, 0x0e, 0x1d, + 0x3a, 0x34, 0xa0, 0x92, 0xe7, 0xe6, 0xb9, 0x73, 0xe7, 0xee, 0x2b, 0x44, + 0x67, 0xee, 0xdc, 0xb9, 0x8b, 0x5f, 0xbc, 0x78, 0x11, 0xdc, 0xac, 0x59, + 0xb3, 0xce, 0x13, 0x27, 0x4e, 0xcc, 0x6c, 0xd2, 0xa4, 0xc9, 0x2b, 0x5f, + 0x5f, 0xdf, 0x75, 0x52, 0xa9, 0x74, 0x0c, 0x00, 0x5f, 0x30, 0x33, 0x7a, + 0xea, 0x3a, 0x05, 0xfe, 0xa1, 0x43, 0x87, 0x22, 0xf4, 0xf4, 0xf4, 0x9e, + 0xbf, 0x79, 0xf3, 0xe6, 0x3c, 0x98, 0xc1, 0xbe, 0xb2, 0x22, 0x92, 0x27, + 0x27, 0x27, 0xa7, 0xd7, 0xab, 0x57, 0x4f, 0x8f, 0xcf, 0xe7, 0x23, 0x30, + 0x30, 0x30, 0xba, 0x63, 0xc7, 0x8e, 0x96, 0x27, 0x4f, 0x9e, 0x3c, 0x7e, + 0xed, 0xda, 0xb5, 0x33, 0x5b, 0xb6, 0x6c, 0x29, 0x72, 0x72, 0x72, 0x32, + 0xf2, 0xf5, 0xf5, 0xdd, 0x65, 0x6c, 0x6c, 0xac, 0x75, 0xf3, 0xe6, 0xcd, + 0x9b, 0x00, 0x30, 0x7c, 0xf8, 0xf0, 0x49, 0x00, 0xb0, 0x66, 0xcd, 0x9a, + 0x98, 0xd9, 0xb3, 0x67, 0x1f, 0x9d, 0x33, 0x67, 0xce, 0xe1, 0x39, 0x73, + 0xe6, 0x1c, 0x9e, 0x3d, 0x7b, 0xf6, 0xd1, 0x35, 0x6b, 0xd6, 0xc4, 0xb0, + 0x61, 0x26, 0xe3, 0xf3, 0x09, 0x36, 0xc5, 0x16, 0x41, 0x85, 0x4c, 0xe7, + 0x98, 0x99, 0x99, 0x85, 0x1a, 0x1a, 0x1a, 0x52, 0x62, 0xb1, 0x98, 0x88, + 0xc5, 0x62, 0x01, 0x00, 0xfa, 0xda, 0xb5, 0x6b, 0x41, 0x22, 0x91, 0x88, + 0x4c, 0x9a, 0x34, 0xa9, 0x73, 0x9d, 0x3a, 0x75, 0xea, 0x7e, 0x45, 0xbd, + 0x08, 0xb6, 0x6c, 0xd9, 0xf2, 0x1b, 0x00, 0xec, 0xda, 0xb5, 0x2b, 0x16, + 0xea, 0x67, 0x16, 0x15, 0xe9, 0x51, 0x7e, 0x24, 0x55, 0xc4, 0x29, 0x04, + 0x90, 0x03, 0x66, 0x3b, 0xac, 0xe2, 0xc9, 0x55, 0x7a, 0x47, 0x7e, 0xf9, + 0xf2, 0xe5, 0x50, 0x00, 0xf8, 0xe1, 0x87, 0x1f, 0x86, 0x80, 0x31, 0xb0, + 0x15, 0x93, 0x61, 0x29, 0x60, 0x56, 0x44, 0x2b, 0x43, 0xb1, 0xc5, 0x4b, + 0xf9, 0xf9, 0xbb, 0x66, 0x43, 0xa9, 0x26, 0x4d, 0x9a, 0xd4, 0x03, 0x80, + 0x98, 0x98, 0x98, 0xca, 0xb6, 0xf6, 0x12, 0x36, 0xaf, 0x29, 0x81, 0x81, + 0x81, 0x2b, 0x8f, 0x1c, 0x39, 0x52, 0xe2, 0xe1, 0xe1, 0xd1, 0x6a, 0xc6, + 0x8c, 0x19, 0xf3, 0xf1, 0x6d, 0x06, 0x8b, 0xc2, 0x67, 0xcf, 0x9e, 0x65, + 0xb8, 0xbb, 0xbb, 0x3b, 0xb5, 0x6d, 0xdb, 0xb6, 0xe9, 0xd3, 0xa7, 0x4f, + 0x55, 0x57, 0xd6, 0xd4, 0x21, 0x07, 0x90, 0xb0, 0x75, 0xeb, 0xd6, 0xcb, + 0x14, 0x45, 0x51, 0x3f, 0xff, 0xfc, 0xf3, 0xfc, 0x92, 0x92, 0x12, 0x45, + 0x3b, 0x27, 0x00, 0xc4, 0x41, 0x41, 0x41, 0xc5, 0x5a, 0x5a, 0x5a, 0xd4, + 0x77, 0xdf, 0x7d, 0x37, 0x58, 0x25, 0x9d, 0x54, 0x8f, 0x1e, 0x3d, 0x7a, + 0xeb, 0xeb, 0xeb, 0xf3, 0x6f, 0xdd, 0xba, 0x55, 0x04, 0x46, 0x17, 0x29, + 0xe7, 0x3b, 0x0b, 0xc0, 0x21, 0x30, 0x6d, 0xea, 0x2a, 0x80, 0x97, 0x60, + 0x66, 0xe0, 0x95, 0x75, 0x5e, 0x8d, 0xe2, 0xbf, 0x7b, 0xf7, 0x6e, 0x09, + 0x4d, 0xd3, 0x15, 0x66, 0xe4, 0xd9, 0x09, 0x8d, 0x18, 0x00, 0xe1, 0x57, + 0xae, 0x5c, 0x59, 0x1b, 0x10, 0x10, 0x20, 0xee, 0xd7, 0xaf, 0x5f, 0x87, + 0xc1, 0x83, 0x07, 0x8f, 0xad, 0x22, 0xbf, 0x34, 0x18, 0x23, 0x32, 0x13, + 0x80, 0x5f, 0x40, 0x40, 0xc0, 0x55, 0x00, 0xd0, 0xd1, 0xd1, 0xb1, 0xc3, + 0x97, 0x79, 0xe9, 0x26, 0x89, 0x89, 0x89, 0x05, 0x00, 0xd0, 0xac, 0x59, + 0xb3, 0x96, 0xa8, 0xa8, 0xb3, 0x79, 0xce, 0xce, 0xce, 0x6e, 0x00, 0x10, + 0x1f, 0x1f, 0x5f, 0xa0, 0x52, 0x36, 0xa2, 0x4b, 0x97, 0x2e, 0x9d, 0xa7, + 0x69, 0x1a, 0x3d, 0x7b, 0xf6, 0x1c, 0xd6, 0xab, 0x57, 0xaf, 0x61, 0x72, + 0xb9, 0x1c, 0x7e, 0x7e, 0x7e, 0x8a, 0x2d, 0xed, 0x9f, 0xea, 0x27, 0x21, + 0x21, 0x21, 0xd3, 0xd2, 0xd2, 0x52, 0xab, 0x63, 0xc7, 0x8e, 0x5e, 0x2f, + 0x5f, 0xbe, 0x2c, 0xcb, 0xcd, 0xcd, 0xbd, 0x2b, 0x12, 0x89, 0x1e, 0xde, + 0xbf, 0x7f, 0x5f, 0xd8, 0xa3, 0x47, 0x8f, 0xbe, 0x36, 0x36, 0x36, 0xc6, + 0x89, 0x89, 0x89, 0xf9, 0x50, 0x1a, 0x58, 0x4f, 0x9b, 0x36, 0x6d, 0x6e, + 0xeb, 0xd6, 0xad, 0xed, 0x97, 0x2d, 0x5b, 0xf6, 0xa1, 0xb8, 0xb8, 0x78, + 0x77, 0x7c, 0x7c, 0xfc, 0x7a, 0x1f, 0x1f, 0x9f, 0xc2, 0x76, 0xed, 0xda, + 0x35, 0x9d, 0x3c, 0x79, 0xb2, 0x37, 0xd4, 0xcb, 0x1b, 0x8d, 0xf2, 0xc9, + 0x5e, 0x45, 0x9f, 0xa0, 0x4e, 0x8e, 0x79, 0x9b, 0x37, 0x6f, 0xde, 0xe5, + 0xe8, 0xe8, 0x58, 0x6f, 0xc6, 0x8c, 0x19, 0x1f, 0xb2, 0xb2, 0xb2, 0xd6, + 0x42, 0xfd, 0x6e, 0xb5, 0x6f, 0x81, 0x0c, 0xc0, 0x6b, 0x1f, 0x1f, 0x9f, + 0x48, 0x43, 0x43, 0x43, 0xcd, 0x89, 0x13, 0x27, 0x4e, 0xc7, 0xd7, 0x8d, + 0x65, 0xca, 0x00, 0x9c, 0x00, 0xb0, 0x0f, 0xe5, 0x93, 0xe2, 0xca, 0x14, + 0x81, 0x71, 0x70, 0xf4, 0x27, 0xd4, 0x0f, 0x48, 0xbf, 0x35, 0x9a, 0x43, + 0x86, 0x0c, 0x99, 0xc1, 0xe3, 0xf1, 0xa8, 0x05, 0x0b, 0x16, 0xc4, 0x3f, + 0x7f, 0xfe, 0x7c, 0x26, 0x98, 0x7b, 0xe4, 0x87, 0x03, 0x98, 0xd9, 0xa0, + 0x41, 0x03, 0x39, 0xa0, 0x7e, 0x07, 0x46, 0xc3, 0x86, 0x0d, 0xad, 0x55, + 0xca, 0x82, 0x6a, 0xdc, 0xb8, 0xb1, 0x3d, 0x00, 0xa4, 0xa4, 0xa4, 0x28, + 0xea, 0x83, 0x8e, 0x8d, 0x8d, 0x7d, 0x0f, 0x00, 0xad, 0x5b, 0xb7, 0xae, + 0xc9, 0xce, 0x29, 0x92, 0x94, 0x94, 0x94, 0x03, 0x00, 0x0e, 0x0e, 0x0e, + 0x8d, 0x54, 0xc2, 0x53, 0xec, 0x0a, 0xa9, 0x32, 0xf4, 0xbb, 0x77, 0xef, + 0x32, 0x01, 0xa0, 0x55, 0xab, 0x56, 0x57, 0x01, 0x74, 0x05, 0xd0, 0x51, + 0xe9, 0x69, 0x0b, 0xc0, 0x0d, 0xcc, 0x4d, 0x3c, 0x5f, 0x3a, 0x18, 0x2f, + 0x69, 0xd8, 0xb0, 0xe1, 0xd9, 0xce, 0x9d, 0x3b, 0x53, 0x2b, 0x57, 0xae, + 0x2c, 0x72, 0x70, 0x70, 0x48, 0x31, 0x32, 0x32, 0x8a, 0x6f, 0xd2, 0xa4, + 0xc9, 0x8b, 0x6b, 0xd7, 0xae, 0x2d, 0x04, 0xf0, 0x0c, 0xea, 0xf5, 0xba, + 0x3a, 0x03, 0xf5, 0x3f, 0x46, 0x4a, 0x4a, 0x0a, 0xbd, 0x79, 0xf3, 0xe6, + 0x3f, 0x96, 0x2e, 0x5d, 0xba, 0xdf, 0xcf, 0xcf, 0xaf, 0x74, 0xe6, 0xcc, + 0x99, 0xe3, 0xbd, 0xbd, 0xbd, 0x17, 0xe3, 0xdb, 0xe8, 0xfe, 0x2f, 0xc9, + 0x67, 0x4d, 0xca, 0x87, 0xc4, 0xc4, 0xc4, 0x14, 0x00, 0x80, 0x93, 0x93, + 0x93, 0xea, 0x19, 0x7c, 0x1e, 0xfb, 0x37, 0xc4, 0xc6, 0xc6, 0x16, 0xa8, + 0xc6, 0xd5, 0xb0, 0x61, 0xc3, 0xba, 0xa8, 0x5e, 0x3e, 0x6b, 0x2b, 0x6f, + 0xea, 0xf2, 0x50, 0x13, 0x44, 0x60, 0x26, 0xeb, 0xe7, 0xa5, 0xa4, 0xa4, + 0x0c, 0x5d, 0xbe, 0x7c, 0xb9, 0x8f, 0x8b, 0x8b, 0x4b, 0x62, 0x69, 0x69, + 0x29, 0xf9, 0xe9, 0xa7, 0x9f, 0x16, 0xe3, 0x73, 0x3f, 0x01, 0xe5, 0x99, + 0xe4, 0xf1, 0xaa, 0xac, 0x1f, 0x91, 0x48, 0x24, 0x05, 0x00, 0x1b, 0x1b, + 0x1b, 0x55, 0x3f, 0x1a, 0x3c, 0xb6, 0x0c, 0x54, 0x91, 0x02, 0x78, 0x79, + 0xec, 0xd8, 0xb1, 0x54, 0x2b, 0x2b, 0x2b, 0xdd, 0x1e, 0x3d, 0x7a, 0xf4, + 0xf7, 0xf4, 0xf4, 0xec, 0x63, 0x66, 0x66, 0xa6, 0x7d, 0xec, 0xd8, 0xb1, + 0x14, 0x30, 0x0b, 0x76, 0x8a, 0xc9, 0x16, 0x51, 0x58, 0x58, 0x58, 0x66, + 0xe3, 0xc6, 0x8d, 0x6d, 0x5a, 0xb6, 0x6c, 0xd9, 0x29, 0x3c, 0x3c, 0xbc, + 0xac, 0xac, 0xac, 0x2c, 0xac, 0xa8, 0xa8, 0xe8, 0x59, 0x74, 0x74, 0xb4, + 0xb8, 0x65, 0xcb, 0x96, 0x9d, 0x9a, 0x35, 0x6b, 0x66, 0x1b, 0x12, 0x12, + 0x92, 0x89, 0x8a, 0xfa, 0x8a, 0x5a, 0xbe, 0x7c, 0xf9, 0x1a, 0x4f, 0x4f, + 0x4f, 0xe7, 0x65, 0xcb, 0x96, 0x95, 0xac, 0x58, 0xb1, 0xa2, 0xa4, 0x57, + 0xaf, 0x5e, 0x2d, 0x16, 0x2f, 0x5e, 0xfc, 0x2b, 0x3e, 0x97, 0x37, 0x1a, + 0x40, 0xfa, 0xbe, 0x7d, 0xfb, 0xee, 0x53, 0x14, 0x85, 0xf1, 0xe3, 0xc7, + 0xcf, 0xf0, 0xf0, 0xf0, 0xe8, 0x63, 0x66, 0x66, 0xa6, 0x7d, 0xe4, 0xc8, + 0x91, 0x04, 0x30, 0x47, 0x13, 0x54, 0x6d, 0x3d, 0xca, 0xdb, 0xdb, 0x7b, + 0xf1, 0xf8, 0xf1, 0xe3, 0x87, 0xcc, 0x9b, 0x37, 0x2f, 0xeb, 0xc9, 0x93, + 0x27, 0xbf, 0xa0, 0x72, 0x9b, 0xb0, 0x34, 0x32, 0x32, 0xf2, 0xd7, 0x2b, + 0x57, 0xae, 0xcc, 0x9f, 0x38, 0x71, 0xe2, 0xe9, 0xf3, 0xe7, 0xcf, 0x97, + 0x0c, 0x1a, 0x34, 0xa8, 0x67, 0xc3, 0x86, 0x0d, 0x9d, 0x6b, 0x58, 0x77, + 0x35, 0xc6, 0xce, 0xce, 0xce, 0x75, 0xe0, 0xc0, 0x81, 0x3d, 0x2e, 0x5c, + 0xb8, 0x50, 0x32, 0x71, 0xe2, 0xc4, 0xd3, 0x57, 0xae, 0x5c, 0x99, 0x1f, + 0x15, 0x15, 0xf5, 0x2b, 0xca, 0x27, 0x8e, 0x69, 0x30, 0x63, 0x90, 0x12, + 0x94, 0x8f, 0x0f, 0x8b, 0xc1, 0x8c, 0xcb, 0xde, 0x82, 0xb1, 0x81, 0xb2, + 0xf0, 0x0f, 0xae, 0x9a, 0x57, 0x8a, 0x8d, 0x8d, 0x4d, 0xbd, 0x07, 0x0f, + 0x1e, 0x3c, 0x79, 0xf0, 0xe0, 0xc1, 0x13, 0x1b, 0x1b, 0x9b, 0x7a, 0x95, + 0x85, 0xe3, 0xf1, 0x78, 0xfa, 0x55, 0x5c, 0x9f, 0x56, 0x21, 0x28, 0x00, + 0xe7, 0x9b, 0x37, 0x6f, 0x96, 0x16, 0x17, 0x17, 0x4b, 0xed, 0xec, 0xec, + 0x5a, 0x29, 0x7e, 0x68, 0xdc, 0xb8, 0x71, 0x1b, 0xa1, 0x50, 0x28, 0x0d, + 0x08, 0x08, 0x28, 0x05, 0xe3, 0x58, 0x42, 0x9d, 0x13, 0x8c, 0x9a, 0x38, + 0x84, 0xa3, 0x76, 0xee, 0xdc, 0x79, 0x90, 0x10, 0x42, 0x7e, 0xf9, 0xe5, + 0x97, 0x5c, 0x00, 0xf3, 0xc0, 0x18, 0xca, 0x6a, 0x1b, 0x91, 0xa9, 0xa9, + 0xa9, 0x5a, 0xc7, 0x4e, 0x36, 0x36, 0x36, 0x8e, 0x39, 0x39, 0x39, 0x65, + 0x42, 0xa1, 0x90, 0xd6, 0xd4, 0xd4, 0xf4, 0x04, 0xe3, 0x9c, 0x61, 0x30, + 0xca, 0xcf, 0x30, 0x07, 0x28, 0x3d, 0xf7, 0x43, 0x43, 0x43, 0x65, 0x1f, + 0x3f, 0x7e, 0xa4, 0x01, 0x04, 0x01, 0xb8, 0x00, 0xd6, 0xb9, 0x8e, 0x91, + 0x91, 0x91, 0xb1, 0x62, 0xd5, 0x4c, 0x99, 0x86, 0x0d, 0x1b, 0xb6, 0x10, + 0x0a, 0x85, 0xd2, 0xc4, 0xc4, 0x44, 0x29, 0xca, 0x3d, 0xde, 0xf2, 0x01, + 0xb8, 0xdf, 0xb9, 0x73, 0x47, 0x24, 0x16, 0x8b, 0xe5, 0xf5, 0xea, 0xd5, + 0xfb, 0x24, 0xa0, 0x14, 0x45, 0x19, 0x44, 0x45, 0x45, 0x7d, 0x94, 0x4a, + 0xa5, 0xa4, 0x61, 0xc3, 0x86, 0xf3, 0xd4, 0x94, 0xb1, 0xe0, 0xf4, 0xe9, + 0xd3, 0xf7, 0x09, 0x21, 0xc4, 0xcd, 0xcd, 0xed, 0x12, 0xd4, 0x4f, 0x0e, + 0x68, 0xf7, 0xe8, 0xd1, 0x63, 0x17, 0x21, 0x84, 0x5c, 0xb9, 0x72, 0x25, + 0x52, 0xa5, 0xfc, 0x74, 0x82, 0x82, 0x82, 0xe2, 0x08, 0x21, 0xa4, 0x4b, + 0x97, 0x2e, 0x5b, 0x51, 0x85, 0x73, 0x30, 0x7d, 0x7d, 0x7d, 0xe3, 0xeb, + 0xd7, 0xaf, 0x3f, 0x66, 0x1d, 0x92, 0x5d, 0x45, 0x15, 0x13, 0x11, 0x9e, + 0x9e, 0x9e, 0xbd, 0xd4, 0x78, 0xe4, 0x56, 0x8b, 0x86, 0x86, 0x86, 0x60, + 0xd8, 0xb0, 0x61, 0xa3, 0x86, 0x0c, 0x19, 0x32, 0x82, 0xa2, 0xa8, 0x9a, + 0x0c, 0xb2, 0x28, 0x36, 0x0f, 0x75, 0x01, 0x4c, 0xe3, 0xf3, 0xf9, 0x41, + 0x63, 0xc7, 0x8e, 0x4d, 0x19, 0x37, 0x6e, 0xdc, 0x21, 0x94, 0x6f, 0xbd, + 0xd2, 0x02, 0xe3, 0xe0, 0xc3, 0xa8, 0x92, 0xc7, 0x10, 0xe5, 0x5b, 0xba, + 0xb4, 0x27, 0x4c, 0x98, 0x70, 0x64, 0xd4, 0xa8, 0x51, 0x29, 0x3c, 0x1e, + 0xef, 0x1e, 0x80, 0xa9, 0x60, 0x1c, 0x82, 0xe8, 0xa0, 0xfa, 0x4e, 0x92, + 0xaa, 0x5b, 0xb7, 0x6e, 0xe3, 0xd1, 0xa3, 0x47, 0xcf, 0x30, 0x34, 0x34, + 0x54, 0x77, 0x55, 0x84, 0xb6, 0xab, 0xab, 0xeb, 0x3a, 0x42, 0x08, 0x19, + 0x35, 0x6a, 0xd4, 0x5c, 0x1e, 0x8f, 0x37, 0x73, 0xfd, 0xfa, 0xf5, 0xf9, + 0x4f, 0x9e, 0x3c, 0xf9, 0xb8, 0x7a, 0xf5, 0xea, 0x64, 0x8a, 0xa2, 0xfe, + 0x98, 0x36, 0x6d, 0xda, 0x87, 0xc0, 0xc0, 0xc0, 0xf4, 0xde, 0xbd, 0x7b, + 0x47, 0x03, 0x68, 0x02, 0xc0, 0x20, 0x26, 0x26, 0x26, 0xb7, 0xb8, 0xb8, + 0x98, 0xd6, 0xd2, 0xd2, 0xfa, 0x01, 0x8c, 0x23, 0x14, 0x7d, 0xf6, 0x31, + 0xd5, 0xd2, 0xd2, 0xfa, 0x41, 0x28, 0x14, 0xd2, 0x31, 0x31, 0x31, 0xb9, + 0x60, 0x9c, 0x70, 0x54, 0xea, 0xb0, 0x8d, 0xcf, 0xe7, 0x6b, 0x6e, 0xdc, + 0xb8, 0xf1, 0x30, 0x21, 0x84, 0x3c, 0x7a, 0xf4, 0xa8, 0x0c, 0xe5, 0x77, + 0xd6, 0x3b, 0x6f, 0xd9, 0xb2, 0x25, 0x9f, 0x10, 0x42, 0x82, 0x82, 0x82, + 0x42, 0x2d, 0x2d, 0x2d, 0xab, 0x32, 0xd0, 0xd5, 0xc6, 0x5f, 0xa7, 0x4e, + 0x1d, 0xeb, 0x73, 0xe7, 0xce, 0x5d, 0x65, 0x9d, 0x5b, 0x49, 0x28, 0x8a, + 0x9a, 0xaa, 0x24, 0x3f, 0x7f, 0xe7, 0x55, 0x6a, 0x02, 0x00, 0x5e, 0x8f, + 0x1e, 0x3d, 0x12, 0x13, 0x42, 0xc8, 0xf4, 0xe9, 0xd3, 0x95, 0xaf, 0x61, + 0xe1, 0x37, 0x68, 0xd0, 0xa0, 0x8f, 0x8a, 0x83, 0xb7, 0xff, 0xc8, 0x55, + 0x6a, 0x56, 0x56, 0x56, 0x76, 0x09, 0x09, 0x09, 0xb9, 0x32, 0x99, 0x8c, + 0x34, 0x6b, 0xd6, 0x6c, 0x35, 0x2a, 0xb6, 0x2d, 0xd5, 0x7b, 0xce, 0x01, + 0xc0, 0xd4, 0xc4, 0xc4, 0xe4, 0x70, 0x46, 0x46, 0x86, 0xac, 0xa8, 0xa8, + 0xa8, 0xac, 0x7e, 0xfd, 0xfa, 0x8e, 0xca, 0x75, 0xf0, 0x05, 0x0e, 0xe1, + 0x5e, 0x02, 0xb0, 0x1a, 0x33, 0x66, 0xcc, 0x95, 0xd2, 0xd2, 0x52, 0xb9, + 0x4c, 0x26, 0xa3, 0x3d, 0x3c, 0x3c, 0xf6, 0x03, 0xb0, 0xdc, 0xbf, 0x7f, + 0x7f, 0x54, 0x25, 0x0e, 0xe1, 0x14, 0x0e, 0x86, 0xf8, 0x00, 0xda, 0x1e, + 0x3f, 0x7e, 0xbc, 0xb0, 0xb4, 0xb4, 0x54, 0x56, 0x52, 0x52, 0x42, 0x9f, + 0x3f, 0x7f, 0x3e, 0x09, 0x4c, 0xbb, 0x31, 0xec, 0xdc, 0xb9, 0xf3, 0x4d, + 0x42, 0x08, 0x89, 0x8c, 0x8c, 0xfc, 0x60, 0x62, 0x62, 0xf2, 0xc9, 0x8b, + 0xa9, 0xae, 0xae, 0xae, 0x49, 0x70, 0x70, 0xf0, 0x7b, 0x42, 0x08, 0x69, + 0xd9, 0xb2, 0xa5, 0x1f, 0x18, 0xe7, 0x30, 0x55, 0x79, 0x6b, 0x57, 0x47, + 0x8d, 0xe2, 0xef, 0xd5, 0xab, 0xd7, 0x1d, 0x36, 0x3d, 0x95, 0x79, 0x6b, + 0xb7, 0x68, 0xde, 0xbc, 0xf9, 0x1d, 0xa9, 0x54, 0x4a, 0x92, 0x92, 0x92, + 0xb2, 0x75, 0x75, 0x75, 0x3f, 0x39, 0x97, 0x33, 0x33, 0x33, 0xab, 0x4c, + 0x26, 0x35, 0x7d, 0x7c, 0x7c, 0x6e, 0xb0, 0xed, 0xf5, 0x52, 0x25, 0x69, + 0xad, 0x4e, 0x1e, 0xf4, 0x87, 0x0f, 0x1f, 0x7e, 0x8d, 0x75, 0x1c, 0x14, + 0x25, 0x10, 0x08, 0x3e, 0xf9, 0x26, 0x11, 0x08, 0x04, 0xfa, 0xf7, 0xef, + 0xdf, 0x7f, 0x43, 0x08, 0x21, 0xfd, 0xfb, 0xf7, 0x57, 0x5c, 0x6d, 0xa8, + 0x80, 0x07, 0xc0, 0x35, 0x28, 0x28, 0x48, 0xf4, 0xfa, 0xf5, 0xeb, 0xfc, + 0xc4, 0xc4, 0x44, 0x61, 0x60, 0x60, 0x60, 0x29, 0x98, 0xab, 0x0e, 0x95, + 0xeb, 0x5b, 0x77, 0xf4, 0xe8, 0xd1, 0xe7, 0x08, 0x21, 0xe4, 0xc5, 0x8b, + 0x17, 0x59, 0x9b, 0x37, 0x6f, 0x8e, 0x03, 0xa3, 0x23, 0x8c, 0xbd, 0xbd, + 0xbd, 0x43, 0x62, 0x63, 0x63, 0x8b, 0xf2, 0xf2, 0xf2, 0x64, 0xcb, 0x96, + 0x2d, 0x0b, 0x66, 0xcb, 0x1f, 0x66, 0x66, 0x66, 0xb6, 0xb9, 0xb9, 0xb9, + 0x25, 0x21, 0x21, 0x21, 0x65, 0x60, 0xbc, 0x58, 0xeb, 0x02, 0x30, 0x34, + 0x31, 0x31, 0xd9, 0x9d, 0x9b, 0x9b, 0x2b, 0xff, 0xf8, 0xf1, 0x63, 0xb1, + 0x8a, 0x37, 0xef, 0xda, 0xe4, 0x17, 0x3d, 0x7a, 0xf4, 0x18, 0x4c, 0xd3, + 0x34, 0x39, 0x79, 0xf2, 0xa4, 0x10, 0xc0, 0x44, 0xd4, 0xfc, 0x46, 0x95, + 0xda, 0x3a, 0x84, 0x53, 0x50, 0xdb, 0x6b, 0xd5, 0xaa, 0xbd, 0x4a, 0xed, + 0xbf, 0x08, 0xfd, 0x03, 0x07, 0x0e, 0xbc, 0x62, 0x65, 0x70, 0x0f, 0x94, + 0x64, 0xb0, 0x6f, 0xdf, 0xbe, 0x63, 0x15, 0x4e, 0x8b, 0x04, 0x02, 0x41, + 0x7d, 0xf6, 0xcf, 0x9f, 0x1c, 0x6e, 0x25, 0x25, 0x25, 0x15, 0x6a, 0x69, + 0x69, 0x7d, 0xaa, 0x23, 0x3e, 0x9f, 0xaf, 0xff, 0xe2, 0xc5, 0x8b, 0x64, + 0x99, 0x4c, 0x46, 0xec, 0xed, 0xed, 0xd7, 0xa1, 0xbc, 0x4f, 0xb3, 0xbb, + 0x7a, 0xf5, 0x6a, 0x29, 0x21, 0x84, 0x4c, 0x9c, 0x38, 0x71, 0x0e, 0xaa, + 0xee, 0xe7, 0x74, 0x1a, 0x37, 0x6e, 0xbc, 0x41, 0x2e, 0x97, 0x93, 0x67, + 0xcf, 0x9e, 0x25, 0xf1, 0xf9, 0x7c, 0x7d, 0xa5, 0xf8, 0x0d, 0xa3, 0xa3, + 0xa3, 0x73, 0x54, 0x1c, 0x74, 0xe9, 0x58, 0x59, 0x59, 0x2d, 0x2d, 0x28, + 0x28, 0x90, 0x27, 0x24, 0x24, 0xe4, 0xaa, 0x93, 0x2b, 0x3e, 0x9f, 0xcf, + 0xe7, 0xb1, 0xe7, 0x64, 0x54, 0xd0, 0x9e, 0x34, 0x69, 0xd2, 0x31, 0x42, + 0x08, 0x99, 0x3a, 0x75, 0xea, 0x9f, 0xa8, 0x7c, 0x3c, 0xc2, 0x5f, 0xbb, + 0x76, 0xad, 0x2f, 0x21, 0x84, 0xd8, 0xda, 0xda, 0xee, 0x02, 0xd0, 0x1e, + 0x80, 0x1d, 0x98, 0x76, 0xa0, 0x3a, 0x46, 0xaa, 0xad, 0x83, 0x2e, 0x55, + 0x8c, 0x6e, 0xde, 0xbc, 0x99, 0x59, 0x03, 0x87, 0x70, 0x35, 0xfd, 0x26, + 0x50, 0xee, 0xad, 0xbd, 0x0c, 0x8c, 0x63, 0x31, 0x6b, 0x5d, 0x5d, 0xdd, + 0x93, 0x21, 0x21, 0x21, 0x62, 0x99, 0x4c, 0x26, 0xf7, 0xf2, 0xf2, 0x1a, + 0x52, 0x45, 0xdc, 0x35, 0x72, 0x08, 0xb7, 0x74, 0xe9, 0x52, 0xc5, 0xbd, + 0xce, 0xc6, 0x4f, 0x9e, 0x3c, 0xc9, 0x0f, 0x09, 0x09, 0x29, 0x04, 0xd3, + 0xc6, 0x74, 0x7f, 0xfe, 0xf9, 0xe7, 0x1b, 0xac, 0x53, 0xb1, 0x3e, 0x00, + 0xf4, 0x6b, 0x59, 0x3e, 0xfa, 0x6d, 0xda, 0xb4, 0x39, 0x45, 0xd3, 0x34, + 0x39, 0x77, 0xee, 0xdc, 0x43, 0x28, 0x39, 0xf0, 0xa2, 0x28, 0x4a, 0xd3, + 0xcf, 0xcf, 0xef, 0x09, 0x4d, 0xd3, 0xc4, 0xdd, 0xdd, 0xfd, 0x14, 0x18, + 0xfd, 0x56, 0x5b, 0xf9, 0xac, 0xad, 0xbc, 0x01, 0x4a, 0x0e, 0xe1, 0xc6, + 0x8e, 0x1d, 0xbb, 0x1f, 0x55, 0x18, 0xd6, 0xca, 0x32, 0xa8, 0xfc, 0x4f, + 0x30, 0x0e, 0xdf, 0x3c, 0x52, 0x53, 0x53, 0x65, 0xac, 0x1f, 0x20, 0x75, + 0x57, 0x2f, 0xd7, 0xcd, 0xcf, 0xcf, 0x97, 0xe7, 0xe7, 0xe7, 0x4b, 0x34, + 0x35, 0x35, 0x2d, 0x2b, 0x89, 0xfa, 0xd3, 0x78, 0x3b, 0x30, 0x30, 0x30, + 0x4e, 0x29, 0x8d, 0xd0, 0xd1, 0xd1, 0xb1, 0xf8, 0xf0, 0xe1, 0x43, 0x71, + 0x25, 0xf2, 0xa6, 0x6b, 0x6d, 0x6d, 0xbd, 0x41, 0x26, 0x93, 0x91, 0x43, + 0x87, 0x0e, 0x05, 0x1e, 0x3c, 0x78, 0xf0, 0xae, 0x44, 0x22, 0xa1, 0xeb, + 0xd4, 0xa9, 0xb3, 0x1a, 0x15, 0x9d, 0xc4, 0xe9, 0x8f, 0x1f, 0x3f, 0xfe, + 0x46, 0x4e, 0x4e, 0x8e, 0xe4, 0xc6, 0x8d, 0x1b, 0x89, 0xdb, 0xb6, 0x6d, + 0x8b, 0x63, 0xd3, 0x6a, 0x76, 0xe8, 0xd0, 0xa1, 0xd4, 0xcb, 0x97, 0x2f, + 0xc7, 0x09, 0x85, 0x42, 0xd9, 0xd8, 0xb1, 0x63, 0xaf, 0x42, 0xa9, 0x7f, + 0xe9, 0xd2, 0xa5, 0x4b, 0x1f, 0x99, 0x4c, 0x26, 0x0f, 0x08, 0x08, 0x10, + 0x51, 0x14, 0xb5, 0x9a, 0xc7, 0xe3, 0xad, 0x0b, 0x0c, 0x0c, 0x14, 0x49, + 0xa5, 0x52, 0x79, 0xfb, 0xf6, 0xed, 0x7b, 0xa8, 0xc9, 0x87, 0x00, 0x80, + 0x57, 0x78, 0x78, 0xb8, 0xf8, 0xf5, 0xeb, 0xd7, 0x1f, 0x77, 0xef, 0xde, + 0x7d, 0x4b, 0x24, 0x12, 0xd1, 0x26, 0x26, 0x26, 0xbf, 0x40, 0x4d, 0x3b, + 0xe9, 0xd4, 0xa9, 0x53, 0x2f, 0x89, 0x44, 0x22, 0x3b, 0x72, 0xe4, 0x48, + 0x21, 0x98, 0x9d, 0x88, 0xd5, 0xdd, 0x02, 0xa4, 0xc1, 0xd6, 0x93, 0xcd, + 0xea, 0xd5, 0xab, 0xa3, 0x08, 0x21, 0xa4, 0x77, 0xef, 0xde, 0x33, 0x51, + 0xf5, 0xed, 0x4e, 0x40, 0xed, 0x1c, 0xc2, 0xf1, 0xfb, 0xf4, 0xe9, 0x33, + 0x8b, 0x10, 0x42, 0x56, 0xaf, 0x5e, 0x1d, 0x05, 0x66, 0x5c, 0xaf, 0x85, + 0x6f, 0xe4, 0x6f, 0xed, 0xef, 0x44, 0x5d, 0x02, 0x79, 0xfd, 0xfa, 0xf5, + 0x9b, 0xd8, 0xb5, 0x6b, 0xd7, 0x8e, 0x00, 0xd0, 0xaf, 0x5f, 0xbf, 0x89, + 0xbe, 0xbe, 0xbe, 0x1b, 0xf1, 0xf9, 0x6c, 0x14, 0xd5, 0xb7, 0x6f, 0xdf, + 0xc1, 0x0e, 0x0e, 0x0e, 0xe6, 0xf3, 0xe7, 0xcf, 0x4f, 0xa2, 0x69, 0xfa, + 0x01, 0x2a, 0x5f, 0x91, 0xa1, 0x01, 0xa4, 0xad, 0x5f, 0xbf, 0x3e, 0x38, + 0x20, 0x20, 0xc0, 0xd3, 0xdf, 0xdf, 0xff, 0xea, 0xfe, 0xfd, 0xfb, 0xf7, + 0xf1, 0xf9, 0x7c, 0xfe, 0xf4, 0xe9, 0xd3, 0x67, 0xf2, 0xf9, 0x7c, 0xfe, + 0x86, 0x0d, 0x1b, 0x82, 0xc1, 0xac, 0x4e, 0x7e, 0xc9, 0x36, 0x69, 0x6a, + 0xec, 0xd8, 0xb1, 0x53, 0xe7, 0xcd, 0x9b, 0x37, 0xb5, 0xa0, 0xa0, 0x80, + 0x6e, 0xda, 0xb4, 0x69, 0xda, 0xd1, 0xa3, 0x47, 0x3b, 0x81, 0x99, 0x9d, + 0xfd, 0xc4, 0xe9, 0xd3, 0xa7, 0x4f, 0x05, 0x04, 0x04, 0xdc, 0x02, 0xc0, + 0x3b, 0x75, 0xea, 0xd4, 0x5f, 0x06, 0x06, 0x06, 0x3a, 0xb7, 0x6f, 0xdf, + 0xbe, 0x93, 0x94, 0x94, 0x94, 0x48, 0xd3, 0x34, 0xdd, 0xac, 0x59, 0x33, + 0xa7, 0x69, 0xd3, 0xa6, 0x4d, 0x35, 0x33, 0x33, 0xd3, 0xfa, 0xe1, 0x87, + 0x1f, 0xd2, 0x25, 0x12, 0x49, 0x0c, 0x98, 0xd9, 0xb5, 0x5b, 0x60, 0x8c, + 0x6f, 0x55, 0xa5, 0x6c, 0x0c, 0x66, 0x46, 0x4b, 0x07, 0xc0, 0x8f, 0x60, + 0x56, 0x0a, 0x0a, 0x01, 0xf0, 0xba, 0x77, 0xef, 0x3e, 0x60, 0xe7, 0xce, + 0x9d, 0x1b, 0xce, 0x9e, 0x3d, 0xfb, 0x57, 0x62, 0x62, 0x62, 0x42, 0x69, + 0x69, 0x69, 0xa9, 0xa3, 0xa3, 0xa3, 0xd3, 0x8c, 0x19, 0x33, 0xa6, 0xea, + 0xea, 0xea, 0x6a, 0x4c, 0x99, 0x32, 0xe5, 0x0d, 0x98, 0xad, 0x8a, 0x8a, + 0xfc, 0xc6, 0xff, 0xfa, 0xeb, 0xaf, 0x4f, 0xef, 0xdd, 0xbb, 0xd7, 0xed, + 0xc9, 0x93, 0x27, 0x81, 0xbb, 0x76, 0xed, 0xda, 0x95, 0x9b, 0x9b, 0x9b, + 0x33, 0x66, 0xcc, 0x98, 0xef, 0x9d, 0x9d, 0x9d, 0x2d, 0x76, 0xee, 0xdc, + 0x59, 0x98, 0x94, 0x94, 0x14, 0x04, 0x95, 0x59, 0xa8, 0xba, 0x75, 0xeb, + 0x3a, 0x8c, 0x18, 0x31, 0xa2, 0xeb, 0x8b, 0x17, 0x2f, 0x24, 0xa1, 0xa1, + 0xa1, 0x0a, 0x27, 0x64, 0xaa, 0xc8, 0x1f, 0x3c, 0x78, 0x70, 0xff, 0xd9, + 0xb3, 0x67, 0x33, 0xfb, 0xf7, 0xef, 0xef, 0x7c, 0xed, 0xda, 0xb5, 0xab, + 0x37, 0x6f, 0xde, 0xbc, 0xa6, 0xa3, 0xa3, 0xa3, 0x33, 0x78, 0xf0, 0xe0, + 0xa1, 0x5d, 0xba, 0x74, 0xb1, 0xbf, 0x71, 0xe3, 0x46, 0xd9, 0xe3, 0xc7, + 0x8f, 0x03, 0x95, 0xcb, 0xbf, 0x75, 0xeb, 0xd6, 0xee, 0xcd, 0x9b, 0x37, + 0x77, 0x2e, 0x29, 0x29, 0x29, 0x75, 0x76, 0x76, 0x76, 0x19, 0x37, 0x6e, + 0xdc, 0x38, 0x7b, 0x7b, 0xfb, 0x06, 0x8b, 0x16, 0x2d, 0xca, 0x0b, 0x0b, + 0x0b, 0xfb, 0xbd, 0x92, 0x6f, 0xa1, 0x5e, 0xbd, 0x7a, 0x0e, 0xf7, 0xee, + 0xdd, 0xbb, 0xa3, 0xf8, 0xff, 0xd4, 0xd4, 0xd4, 0xf8, 0xaa, 0xea, 0xae, + 0x79, 0xf3, 0xe6, 0xee, 0x7f, 0xfd, 0xf5, 0xd7, 0xd9, 0xc4, 0xc4, 0xc4, + 0xac, 0x4b, 0x97, 0x2e, 0x5d, 0x43, 0xf5, 0xab, 0x13, 0x8a, 0x33, 0xcb, + 0xe9, 0x00, 0x4e, 0xc8, 0xe5, 0xf2, 0xeb, 0xa7, 0x4f, 0x9f, 0xf6, 0x40, + 0xb9, 0x33, 0x39, 0x82, 0xf2, 0x55, 0xd1, 0x9a, 0x40, 0x4e, 0x9c, 0x38, + 0x71, 0x0d, 0xc0, 0x1d, 0x30, 0x8e, 0x31, 0xf2, 0x51, 0x7e, 0xbe, 0xb3, + 0x3a, 0x78, 0x07, 0x0f, 0x1e, 0xf4, 0xed, 0xd7, 0xaf, 0x5f, 0xd7, 0x75, + 0xeb, 0xd6, 0x35, 0x5d, 0xb9, 0x72, 0xe5, 0x42, 0x54, 0x6c, 0x2b, 0xb2, + 0xc8, 0xc8, 0x48, 0xff, 0x6b, 0xd7, 0xae, 0xcd, 0x5f, 0xba, 0x74, 0xe9, + 0xc2, 0x8b, 0x17, 0x2f, 0x76, 0x59, 0xb1, 0x62, 0x85, 0x39, 0x18, 0x8f, + 0xf0, 0xaf, 0x00, 0x9c, 0x3a, 0x78, 0xf0, 0x60, 0xc4, 0xc1, 0x83, 0x07, + 0xdb, 0x82, 0xb9, 0xca, 0x26, 0xc5, 0xd5, 0xd5, 0xb5, 0x5d, 0xe3, 0xc6, + 0x8d, 0x4d, 0xcf, 0x9d, 0x3b, 0x57, 0x2c, 0x16, 0x8b, 0xef, 0xa3, 0xe2, + 0xd9, 0x1e, 0x4a, 0x2c, 0x16, 0xdf, 0xbf, 0x75, 0xeb, 0x56, 0xc9, 0xf0, + 0xe1, 0xc3, 0x4d, 0x5b, 0xb4, 0x68, 0xe1, 0x1e, 0x11, 0x11, 0xf1, 0xc9, + 0x49, 0xe0, 0x92, 0x25, 0x4b, 0x7e, 0x2c, 0x28, 0x28, 0xf0, 0x04, 0x40, + 0xea, 0xd6, 0xad, 0x5b, 0xd7, 0xcb, 0xcb, 0xab, 0xa7, 0xa9, 0xa9, 0xa9, + 0xb1, 0x48, 0x24, 0x22, 0x33, 0x67, 0xce, 0x0c, 0x66, 0xcb, 0x56, 0x0e, + 0x20, 0x79, 0xe3, 0xc6, 0x8d, 0xc7, 0xda, 0xb4, 0x69, 0x33, 0xab, 0x7b, + 0xf7, 0xee, 0x6d, 0x22, 0x23, 0x23, 0x23, 0xfd, 0xfd, 0xfd, 0xef, 0x44, + 0x45, 0x45, 0x45, 0x99, 0x98, 0x98, 0x98, 0x38, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3a, 0x3a, 0x36, 0x6e, 0xd2, 0xa4, 0x49, 0x85, 0x7b, 0x37, 0x57, 0xac, + 0x58, 0x31, 0x1d, 0xc0, 0x48, 0x47, 0x47, 0xc7, 0x26, 0xce, 0xce, 0xce, + 0x4e, 0x7a, 0x7a, 0x7a, 0x3a, 0x37, 0x6f, 0xde, 0x14, 0x4f, 0x9b, 0x36, + 0xed, 0x21, 0x21, 0x44, 0x71, 0x2e, 0xf6, 0x13, 0xba, 0xba, 0xba, 0xd4, + 0xc1, 0x83, 0x07, 0x7d, 0xd4, 0xd5, 0xe9, 0xc1, 0x83, 0x07, 0x0f, 0x84, + 0x86, 0x86, 0x3e, 0xab, 0x61, 0x1d, 0x29, 0x23, 0x05, 0x10, 0x36, 0x7b, + 0xf6, 0xec, 0xa7, 0xb7, 0x6f, 0xdf, 0xee, 0xb2, 0x7f, 0xff, 0xfe, 0x2d, + 0x83, 0x06, 0x0d, 0xf2, 0x7a, 0xf2, 0xe4, 0xc9, 0x13, 0x00, 0x94, 0xab, + 0xab, 0x6b, 0xa7, 0x2f, 0x88, 0xf3, 0x33, 0x5c, 0x5d, 0x5d, 0x5b, 0xd9, + 0xda, 0xda, 0xd6, 0x33, 0x31, 0x31, 0xa9, 0xaf, 0xad, 0xad, 0x4d, 0xd1, + 0x34, 0x4d, 0x8d, 0x1b, 0x37, 0x6e, 0x4c, 0x5e, 0x5e, 0x5e, 0x72, 0x6a, + 0x6a, 0xea, 0x87, 0xa8, 0xa8, 0xa8, 0x57, 0x8a, 0x3a, 0x39, 0x72, 0xe4, + 0xc8, 0x89, 0x26, 0x4d, 0x9a, 0x34, 0x0e, 0x0b, 0x0b, 0x0b, 0xcf, 0xcc, + 0xcc, 0xcc, 0xea, 0xd3, 0xa7, 0x4f, 0xef, 0x4e, 0x9d, 0x3a, 0xb5, 0xe7, + 0xf3, 0xf9, 0xbc, 0x35, 0x6b, 0xd6, 0x14, 0x44, 0x47, 0x47, 0xdf, 0x46, + 0xf5, 0x5b, 0xa2, 0x0a, 0xf2, 0xf3, 0xf3, 0xb7, 0xcd, 0x9e, 0x3d, 0xbb, + 0xdb, 0x85, 0x0b, 0x17, 0xec, 0x0e, 0x1c, 0x38, 0x70, 0xa4, 0x6f, 0xdf, + 0xbe, 0x5d, 0xa0, 0xa2, 0x13, 0x77, 0xee, 0xdc, 0xb9, 0x9c, 0x75, 0xe8, + 0x53, 0x41, 0x3e, 0x77, 0xef, 0xde, 0xbd, 0xf3, 0xd5, 0xab, 0x57, 0xaa, + 0xce, 0xb1, 0x64, 0xcf, 0x9e, 0x3d, 0x7b, 0xa8, 0xa3, 0xa3, 0x33, 0x50, + 0x2e, 0x97, 0x23, 0x34, 0x34, 0xf4, 0x0e, 0x6a, 0x36, 0x03, 0x2c, 0x07, + 0x10, 0xb3, 0x79, 0xf3, 0xe6, 0xdb, 0xe3, 0xc7, 0x8f, 0x1f, 0xa9, 0xb2, + 0x48, 0x27, 0x7a, 0xfc, 0xf8, 0xf1, 0xde, 0xb3, 0x67, 0xcf, 0x76, 0x1b, + 0x3d, 0x7a, 0xb4, 0xed, 0xb3, 0x67, 0xcf, 0x9e, 0xfa, 0xf9, 0xf9, 0xfd, + 0x25, 0x97, 0xcb, 0xe5, 0x83, 0x06, 0x0d, 0x1a, 0xec, 0xe2, 0xe2, 0xd2, + 0x64, 0xcf, 0x9e, 0x3d, 0xc5, 0xaf, 0x5e, 0xbd, 0xda, 0x0b, 0xa6, 0x9d, + 0xd6, 0x76, 0x55, 0xb3, 0xda, 0xf8, 0x4f, 0x9c, 0x38, 0x51, 0x1a, 0x10, + 0x10, 0xf0, 0x07, 0xaa, 0xd6, 0x15, 0xf9, 0x6f, 0xde, 0xbc, 0xd9, 0xb0, + 0x6f, 0xdf, 0xbe, 0xf6, 0xb3, 0x67, 0xcf, 0x36, 0x5f, 0xb1, 0x62, 0xc5, + 0xfa, 0x65, 0xcb, 0x96, 0x79, 0x03, 0xc0, 0xb6, 0x6d, 0xdb, 0xf6, 0x7a, + 0x78, 0x78, 0xb4, 0xbb, 0x73, 0xe7, 0x4e, 0x60, 0x72, 0x72, 0x72, 0x72, + 0x5e, 0x5e, 0x5e, 0x9e, 0xb9, 0xb9, 0xb9, 0x85, 0x97, 0x97, 0x57, 0x9f, + 0x2e, 0x5d, 0xba, 0xb4, 0xbd, 0x77, 0xef, 0x9e, 0xd8, 0xcf, 0xcf, 0xef, + 0x52, 0x0d, 0xea, 0x4c, 0x1d, 0x52, 0x3f, 0x3f, 0xbf, 0x33, 0x2f, 0x5e, + 0xbc, 0xf0, 0xea, 0xd1, 0xa3, 0x87, 0xf3, 0xb3, 0x67, 0xcf, 0x9e, 0x5d, + 0xb9, 0x72, 0xe5, 0xb2, 0x5c, 0x2e, 0x97, 0x0f, 0x19, 0x32, 0x64, 0x68, + 0x9b, 0x36, 0x6d, 0x9c, 0x02, 0x02, 0x02, 0xc4, 0x37, 0x6e, 0xdc, 0x38, + 0x8d, 0x8a, 0x7d, 0x26, 0x0d, 0x20, 0xf5, 0xc2, 0x85, 0x0b, 0xb1, 0x7b, + 0xf6, 0xec, 0x71, 0x01, 0x80, 0xcd, 0x9b, 0x37, 0xbf, 0x02, 0xa3, 0xe7, + 0x94, 0x75, 0x8a, 0x3c, 0x3e, 0x3e, 0x3e, 0x1a, 0x00, 0xda, 0xb4, 0x69, + 0x53, 0x87, 0x1d, 0x84, 0x8b, 0x01, 0xd0, 0x37, 0x6f, 0xde, 0xbc, 0xf1, + 0xfb, 0xef, 0xbf, 0xbb, 0x51, 0x14, 0x85, 0xc4, 0xc4, 0xc4, 0x14, 0xb6, + 0x1e, 0x79, 0xeb, 0xd7, 0xaf, 0xdf, 0x6e, 0x6a, 0x6a, 0xaa, 0x3b, 0x70, + 0xe0, 0xc0, 0x67, 0x00, 0x2e, 0xb1, 0xf5, 0x42, 0xe5, 0xe7, 0xe7, 0xef, + 0x5f, 0xb3, 0x66, 0xcd, 0x88, 0xdd, 0xbb, 0x77, 0x5b, 0xaf, 0x5b, 0xb7, + 0x6e, 0xeb, 0xec, 0xd9, 0xb3, 0x27, 0xa0, 0xf6, 0xbb, 0xa1, 0x34, 0x8f, + 0x1c, 0x39, 0x72, 0x88, 0xa2, 0x28, 0xe8, 0xeb, 0xeb, 0xe7, 0x1f, 0x3d, + 0x7a, 0xf4, 0x3b, 0x30, 0x5e, 0xa1, 0x2b, 0x20, 0x93, 0xc9, 0x64, 0x53, + 0xa7, 0x4e, 0x9d, 0x84, 0x6f, 0xb3, 0x72, 0x29, 0xa1, 0x69, 0x3a, 0x70, + 0xef, 0xde, 0xbd, 0xe9, 0x5b, 0xb6, 0x6c, 0xa9, 0xdf, 0xbb, 0x77, 0xef, + 0x81, 0xfe, 0xfe, 0xfe, 0xe7, 0xbe, 0x51, 0xdc, 0xff, 0x71, 0xfc, 0xfd, + 0xfd, 0x3f, 0x4c, 0x9b, 0x36, 0xad, 0xc5, 0xda, 0xb5, 0x6b, 0x87, 0x5b, + 0x58, 0x58, 0x24, 0x0b, 0x85, 0xc2, 0xc2, 0xd1, 0xa3, 0x47, 0x8f, 0xee, + 0xd4, 0xa9, 0x53, 0x87, 0xd7, 0xaf, 0x5f, 0xcb, 0x9d, 0x9d, 0x9d, 0xd5, + 0x0e, 0x60, 0x65, 0x32, 0x99, 0xd6, 0xa3, 0x47, 0x8f, 0x82, 0x7c, 0x7d, + 0x7d, 0x0f, 0x94, 0x94, 0x94, 0x94, 0x4c, 0x98, 0x30, 0x61, 0x92, 0xbb, + 0xbb, 0x7b, 0xfd, 0xa3, 0x47, 0x8f, 0x0a, 0xe3, 0xe3, 0xe3, 0xaf, 0x80, + 0x91, 0x37, 0x02, 0x20, 0x77, 0xee, 0xdc, 0xb9, 0x77, 0x3c, 0x3c, 0x3c, + 0x06, 0x1e, 0x3b, 0x76, 0x6c, 0xf7, 0x77, 0xdf, 0x7d, 0xd7, 0x33, 0x38, + 0x38, 0xf8, 0x09, 0x45, 0x51, 0x68, 0xc5, 0xd0, 0x72, 0xe4, 0xc8, 0x91, + 0x23, 0xde, 0xbe, 0x7d, 0x1b, 0x05, 0x40, 0x12, 0x1b, 0x1b, 0x7b, 0xe5, + 0xe4, 0xc9, 0x93, 0x73, 0x27, 0x4e, 0x9c, 0xd8, 0xe0, 0xe6, 0xcd, 0x9b, + 0x37, 0x4f, 0x9e, 0x3c, 0x79, 0x4c, 0x4b, 0x4b, 0x4b, 0x73, 0xe2, 0xc4, + 0x89, 0x93, 0xd5, 0x4c, 0x8c, 0x88, 0x33, 0x33, 0x33, 0xaf, 0x2e, 0x58, + 0xb0, 0x60, 0x96, 0xaf, 0xaf, 0x6f, 0xdd, 0x37, 0x6f, 0xde, 0x44, 0x1c, + 0x3d, 0x7a, 0xf4, 0xd8, 0x87, 0x0f, 0x1f, 0x52, 0x1c, 0x1d, 0x1d, 0x1d, + 0xdd, 0xdd, 0xdd, 0xdd, 0x5a, 0xb5, 0x6a, 0xe5, 0xda, 0xac, 0x59, 0x33, + 0xe7, 0x94, 0x94, 0x94, 0x84, 0x2f, 0x2c, 0x22, 0xad, 0xd0, 0xd0, 0x50, + 0x01, 0x21, 0x04, 0xd1, 0xd1, 0xd1, 0xd3, 0x62, 0x62, 0x62, 0x3c, 0x25, + 0x12, 0x89, 0x44, 0x2c, 0x16, 0x8b, 0x93, 0x93, 0x93, 0x53, 0x8e, 0x1f, + 0x3f, 0x7e, 0x4c, 0x31, 0x06, 0xf9, 0x12, 0xf8, 0x7c, 0xbe, 0x46, 0x87, + 0x0e, 0x1d, 0x3a, 0x1b, 0x1a, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x59, 0xdb, + 0xda, 0xda, 0xea, 0x00, 0xc0, 0x98, 0x31, 0x63, 0x86, 0x64, 0x66, 0x66, + 0x36, 0x29, 0x2a, 0x2a, 0x2a, 0x7c, 0xff, 0xfe, 0x7d, 0x74, 0x5a, 0x5a, + 0xda, 0x87, 0xaf, 0xac, 0x6a, 0x85, 0xbf, 0x9d, 0x82, 0xd2, 0xd2, 0xd2, + 0xd5, 0x03, 0x07, 0x0e, 0xb4, 0x79, 0xf1, 0xe2, 0x45, 0xd7, 0x73, 0xe7, + 0xce, 0xfd, 0xd9, 0xa1, 0x43, 0x87, 0x4e, 0xd1, 0xd1, 0xd1, 0xaf, 0x00, + 0x40, 0x5b, 0x5b, 0x5b, 0xc7, 0xdd, 0xdd, 0xbd, 0xbd, 0x11, 0x83, 0x8d, + 0xb9, 0xb9, 0xb9, 0x80, 0xc7, 0xe3, 0x61, 0xfc, 0xf8, 0xf1, 0x63, 0x8b, + 0x8a, 0x8a, 0xd2, 0x0a, 0x0b, 0x0b, 0x0b, 0xa2, 0xa3, 0xa3, 0xdf, 0x64, + 0x65, 0x65, 0x65, 0x7d, 0x65, 0x7a, 0x6a, 0x82, 0x38, 0x2c, 0x2c, 0xec, + 0xf0, 0xde, 0xbd, 0x7b, 0xbf, 0xf3, 0xf6, 0xf6, 0xee, 0xa2, 0xab, 0xab, + 0x7b, 0xd3, 0xcf, 0xcf, 0xef, 0x02, 0x00, 0x8c, 0x18, 0x31, 0x62, 0x54, + 0xbf, 0x7e, 0xfd, 0x3a, 0x1e, 0x38, 0x70, 0xa0, 0x38, 0x24, 0x24, 0xe4, + 0x28, 0x18, 0xbd, 0xf4, 0xc9, 0x78, 0xe7, 0xf1, 0x78, 0xda, 0x35, 0x90, + 0x4f, 0x54, 0x25, 0x6f, 0x3c, 0x1e, 0xef, 0xab, 0xef, 0xaa, 0xd6, 0xd0, + 0xd0, 0xd0, 0x4c, 0x4d, 0x4d, 0x4d, 0xf5, 0xf3, 0xf3, 0xbb, 0x1c, 0x1e, + 0x1e, 0x1e, 0x9e, 0x99, 0x99, 0x99, 0xe9, 0xe0, 0xe0, 0xd0, 0xb8, 0x6f, + 0xdf, 0xbe, 0x03, 0xeb, 0xd6, 0xad, 0xcb, 0xdf, 0xb3, 0x67, 0x4f, 0x3e, + 0x3e, 0xef, 0xb7, 0x08, 0x00, 0x71, 0x40, 0x40, 0x40, 0xc9, 0x88, 0x11, + 0x23, 0x0c, 0x4e, 0x9d, 0x3a, 0x75, 0xfc, 0xdc, 0xb9, 0x73, 0xc7, 0x79, + 0x3c, 0x1e, 0xcf, 0xc4, 0xc4, 0xc4, 0xe4, 0xc0, 0x81, 0x03, 0x8a, 0x6d, + 0xf0, 0xf2, 0x27, 0x4f, 0x9e, 0x3c, 0x4c, 0x4c, 0x4c, 0xf4, 0xee, 0xd6, + 0xad, 0x9b, 0xdd, 0xb5, 0x6b, 0xd7, 0xae, 0x9e, 0x3f, 0x7f, 0xfe, 0xb4, + 0xa1, 0xa1, 0xa1, 0xd1, 0xcc, 0x99, 0x33, 0x7f, 0x2a, 0x2e, 0x2e, 0xae, + 0xcc, 0x30, 0x14, 0x67, 0x64, 0x64, 0x9c, 0xbb, 0x75, 0xeb, 0xd6, 0xbc, + 0x5e, 0xbd, 0x7a, 0xb5, 0xe3, 0xf3, 0xf9, 0xd4, 0xcd, 0x9b, 0x37, 0x4b, + 0x3f, 0x7e, 0xfc, 0xf8, 0x17, 0x2a, 0xf6, 0x73, 0xb2, 0xd0, 0xd0, 0xd0, + 0xa7, 0x66, 0x66, 0x66, 0xfd, 0xba, 0x74, 0xe9, 0x62, 0x7b, 0xf8, 0xf0, + 0xe1, 0xab, 0x60, 0xfa, 0x74, 0xea, 0xe9, 0xd3, 0xa7, 0xef, 0x76, 0xed, + 0xda, 0xe5, 0xa1, 0xa7, 0xa7, 0xc7, 0x0f, 0x0d, 0x0d, 0x0d, 0x06, 0xdb, + 0x7f, 0x99, 0x9a, 0x9a, 0x5a, 0x9d, 0x3a, 0x75, 0xea, 0xcf, 0x82, 0x82, + 0x02, 0x32, 0x71, 0xe2, 0xc4, 0x40, 0x42, 0xc8, 0x01, 0x42, 0x08, 0x35, + 0x61, 0xc2, 0x84, 0xd6, 0x51, 0x51, 0x51, 0x7d, 0x4e, 0x9f, 0x3e, 0x7d, + 0xaa, 0x55, 0xab, 0x56, 0x2e, 0x85, 0x85, 0x85, 0xd9, 0x4a, 0xdf, 0x91, + 0x02, 0x08, 0xdf, 0xb7, 0x6f, 0x5f, 0xdc, 0x81, 0x03, 0x07, 0x9c, 0x2c, + 0x2c, 0x2c, 0xba, 0x5d, 0xba, 0x74, 0xa9, 0x38, 0x3f, 0x3f, 0xff, 0x12, + 0x54, 0xc6, 0x79, 0xe6, 0xe6, 0xe6, 0x36, 0xe7, 0xcf, 0x9f, 0x3f, 0x27, + 0x12, 0x89, 0xa8, 0xa0, 0xa0, 0xa0, 0x97, 0x23, 0x47, 0x8e, 0x14, 0x03, + 0x18, 0xa8, 0x1c, 0xe6, 0xce, 0x9d, 0x3b, 0xb7, 0x0a, 0x0a, 0x0a, 0x94, + 0x1d, 0x00, 0x2b, 0x1c, 0x2e, 0x16, 0xa2, 0xdc, 0x01, 0xa1, 0x05, 0x18, + 0xe3, 0xfc, 0x5b, 0x1d, 0x97, 0xe5, 0x83, 0xb9, 0xe9, 0x08, 0xec, 0x37, + 0x0a, 0xf1, 0xcf, 0xf8, 0x0c, 0xf9, 0x5b, 0xd0, 0xee, 0xd0, 0xa1, 0xc3, + 0x3a, 0x9a, 0xa6, 0x09, 0x4d, 0xd3, 0xa4, 0x43, 0x87, 0x0e, 0x95, 0xdd, + 0x23, 0xac, 0xe9, 0xef, 0xef, 0x1f, 0x51, 0x5c, 0x5c, 0x5c, 0xd9, 0xf5, + 0x69, 0xaa, 0x08, 0x00, 0xf4, 0xf1, 0xf4, 0xf4, 0x4c, 0x8a, 0x8e, 0x8e, + 0x2e, 0x55, 0xcc, 0xfe, 0xbe, 0x7b, 0xf7, 0x4e, 0xd4, 0xb3, 0x67, 0xcf, + 0x14, 0x30, 0xae, 0xfc, 0x2b, 0xdb, 0x42, 0x58, 0xdd, 0xca, 0xb9, 0xd6, + 0xa2, 0x45, 0x8b, 0x4e, 0x93, 0x6a, 0x98, 0x37, 0x6f, 0xde, 0x1f, 0xec, + 0x37, 0x0c, 0xa7, 0x4e, 0x9d, 0x1a, 0xf4, 0xfe, 0xfd, 0xfb, 0x62, 0xe5, + 0xdf, 0xe5, 0x72, 0x39, 0xfd, 0xfc, 0xf9, 0xf3, 0x92, 0x7e, 0xfd, 0xfa, + 0x65, 0x01, 0x98, 0x8e, 0xea, 0x67, 0xff, 0x4d, 0x2a, 0xb9, 0x4a, 0x4d, + 0xb3, 0x69, 0xd3, 0xa6, 0x33, 0x02, 0x02, 0x02, 0x72, 0x15, 0xf7, 0x4b, + 0x12, 0x42, 0x88, 0x54, 0x2a, 0x95, 0x3f, 0x7a, 0xf4, 0xa8, 0xa4, 0x5d, + 0xbb, 0x76, 0xa9, 0x60, 0x1c, 0x32, 0x29, 0xe7, 0x57, 0x00, 0xc0, 0xab, + 0x75, 0xeb, 0xd6, 0xf1, 0x11, 0x11, 0x11, 0xa5, 0x34, 0xfb, 0x62, 0x51, + 0x51, 0x91, 0x74, 0xc5, 0x8a, 0x15, 0x05, 0x7c, 0x3e, 0xff, 0x37, 0x7c, + 0x7e, 0x2d, 0x19, 0x7f, 0xc3, 0x86, 0x0d, 0xbe, 0x84, 0x10, 0x32, 0x7e, + 0xfc, 0xf8, 0x48, 0x54, 0xbe, 0x42, 0x49, 0x01, 0xb0, 0xb4, 0xb4, 0xb4, + 0xf4, 0x3f, 0x74, 0xe8, 0x90, 0x50, 0x22, 0x91, 0x7c, 0xba, 0x4a, 0xad, + 0xa4, 0xa4, 0x44, 0xb6, 0x75, 0xeb, 0xd6, 0x62, 0x03, 0x03, 0x83, 0x73, + 0xa8, 0xb8, 0x2a, 0xa2, 0x31, 0x6b, 0xd6, 0xac, 0xcd, 0x8a, 0x70, 0xc5, + 0xc5, 0xc5, 0xe2, 0x87, 0x0f, 0x1f, 0x16, 0xf6, 0xec, 0xd9, 0x33, 0x15, + 0xcc, 0x76, 0xb4, 0xca, 0x66, 0xc5, 0x78, 0xe6, 0xe6, 0xe6, 0x1d, 0x65, + 0x32, 0x19, 0x91, 0x4a, 0xa5, 0xb4, 0xa9, 0xa9, 0x69, 0x7b, 0x54, 0x3d, + 0x38, 0xd7, 0x98, 0x3c, 0x79, 0xf2, 0x26, 0x42, 0x08, 0xd9, 0xb6, 0x6d, + 0x5b, 0x0a, 0x6a, 0xb7, 0x7a, 0xa2, 0x9c, 0x3f, 0x2d, 0xa8, 0x38, 0x37, + 0xf9, 0x87, 0xde, 0x37, 0x3c, 0x7b, 0xf6, 0x6c, 0xa2, 0x9a, 0x99, 0x5c, + 0x65, 0x4c, 0x5b, 0xb6, 0x6c, 0x79, 0x5d, 0x2c, 0x16, 0xcb, 0x83, 0x82, + 0x82, 0x9e, 0x9b, 0x9b, 0x9b, 0x37, 0x02, 0x33, 0xb1, 0xa3, 0x0b, 0x80, + 0xa7, 0xa5, 0xa5, 0x65, 0xdc, 0xa6, 0x4d, 0x1b, 0x4f, 0xf6, 0xfb, 0x82, + 0xb5, 0x6b, 0xd7, 0x1e, 0x67, 0x67, 0xb1, 0x1f, 0x40, 0xfd, 0xcc, 0xa0, + 0xd1, 0xd8, 0xb1, 0x63, 0x1f, 0xb3, 0xd7, 0x95, 0x9c, 0x00, 0x60, 0xa6, + 0xee, 0xaa, 0x30, 0x89, 0x44, 0x22, 0x7f, 0xf7, 0xee, 0x9d, 0xf8, 0xd8, + 0xb1, 0x63, 0xa2, 0x06, 0x0d, 0x1a, 0xc4, 0x81, 0xb9, 0xd2, 0x46, 0xd1, + 0x31, 0xf0, 0x00, 0x38, 0xf0, 0x78, 0xbc, 0xbf, 0x96, 0x2e, 0x5d, 0x5a, + 0xf4, 0xe6, 0xcd, 0x9b, 0x32, 0x99, 0x4c, 0x46, 0x2b, 0xda, 0x41, 0x5c, + 0x5c, 0x5c, 0xf1, 0xc5, 0x8b, 0x17, 0xd3, 0xd9, 0x74, 0x56, 0xb8, 0x8a, + 0x4c, 0x28, 0x14, 0x4a, 0xc3, 0xc2, 0xc2, 0x0a, 0x4f, 0x9d, 0x3a, 0x55, + 0x34, 0x7a, 0xf4, 0xe8, 0x5c, 0x30, 0xe7, 0xc3, 0x5b, 0xa2, 0xe2, 0x8c, + 0x67, 0x95, 0x57, 0xa9, 0xb1, 0xab, 0x42, 0xcb, 0x95, 0xd2, 0x53, 0x9b, + 0x95, 0x73, 0x80, 0x69, 0x2f, 0x9e, 0xf5, 0xea, 0xd5, 0x8b, 0xba, 0x75, + 0xeb, 0x56, 0x59, 0x71, 0x71, 0xb1, 0x54, 0x91, 0xf6, 0x98, 0x98, 0x98, + 0xa2, 0xbf, 0xfe, 0xfa, 0xab, 0x6c, 0xdc, 0xb8, 0x71, 0x0f, 0xc1, 0xee, + 0x9e, 0xf8, 0x82, 0x95, 0x73, 0x41, 0x58, 0x58, 0x58, 0x74, 0x65, 0x69, + 0x7f, 0xf2, 0xe4, 0x49, 0xa4, 0x52, 0x1a, 0xf5, 0x97, 0x2d, 0x5b, 0x16, + 0x54, 0x52, 0x52, 0x22, 0x53, 0x0e, 0x13, 0x13, 0x13, 0x23, 0x1d, 0x33, + 0x66, 0x4c, 0x2e, 0x98, 0x2b, 0x02, 0x55, 0xdb, 0xae, 0xba, 0x95, 0x73, + 0x80, 0xd1, 0x39, 0x13, 0x2f, 0x5e, 0xbc, 0xa8, 0x58, 0xd5, 0x52, 0x6c, + 0x37, 0xfe, 0xb4, 0x72, 0x5e, 0x19, 0x03, 0x06, 0x0c, 0x98, 0xcf, 0xa6, + 0x49, 0x79, 0xe5, 0xdc, 0x08, 0x40, 0xeb, 0xac, 0xac, 0x2c, 0x79, 0x78, + 0x78, 0xb8, 0x04, 0xcc, 0x5d, 0xaf, 0x86, 0x35, 0x58, 0x39, 0x07, 0x1b, + 0x57, 0x67, 0x3f, 0x3f, 0x3f, 0x11, 0x21, 0x84, 0x28, 0xad, 0x9c, 0x03, + 0x80, 0x29, 0x45, 0x51, 0x87, 0x56, 0xaf, 0x5e, 0x5d, 0x9c, 0x92, 0x92, + 0xf2, 0xa9, 0x9e, 0x13, 0x12, 0x12, 0x44, 0x0b, 0x17, 0x2e, 0x2c, 0x00, + 0xb0, 0x4d, 0xa9, 0x2c, 0x6b, 0xbb, 0x72, 0x5e, 0x69, 0xfc, 0x84, 0x10, + 0x72, 0xf1, 0xe2, 0xc5, 0x32, 0x8a, 0xa2, 0xf6, 0xa1, 0xfc, 0x9a, 0xb5, + 0x4a, 0xef, 0x39, 0x07, 0x60, 0x64, 0x6c, 0x6c, 0xbc, 0x37, 0x27, 0x27, + 0x47, 0x2e, 0x16, 0x8b, 0x65, 0x8e, 0x8e, 0x8e, 0x6e, 0x00, 0xf4, 0x27, + 0x4d, 0x9a, 0x74, 0xe3, 0xdd, 0xbb, 0x77, 0x25, 0xaa, 0x65, 0xf8, 0xf1, + 0xe3, 0x47, 0xf1, 0xaa, 0x55, 0xab, 0x0a, 0x0c, 0x0c, 0x0c, 0x2e, 0x83, + 0xd9, 0x65, 0xa2, 0x4e, 0x1f, 0x54, 0xb7, 0x92, 0x4c, 0x01, 0xa8, 0x63, + 0x60, 0x60, 0x70, 0xdb, 0xd7, 0xd7, 0xb7, 0x54, 0x59, 0x2e, 0x0a, 0x0b, + 0x0b, 0xa5, 0x5b, 0xb7, 0x6e, 0x15, 0x6a, 0x6b, 0x6b, 0xff, 0x05, 0xf5, + 0xfa, 0x5a, 0xc7, 0xda, 0xda, 0xfa, 0x57, 0xb9, 0x5c, 0x4e, 0x64, 0x32, + 0x19, 0xb1, 0xb0, 0xb0, 0x58, 0x82, 0xcf, 0xfb, 0x21, 0x0d, 0x13, 0x13, + 0x93, 0x81, 0x84, 0x10, 0x52, 0x5a, 0x5a, 0x4a, 0x6b, 0x69, 0x69, 0x29, + 0xfa, 0x12, 0x3e, 0x00, 0xb7, 0xe8, 0xe8, 0x68, 0x29, 0x21, 0x84, 0xb4, + 0x6f, 0xdf, 0x7e, 0x2d, 0x00, 0xed, 0xd6, 0xad, 0x5b, 0x7b, 0xc8, 0xe5, + 0x72, 0x9a, 0xbd, 0x26, 0xe9, 0x3b, 0x54, 0xec, 0x77, 0xf4, 0x04, 0x02, + 0xc1, 0xe2, 0xf7, 0xef, 0xdf, 0x4b, 0x65, 0x32, 0x19, 0xed, 0xea, 0xea, + 0xda, 0xf1, 0x0b, 0xf2, 0x6b, 0x5a, 0x5d, 0xdf, 0x4b, 0x08, 0x21, 0x62, + 0xb1, 0x58, 0x86, 0xcf, 0xfb, 0x8d, 0x2f, 0x5d, 0x39, 0x07, 0x6a, 0x77, + 0xad, 0xda, 0xbf, 0x69, 0xe5, 0x5c, 0x0b, 0xc0, 0xe8, 0x95, 0x2b, 0x57, + 0x16, 0x96, 0x95, 0x95, 0x7d, 0x1a, 0x40, 0xc4, 0xc6, 0xc6, 0x16, 0x77, + 0xec, 0xd8, 0x31, 0x76, 0xd2, 0xa4, 0x49, 0x1f, 0x08, 0xf9, 0x7c, 0xe5, + 0xbc, 0xb8, 0xb8, 0x98, 0x36, 0x30, 0x30, 0x78, 0x75, 0xec, 0xd8, 0xb1, + 0x14, 0x91, 0x48, 0x24, 0x51, 0xf4, 0xef, 0x3e, 0x3e, 0x3e, 0x42, 0x0d, + 0x0d, 0x8d, 0x3f, 0x50, 0xb1, 0x2f, 0xe1, 0x03, 0x68, 0x5b, 0xb7, 0x6e, + 0xdd, 0xe8, 0x0b, 0x17, 0x2e, 0x94, 0x0a, 0x85, 0x42, 0xa9, 0xe2, 0x3b, + 0x19, 0x19, 0x19, 0xa5, 0xfe, 0xfe, 0xfe, 0x1f, 0xeb, 0xd6, 0xad, 0xdb, + 0x0b, 0xe5, 0xba, 0xd2, 0x58, 0x43, 0x43, 0x63, 0xff, 0x9e, 0x3d, 0x7b, + 0x84, 0xa5, 0xa5, 0xa5, 0x32, 0x36, 0x6e, 0xf1, 0xc1, 0x83, 0x07, 0x13, + 0x2c, 0x2c, 0x2c, 0x5e, 0xaa, 0xe9, 0xff, 0x74, 0x01, 0xcc, 0xe8, 0xd2, + 0xa5, 0x4b, 0x7a, 0x58, 0x58, 0x58, 0x89, 0xa2, 0x6f, 0x11, 0x8b, 0xc5, + 0xb2, 0x90, 0x90, 0x90, 0x82, 0x7d, 0xfb, 0xf6, 0x65, 0x1a, 0x1a, 0x1a, + 0xba, 0xe1, 0xf3, 0xb1, 0x41, 0x8d, 0x56, 0xce, 0x79, 0x3c, 0x9e, 0xce, + 0x84, 0x09, 0x13, 0xf6, 0xe5, 0xe6, 0xe6, 0xd2, 0x79, 0x79, 0x79, 0xf2, + 0xa8, 0xa8, 0x28, 0x61, 0x64, 0x64, 0x64, 0x71, 0x7c, 0x7c, 0xfc, 0xa7, + 0x6f, 0x8d, 0x1e, 0x3d, 0xfa, 0x07, 0xa8, 0x5c, 0xa5, 0x56, 0xd3, 0x95, + 0x73, 0x33, 0x33, 0xb3, 0xba, 0xd5, 0xc9, 0xf3, 0xaa, 0x55, 0xab, 0x76, + 0xa1, 0xf2, 0x55, 0xbe, 0x9a, 0xae, 0x9c, 0x2b, 0xee, 0x39, 0x07, 0x18, + 0x7d, 0xdb, 0xaa, 0x45, 0x8b, 0x16, 0x91, 0x42, 0xa1, 0x50, 0x1e, 0x17, + 0x17, 0x97, 0x66, 0x66, 0x66, 0x66, 0x0d, 0x80, 0x6a, 0xd6, 0xac, 0x99, + 0x7b, 0x75, 0xe9, 0x99, 0x35, 0x6b, 0xd6, 0x0a, 0x00, 0x1a, 0xff, 0xc0, + 0xca, 0x39, 0xc0, 0x8c, 0x0b, 0xb6, 0x79, 0x7b, 0x7b, 0xe7, 0x64, 0x66, + 0x66, 0x8a, 0x14, 0x69, 0xc8, 0xcc, 0xcc, 0x14, 0xcd, 0x99, 0x33, 0x27, + 0x97, 0xa2, 0xa8, 0x5d, 0x28, 0xbf, 0xa2, 0xf1, 0xd3, 0xca, 0xf9, 0xc0, + 0x81, 0x03, 0x3f, 0x1c, 0x3b, 0x76, 0xec, 0x43, 0x0d, 0xe4, 0xb3, 0x52, + 0x79, 0xeb, 0xdf, 0xbf, 0x7f, 0xbc, 0x1a, 0x79, 0xab, 0xd5, 0xca, 0x39, + 0x8f, 0xc7, 0xab, 0x73, 0xf9, 0xf2, 0xe5, 0x8f, 0x22, 0x91, 0xa8, 0x42, + 0x9f, 0x9d, 0x9f, 0x9f, 0x2f, 0xd9, 0xb0, 0x61, 0x43, 0x91, 0x86, 0x86, + 0xc6, 0x76, 0xa8, 0xbf, 0x8d, 0xc9, 0xd0, 0xca, 0xca, 0xea, 0xcc, 0xed, + 0xdb, 0xb7, 0x2b, 0xf4, 0x49, 0x19, 0x19, 0x19, 0x85, 0x4a, 0x65, 0x43, + 0x01, 0xb0, 0x6d, 0xd1, 0xa2, 0xc5, 0xcb, 0xd0, 0xd0, 0xd0, 0x4f, 0xed, + 0xaa, 0xb8, 0xb8, 0xb8, 0x6c, 0xcf, 0x9e, 0x3d, 0xc9, 0xd6, 0xd6, 0xd6, + 0xaf, 0xd4, 0x94, 0xa7, 0x02, 0x93, 0x61, 0xc3, 0x86, 0x3d, 0x56, 0xbc, + 0x33, 0x68, 0xd0, 0xa0, 0x20, 0x7c, 0x7e, 0xd5, 0xa5, 0x06, 0x8f, 0xc7, + 0xeb, 0x24, 0x14, 0x0a, 0x69, 0x42, 0x08, 0xb1, 0xb6, 0xb6, 0x9e, 0xc9, + 0xe6, 0x57, 0xbb, 0x79, 0xf3, 0xe6, 0xab, 0x09, 0x21, 0xa4, 0xa0, 0xa0, + 0x80, 0xa6, 0x28, 0xaa, 0x1d, 0x2b, 0x9f, 0xbc, 0x2b, 0x57, 0xae, 0xdc, + 0x23, 0x84, 0x90, 0x21, 0x43, 0x86, 0x24, 0x02, 0x68, 0x8d, 0xf2, 0x1d, + 0xbb, 0x6e, 0x23, 0x46, 0x8c, 0x48, 0x62, 0xfb, 0xf7, 0x5b, 0x6a, 0xda, + 0xa3, 0x8e, 0x9e, 0x9e, 0xde, 0xbc, 0x82, 0x82, 0x02, 0x9a, 0x10, 0x42, + 0x7a, 0xf4, 0xe8, 0x71, 0x13, 0x9f, 0x8f, 0x49, 0x79, 0xed, 0xdb, 0xb7, + 0x1f, 0x5e, 0x9d, 0x7c, 0xb6, 0x6a, 0xd5, 0xaa, 0x07, 0xd4, 0xf7, 0xa7, + 0xff, 0x15, 0xf7, 0x9c, 0xff, 0x1b, 0x10, 0x00, 0xe8, 0xde, 0xa0, 0x41, + 0x83, 0xa4, 0xfa, 0xf5, 0xeb, 0x27, 0x01, 0xe8, 0x0e, 0xf5, 0xf7, 0xce, + 0x19, 0x00, 0xd8, 0x0f, 0xe0, 0x39, 0xca, 0x2f, 0xaf, 0xaf, 0x0e, 0x5d, + 0x30, 0x5e, 0xa7, 0x03, 0x2d, 0x2c, 0x2c, 0x92, 0xcd, 0xcd, 0xcd, 0x93, + 0x01, 0xdc, 0x03, 0x30, 0xa4, 0x9a, 0x42, 0xd3, 0x64, 0xc3, 0xbc, 0x02, + 0x30, 0x09, 0x9f, 0x2b, 0x6c, 0x1d, 0x30, 0xf7, 0xe8, 0x25, 0x82, 0x39, + 0x37, 0x98, 0xa2, 0xe6, 0x89, 0x06, 0xb3, 0x5d, 0x59, 0x9b, 0x7d, 0x7e, + 0x04, 0x70, 0xdf, 0xc0, 0xc0, 0x20, 0xc9, 0xde, 0xde, 0xfe, 0x83, 0x9d, + 0x9d, 0xdd, 0x07, 0x81, 0x40, 0x10, 0x07, 0xe0, 0x26, 0x80, 0x11, 0x60, + 0x06, 0x78, 0xd5, 0x19, 0x6a, 0xc6, 0x00, 0x2e, 0x82, 0xb9, 0x7a, 0x42, + 0xf9, 0x3e, 0x5e, 0x3e, 0x80, 0x16, 0x00, 0xce, 0x6a, 0x69, 0x69, 0xc5, + 0x37, 0x6a, 0xd4, 0x28, 0xd5, 0xde, 0xde, 0xfe, 0x83, 0x40, 0x20, 0x88, + 0x05, 0xe3, 0x30, 0xac, 0x0f, 0xd4, 0x1b, 0x71, 0x3a, 0x00, 0x7a, 0x02, + 0xf0, 0x37, 0x34, 0x34, 0x4c, 0x68, 0xd8, 0xb0, 0xa1, 0xe2, 0xac, 0xc9, + 0x72, 0x30, 0xb3, 0x3f, 0x94, 0x9a, 0xf0, 0x0b, 0x00, 0xbc, 0x06, 0x30, + 0x19, 0x55, 0xdf, 0x57, 0xcd, 0x07, 0x73, 0xad, 0x9b, 0x0f, 0x9f, 0xcf, + 0x7f, 0xdf, 0xb0, 0x61, 0xc3, 0xd4, 0xfa, 0xf5, 0xeb, 0xa7, 0x52, 0x14, + 0xf5, 0x16, 0xc0, 0x26, 0x30, 0x83, 0x76, 0xe5, 0x3a, 0xd4, 0xe6, 0xf3, + 0xf9, 0x3f, 0xda, 0xda, 0xda, 0xbe, 0xb7, 0xb3, 0xb3, 0x4b, 0x01, 0xe3, + 0x34, 0xef, 0x12, 0x5b, 0x0f, 0x95, 0x1e, 0x17, 0x60, 0xe3, 0xb0, 0xb7, + 0xb5, 0xb5, 0x8d, 0xb5, 0xb1, 0xb1, 0x89, 0x05, 0xb3, 0xd5, 0xac, 0xaa, + 0x72, 0xd4, 0xde, 0xbb, 0x77, 0x6f, 0x10, 0x21, 0x84, 0xb4, 0x6c, 0xd9, + 0xf2, 0x18, 0xaa, 0xbe, 0x9e, 0xee, 0xbf, 0x11, 0x03, 0x81, 0x40, 0xb0, + 0xaf, 0x65, 0xcb, 0x96, 0x1f, 0xc0, 0x6c, 0xe5, 0x51, 0x37, 0xa1, 0x23, + 0x00, 0xe0, 0xd9, 0xae, 0x5d, 0xbb, 0xb8, 0xe4, 0xe4, 0xe4, 0x92, 0x92, + 0x92, 0x12, 0xd1, 0x93, 0x27, 0x4f, 0x9e, 0x1f, 0x3e, 0x7c, 0xf8, 0x44, + 0x70, 0x70, 0xf0, 0x8b, 0xb2, 0xb2, 0x32, 0x71, 0x76, 0x76, 0x76, 0x3e, + 0x1b, 0x4e, 0x51, 0xa7, 0x51, 0x00, 0xc6, 0x41, 0x7d, 0x27, 0xa3, 0x05, + 0x60, 0x02, 0x1b, 0x66, 0x01, 0x00, 0x4b, 0x30, 0x6d, 0xf1, 0x03, 0x18, + 0x59, 0x4f, 0x62, 0x9f, 0x38, 0x00, 0xc1, 0x60, 0xae, 0x75, 0x73, 0x57, + 0x13, 0x17, 0x1f, 0xcc, 0x1d, 0xc4, 0xbf, 0x00, 0x78, 0xa0, 0xa5, 0xa5, + 0x95, 0xd8, 0xb8, 0x71, 0xe3, 0x34, 0x6d, 0x6d, 0xed, 0x04, 0x30, 0x67, + 0xb1, 0xf6, 0x83, 0x69, 0x07, 0x06, 0x2a, 0xf1, 0x47, 0x83, 0x39, 0xd6, + 0x71, 0x08, 0xc0, 0x78, 0x94, 0xcf, 0x76, 0x2a, 0x63, 0x02, 0xe0, 0x3e, + 0x98, 0x55, 0xbf, 0x14, 0x30, 0x0e, 0x35, 0x94, 0x9f, 0x37, 0x00, 0x86, + 0xa1, 0x5c, 0x11, 0xeb, 0x03, 0xd8, 0x0a, 0x46, 0xde, 0x3b, 0xa2, 0x66, + 0xdb, 0x8e, 0xb4, 0xc0, 0xec, 0x8e, 0x39, 0x43, 0x51, 0x54, 0xb4, 0xbd, + 0xbd, 0x7d, 0x9a, 0xae, 0xae, 0x6e, 0x3c, 0x80, 0x47, 0x60, 0xee, 0xb2, + 0x1f, 0x03, 0xf6, 0x7e, 0x52, 0x36, 0xfd, 0x51, 0x60, 0xda, 0xa5, 0xea, + 0x76, 0xb6, 0x16, 0xec, 0x6f, 0xfb, 0x51, 0x6e, 0x3c, 0x18, 0x81, 0x39, + 0x63, 0x1a, 0x0d, 0xc6, 0x61, 0x59, 0x26, 0x18, 0x07, 0x66, 0xf1, 0x60, + 0xce, 0x21, 0x1d, 0x45, 0xb9, 0x11, 0xa8, 0x0b, 0x60, 0xa1, 0x40, 0x20, + 0x78, 0x6b, 0x6b, 0x6b, 0x9b, 0xd6, 0xac, 0x59, 0xb3, 0x0c, 0x3d, 0x3d, + 0xbd, 0x54, 0x30, 0x0e, 0xa6, 0x26, 0xb1, 0x65, 0xa1, 0xda, 0x06, 0x4c, + 0xc1, 0x9c, 0x8b, 0x0c, 0x44, 0x45, 0xa3, 0x84, 0x02, 0x63, 0xb4, 0x1d, + 0x65, 0xcb, 0x62, 0x04, 0xca, 0x8f, 0x68, 0x1c, 0x07, 0x90, 0xaa, 0x54, + 0x0f, 0xca, 0xcf, 0x6b, 0x94, 0x1b, 0x5e, 0x26, 0x60, 0x76, 0x81, 0xac, + 0x05, 0xa3, 0x57, 0xcd, 0xd9, 0xb4, 0x5c, 0x63, 0x7f, 0xd3, 0x07, 0xb0, + 0x81, 0x0d, 0x63, 0xa2, 0x54, 0x3e, 0xaf, 0xf0, 0xb9, 0xf1, 0x65, 0x02, + 0xe0, 0x30, 0x9b, 0xef, 0xbd, 0x4a, 0xe5, 0x43, 0xb1, 0x72, 0xb7, 0x12, + 0xc0, 0x0b, 0x4b, 0x4b, 0xcb, 0x0f, 0x96, 0x96, 0x96, 0x29, 0xac, 0xbc, + 0x2d, 0x62, 0xbf, 0xa9, 0xc8, 0xb3, 0x00, 0x40, 0x3f, 0x94, 0xeb, 0xb2, + 0xea, 0x26, 0x72, 0xd5, 0xc6, 0xef, 0xee, 0xee, 0xfe, 0xb1, 0xa0, 0xa0, + 0x80, 0xce, 0xce, 0xce, 0x16, 0xd7, 0xa9, 0x53, 0xa7, 0x95, 0x52, 0xfc, + 0x7c, 0x30, 0x77, 0xe1, 0x46, 0x81, 0x71, 0xec, 0xa6, 0x6c, 0x00, 0xf2, + 0xc0, 0xdc, 0xe1, 0xfc, 0x02, 0x8c, 0x13, 0x4c, 0x57, 0xb6, 0x4c, 0x26, + 0x02, 0x08, 0x32, 0x30, 0x30, 0x48, 0x69, 0xd8, 0xb0, 0x61, 0x9a, 0x93, + 0x93, 0x53, 0x9a, 0x91, 0x91, 0x51, 0x32, 0x98, 0xf3, 0x65, 0x2b, 0xc1, + 0xe8, 0xad, 0xca, 0x06, 0xde, 0xa6, 0x60, 0xda, 0x87, 0xaa, 0xde, 0x87, + 0xca, 0x77, 0x1d, 0xc0, 0xf8, 0xeb, 0x78, 0xd7, 0xa0, 0x41, 0x83, 0x34, + 0x6b, 0x6b, 0xeb, 0x0f, 0x6c, 0x3d, 0x6d, 0x02, 0x50, 0x1f, 0xea, 0xfb, + 0x4c, 0x1e, 0x98, 0x5d, 0x35, 0xd1, 0xac, 0x9c, 0x35, 0x53, 0x13, 0x8e, + 0x02, 0x73, 0x0f, 0x72, 0x34, 0x80, 0x08, 0x30, 0xdb, 0x62, 0x15, 0x65, + 0x61, 0x06, 0xa6, 0x6d, 0xbe, 0x03, 0xe0, 0x09, 0x46, 0xfe, 0xdd, 0xd9, + 0xbc, 0xef, 0x87, 0xfa, 0xad, 0x9a, 0xb6, 0x60, 0xe4, 0x30, 0x0c, 0xe5, + 0x03, 0xb7, 0xda, 0xe4, 0xd7, 0x8c, 0xcd, 0x57, 0x16, 0xd4, 0xcb, 0xa6, + 0xa2, 0xfd, 0xbf, 0x50, 0xf3, 0xfe, 0xd7, 0x18, 0xe7, 0x8a, 0xba, 0x0d, + 0x41, 0x45, 0xd9, 0x54, 0xc7, 0xbf, 0xc9, 0x38, 0xa7, 0xc0, 0x8c, 0x2d, + 0x7e, 0x15, 0x08, 0x04, 0x31, 0x8d, 0x1b, 0x37, 0x4e, 0x33, 0x30, 0x30, + 0x48, 0x00, 0x53, 0x47, 0x43, 0x01, 0xcc, 0x62, 0xf3, 0xac, 0xd8, 0x56, + 0xab, 0xc3, 0xfe, 0x2d, 0x18, 0xcc, 0xf6, 0xee, 0xdd, 0x1a, 0x1a, 0x1a, + 0x51, 0xf6, 0xf6, 0xf6, 0x1f, 0x34, 0x34, 0x34, 0xa2, 0xc1, 0xe8, 0x55, + 0x1b, 0x7c, 0xae, 0x83, 0x34, 0x01, 0xb4, 0x02, 0xa3, 0x6b, 0xde, 0x36, + 0x68, 0xd0, 0x20, 0x95, 0x6d, 0xc3, 0x61, 0x60, 0xce, 0xe0, 0x2b, 0xee, + 0x7b, 0x57, 0xa4, 0xa9, 0x2e, 0x80, 0x6d, 0x1a, 0x1a, 0x1a, 0xd1, 0x6c, + 0xdc, 0x11, 0x00, 0xb6, 0x83, 0x39, 0x53, 0xfe, 0x12, 0xc0, 0x6c, 0x54, + 0x34, 0x50, 0x0c, 0xc0, 0x2c, 0xba, 0xdc, 0xd2, 0xd4, 0xd4, 0x8c, 0x6b, + 0xd2, 0xa4, 0x49, 0xaa, 0x40, 0x20, 0x88, 0x01, 0xe3, 0x08, 0x6e, 0x0b, + 0xd4, 0x4f, 0x7e, 0x29, 0xfa, 0xb6, 0x48, 0xa8, 0x1f, 0xeb, 0x01, 0x00, + 0xf5, 0xdb, 0x6f, 0xbf, 0xfd, 0x4e, 0x08, 0x21, 0xfd, 0xfb, 0xf7, 0x4f, + 0xe1, 0xf3, 0xf9, 0xef, 0xc1, 0xe8, 0xfc, 0x07, 0x00, 0x5e, 0x38, 0x3b, + 0x3b, 0x67, 0xd0, 0x34, 0x4d, 0x02, 0x03, 0x03, 0xdf, 0xb2, 0xf1, 0x69, + 0x03, 0x98, 0x81, 0x8a, 0xfa, 0x54, 0xf9, 0x7b, 0x23, 0xd8, 0xdf, 0x66, + 0xa2, 0x7c, 0xdb, 0x7f, 0x43, 0x30, 0x63, 0xdb, 0x58, 0x30, 0xba, 0x2f, + 0x0d, 0x4c, 0x1f, 0x90, 0xc0, 0xfe, 0x2d, 0x02, 0x80, 0x37, 0x2a, 0x5f, + 0xc0, 0xa9, 0xce, 0x38, 0x37, 0x05, 0xb3, 0x1b, 0xd3, 0x1f, 0x15, 0xe5, + 0x5e, 0x0b, 0xcc, 0x18, 0x30, 0x1c, 0xcc, 0x78, 0xab, 0x1e, 0x98, 0xbe, + 0xb0, 0x05, 0x98, 0xf6, 0xa3, 0x48, 0x4f, 0x3a, 0x9b, 0x9e, 0x78, 0xf6, + 0x6f, 0x2f, 0xd9, 0x72, 0xd3, 0x05, 0x73, 0xef, 0x7b, 0x38, 0x80, 0xf9, + 0x6c, 0xfa, 0x8c, 0xc0, 0x4c, 0xa0, 0x9f, 0x67, 0xe5, 0x4a, 0x87, 0xad, + 0xab, 0x70, 0x30, 0x47, 0x66, 0xf4, 0x6a, 0x59, 0x3e, 0x8a, 0xfa, 0x35, + 0x03, 0x33, 0xe6, 0x79, 0x6e, 0x63, 0x63, 0x93, 0x64, 0x69, 0x69, 0x99, + 0xc4, 0xa6, 0x71, 0x3e, 0x98, 0x36, 0xa6, 0xa8, 0xdb, 0x4f, 0xc6, 0xf9, + 0x90, 0x21, 0x43, 0x0e, 0x01, 0xd8, 0x57, 0x03, 0xf9, 0xac, 0x4c, 0xde, + 0x76, 0x0f, 0x19, 0x32, 0xe4, 0x80, 0x1a, 0xe3, 0x5c, 0x1b, 0xcc, 0xf8, + 0x3e, 0x12, 0x40, 0x55, 0x47, 0x6c, 0x15, 0x18, 0x03, 0x38, 0x2c, 0x10, + 0x08, 0xa2, 0xad, 0xad, 0xad, 0x93, 0x9d, 0x9c, 0x9c, 0x52, 0xad, 0xac, + 0xac, 0x52, 0x28, 0x8a, 0x7a, 0x05, 0xa6, 0xdf, 0xac, 0xcc, 0x17, 0x03, + 0x1f, 0x8c, 0x7e, 0x3e, 0x6b, 0x64, 0x64, 0x94, 0xdc, 0xac, 0x59, 0xb3, + 0x54, 0x13, 0x13, 0x93, 0x04, 0x30, 0x3a, 0x57, 0xb9, 0x1e, 0x05, 0x60, + 0xf4, 0xef, 0x6d, 0x63, 0x63, 0xe3, 0x0f, 0xf6, 0xf6, 0xf6, 0x1f, 0x28, + 0x8a, 0x0a, 0x07, 0x23, 0xf7, 0xdd, 0xd8, 0xb2, 0x57, 0x2e, 0x4f, 0xe5, + 0xf2, 0x1e, 0xc3, 0xd6, 0x69, 0x2c, 0x80, 0x91, 0x95, 0xe4, 0xc5, 0x92, + 0xad, 0xf3, 0x68, 0x94, 0x1f, 0x7b, 0xd2, 0x00, 0xd3, 0xfe, 0xdf, 0x81, + 0xb9, 0x51, 0x4a, 0xb1, 0x62, 0xac, 0x0f, 0xe6, 0x6a, 0xe3, 0xd7, 0x00, + 0xbe, 0x57, 0xf9, 0xa6, 0x2e, 0x98, 0xbe, 0xf0, 0x35, 0x9b, 0x36, 0xd5, + 0xf1, 0x37, 0xc5, 0xe3, 0xf1, 0x1a, 0xa7, 0xa4, 0xa4, 0x48, 0x93, 0x92, + 0x92, 0xe4, 0x14, 0x45, 0x0d, 0xc1, 0xe7, 0xc6, 0xb3, 0x06, 0x80, 0xce, + 0xec, 0x77, 0x15, 0x63, 0xa4, 0x38, 0x95, 0x27, 0x0c, 0x4c, 0x3f, 0xa4, + 0xae, 0x4f, 0xd5, 0x5b, 0xb0, 0x60, 0xc1, 0x6d, 0x42, 0x08, 0x99, 0x3f, + 0x7f, 0xfe, 0x51, 0x7c, 0x63, 0xe3, 0x7c, 0xe1, 0xc2, 0x85, 0xc7, 0x09, + 0x21, 0x64, 0xe1, 0xc2, 0x85, 0xfe, 0xf8, 0x17, 0x19, 0xe7, 0x95, 0x19, + 0x4d, 0xda, 0x60, 0x14, 0x33, 0xc0, 0x14, 0x6c, 0x59, 0x25, 0xef, 0x1a, + 0x82, 0x29, 0xec, 0xda, 0xdc, 0x95, 0xac, 0x09, 0x46, 0x69, 0x9b, 0x82, + 0xd9, 0x02, 0x92, 0x0f, 0xe6, 0xf0, 0x7d, 0x75, 0x4e, 0x8a, 0xb4, 0xc0, + 0x08, 0x4e, 0x29, 0x3e, 0x77, 0x32, 0xa4, 0x38, 0x83, 0xac, 0x5b, 0x45, + 0x9e, 0x14, 0xdb, 0x87, 0x14, 0xce, 0xe1, 0xb4, 0x51, 0xae, 0xb8, 0x4c, + 0xc0, 0x6c, 0xe5, 0xcb, 0x66, 0xc3, 0x94, 0xa2, 0x66, 0x5b, 0x1f, 0x28, + 0xf6, 0x7d, 0x1e, 0x18, 0xa7, 0x39, 0xca, 0xdb, 0x01, 0x35, 0xd8, 0xf4, + 0x2a, 0xf2, 0xca, 0x03, 0x73, 0xef, 0x62, 0x09, 0xca, 0x1d, 0x0f, 0xa8, + 0x43, 0xc0, 0xbe, 0x63, 0x0c, 0x46, 0x90, 0xb2, 0xc0, 0x38, 0x4d, 0x11, + 0x41, 0xbd, 0xa7, 0x4d, 0x5d, 0x36, 0x2f, 0x25, 0xa8, 0x7e, 0x2b, 0x36, + 0x9f, 0x0d, 0xaf, 0x0f, 0x46, 0x79, 0x2a, 0xf2, 0x5c, 0x82, 0xcf, 0xef, + 0x0b, 0x57, 0x74, 0xae, 0xf5, 0xd8, 0x34, 0x65, 0xb0, 0xf1, 0x97, 0xd6, + 0xa0, 0xae, 0x04, 0x60, 0xe4, 0x87, 0x80, 0x69, 0xa8, 0x55, 0x6d, 0xa3, + 0xd5, 0x7f, 0xf6, 0xec, 0x59, 0x2c, 0x00, 0xd3, 0xf6, 0xed, 0xdb, 0x7b, + 0x81, 0x31, 0x22, 0xfe, 0x31, 0x8f, 0x88, 0xdf, 0x00, 0x1e, 0x98, 0x4e, + 0xaa, 0x21, 0x18, 0xaf, 0xcf, 0x95, 0x5d, 0x07, 0xa8, 0x03, 0xa0, 0x9b, + 0xa9, 0xa9, 0xe9, 0xca, 0xc1, 0x83, 0x07, 0xdb, 0xb6, 0x6e, 0xdd, 0x5a, + 0xe6, 0xe8, 0xe8, 0x28, 0xc8, 0xcd, 0xcd, 0xe5, 0x45, 0x45, 0x45, 0x69, + 0x9c, 0x3a, 0x75, 0x2a, 0x26, 0x31, 0x31, 0x71, 0x00, 0x18, 0x39, 0xaa, + 0xae, 0x4e, 0x15, 0x2b, 0xfd, 0x7a, 0x60, 0xda, 0x82, 0x08, 0x4c, 0x9d, + 0xaa, 0x53, 0xe2, 0x8a, 0xfb, 0x56, 0x4b, 0xa1, 0xbe, 0x8d, 0x2a, 0xda, + 0x8e, 0x36, 0xca, 0x0d, 0xb9, 0x5c, 0x94, 0xcb, 0xa8, 0xe2, 0x8a, 0x0d, + 0x03, 0xa5, 0xf8, 0x09, 0x1b, 0x97, 0x1c, 0xe5, 0xce, 0xdd, 0x54, 0xd3, + 0xc8, 0x03, 0xd3, 0x36, 0x2a, 0x33, 0xb2, 0x15, 0x9e, 0xb2, 0x15, 0xf9, + 0xa3, 0xd8, 0x3c, 0x68, 0x82, 0x71, 0xc0, 0x54, 0x53, 0xe7, 0x1b, 0x7c, + 0xf6, 0x3d, 0x1d, 0x30, 0x1d, 0x96, 0xb2, 0x63, 0x0f, 0x85, 0x23, 0x3a, + 0x45, 0xfa, 0x05, 0x60, 0x74, 0x95, 0xaa, 0x7c, 0x69, 0xb0, 0x69, 0x55, + 0xe4, 0x57, 0x91, 0x1e, 0x23, 0xa8, 0x9f, 0x98, 0x04, 0x1b, 0xb6, 0x50, + 0x29, 0xac, 0x2e, 0x1b, 0xde, 0x8c, 0x2d, 0xcb, 0x6c, 0x36, 0x1f, 0x0a, + 0x5d, 0xa2, 0xae, 0x7c, 0x8c, 0x51, 0xee, 0xc8, 0x4e, 0x5d, 0xdb, 0xd3, + 0x54, 0x2a, 0x23, 0x80, 0xd1, 0xb7, 0x95, 0x75, 0x5c, 0x84, 0x4d, 0xbb, + 0xc2, 0x69, 0xa4, 0x22, 0x3f, 0x25, 0x28, 0x1f, 0xec, 0xd3, 0x28, 0xbf, + 0x41, 0x42, 0x4f, 0xa9, 0x3c, 0x88, 0x52, 0xf9, 0xe4, 0x57, 0x91, 0x16, + 0x09, 0x2a, 0xca, 0xb7, 0x22, 0xdf, 0x3a, 0x28, 0x37, 0xea, 0x73, 0x51, + 0xae, 0x67, 0x95, 0xf3, 0xac, 0xd0, 0xdf, 0x65, 0x28, 0x3f, 0x7e, 0x52, + 0x1d, 0xca, 0xf1, 0x5b, 0x00, 0x70, 0xf0, 0xf6, 0xf6, 0xf6, 0xf5, 0xf1, + 0xf1, 0xa9, 0xf3, 0xe0, 0xc1, 0x83, 0xb0, 0x41, 0x83, 0x06, 0x79, 0x15, + 0x16, 0x16, 0x2a, 0x6e, 0x01, 0x10, 0xb0, 0xe5, 0x23, 0xc1, 0xe7, 0x4e, + 0x19, 0xf9, 0x28, 0x9f, 0x50, 0x54, 0xf4, 0x55, 0x5a, 0x6c, 0xdc, 0x0a, + 0xbf, 0x14, 0x5a, 0x28, 0x3f, 0x96, 0x24, 0x62, 0x9f, 0xca, 0xb6, 0x77, + 0x2b, 0xea, 0x0e, 0xf8, 0x5c, 0xef, 0xab, 0x86, 0xd3, 0x63, 0xbf, 0x53, + 0x07, 0x8c, 0xdc, 0xe5, 0xa0, 0xbc, 0x8f, 0xa9, 0xac, 0x0c, 0xf8, 0x60, + 0xfa, 0x24, 0xc2, 0xc6, 0x2f, 0xaf, 0x26, 0x4c, 0x05, 0xc7, 0x6f, 0x6c, + 0xda, 0xf8, 0x28, 0x6f, 0x47, 0x1a, 0x55, 0x94, 0x8d, 0x22, 0x9d, 0x8a, + 0x7e, 0x4c, 0x5d, 0xdb, 0xab, 0x2e, 0xbf, 0x3c, 0x36, 0x2d, 0xd5, 0x4d, + 0xd0, 0x2b, 0x1c, 0xef, 0x28, 0xbf, 0x6f, 0x21, 0x16, 0x8b, 0xb3, 0x52, + 0x52, 0x52, 0xca, 0x16, 0x2c, 0x58, 0x30, 0x9d, 0x4d, 0x1f, 0x82, 0x82, + 0x82, 0x02, 0x8b, 0x8b, 0x8b, 0x8b, 0x50, 0x3d, 0x8a, 0xba, 0x95, 0x41, + 0x45, 0xf7, 0x1a, 0x18, 0x18, 0x18, 0x76, 0xeb, 0xd6, 0x4d, 0x71, 0x96, + 0x52, 0x7f, 0xc7, 0x8e, 0x1d, 0x07, 0x1a, 0x34, 0x68, 0xa0, 0xcd, 0x9e, + 0x15, 0xcd, 0xae, 0x41, 0xdc, 0x9f, 0xa1, 0xad, 0xad, 0xad, 0xe3, 0xec, + 0xec, 0xec, 0x5a, 0x9b, 0x77, 0xa2, 0xa2, 0xa2, 0x22, 0xc4, 0x62, 0x71, + 0x6d, 0x1d, 0xc9, 0x29, 0x64, 0xdf, 0x18, 0x8c, 0xec, 0x14, 0x80, 0x91, + 0x4d, 0x21, 0x9b, 0x67, 0x1d, 0x94, 0xd7, 0x85, 0xb2, 0x0e, 0x2f, 0x62, + 0xff, 0xdf, 0x00, 0x4c, 0x9b, 0xf9, 0xc8, 0x96, 0x4b, 0x65, 0x8e, 0xfc, + 0xf8, 0x60, 0x64, 0x54, 0xd1, 0xc6, 0x64, 0x28, 0x77, 0xbe, 0x29, 0x44, + 0x45, 0xd9, 0xa3, 0xd8, 0xb0, 0x06, 0x6c, 0x9a, 0x3e, 0xa2, 0x7c, 0x6c, + 0x62, 0x84, 0xf2, 0x76, 0x53, 0xe1, 0xca, 0x24, 0xf6, 0x1d, 0x45, 0xdf, + 0xa2, 0x18, 0x63, 0x29, 0xfa, 0xa4, 0xcf, 0x8e, 0x4b, 0xb2, 0xf9, 0xd0, + 0x85, 0xfa, 0xb1, 0x1e, 0x00, 0xe8, 0x25, 0x27, 0x27, 0xa7, 0xe7, 0xe4, + 0xe4, 0x68, 0xb6, 0x69, 0xd3, 0xe6, 0x47, 0x30, 0x46, 0xb9, 0x62, 0x5c, + 0xa7, 0x01, 0xa0, 0x55, 0x46, 0x46, 0xc6, 0xcd, 0xc4, 0xc4, 0xc4, 0x82, + 0x8e, 0x1d, 0x3b, 0xda, 0xb1, 0x65, 0xa2, 0x88, 0x53, 0xb5, 0x4f, 0x55, + 0xee, 0x4b, 0x95, 0xd3, 0xaf, 0x68, 0x5f, 0x55, 0x8d, 0x27, 0x45, 0xa8, + 0xbc, 0x1d, 0xeb, 0xec, 0xd8, 0xb1, 0xe3, 0xf6, 0xfc, 0xf9, 0xf3, 0xbb, + 0x7a, 0x79, 0x79, 0x6d, 0xb9, 0x73, 0xe7, 0xce, 0x4a, 0x54, 0x1c, 0x53, + 0x2a, 0xda, 0x1c, 0xf0, 0xf9, 0xed, 0x3a, 0x0a, 0x5d, 0x46, 0xa3, 0xfc, + 0x16, 0x0b, 0x01, 0xaa, 0x5e, 0x14, 0x51, 0x38, 0x6b, 0x54, 0x38, 0x19, + 0x36, 0x56, 0xca, 0x0f, 0x50, 0xbe, 0xd8, 0xa4, 0xd0, 0xff, 0x3a, 0xec, + 0xa3, 0xd0, 0x87, 0xb5, 0x2d, 0x1f, 0xe5, 0xba, 0xd2, 0x63, 0x65, 0x47, + 0xe1, 0xdc, 0x54, 0x91, 0x0e, 0x45, 0x38, 0xdd, 0x85, 0x0b, 0x17, 0x9e, + 0xdf, 0xb6, 0x6d, 0x5b, 0xff, 0x21, 0x43, 0x86, 0xec, 0xbc, 0x7c, 0xf9, + 0xf2, 0x46, 0x56, 0x2e, 0xaa, 0x93, 0x4f, 0x75, 0xf2, 0x26, 0x19, 0x3c, + 0x78, 0xf0, 0xf2, 0x4b, 0x97, 0x2e, 0xcd, 0x5f, 0xbc, 0x78, 0xf1, 0xcd, + 0xad, 0x5b, 0xb7, 0x8e, 0x60, 0xeb, 0x80, 0xaa, 0x22, 0x0f, 0xea, 0x50, + 0xf4, 0x6b, 0x7a, 0x28, 0xf7, 0xe9, 0xa3, 0x70, 0x02, 0xa6, 0x18, 0x0f, + 0x57, 0xa5, 0x9f, 0x15, 0xe3, 0x7a, 0x53, 0xb6, 0xfe, 0xf2, 0xf1, 0xb9, + 0x6e, 0x13, 0xb0, 0xf1, 0x2a, 0xe2, 0x57, 0x8c, 0xe5, 0xc5, 0x6c, 0x7d, + 0xa8, 0x6b, 0x2f, 0x8a, 0xf2, 0x56, 0x18, 0xc9, 0x8a, 0x3e, 0x5d, 0x15, + 0x85, 0xce, 0xa5, 0x50, 0xd1, 0xa1, 0xaa, 0x42, 0x4e, 0x14, 0x8e, 0x3c, + 0x15, 0xfa, 0x41, 0xd1, 0x87, 0x2b, 0x6c, 0x2d, 0x75, 0xf5, 0xab, 0x3c, + 0xfe, 0xf9, 0x94, 0x9e, 0x81, 0x03, 0x07, 0xfe, 0x70, 0xe5, 0xca, 0x95, + 0x23, 0x2b, 0x56, 0xac, 0x48, 0xdd, 0xb0, 0x61, 0x83, 0x3b, 0x9b, 0x0f, + 0xd5, 0xb2, 0xd1, 0x44, 0xd5, 0x0b, 0x9a, 0x8a, 0x71, 0x8e, 0xba, 0x71, + 0x9d, 0x4e, 0x8b, 0x16, 0x2d, 0xd6, 0x84, 0x86, 0x86, 0xfe, 0x9c, 0x9f, + 0x9f, 0x5f, 0xb2, 0x6d, 0xdb, 0xb6, 0x6d, 0xa1, 0xa1, 0xa1, 0xc1, 0x55, + 0x1c, 0x4b, 0x31, 0xbe, 0x7b, 0xf7, 0xee, 0x7b, 0xa9, 0x54, 0x2a, 0xef, + 0xdb, 0xb7, 0x6f, 0x33, 0x7c, 0x7e, 0x2b, 0x16, 0x00, 0xa0, 0x7b, 0xf7, + 0xee, 0xbd, 0xdb, 0xb4, 0x69, 0xd3, 0x61, 0xf1, 0xe2, 0xc5, 0x8b, 0x8d, + 0x8d, 0x8d, 0x75, 0xdd, 0xdc, 0xdc, 0xb6, 0x45, 0x44, 0x44, 0xac, 0xc4, + 0x3f, 0x74, 0x4f, 0xf9, 0xdf, 0x09, 0x0f, 0x7f, 0xef, 0xb5, 0x21, 0xea, + 0xae, 0x39, 0xfa, 0x4f, 0x40, 0xa1, 0x7c, 0x8b, 0xc7, 0xdf, 0x91, 0x9e, + 0x2f, 0x8d, 0x9f, 0xc2, 0xdf, 0x5f, 0xfe, 0x35, 0x89, 0x9f, 0x87, 0xea, + 0x1d, 0x34, 0x7c, 0x4d, 0xfc, 0xc6, 0xbf, 0xfd, 0xf6, 0x5b, 0x4c, 0xcf, + 0x9e, 0x3d, 0x83, 0x51, 0x0b, 0x67, 0x5b, 0xff, 0x65, 0x28, 0xea, 0xb8, + 0x3a, 0xb4, 0xc0, 0x38, 0x7c, 0x9b, 0x02, 0x66, 0xdb, 0xef, 0x19, 0x30, + 0x5e, 0xab, 0x97, 0x82, 0x59, 0xb1, 0xfa, 0x4f, 0x3b, 0xa9, 0x50, 0xe4, + 0xe3, 0xbf, 0xa1, 0x5d, 0x7e, 0x09, 0xff, 0xe9, 0xb4, 0x2b, 0xda, 0xec, + 0x7f, 0x3a, 0x1d, 0xff, 0x09, 0xfe, 0x89, 0xfe, 0xc2, 0x80, 0xcf, 0xe7, + 0x2f, 0xfc, 0xeb, 0xaf, 0xbf, 0x44, 0x84, 0x10, 0x12, 0x19, 0x19, 0xf9, + 0x5e, 0x20, 0x10, 0x68, 0x7f, 0x65, 0xbc, 0x7f, 0xb7, 0xfe, 0xff, 0xa7, + 0xca, 0xe7, 0xdf, 0x8a, 0x85, 0x58, 0x2c, 0xa6, 0x55, 0xb7, 0x40, 0xba, + 0xb8, 0xb8, 0x74, 0xc1, 0xd7, 0xd5, 0x07, 0xe5, 0xe2, 0xe2, 0xd2, 0x45, + 0x35, 0xde, 0xaf, 0x5c, 0x39, 0xa7, 0x9a, 0x36, 0x6d, 0xda, 0xa6, 0xba, + 0xed, 0x9b, 0xaa, 0xd8, 0xdb, 0xdb, 0xbb, 0x7e, 0x45, 0x5e, 0xbe, 0x54, + 0x27, 0xd7, 0xb4, 0x4f, 0x52, 0xa6, 0x36, 0x32, 0x5a, 0xdb, 0xb8, 0xbf, + 0x65, 0xdf, 0x62, 0xfa, 0xfe, 0xfd, 0x7b, 0x51, 0x69, 0x69, 0xa9, 0xdc, + 0xda, 0xda, 0xba, 0xa5, 0x4a, 0x9c, 0xd4, 0xc4, 0x89, 0x13, 0xe7, 0x13, + 0x42, 0xc8, 0x6f, 0xbf, 0xfd, 0x16, 0x8f, 0xcf, 0xb7, 0x04, 0xff, 0x2d, + 0xa8, 0x7a, 0xce, 0xb7, 0xb6, 0xb6, 0x6e, 0x92, 0x9b, 0x9b, 0x2b, 0x92, + 0x4a, 0xa5, 0xc4, 0xd2, 0xd2, 0x72, 0x3c, 0xbe, 0xec, 0xd6, 0x87, 0x7f, + 0x13, 0x55, 0xc9, 0xce, 0xa7, 0x95, 0xf3, 0xc1, 0x83, 0x07, 0xef, 0x40, + 0xf9, 0xf1, 0xc1, 0xda, 0xc8, 0x90, 0x22, 0xac, 0xd6, 0xe0, 0xc1, 0x83, + 0x77, 0xa8, 0x59, 0x39, 0xff, 0xda, 0xb4, 0xf3, 0x51, 0x7b, 0xfd, 0x5c, + 0x53, 0x99, 0xfe, 0x92, 0xb6, 0xf8, 0x5f, 0x81, 0x91, 0x91, 0x51, 0x9d, + 0xa4, 0xa4, 0xa4, 0x9c, 0xa2, 0xa2, 0x22, 0xda, 0xc4, 0xc4, 0x64, 0x03, + 0xbe, 0x4d, 0x79, 0xab, 0xa2, 0x01, 0xa0, 0x73, 0xff, 0xfe, 0xfd, 0xd3, + 0x43, 0x43, 0x43, 0x45, 0x84, 0x10, 0x12, 0x1c, 0x1c, 0xfc, 0x16, 0x95, + 0xb7, 0x99, 0x9a, 0xac, 0x9c, 0x6b, 0x3e, 0x7d, 0xfa, 0x34, 0x9a, 0x10, + 0x42, 0x42, 0x42, 0x42, 0x44, 0xfd, 0xfb, 0xf7, 0x4f, 0x07, 0xb3, 0xba, + 0xff, 0x9f, 0x1e, 0x63, 0xd7, 0xaa, 0x50, 0x2a, 0xe3, 0xef, 0xbe, 0x22, + 0xeb, 0x9f, 0xba, 0x82, 0xab, 0x3a, 0x14, 0xab, 0x80, 0xff, 0x6d, 0xf1, + 0x2b, 0xdf, 0x4f, 0xf9, 0x77, 0x50, 0xd3, 0xf2, 0xff, 0xd2, 0x7a, 0xaa, + 0xe9, 0x7b, 0xd2, 0x25, 0x4b, 0x96, 0x1c, 0x04, 0xb3, 0xad, 0xa6, 0xb8, + 0x86, 0xef, 0xfc, 0xb7, 0x51, 0xd3, 0x3a, 0x16, 0x83, 0xd9, 0x89, 0x92, + 0x02, 0xa6, 0xed, 0x29, 0xae, 0x00, 0x53, 0x5c, 0xe7, 0xf7, 0x4f, 0xdc, + 0x19, 0xff, 0x2d, 0xf2, 0xf1, 0xdf, 0xca, 0x7f, 0x3a, 0xed, 0x7f, 0x77, + 0x9b, 0xfd, 0x6f, 0xe6, 0x9f, 0xe8, 0x2f, 0x84, 0x72, 0xb9, 0xfc, 0xcf, + 0x51, 0xa3, 0x46, 0x39, 0xef, 0xdf, 0xbf, 0x7f, 0x64, 0x44, 0x44, 0x44, + 0x99, 0x54, 0x2a, 0x55, 0xec, 0x1e, 0xf9, 0x52, 0xfe, 0x29, 0x99, 0xff, + 0x6f, 0xe9, 0xef, 0xfe, 0xdb, 0xa0, 0x5b, 0xb4, 0x68, 0x11, 0x0f, 0xc6, + 0xc7, 0x80, 0x88, 0x10, 0x42, 0x28, 0x8a, 0x12, 0x26, 0x24, 0x24, 0xc8, + 0xc0, 0x5e, 0x33, 0xfa, 0x85, 0xf1, 0xf2, 0x62, 0x62, 0x62, 0x64, 0x4e, + 0x4e, 0x4e, 0xef, 0x08, 0x21, 0xfa, 0x14, 0x45, 0x51, 0x84, 0x10, 0x1d, + 0x42, 0x88, 0xea, 0xea, 0x56, 0xad, 0xe2, 0x4c, 0x4c, 0x4c, 0x44, 0xb3, + 0x66, 0xcd, 0xde, 0xe0, 0x73, 0x1f, 0x12, 0x95, 0x51, 0x94, 0x92, 0x92, + 0x42, 0x81, 0xbd, 0xe2, 0xf3, 0x0b, 0xbe, 0xf9, 0x35, 0xe3, 0x87, 0xda, + 0xbe, 0x57, 0x9b, 0x72, 0xa9, 0x6d, 0xdc, 0xdf, 0xb2, 0x9d, 0x91, 0x35, + 0x6b, 0xd6, 0x24, 0xfd, 0xf9, 0xe7, 0x9f, 0x8e, 0x6f, 0xde, 0xbc, 0x79, + 0xf8, 0xe2, 0xc5, 0x8b, 0x90, 0x98, 0x98, 0x98, 0x58, 0x13, 0x13, 0x13, + 0x63, 0x37, 0x37, 0x37, 0x37, 0x47, 0x47, 0x47, 0xfb, 0xe0, 0xe0, 0x60, + 0xf1, 0x9a, 0x35, 0x6b, 0x2e, 0xe0, 0x9f, 0xb9, 0xfe, 0x88, 0x3a, 0x7f, + 0xfe, 0xfc, 0xa5, 0xb6, 0x6d, 0xdb, 0xb6, 0x49, 0x48, 0x48, 0x48, 0xd2, + 0xd6, 0xd6, 0xd6, 0x6e, 0xdb, 0xb6, 0x6d, 0x6b, 0x1e, 0x8f, 0xc7, 0x5b, + 0xbe, 0x7c, 0x79, 0x7e, 0x56, 0x56, 0x56, 0x28, 0xfe, 0x5d, 0xbb, 0x01, + 0xbf, 0x84, 0xda, 0xb6, 0xa9, 0xda, 0xca, 0xc3, 0xdf, 0xa9, 0xa3, 0xbf, + 0x54, 0x1f, 0xd4, 0x34, 0x0f, 0xff, 0xaa, 0x71, 0x95, 0x86, 0x86, 0x86, + 0xe6, 0xad, 0x5b, 0xb7, 0xfc, 0x01, 0xa0, 0x63, 0xc7, 0x8e, 0xed, 0x75, + 0x75, 0x75, 0xb5, 0x27, 0x4c, 0x98, 0x90, 0x96, 0x9f, 0x9f, 0x7f, 0x12, + 0x7f, 0xcf, 0x55, 0x92, 0x32, 0x00, 0xe1, 0x37, 0x6e, 0xdc, 0x98, 0x77, + 0xe3, 0xc6, 0x8d, 0x49, 0x9a, 0x9a, 0x9a, 0x76, 0xa6, 0xa6, 0xa6, 0x6f, + 0xc0, 0xec, 0x84, 0xa8, 0x6e, 0x97, 0x6e, 0x65, 0xe8, 0x0c, 0x19, 0x32, + 0xe4, 0x4d, 0x5e, 0x5e, 0x1e, 0x4f, 0x22, 0x91, 0x24, 0x80, 0x39, 0xba, + 0x13, 0x8e, 0x7f, 0x51, 0x3b, 0xfc, 0xd7, 0xcc, 0x22, 0x70, 0xfc, 0xbf, + 0xa5, 0x14, 0xcc, 0x99, 0x68, 0xc5, 0xfd, 0xdc, 0xff, 0xdf, 0xa1, 0xf1, + 0xcf, 0xdc, 0x95, 0xcb, 0xc1, 0xf1, 0xff, 0x0d, 0x02, 0x20, 0x5b, 0x2e, + 0x97, 0xaf, 0x98, 0x3a, 0x75, 0x6a, 0x16, 0x98, 0xf3, 0x9f, 0xa5, 0x5f, + 0x19, 0x27, 0xc7, 0x7f, 0x96, 0xc2, 0x77, 0xef, 0xde, 0x8d, 0x42, 0xc5, + 0xe3, 0x23, 0x72, 0x30, 0x47, 0x84, 0xbe, 0x66, 0x42, 0x83, 0x16, 0x8b, + 0xc5, 0xaf, 0xa3, 0xa3, 0xa3, 0xc7, 0xa3, 0xe2, 0xaa, 0x95, 0xe2, 0x38, + 0xca, 0x17, 0xc5, 0x29, 0x91, 0x48, 0xde, 0xbd, 0x7b, 0xf7, 0x6e, 0x22, + 0x6a, 0x3e, 0x76, 0x92, 0x81, 0x99, 0x90, 0xfd, 0x5f, 0x9d, 0xb4, 0xfb, + 0x3b, 0x10, 0x9d, 0x3e, 0x7d, 0x7a, 0xcb, 0xdb, 0xb7, 0x6f, 0xd7, 0xfd, + 0xf8, 0xe3, 0x8f, 0xda, 0x0e, 0x0e, 0x0e, 0x4e, 0xee, 0xee, 0xee, 0xcd, + 0xb2, 0xb2, 0xb2, 0x24, 0xf7, 0xef, 0xdf, 0x17, 0xcc, 0x9d, 0x3b, 0x37, + 0xe3, 0xce, 0x9d, 0x3b, 0xcf, 0xc1, 0xf8, 0x58, 0xf8, 0x27, 0xb6, 0xb0, + 0xea, 0x5f, 0xb8, 0x70, 0x41, 0x23, 0x3f, 0x3f, 0x5f, 0xa3, 0x61, 0xc3, + 0x86, 0x4d, 0x29, 0x8a, 0xd2, 0x38, 0x7e, 0xfc, 0x78, 0xe9, 0xf1, 0xe3, + 0xc7, 0x45, 0x0f, 0x1e, 0x3c, 0xd8, 0x05, 0xc6, 0x0f, 0xc3, 0xff, 0xf4, + 0xe4, 0x5c, 0x76, 0x76, 0x76, 0x71, 0x78, 0x78, 0xb8, 0xa4, 0xb0, 0xb0, + 0xf0, 0x4b, 0xef, 0xb5, 0xff, 0x44, 0x61, 0x61, 0xa1, 0x30, 0x3c, 0x3c, + 0x5c, 0x92, 0x95, 0x95, 0xf5, 0x6f, 0x5d, 0xcc, 0xf9, 0xaf, 0x86, 0x10, + 0x62, 0x28, 0x14, 0x0a, 0xed, 0xea, 0xd4, 0xa9, 0xa3, 0x7f, 0xfd, 0xfa, + 0x75, 0xa9, 0xaf, 0xaf, 0x6f, 0x61, 0x40, 0x40, 0xc0, 0x1a, 0x30, 0x7e, + 0x43, 0xfe, 0x2e, 0x39, 0x2e, 0x05, 0x70, 0x05, 0x40, 0x80, 0x44, 0x22, + 0xd1, 0xcd, 0xcc, 0xcc, 0xd4, 0x04, 0x73, 0xbc, 0x40, 0x6d, 0x12, 0x63, + 0x63, 0x63, 0x8b, 0x65, 0x32, 0x59, 0x55, 0x13, 0x1e, 0xc2, 0xcc, 0xcc, + 0xcc, 0x9f, 0xc1, 0xd8, 0x14, 0xb5, 0x39, 0xaa, 0xfc, 0x5f, 0xc3, 0xff, + 0xda, 0xd6, 0x4b, 0x0e, 0x0e, 0x0e, 0x0e, 0x8e, 0x7f, 0x37, 0x8a, 0xb3, + 0x88, 0x72, 0xa8, 0x3f, 0x93, 0xca, 0xf1, 0xef, 0x42, 0xdd, 0x96, 0x4f, + 0x1a, 0x5f, 0x5f, 0xaf, 0x95, 0x1d, 0x0d, 0xfb, 0x9a, 0x55, 0xac, 0x2f, + 0x39, 0x6e, 0xf6, 0x2d, 0xf2, 0xc2, 0x51, 0x8e, 0xe2, 0x3c, 0xbe, 0x3b, + 0x18, 0x47, 0x93, 0xb6, 0xec, 0xbf, 0x0b, 0xc1, 0x9c, 0x69, 0x7f, 0x0c, + 0xc6, 0x81, 0x61, 0x2e, 0xfe, 0x19, 0xa3, 0x58, 0x0b, 0xcc, 0xb5, 0x51, + 0x9d, 0xc1, 0x38, 0xb9, 0x13, 0x80, 0x71, 0xd8, 0x76, 0x8b, 0x4d, 0x4b, + 0x11, 0xfe, 0xb7, 0xeb, 0x5f, 0x0b, 0x8c, 0x23, 0xc3, 0x61, 0x00, 0xf6, + 0x81, 0x71, 0x2c, 0xf9, 0xa5, 0x3b, 0x1a, 0x04, 0x60, 0x1c, 0x10, 0xce, + 0x04, 0xe0, 0x07, 0xc6, 0x21, 0xf3, 0xbf, 0xca, 0xe8, 0xfa, 0x17, 0x60, + 0x0c, 0x60, 0x23, 0x18, 0x87, 0x7c, 0x39, 0x60, 0x1c, 0xc9, 0x06, 0x42, + 0xbd, 0xbf, 0x92, 0xbf, 0x03, 0xc5, 0x4e, 0xa3, 0xca, 0xda, 0xae, 0x3e, + 0x98, 0x1b, 0xa3, 0x68, 0x30, 0xc7, 0x43, 0x2b, 0x33, 0xe2, 0x79, 0xf8, + 0x17, 0xef, 0x66, 0xe4, 0x8c, 0x73, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x8e, 0x7f, 0x13, 0x1a, 0x60, 0xb6, 0xbe, 0x2a, 0xce, 0xfd, + 0x2a, 0xb6, 0x0f, 0x4b, 0xf0, 0xcf, 0xee, 0xc2, 0xa3, 0xc0, 0x9c, 0x8f, + 0xd5, 0x44, 0xb9, 0x2f, 0x25, 0xc5, 0xc4, 0xe1, 0x3f, 0xb1, 0xad, 0xfe, + 0xbf, 0x1d, 0xe5, 0xab, 0x6a, 0x45, 0xf8, 0xfa, 0xba, 0xd1, 0x04, 0xe3, + 0xcc, 0x4e, 0x8c, 0xea, 0x1d, 0xbf, 0x71, 0xd4, 0x1e, 0x85, 0x03, 0x39, + 0x1e, 0xca, 0x77, 0x7a, 0xfe, 0x37, 0xed, 0x6a, 0x55, 0x4c, 0xce, 0x2b, + 0x9c, 0x7c, 0x73, 0xf5, 0xcf, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, + 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xf1, 0xaf, 0xe1, 0xff, + 0x00, 0xae, 0xcb, 0x68, 0x01, 0xdb, 0x49, 0x15, 0x4b, 0x00, 0x00, 0x00, + 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x31, 0x32, + 0x2d, 0x32, 0x37, 0x54, 0x31, 0x39, 0x3a, 0x34, 0x38, 0x3a, 0x35, 0x33, + 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x1b, 0xe6, 0x7d, 0x34, 0x00, 0x00, + 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x31, + 0x32, 0x2d, 0x32, 0x37, 0x54, 0x31, 0x39, 0x3a, 0x34, 0x37, 0x3a, 0x35, + 0x32, 0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x3d, 0xc7, 0x95, 0xb1, 0x00, + 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; unsigned int cc_fps_images_len(void) diff --git a/cocos/cocos2d.h b/cocos/cocos2d.h index bdfabeb043..a8d613c27f 100644 --- a/cocos/cocos2d.h +++ b/cocos/cocos2d.h @@ -283,6 +283,8 @@ THE SOFTWARE. #include "3d/CCMeshVertexIndexData.h" #include "3d/CCSkeleton3D.h" #include "3d/CCBillBoard.h" +#include "3d/CCFrustum.h" +#include "3d/CCPlane.h" // Deprecated include #include "deprecated/CCDictionary.h" diff --git a/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp index 2494264820..89a016417e 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp @@ -115,11 +115,14 @@ void ArmatureNodeReader::setPropsWithFlatBuffers(cocos2d::Node *node, const flatbuffers::Table *nodeOptions) { - auto* custom = static_cast(node); - auto options = (flatbuffers::CSArmatureNodeOption*)nodeOptions; - auto reader = ArmatureNodeReader::getInstance(); + auto* custom = static_cast(node); + auto options = (flatbuffers::CSArmatureNodeOption*)nodeOptions; std::string filepath(options->fileData()->path()->c_str()); + + std::string dirpath = filepath.substr(0, filepath.find_last_of("/")); + FileUtils::getInstance()->addSearchPath(dirpath); + ArmatureDataManager::getInstance()->addArmatureFileInfo(FileUtils::getInstance()->fullPathForFilename(filepath)); custom->init(getArmatureName(filepath)); if (options->isAutoPlay()) diff --git a/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua b/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua index f73bfd0208..1012c8894b 100644 --- a/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua +++ b/cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua @@ -33,6 +33,18 @@ -- @function [parent=#ActionTimeline] pause -- @param self +-------------------------------- +-- @overload self, int, bool +-- @overload self, int +-- @overload self, int, int, bool +-- @overload self, int, int, int, bool +-- @function [parent=#ActionTimeline] gotoFrameAndPlay +-- @param self +-- @param #int startIndex +-- @param #int endIndex +-- @param #int currentFrameIndex +-- @param #bool loop + -------------------------------- -- -- @function [parent=#ActionTimeline] init @@ -57,6 +69,13 @@ -- @param self -- @return array_table#array_table ret (return value: array_table) +-------------------------------- +-- +-- @function [parent=#ActionTimeline] play +-- @param self +-- @param #string name +-- @param #bool loop + -------------------------------- -- Resume the animation. -- @function [parent=#ActionTimeline] resume @@ -88,17 +107,11 @@ -- @return bool#bool ret (return value: bool) -------------------------------- --- @overload self, int, bool --- @overload self, int --- @overload self, int, int, bool --- @overload self, int, int, int, bool --- @function [parent=#ActionTimeline] gotoFrameAndPlay +-- +-- @function [parent=#ActionTimeline] removeIndexes -- @param self --- @param #int startIndex --- @param #int endIndex --- @param #int currentFrameIndex --- @param #bool loop - +-- @param #string name + -------------------------------- -- -- @function [parent=#ActionTimeline] clearFrameEventCallFunc @@ -112,6 +125,12 @@ -- @param self -- @return int#int ret (return value: int) +-------------------------------- +-- Set current frame index, this will cause action plays to this frame. +-- @function [parent=#ActionTimeline] setCurrentFrame +-- @param self +-- @param #int frameIndex + -------------------------------- -- Set the animation speed, this will speed up or slow down the speed. -- @function [parent=#ActionTimeline] setTimeSpeed @@ -130,10 +149,10 @@ -- @param #int duration -------------------------------- --- Set current frame index, this will cause action plays to this frame. --- @function [parent=#ActionTimeline] setCurrentFrame +-- add ActionIndexes +-- @function [parent=#ActionTimeline] addIndexes -- @param self --- @param #int frameIndex +-- @param #ccs.ActionIndexes indexes -------------------------------- -- diff --git a/cocos/scripting/lua-bindings/auto/api/AttachNode.lua b/cocos/scripting/lua-bindings/auto/api/AttachNode.lua index e61a0d0d48..9ae15250db 100644 --- a/cocos/scripting/lua-bindings/auto/api/AttachNode.lua +++ b/cocos/scripting/lua-bindings/auto/api/AttachNode.lua @@ -12,12 +12,6 @@ -- @param #cc.Bone3D attachBone -- @return AttachNode#AttachNode ret (return value: cc.AttachNode) --------------------------------- --- --- @function [parent=#AttachNode] getWorldToNodeTransform --- @param self --- @return mat4_table#mat4_table ret (return value: mat4_table) - -------------------------------- -- -- @function [parent=#AttachNode] visit @@ -26,4 +20,16 @@ -- @param #mat4_table parentTransform -- @param #unsigned int parentFlags +-------------------------------- +-- +-- @function [parent=#AttachNode] getWorldToNodeTransform +-- @param self +-- @return mat4_table#mat4_table ret (return value: mat4_table) + +-------------------------------- +-- +-- @function [parent=#AttachNode] getNodeToWorldTransform +-- @param self +-- @return mat4_table#mat4_table ret (return value: mat4_table) + return nil diff --git a/cocos/scripting/lua-bindings/auto/api/Camera.lua b/cocos/scripting/lua-bindings/auto/api/Camera.lua index a070acd17e..0826a03728 100644 --- a/cocos/scripting/lua-bindings/auto/api/Camera.lua +++ b/cocos/scripting/lua-bindings/auto/api/Camera.lua @@ -37,6 +37,13 @@ -- @param self -- @return int#int ret (return value: int) +-------------------------------- +-- Enable frustum culling +-- @function [parent=#Camera] enableFrustumCulling +-- @param self +-- @param #bool enalbe +-- @param #bool clipZ + -------------------------------- -- Creates a view matrix based on the specified input parameters.
-- param eyePosition The eye position.
@@ -48,6 +55,13 @@ -- @param #vec3_table target -- @param #vec3_table up +-------------------------------- +-- Is this aabb visible in frustum +-- @function [parent=#Camera] isVisibleInFrustum +-- @param self +-- @param #cc.AABB aabb +-- @return bool#bool ret (return value: bool) + -------------------------------- -- -- @function [parent=#Camera] setCameraFlag diff --git a/cocos/scripting/lua-bindings/auto/api/Console.lua b/cocos/scripting/lua-bindings/auto/api/Console.lua index 25abbbf30c..a536d53190 100644 --- a/cocos/scripting/lua-bindings/auto/api/Console.lua +++ b/cocos/scripting/lua-bindings/auto/api/Console.lua @@ -4,11 +4,6 @@ -- @extend Ref -- @parent_module cc --------------------------------- --- stops the Console. 'stop' will be called at destruction time as well --- @function [parent=#Console] stop --- @param self - -------------------------------- -- starts listening to specifed TCP port -- @function [parent=#Console] listenOnTCP @@ -16,6 +11,24 @@ -- @param #int port -- @return bool#bool ret (return value: bool) +-------------------------------- +-- log something in the console +-- @function [parent=#Console] log +-- @param self +-- @param #char buf + +-------------------------------- +-- set bind address
+-- address : 127.0.0.1 +-- @function [parent=#Console] setBindAddress +-- @param self +-- @param #string address + +-------------------------------- +-- stops the Console. 'stop' will be called at destruction time as well +-- @function [parent=#Console] stop +-- @param self + -------------------------------- -- starts listening to specifed file descriptor -- @function [parent=#Console] listenOnFileDescriptor @@ -23,10 +36,4 @@ -- @param #int fd -- @return bool#bool ret (return value: bool) --------------------------------- --- log something in the console --- @function [parent=#Console] log --- @param self --- @param #char buf - return nil diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 73a1a8223c..bdb4aefb2c 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -167,52 +167,6 @@ int lua_register_cocos2dx_Ref(lua_State* tolua_S) return 1; } -int lua_cocos2dx_Console_stop(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Console* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Console",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Console*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Console_stop'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Console_stop'", nullptr); - return 0; - } - cobj->stop(); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Console:stop",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Console_stop'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Console_listenOnTCP(lua_State* tolua_S) { int argc = 0; @@ -263,6 +217,150 @@ int lua_cocos2dx_Console_listenOnTCP(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Console_log(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Console* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Console",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Console*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Console_log'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + const char* arg0; + + std::string arg0_tmp; ok &= luaval_to_std_string(tolua_S, 2, &arg0_tmp, "cc.Console:log"); arg0 = arg0_tmp.c_str(); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Console_log'", nullptr); + return 0; + } + cobj->log(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Console:log",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Console_log'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Console_setBindAddress(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Console* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Console",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Console*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Console_setBindAddress'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Console:setBindAddress"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Console_setBindAddress'", nullptr); + return 0; + } + cobj->setBindAddress(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Console:setBindAddress",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Console_setBindAddress'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_Console_stop(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Console* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Console",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Console*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Console_stop'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Console_stop'", nullptr); + return 0; + } + cobj->stop(); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Console:stop",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Console_stop'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Console_listenOnFileDescriptor(lua_State* tolua_S) { int argc = 0; @@ -313,55 +411,6 @@ int lua_cocos2dx_Console_listenOnFileDescriptor(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Console_log(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Console* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.Console",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::Console*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Console_log'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - const char* arg0; - - std::string arg0_tmp; ok &= luaval_to_std_string(tolua_S, 2, &arg0_tmp, "cc.Console:log"); arg0 = arg0_tmp.c_str(); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Console_log'", nullptr); - return 0; - } - cobj->log(arg0); - return 0; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Console:log",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Console_log'.",&tolua_err); -#endif - - return 0; -} static int lua_cocos2dx_Console_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (Console)"); @@ -374,10 +423,11 @@ int lua_register_cocos2dx_Console(lua_State* tolua_S) tolua_cclass(tolua_S,"Console","cc.Console","cc.Ref",nullptr); tolua_beginmodule(tolua_S,"Console"); - tolua_function(tolua_S,"stop",lua_cocos2dx_Console_stop); tolua_function(tolua_S,"listenOnTCP",lua_cocos2dx_Console_listenOnTCP); - tolua_function(tolua_S,"listenOnFileDescriptor",lua_cocos2dx_Console_listenOnFileDescriptor); tolua_function(tolua_S,"log",lua_cocos2dx_Console_log); + tolua_function(tolua_S,"setBindAddress",lua_cocos2dx_Console_setBindAddress); + tolua_function(tolua_S,"stop",lua_cocos2dx_Console_stop); + tolua_function(tolua_S,"listenOnFileDescriptor",lua_cocos2dx_Console_listenOnFileDescriptor); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::Console).name(); g_luaType[typeName] = "cc.Console"; @@ -60954,6 +61004,58 @@ int lua_cocos2dx_Camera_getType(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Camera_enableFrustumCulling(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Camera* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Camera",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Camera*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Camera_enableFrustumCulling'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + bool arg0; + bool arg1; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "cc.Camera:enableFrustumCulling"); + + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "cc.Camera:enableFrustumCulling"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Camera_enableFrustumCulling'", nullptr); + return 0; + } + cobj->enableFrustumCulling(arg0, arg1); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Camera:enableFrustumCulling",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Camera_enableFrustumCulling'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Camera_lookAt(lua_State* tolua_S) { int argc = 0; @@ -61006,6 +61108,56 @@ int lua_cocos2dx_Camera_lookAt(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Camera_isVisibleInFrustum(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Camera* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.Camera",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Camera*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Camera_isVisibleInFrustum'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + const cocos2d::AABB* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.AABB",&arg0); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Camera_isVisibleInFrustum'", nullptr); + return 0; + } + bool ret = cobj->isVisibleInFrustum(arg0); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Camera:isVisibleInFrustum",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Camera_isVisibleInFrustum'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Camera_setCameraFlag(lua_State* tolua_S) { int argc = 0; @@ -61224,7 +61376,9 @@ int lua_register_cocos2dx_Camera(lua_State* tolua_S) tolua_function(tolua_S,"getViewMatrix",lua_cocos2dx_Camera_getViewMatrix); tolua_function(tolua_S,"getCameraFlag",lua_cocos2dx_Camera_getCameraFlag); tolua_function(tolua_S,"getType",lua_cocos2dx_Camera_getType); + tolua_function(tolua_S,"enableFrustumCulling",lua_cocos2dx_Camera_enableFrustumCulling); tolua_function(tolua_S,"lookAt",lua_cocos2dx_Camera_lookAt); + tolua_function(tolua_S,"isVisibleInFrustum",lua_cocos2dx_Camera_isVisibleInFrustum); tolua_function(tolua_S,"setCameraFlag",lua_cocos2dx_Camera_setCameraFlag); tolua_function(tolua_S,"create", lua_cocos2dx_Camera_create); tolua_function(tolua_S,"createPerspective", lua_cocos2dx_Camera_createPerspective); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp index 43260558fe..9ca9dadf01 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -1621,6 +1621,9 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp index 49b42f4482..6b7dba851f 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp @@ -20412,6 +20412,105 @@ int lua_cocos2dx_studio_ActionTimeline_pause(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 2) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + bool arg1; + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0, arg1); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 1) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 3) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + int arg1; + ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + bool arg2; + ok &= luaval_to_boolean(tolua_S, 4,&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0, arg1, arg2); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 4) { + int arg0; + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + int arg1; + ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + int arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + bool arg3; + ok &= luaval_to_boolean(tolua_S, 5,&arg3, "ccs.ActionTimeline:gotoFrameAndPlay"); + + if (!ok) { break; } + cobj->gotoFrameAndPlay(arg0, arg1, arg2, arg3); + return 0; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:gotoFrameAndPlay",argc, 4); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_init(lua_State* tolua_S) { int argc = 0; @@ -20608,6 +20707,58 @@ int lua_cocos2dx_studio_ActionTimeline_getTimelines(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_play(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_play'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 2) + { + std::string arg0; + bool arg1; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.ActionTimeline:play"); + + ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccs.ActionTimeline:play"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_play'", nullptr); + return 0; + } + cobj->play(arg0, arg1); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:play",argc, 2); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_play'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_resume(lua_State* tolua_S) { int argc = 0; @@ -20844,101 +20995,51 @@ int lua_cocos2dx_studio_ActionTimeline_isPlaying(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay(lua_State* tolua_S) +int lua_cocos2dx_studio_ActionTimeline_removeIndexes(lua_State* tolua_S) { int argc = 0; cocostudio::timeline::ActionTimeline* cobj = nullptr; bool ok = true; + #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif + #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; #endif + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + #if COCOS2D_DEBUG >= 1 - if (!cobj) + if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_removeIndexes'", nullptr); return 0; } #endif + argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 2) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); + if (argc == 1) + { + std::string arg0; - if (!ok) { break; } - bool arg1; - ok &= luaval_to_boolean(tolua_S, 3,&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0, arg1); + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccs.ActionTimeline:removeIndexes"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_removeIndexes'", nullptr); return 0; } - }while(0); - ok = true; - do{ - if (argc == 1) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0); - return 0; - } - }while(0); - ok = true; - do{ - if (argc == 3) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - int arg1; - ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - bool arg2; - ok &= luaval_to_boolean(tolua_S, 4,&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0, arg1, arg2); - return 0; - } - }while(0); - ok = true; - do{ - if (argc == 4) { - int arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - int arg1; - ok &= luaval_to_int32(tolua_S, 3,(int *)&arg1, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - int arg2; - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - bool arg3; - ok &= luaval_to_boolean(tolua_S, 5,&arg3, "ccs.ActionTimeline:gotoFrameAndPlay"); - - if (!ok) { break; } - cobj->gotoFrameAndPlay(arg0, arg1, arg2, arg3); - return 0; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:gotoFrameAndPlay",argc, 4); + cobj->removeIndexes(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:removeIndexes",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_removeIndexes'.",&tolua_err); #endif return 0; @@ -21036,6 +21137,55 @@ int lua_cocos2dx_studio_ActionTimeline_getEndFrame(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ActionTimeline_setCurrentFrame(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimeline* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimeline*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + int arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:setCurrentFrame"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); + return 0; + } + cobj->setCurrentFrame(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:setCurrentFrame",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ActionTimeline_setTimeSpeed(lua_State* tolua_S) { int argc = 0; @@ -21180,7 +21330,7 @@ int lua_cocos2dx_studio_ActionTimeline_setDuration(lua_State* tolua_S) return 0; } -int lua_cocos2dx_studio_ActionTimeline_setCurrentFrame(lua_State* tolua_S) +int lua_cocos2dx_studio_ActionTimeline_addIndexes(lua_State* tolua_S) { int argc = 0; cocostudio::timeline::ActionTimeline* cobj = nullptr; @@ -21200,7 +21350,7 @@ int lua_cocos2dx_studio_ActionTimeline_setCurrentFrame(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimeline_addIndexes'", nullptr); return 0; } #endif @@ -21208,23 +21358,24 @@ int lua_cocos2dx_studio_ActionTimeline_setCurrentFrame(lua_State* tolua_S) argc = lua_gettop(tolua_S)-1; if (argc == 1) { - int arg0; + cocostudio::timeline::ActionIndexes arg0; - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccs.ActionTimeline:setCurrentFrame"); + #pragma warning NO CONVERSION TO NATIVE FOR ActionIndexes + ok = false; if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimeline_addIndexes'", nullptr); return 0; } - cobj->setCurrentFrame(arg0); + cobj->addIndexes(arg0); return 0; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:setCurrentFrame",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimeline:addIndexes",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_setCurrentFrame'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimeline_addIndexes'.",&tolua_err); #endif return 0; @@ -21318,22 +21469,25 @@ int lua_register_cocos2dx_studio_ActionTimeline(lua_State* tolua_S) tolua_function(tolua_S,"getCurrentFrame",lua_cocos2dx_studio_ActionTimeline_getCurrentFrame); tolua_function(tolua_S,"getStartFrame",lua_cocos2dx_studio_ActionTimeline_getStartFrame); tolua_function(tolua_S,"pause",lua_cocos2dx_studio_ActionTimeline_pause); + tolua_function(tolua_S,"gotoFrameAndPlay",lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay); tolua_function(tolua_S,"init",lua_cocos2dx_studio_ActionTimeline_init); tolua_function(tolua_S,"removeTimeline",lua_cocos2dx_studio_ActionTimeline_removeTimeline); tolua_function(tolua_S,"setLastFrameCallFunc",lua_cocos2dx_studio_ActionTimeline_setLastFrameCallFunc); tolua_function(tolua_S,"getTimelines",lua_cocos2dx_studio_ActionTimeline_getTimelines); + tolua_function(tolua_S,"play",lua_cocos2dx_studio_ActionTimeline_play); tolua_function(tolua_S,"resume",lua_cocos2dx_studio_ActionTimeline_resume); tolua_function(tolua_S,"getTimeSpeed",lua_cocos2dx_studio_ActionTimeline_getTimeSpeed); tolua_function(tolua_S,"getDuration",lua_cocos2dx_studio_ActionTimeline_getDuration); tolua_function(tolua_S,"gotoFrameAndPause",lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPause); tolua_function(tolua_S,"isPlaying",lua_cocos2dx_studio_ActionTimeline_isPlaying); - tolua_function(tolua_S,"gotoFrameAndPlay",lua_cocos2dx_studio_ActionTimeline_gotoFrameAndPlay); + tolua_function(tolua_S,"removeIndexes",lua_cocos2dx_studio_ActionTimeline_removeIndexes); tolua_function(tolua_S,"clearFrameEventCallFunc",lua_cocos2dx_studio_ActionTimeline_clearFrameEventCallFunc); tolua_function(tolua_S,"getEndFrame",lua_cocos2dx_studio_ActionTimeline_getEndFrame); + tolua_function(tolua_S,"setCurrentFrame",lua_cocos2dx_studio_ActionTimeline_setCurrentFrame); tolua_function(tolua_S,"setTimeSpeed",lua_cocos2dx_studio_ActionTimeline_setTimeSpeed); tolua_function(tolua_S,"clearLastFrameCallFunc",lua_cocos2dx_studio_ActionTimeline_clearLastFrameCallFunc); tolua_function(tolua_S,"setDuration",lua_cocos2dx_studio_ActionTimeline_setDuration); - tolua_function(tolua_S,"setCurrentFrame",lua_cocos2dx_studio_ActionTimeline_setCurrentFrame); + tolua_function(tolua_S,"addIndexes",lua_cocos2dx_studio_ActionTimeline_addIndexes); tolua_function(tolua_S,"create", lua_cocos2dx_studio_ActionTimeline_create); tolua_endmodule(tolua_S); std::string typeName = typeid(cocostudio::timeline::ActionTimeline).name(); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp index 2286bc7daa..d32028d033 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp @@ -494,6 +494,9 @@ int register_all_cocos2dx_studio(lua_State* tolua_S); + + + diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index f4bbb046c1..bec22a5e68 100644 --- a/templates/cocos2dx_files.json +++ b/templates/cocos2dx_files.json @@ -257,6 +257,8 @@ "cocos/3d/CCBundle3DData.h", "cocos/3d/CCBundleReader.cpp", "cocos/3d/CCBundleReader.h", + "cocos/3d/CCFrustum.cpp", + "cocos/3d/CCFrustum.h", "cocos/3d/CCMesh.cpp", "cocos/3d/CCMesh.h", "cocos/3d/CCMeshSkin.cpp", @@ -267,6 +269,8 @@ "cocos/3d/CCOBB.h", "cocos/3d/CCObjLoader.cpp", "cocos/3d/CCObjLoader.h", + "cocos/3d/CCPlane.cpp", + "cocos/3d/CCPlane.h", "cocos/3d/CCRay.cpp", "cocos/3d/CCRay.h", "cocos/3d/CCSkeleton3D.cpp", @@ -5158,7 +5162,8 @@ "cocos/scripting/lua-bindings/script/cocos2d/Opengl.lua", "cocos/scripting/lua-bindings/script/cocos2d/OpenglConstants.lua", "cocos/scripting/lua-bindings/script/cocos2d/bitExtend.lua", - "cocos/scripting/lua-bindings/script/cocos2d/extern.lua", + "cocos/scripting/lua-bindings/script/cocos2d/deprecated.lua", + "cocos/scripting/lua-bindings/script/cocos2d/functions.lua", "cocos/scripting/lua-bindings/script/cocos2d/json.lua", "cocos/scripting/lua-bindings/script/cocos2d/luaj.lua", "cocos/scripting/lua-bindings/script/cocos2d/luaoc.lua", @@ -5176,6 +5181,17 @@ "cocos/scripting/lua-bindings/script/extension/DeprecatedExtensionEnum.lua", "cocos/scripting/lua-bindings/script/extension/DeprecatedExtensionFunc.lua", "cocos/scripting/lua-bindings/script/extension/ExtensionConstants.lua", + "cocos/scripting/lua-bindings/script/framework/audio.lua", + "cocos/scripting/lua-bindings/script/framework/components/event.lua", + "cocos/scripting/lua-bindings/script/framework/device.lua", + "cocos/scripting/lua-bindings/script/framework/display.lua", + "cocos/scripting/lua-bindings/script/framework/extends/LayerEx.lua", + "cocos/scripting/lua-bindings/script/framework/extends/MenuEx.lua", + "cocos/scripting/lua-bindings/script/framework/extends/NodeEx.lua", + "cocos/scripting/lua-bindings/script/framework/extends/SpriteEx.lua", + "cocos/scripting/lua-bindings/script/framework/init.lua", + "cocos/scripting/lua-bindings/script/framework/package_support.lua", + "cocos/scripting/lua-bindings/script/framework/transition.lua", "cocos/scripting/lua-bindings/script/init.lua", "cocos/scripting/lua-bindings/script/network/DeprecatedNetworkClass.lua", "cocos/scripting/lua-bindings/script/network/DeprecatedNetworkEnum.lua", diff --git a/templates/cpp-template-default/Resources/CloseNormal.png b/templates/cpp-template-default/Resources/CloseNormal.png index 5657a13b58..b65498c941 100644 Binary files a/templates/cpp-template-default/Resources/CloseNormal.png and b/templates/cpp-template-default/Resources/CloseNormal.png differ diff --git a/templates/cpp-template-default/Resources/CloseSelected.png b/templates/cpp-template-default/Resources/CloseSelected.png index e4c82da775..306749ecd2 100644 Binary files a/templates/cpp-template-default/Resources/CloseSelected.png and b/templates/cpp-template-default/Resources/CloseSelected.png differ diff --git a/templates/cpp-template-default/Resources/HelloWorld.png b/templates/cpp-template-default/Resources/HelloWorld.png index 5fe89fb5bd..b92aeeb7f6 100644 Binary files a/templates/cpp-template-default/Resources/HelloWorld.png and b/templates/cpp-template-default/Resources/HelloWorld.png differ diff --git a/templates/lua-template-default/src/main.lua b/templates/lua-template-default/src/main.lua index f2ace7d04a..7b0a513537 100644 --- a/templates/lua-template-default/src/main.lua +++ b/templates/lua-template-default/src/main.lua @@ -1,5 +1,7 @@ cc.FileUtils:getInstance():setPopupNotify(false) +cc.FileUtils:getInstance():addSearchPath("src/") +cc.FileUtils:getInstance():addSearchPath("res/") require "config" require "cocos.init" diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp index 99d1860936..c558d0a0bf 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.cpp @@ -7,6 +7,13 @@ #include "ConfigParser.h" #include "lua_module_register.h" +#include "cocostudio/CocoStudio.h" + +#if ((CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC)) +#include "service/DeviceEx.h" +#include "network/CCHTTPRequest.h" +#endif + using namespace CocosDenshion; USING_NS_CC; @@ -41,27 +48,15 @@ void AppDelegate::initGLContextAttrs() bool AppDelegate::applicationDidFinishLaunching() { -#if (COCOS2D_DEBUG > 0 && CC_CODE_IDE_DEBUG_SUPPORT > 0) - // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE - initRuntime(); + // +#if ((CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)) + _project.setDebuggerType(kCCRuntimeDebuggerCodeIDE); #endif - - // initialize director - auto director = Director::getInstance(); - auto glview = director->getOpenGLView(); - if(!glview) { - Size viewSize = ConfigParser::getInstance()->getInitViewSize(); - string title = ConfigParser::getInstance()->getInitViewName(); -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_MAC) && (COCOS2D_DEBUG > 0 && CC_CODE_IDE_DEBUG_SUPPORT > 0) - extern void createSimulator(const char* viewName, float width, float height, bool isLandscape = true, float frameZoomFactor = 1.0f); - bool isLanscape = ConfigParser::getInstance()->isLanscape(); - createSimulator(title.c_str(),viewSize.width,viewSize.height, isLanscape); -#else - glview = cocos2d::GLViewImpl::createWithRect(title.c_str(), Rect(0, 0, viewSize.width, viewSize.height)); - director->setOpenGLView(glview); -#endif - } + + // set default FPS + Director::getInstance()->setAnimationInterval(1.0 / 60.0f); + // register lua module auto engine = LuaEngine::getInstance(); ScriptEngineManager::getInstance()->setScriptEngine(engine); lua_State* L = engine->getLuaStack()->getLuaState(); @@ -77,13 +72,10 @@ bool AppDelegate::applicationDidFinishLaunching() //LuaStack* stack = engine->getLuaStack(); //register_custom_function(stack->getLuaState()); -#if (COCOS2D_DEBUG > 0 && CC_CODE_IDE_DEBUG_SUPPORT > 0) - // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE - startRuntime(); -#else - engine->executeScriptFile(ConfigParser::getInstance()->getEntryFile().c_str()); -#endif - + StartupCall *call = StartupCall::create(this); + call->startup(); + + cocos2d::log("iShow!"); return true; } @@ -102,3 +94,291 @@ void AppDelegate::applicationWillEnterForeground() SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); } + + +void AppDelegate::setProjectConfig(const ProjectConfig& project) +{ + _project = project; +} + +void AppDelegate::reopenProject() +{ + auto fileUtils = FileUtils::getInstance(); + + // + // set root path + // set search root **MUST** before set search paths + // + fileUtils->setDefaultResourceRootPath(_project.getProjectDir()); + + // clean + Director::getInstance()->getTextureCache()->removeAllTextures(); + Director::getInstance()->purgeCachedData(); + SimpleAudioEngine::getInstance()->stopAllEffects(); + SimpleAudioEngine::getInstance()->stopBackgroundMusic(true); + vector searchPaths; + fileUtils->setSearchPaths(searchPaths); + + const string writablePath = _project.getWritableRealPath(); + if (writablePath.length()) + { + FileUtils::getInstance()->setWritablePath(writablePath.c_str()); + } + + resetDesignResolution(); + + StartupCall *call = StartupCall::create(this); + call->startup(); +} + +// ---------------------------------------- + +StartupCall *StartupCall::create(AppDelegate *app) +{ + StartupCall *call = new StartupCall(); + call->_app = app; + call->autorelease(); + return call; +} + +StartupCall::StartupCall() + : _launchEvent("empty") +{ +} + +static bool endWithString(const std::string &buf, const std::string &suffix) +{ + return ((buf.find(suffix) + suffix.length()) == buf.length()); +} + +void StartupCall::startup() +{ + auto engine = LuaEngine::getInstance(); + auto stack = engine->getLuaStack(); + + const ProjectConfig &project = _app->_project; + + // set search path + string path = FileUtils::getInstance()->fullPathForFilename(project.getScriptFileRealPath().c_str()); + size_t pos; + while ((pos = path.find_first_of("\\")) != std::string::npos) + { + path.replace(pos, 1, "/"); + } + size_t p = path.find_last_of("/"); + string workdir; + if (p != path.npos) + { + workdir = path.substr(0, p); + stack->addSearchPath(workdir.c_str()); + FileUtils::getInstance()->addSearchPath(workdir); + } + + // update search pathes + FileUtils::getInstance()->addSearchPath(project.getProjectDir()); + auto &customizedPathes = project.getSearchPath(); + for (auto &path : customizedPathes) + { + FileUtils::getInstance()->addSearchPath(path); + } + + updateConfigParser(project); + if (FileUtils::getInstance()->isFileExist(path)) + { + updatePreviewFuncForPath(path); + + // launch + if (project.getDebuggerType() == kCCRuntimeDebuggerNone) + { + _previewFunc(path); + } + else + { + // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE + initRuntime(project.getProjectDir()); + startRuntime(); + } + } + else + { + CCLOG("[ERROR]: %s is not exist.", path.c_str()); + } + + // track start event + trackLaunchEvent(); +} + +// *NOTE* +// track event on windows / mac platform +// +void StartupCall::trackEvent(const char *eventName) +{ +#if ((CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC)) + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + const char *platform = "win"; +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) + const char *platform = "mac"; +#else + const char *platform = "UNKNOWN"; +#endif + + auto request = extra::HTTPRequest::createWithUrl(NULL, + "http://www.google-analytics.com/collect", + kCCHTTPRequestMethodPOST); + request->addPOSTValue("v", "1"); + request->addPOSTValue("tid", "UA-55061270-1"); + request->addPOSTValue("cid", player::DeviceEx::getInstance()->getUserGUID().c_str()); + request->addPOSTValue("t", "event"); + + request->addPOSTValue("an", "simulator"); + request->addPOSTValue("av", cocos2dVersion()); + + request->addPOSTValue("ec", platform); + request->addPOSTValue("ea", eventName); + + request->start(); + +#endif // ((CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC)) +} + +void StartupCall::trackLaunchEvent() +{ + trackEvent(_launchEvent.c_str()); +} + +void StartupCall::onPreviewCocosCSD(const std::string &path) +{ + std::string filepath = path; + if (filepath.empty()) + { + filepath = ConfigParser::getInstance()->getEntryFile(); + } + + CCLOG("------------------------------------------------"); + CCLOG("LOAD Cocos Studio FILE (.csd): %s", filepath.c_str()); + CCLOG("------------------------------------------------"); + + auto node = CSLoader::getInstance()->createNodeWithFlatBuffersForSimulator(filepath.c_str()); + auto action = cocostudio::timeline::ActionTimelineCache::getInstance()->createActionWithFlatBuffersForSimulator(filepath.c_str()); + if (action) + { + node->runAction(action); + action->gotoFrameAndPlay(0); + } + + if (node) + { + if (Director::getInstance()->getRunningScene()) + { + auto scene = Scene::create(); + scene->addChild(node); + Director::getInstance()->replaceScene(scene); + } + else + { + auto scene = Scene::create(); + scene->addChild(node); + Director::getInstance()->runWithScene(scene); + } + } +} + +void StartupCall::onPreviewCocosCSB(const std::string &path) +{ + std::string filepath = path; + if (filepath.empty()) + { + filepath = ConfigParser::getInstance()->getEntryFile(); + } + CCLOG("\n------------------------------------------------\n"); + CCLOG("[WARNING]: using **SUITABLE** Cocos Studio generate csb file!!"); + CCLOG("LOAD Cocos Studio FILE (.csb): %s", filepath.c_str()); + CCLOG("\n------------------------------------------------\n"); + + auto node = CSLoader::getInstance()->createNode(filepath); + if (node) + { + if (Director::getInstance()->getRunningScene()) + { + auto scene = Scene::create(); + scene->addChild(node); + Director::getInstance()->replaceScene(scene); + } + else + { + auto scene = Scene::create(); + scene->addChild(node); + Director::getInstance()->runWithScene(scene); + } + } +} + +void StartupCall::onPreviewLua(const std::string &path) +{ + CCLOG("------------------------------------------------"); + CCLOG("LOAD Lua FILE: %s", path.c_str()); + CCLOG("------------------------------------------------"); + + LuaEngine::getInstance()->executeScriptFile(path.c_str()); +} + +void StartupCall::onPreviewJs(const std::string &path) +{ + CCLOG("------------------------------------------------"); + CCLOG("LOAD Js FILE: %s", path.c_str()); + CCLOG("------------------------------------------------"); + + CCLOG("TODO: "); +} + +void StartupCall::updateConfigParser(const ProjectConfig& project) +{ + // set entry file + auto parser = ConfigParser::getInstance(); + string entryFile(project.getScriptFileRealPath()); + if (entryFile.find(project.getProjectDir()) != string::npos) + { + entryFile.erase(0, project.getProjectDir().length()); + } + entryFile = replaceAll(entryFile, "\\", "/"); + parser->setEntryFile(entryFile); + + parser->setBindAddress(project.getBindAddress()); +} + +void StartupCall::updatePreviewFuncForPath(const std::string &path) +{ + // set loader + _previewFunc = [](const std::string &path) { CCLOG("[WARNING]: unsupport %s", path.c_str()); }; + + if (!FileUtils::getInstance()->isFileExist(path)) + { + CCLOG("[ERROR]: %s is not exist.", path.c_str()); + return ; + } + + if (endWithString(path, ".lua")) + { + _launchEvent = "lua"; + _previewFunc = std::bind(&StartupCall::onPreviewLua, this, std::placeholders::_1); + setLoader(std::bind(&luaScriptLoader, std::placeholders::_1)); + } + else if (endWithString(path, ".csd")) + { + _launchEvent = "ccs"; + _previewFunc = std::bind(&StartupCall::onPreviewCocosCSD, this, std::placeholders::_1); + setLoader(std::bind(&StartupCall::onPreviewCocosCSD, this, std::placeholders::_1)); + } + else if (endWithString(path, ".csb")) + { + _launchEvent = "ccs"; + _previewFunc = std::bind(&StartupCall::onPreviewCocosCSB, this, std::placeholders::_1); + setLoader(std::bind(&StartupCall::onPreviewCocosCSB, this, std::placeholders::_1)); + } + else if (endWithString(path, ".js")) + { + _launchEvent = "js"; + _previewFunc = std::bind(&StartupCall::onPreviewJs, this, std::placeholders::_1); + } +} diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h index a2699dc754..eed4bacbb1 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/AppDelegate.h @@ -2,6 +2,8 @@ #define __APP_DELEGATE_H__ #include "cocos2d.h" +#include "ProjectConfig/ProjectConfig.h" +#include "ProjectConfig/SimulatorConfig.h" /** @brief The cocos2d Application. @@ -34,6 +36,42 @@ public: @param the pointer of the application */ virtual void applicationWillEnterForeground(); + + void setProjectConfig(const ProjectConfig& project); + + void reopenProject(); + +private: + ProjectConfig _project; + + friend class StartupCall; +}; + + +class StartupCall : public cocos2d::Ref +{ +public: + static StartupCall *create(AppDelegate *app); + void startup(); + +private: + StartupCall(); + + void trackEvent(const char *eventName); + void trackLaunchEvent(); + + void onPreviewCocosCSD(const std::string &path); + void onPreviewCocosCSB(const std::string &path); + void onPreviewLua(const std::string &path); + void onPreviewJs(const std::string &path); + + void updateConfigParser(const ProjectConfig& project); + void updatePreviewFuncForPath(const std::string &path); + +private: + AppDelegate *_app; + std::function _previewFunc; + std::string _launchEvent; }; #endif // __APP_DELEGATE_H__ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.cpp index 1bb12682dc..2aef3cb7d3 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.cpp @@ -6,12 +6,6 @@ #include "ConfigParser.h" #include "FileServer.h" -#define CONFIG_FILE "config.json" -#define CONSOLE_PORT 6010 -#define UPLOAD_PORT 6020 -#define WIN_WIDTH 960 -#define WIN_HEIGHT 640 - // ConfigParser ConfigParser *ConfigParser::s_sharedConfigParserInstance = NULL; ConfigParser *ConfigParser::getInstance(void) @@ -29,8 +23,10 @@ void ConfigParser::purge() CC_SAFE_DELETE(s_sharedConfigParserInstance); } -void ConfigParser::readConfig() +void ConfigParser::readConfig(const string &filepath) { + string fullPathFile = filepath; + #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // add writable path to search path temporarily for reading config file vector searchPathArray = FileUtils::getInstance()->getSearchPaths(); @@ -39,7 +35,10 @@ void ConfigParser::readConfig() #endif // read config file - string fullPathFile = FileUtils::getInstance()->fullPathForFilename(CONFIG_FILE); + if (fullPathFile.empty()) + { + fullPathFile = FileUtils::getInstance()->fullPathForFilename(CONFIG_FILE); + } string fileContent = FileUtils::getInstance()->getStringFromFile(fullPathFile); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) @@ -83,19 +82,19 @@ void ConfigParser::readConfig() } if (objectInitView.HasMember("entry") && objectInitView["entry"].IsString()) { - _entryfile = objectInitView["entry"].GetString(); + setEntryFile(objectInitView["entry"].GetString()); } if (objectInitView.HasMember("consolePort")) { _consolePort = objectInitView["consolePort"].GetUint(); if(_consolePort <= 0) - _consolePort = CONSOLE_PORT; + _consolePort = kProjectConfigConsolePort; } if (objectInitView.HasMember("uploadPort")) { _uploadPort = objectInitView["uploadPort"].GetUint(); if(_uploadPort <= 0) - _uploadPort = UPLOAD_PORT; + _uploadPort = kProjectConfigUploadPort; } if (objectInitView.HasMember("isWindowTop") && objectInitView["isWindowTop"].IsBool()) { @@ -123,11 +122,12 @@ void ConfigParser::readConfig() ConfigParser::ConfigParser(void) : _isLandscape(true), _isWindowTop(false), -_consolePort(CONSOLE_PORT), -_uploadPort(UPLOAD_PORT), -_viewName("HelloLua"), +_consolePort(kProjectConfigConsolePort), +_uploadPort(kProjectConfigUploadPort), +_viewName("simulator"), _entryfile("src/main.lua"), -_initViewSize(WIN_WIDTH, WIN_HEIGHT) +_initViewSize(ProjectConfig::DEFAULT_HEIGHT, ProjectConfig::DEFAULT_WIDTH), +_bindAddress("") { } @@ -160,6 +160,14 @@ bool ConfigParser::isWindowTop() { return _isWindowTop; } +void ConfigParser::setConsolePort(int port) +{ + _consolePort = port; +} +void ConfigParser::setUploadPort(int port) +{ + _uploadPort = port; +} int ConfigParser::getConsolePort() { return _consolePort; @@ -177,3 +185,23 @@ const SimulatorScreenSize ConfigParser::getScreenSize(int index) { return _screenSizeArray.at(index); } + +void ConfigParser::setEntryFile(const std::string &file) +{ + _entryfile = file; +} + +void ConfigParser::setInitViewSize(const cocos2d::Size &size) +{ + _initViewSize = size; +} + +void ConfigParser::setBindAddress(const std::string &address) +{ + _bindAddress = address; +} + +const std::string &ConfigParser::getBindAddress() +{ + return _bindAddress; +} diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.h index 6bc2515339..4c75846478 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.h +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ConfigParser.h @@ -5,29 +5,21 @@ #include #include "cocos2d.h" #include "json/document.h" +#include "ProjectConfig/SimulatorConfig.h" +#include "ProjectConfig/ProjectConfig.h" using namespace std; USING_NS_CC; -// ConfigParser -typedef struct _SimulatorScreenSize { - string title; - int width; - int height; - - _SimulatorScreenSize(const string title_, int width_, int height_) - { - title = title_; - width = width_; - height = height_; - } -} SimulatorScreenSize; +#define CONFIG_FILE "config.json" typedef vector ScreenSizeArray; class ConfigParser { public: static ConfigParser *getInstance(void); - static void purge(); + static void purge(); + + void readConfig(const string &filepath = ""); // predefined screen size int getScreenSizeCount(void); @@ -36,13 +28,19 @@ public: string getEntryFile(); rapidjson::Document& getConfigJsonRoot(); const SimulatorScreenSize getScreenSize(int index); + void setConsolePort(int port); + void setUploadPort(int port); int getConsolePort(); int getUploadPort(); bool isLanscape(); bool isWindowTop(); + void setEntryFile(const std::string &file); + void setInitViewSize(const cocos2d::Size &size); + void setBindAddress(const std::string &address); + const std::string &getBindAddress(); + private: - void readConfig(); ConfigParser(void); static ConfigParser *s_sharedConfigParserInstance; ScreenSizeArray _screenSizeArray; @@ -53,6 +51,7 @@ private: bool _isWindowTop; int _consolePort; int _uploadPort; + string _bindAddress; rapidjson::Document _docRootjson; }; diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/ProjectConfig.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/ProjectConfig.cpp new file mode 100644 index 0000000000..26aabcb744 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/ProjectConfig.cpp @@ -0,0 +1,791 @@ + +#include + +#include "ProjectConfig/ProjectConfig.h" +#include "ProjectConfig/SimulatorConfig.h" + +#ifdef _MSC_VER +#define strcasecmp _stricmp +#endif + +#if defined(_WINDOWS) +#define DIRECTORY_SEPARATOR "\\" +#define DIRECTORY_SEPARATOR_CHAR '\\' +#else +#define DIRECTORY_SEPARATOR "/" +#define DIRECTORY_SEPARATOR_CHAR '/' +#endif + +static std::vector &split(const std::string &s, char delim, std::vector &elems) { + std::stringstream ss(s); + std::string item; + while (std::getline(ss, item, delim)) { + elems.push_back(item); + } + return elems; +} + + +static std::vector split(const std::string &s, char delim) { + std::vector elems; + split(s, delim, elems); + return elems; +} + +ProjectConfig::ProjectConfig() + : _scriptFile("$(PROJDIR)/src/main.lua") + , _writablePath("") + , _packagePath("") + , _frameSize(960, 640) + , _frameScale(1.0f) + , _showConsole(true) + , _loadPrecompiledFramework(false) + , _writeDebugLogToFile(false) + , _windowOffset(0, 0) + , _debuggerType(kCCRuntimeDebuggerNone) + , _isAppMenu(true) + , _isResizeWindow(false) + , _isRetinaDisplay(false) + , _debugLogFile("debug.log") + , _consolePort(kProjectConfigConsolePort) + , _fileUploadPort(kProjectConfigUploadPort) + , _bindAddress("") +{ + normalize(); +} + +string ProjectConfig::getProjectDir() const +{ + return _projectDir; +} + +void ProjectConfig::setProjectDir(const string &projectDir) +{ + _projectDir = projectDir; + normalize(); +} + +string ProjectConfig::getScriptFile() const +{ + return _scriptFile; +} + +string ProjectConfig::getScriptFileRealPath() const +{ + return replaceProjectDirToFullPath(_scriptFile); +} + +void ProjectConfig::setScriptFile(const string &scriptFile) +{ + _scriptFile = scriptFile; + normalize(); +} + +string ProjectConfig::getWritablePath() const +{ + return _writablePath; +} + +string ProjectConfig::getWritableRealPath() const +{ + return replaceProjectDirToFullPath(_writablePath); +} + +void ProjectConfig::setWritablePath(const string &writablePath) +{ + _writablePath = writablePath; + normalize(); +} + +string ProjectConfig::getPackagePath() const +{ + return _packagePath; +} + +string ProjectConfig::getNormalizedPackagePath() const +{ + // replace $(PROJDIR) + auto path = _packagePath; + auto pos = string::npos; + while ((pos = path.find("$(PROJDIR)")) != string::npos) + { + path = path.substr(0, pos) + _projectDir + path.substr(pos + 10); + } + auto len = path.length(); + if (len && path[len - 1] != ';') + { + path.append(";"); + } + path.append(";"); + SimulatorConfig::makeNormalizePath(&path, "/"); + return path; +} + +void ProjectConfig::setPackagePath(const string &packagePath) +{ + _packagePath = packagePath; +} + +void ProjectConfig::addPackagePath(const string &packagePath) +{ + if (packagePath.length()) + { + if (_packagePath.length()) + { + _packagePath.append(";"); + } + _packagePath.append(packagePath); + normalize(); + } +} + +vector ProjectConfig::getPackagePathArray() const +{ + vector arr; + + size_t pos = string::npos; + size_t prev = 0; + while ((pos = _packagePath.find_first_of(";", pos + 1)) != string::npos) + { + auto path = _packagePath.substr(prev, pos - prev); + if (path.length() > 0) arr.push_back(path); + prev = pos + 1; + } + auto path = _packagePath.substr(prev); + if (path.length() > 0) arr.push_back(path); + return arr; +} + +cocos2d::Size ProjectConfig::getFrameSize() const +{ + return _frameSize; +} + +void ProjectConfig::setFrameSize(const cocos2d::Size &frameSize) +{ + if (frameSize.width > 0 && frameSize.height > 0) + { + _frameSize = frameSize; + } +} + +bool ProjectConfig::isLandscapeFrame() const +{ + return _frameSize.width > _frameSize.height; +} + +bool ProjectConfig::isPortraitFrame() const +{ + return _frameSize.width < _frameSize.height; +} + +void ProjectConfig::changeFrameOrientation() +{ + float w = _frameSize.width; + _frameSize.width = _frameSize.height; + _frameSize.height = w; +} + +void ProjectConfig::changeFrameOrientationToPortait() +{ + if (isLandscapeFrame()) changeFrameOrientation(); +} + +void ProjectConfig::changeFrameOrientationToLandscape() +{ + if (!isLandscapeFrame()) changeFrameOrientation(); +} + +float ProjectConfig::getFrameScale() const +{ + return _frameScale; +} + +void ProjectConfig::setFrameScale(float frameScale) +{ + if (frameScale > 0) + { + _frameScale = frameScale; + } +} + +bool ProjectConfig::isShowConsole() const +{ + return _showConsole; +} + +void ProjectConfig::setShowConsole(bool showConsole) +{ + _showConsole = showConsole; +} + +bool ProjectConfig::isLoadPrecompiledFramework() const +{ + return _loadPrecompiledFramework; +} + +void ProjectConfig::setLoadPrecompiledFramework(bool load) +{ + _loadPrecompiledFramework = load; +} + +bool ProjectConfig::isWriteDebugLogToFile() const +{ + return _writeDebugLogToFile; +} + +void ProjectConfig::setWriteDebugLogToFile(bool writeDebugLogToFile) +{ + _writeDebugLogToFile = writeDebugLogToFile; +} + +void ProjectConfig::setDebugLogFilePath(const std::string &logFile) +{ + _debugLogFile = logFile; +} +string ProjectConfig::getDebugLogFilePath() const +{ + if (isAbsolutePath(_debugLogFile)) return _debugLogFile; + + auto path(getProjectDir()); + path.append(_debugLogFile); + return path; +} + +cocos2d::Vec2 ProjectConfig::getWindowOffset() const +{ + return _windowOffset; +} + +void ProjectConfig::setWindowOffset(const cocos2d::Vec2 &windowOffset) +{ + _windowOffset = windowOffset; +} + +int ProjectConfig::getDebuggerType() const +{ + return _debuggerType; +} + +void ProjectConfig::setDebuggerType(int debuggerType) +{ + _debuggerType = debuggerType; +} + +void ProjectConfig::parseCommandLine(const vector &args) +{ + auto it = args.begin(); + while (it != args.end()) + { + string arg = *it; + + if (arg.compare("-workdir") == 0) + { + ++it; + if (it == args.end()) break; + setProjectDir(*it); + if (_writablePath.length() == 0) setWritablePath(*it); + } + else if (arg.compare("-writable-path") == 0) + { + ++it; + if (it == args.end()) break; + setWritablePath(*it); + } + else if (arg.compare("-entry") == 0) + { + ++it; + if (it == args.end()) break; + setScriptFile(*it); + } + else if (arg.compare("-landscape") == 0) + { + setFrameSize(cocos2d::Size(DEFAULT_HEIGHT, DEFAULT_WIDTH)); + } + else if (arg.compare("-portrait") == 0) + { + setFrameSize(cocos2d::Size(DEFAULT_WIDTH, DEFAULT_HEIGHT)); + } + else if (arg.compare("-resolution") == 0) + { + ++it; + if (it == args.end()) break; + const string& sizeStr(*it); + size_t pos = sizeStr.find('x'); + int width = 0; + int height = 0; + if (pos != sizeStr.npos && pos > 0) + { + string widthStr, heightStr; + widthStr.assign(sizeStr, 0, pos); + heightStr.assign(sizeStr, pos + 1, sizeStr.length() - pos); + width = atoi(widthStr.c_str()); + height = atoi(heightStr.c_str()); + setFrameSize(cocos2d::Size(width, height)); + } + } + else if (arg.compare("-scale") == 0) + { + ++it; + if (it == args.end()) break; + float scale = atof((*it).c_str()); + setFrameScale(scale); + } + else if (arg.compare("-write-debug-log") == 0) + { + ++it; + if (it == args.end()) break; + setDebugLogFilePath((*it)); + setWriteDebugLogToFile(true); + } + else if (arg.compare("-console") == 0) + { + ++it; + if (it == args.end()) break; + if ((*it).compare("enable") == 0) + { + setShowConsole(true); + } + else + { + setShowConsole(false); + } + } + else if (arg.compare("-position") == 0) + { + ++it; + if (it == args.end()) break; + const string& posStr(*it); + size_t pos = posStr.find(','); + int x = 0; + int y = 0; + if (pos != posStr.npos && pos > 0) + { + string xStr, yStr; + xStr.assign(posStr, 0, pos); + yStr.assign(posStr, pos + 1, posStr.length() - pos); + x = atoi(xStr.c_str()); + y = atoi(yStr.c_str()); + setWindowOffset(cocos2d::Vec2(x, y)); + } + } + else if (arg.compare("-debugger") == 0) + { + ++it; + if (it == args.end()) break; + if ((*it).compare("codeide") == 0) + { + setDebuggerType(kCCRuntimeDebuggerCodeIDE); + } + else if ((*it).compare("studio") == 0) + { + setDebuggerType(kCCRuntimeDebuggerStudio); + } + } + else if (arg.compare("-app-menu") == 0) + { + _isAppMenu = true; + } + else if (arg.compare("-resize-window") == 0) + { + _isResizeWindow = true; + } + else if (arg.compare("-retina-display") == 0) + { + _isRetinaDisplay = true; + } + else if (arg.compare("-port") == 0) + { + CCLOG("TODO:"); + } + else if (arg.compare("-listen") == 0) + { + ++it; + setBindAddress((*it)); + } + else if (arg.compare("-search-path") == 0) + { + ++it; + vector pathes = split((*it), ';'); + setSearchPath(pathes); + } + + ++it; + } +} + +string ProjectConfig::makeCommandLine(unsigned int mask /* = kProjectConfigAll */) const +{ + stringstream buff; + + vector commands = makeCommandLineVector(mask); + for (auto &cmd : commands) + { + buff << " " << cmd; + } + + string result = buff.str(); + while (result.at(0) == ' ') + { + result = result.assign(result, 1, result.length()); + } + + return result; +} + +vector ProjectConfig::makeCommandLineVector(unsigned int mask /* = kProjectConfigAll */) const +{ + vector ret; + + stringstream buff; + + if (mask & kProjectConfigProjectDir) + { + auto path = getProjectDir(); + if (path.length()) + { + ret.push_back("-workdir"); + ret.push_back(dealWithSpaceWithPath(path)); + } + } + + if (mask & kProjectConfigScriptFile) + { + auto path = getScriptFileRealPath(); + if (path.length()) + { + ret.push_back("-entry"); + ret.push_back(dealWithSpaceWithPath(path)); + } + } + + if (mask & kProjectConfigWritablePath) + { + auto path = getWritableRealPath(); + if (path.length()) + { + ret.push_back("-writable-path"); + ret.push_back(dealWithSpaceWithPath(path)); + } + } + + if (mask & kProjectConfigFrameSize) + { + buff.str(""); + buff << (int)getFrameSize().width; + buff << "x"; + buff << (int)getFrameSize().height; + + ret.push_back("-resolution"); + ret.push_back(buff.str()); + } + + if (mask & kProjectConfigFrameScale) + { + if (getFrameScale() < 1.0f) + { + buff.str(""); + buff.precision(2); + buff << getFrameScale(); + + ret.push_back("-scale"); + ret.push_back(buff.str()); + } + } + + if (mask & kProjectConfigWriteDebugLogToFile) + { + if (isWriteDebugLogToFile()) + { + ret.push_back("-write-debug-log"); + ret.push_back(getDebugLogFilePath()); + } + } + + if (mask & kProjectConfigShowConsole) + { + if (isShowConsole()) + { + ret.push_back("-console"); + ret.push_back("enable"); + } + else + { + ret.push_back("-console"); + ret.push_back("disable"); + } + } + + if (mask & kProjectConfigWindowOffset) + { + if (_windowOffset.x != 0 && _windowOffset.y != 0) + { + buff.str(""); + buff << (int)_windowOffset.x; + buff << ","; + buff << (int)_windowOffset.y; + buff << ""; + + ret.push_back("-position"); + ret.push_back(buff.str()); + } + } + + if (mask & kProjectConfigDebugger) + { + switch (getDebuggerType()) + { + case kCCRuntimeDebuggerCodeIDE: + ret.push_back("-debugger"); + ret.push_back("codeide"); + break; + case kCCRuntimeDebuggerStudio: + ret.push_back("-debugger"); + ret.push_back("studio"); + break; + } + } + + if (mask & kProjectConfigListen) + { + if (!_bindAddress.empty()) + { + ret.push_back("-listen"); + ret.push_back(_bindAddress); + } + } + + if (mask & kProjectConfigSearchPath) + { + if (_searchPath.size() > 0) + { + stringstream pathbuff; + for (auto &path : _searchPath) + { + pathbuff << dealWithSpaceWithPath(path) << ";"; + } + string pathArgs = pathbuff.str(); + pathArgs[pathArgs.length()-1] = '\0'; + + ret.push_back("-search-path"); + ret.push_back(pathArgs); + } + } + + return ret; +} + +void ProjectConfig::setConsolePort(int port) +{ + _consolePort = port; +} + +int ProjectConfig::getConsolePort() +{ + return _consolePort; +} + +void ProjectConfig::setFileUploadPort(int port) +{ + _fileUploadPort = port; +} + +int ProjectConfig::getFileUploadPort() +{ + return _fileUploadPort; +} + +void ProjectConfig::setBindAddress(const std::string &address) +{ + _bindAddress = address; +} + +const std::string &ProjectConfig::getBindAddress() const +{ + return _bindAddress; +} + +void ProjectConfig::setSearchPath(const vector &args) +{ + _searchPath = args; +} + +const vector &ProjectConfig::getSearchPath() const +{ + return _searchPath; +} + +bool ProjectConfig::isAppMenu() const +{ + return _isAppMenu; +} + +bool ProjectConfig::isResizeWindow() const +{ + return _isResizeWindow; +} + +bool ProjectConfig::isRetinaDisplay() const +{ + return _isRetinaDisplay; +} + +bool ProjectConfig::validate() const +{ + auto utils = cocos2d::FileUtils::getInstance(); + if (!utils->isDirectoryExist(_projectDir)) return false; + if (!utils->isDirectoryExist(getWritableRealPath())) return false; + if (!utils->isFileExist(getScriptFileRealPath())) return false; + return true; +} + +void ProjectConfig::dump() +{ + CCLOG("Project Config:"); + CCLOG(" project dir: %s", _projectDir.c_str()); + CCLOG(" writable path: %s", _writablePath.length() ? _writablePath.c_str() : "-"); + CCLOG(" script file: %s", _scriptFile.c_str()); + CCLOG(" frame size: %0.0f x %0.0f", _frameSize.width, _frameSize.height); + CCLOG(" frame scale: %0.2f", _frameScale); + CCLOG(" show console: %s", _showConsole ? "YES" : "NO"); + CCLOG(" write debug log: %s (%s)", _writeDebugLogToFile ? getDebugLogFilePath().c_str() : "NO", + _writeDebugLogToFile ? getDebugLogFilePath().c_str() : ""); + CCLOG(" listen: %s", _bindAddress.c_str()); + + if (_debuggerType == kCCRuntimeDebuggerLDT) + { + CCLOG(" debugger: Eclipse LDT"); + } + else if (_debuggerType == kCCRuntimeDebuggerCodeIDE) + { + CCLOG(" debugger: Cocos Code IDE"); + } + else if (_debuggerType == kCCRuntimeDebuggerStudio) + { + CCLOG(" debugger: Cocos Studio"); + } + else + { + CCLOG(" debugger: none"); + } + + CCLOG(" add searching path:"); + for (auto &path : _searchPath) + { + CCLOG(" %s", path.c_str()); + } + + CCLOG("\n\n"); +} + +void ProjectConfig::normalize() +{ + SimulatorConfig::makeNormalizePath(&_projectDir); + SimulatorConfig::makeNormalizePath(&_scriptFile); + SimulatorConfig::makeNormalizePath(&_writablePath); + SimulatorConfig::makeNormalizePath(&_packagePath); + + // projectDir + size_t len = _projectDir.length(); + if (len > 0 && _projectDir[len - 1] != DIRECTORY_SEPARATOR_CHAR) + { + _projectDir.append(DIRECTORY_SEPARATOR); + len++; + } + + // writablePath + if (len > 0 && _writablePath.length() == 0) + { + _writablePath = _projectDir; + } + len = _writablePath.length(); + if (len > 0 && _writablePath[len - 1] != DIRECTORY_SEPARATOR_CHAR) + { + _writablePath.append(DIRECTORY_SEPARATOR); + } + _writablePath = replaceProjectDirToMacro(_writablePath); + + // scriptFile + _scriptFile = replaceProjectDirToMacro(_scriptFile); + + // package.path + vector arr = getPackagePathArray(); + _packagePath = string(""); + for (auto it = arr.begin(); it != arr.end(); ++it) + { + string path = replaceProjectDirToMacro(*it); + _packagePath.append(path); + _packagePath.append(";"); + } + if (_packagePath.length() > 0 && _packagePath[_packagePath.length() - 1] == ';') + { + _packagePath = _packagePath.substr(0, _packagePath.length() - 1); + } +} + +string ProjectConfig::replaceProjectDirToMacro(const string &path) const +{ + if (!isAbsolutePath(path)) + { + if (path.compare(0, 10, "$(PROJDIR)") == 0) return path; + string result("$(PROJDIR)"); + result.append(DIRECTORY_SEPARATOR); + result.append(path); + return result; + } + + string result = path; + size_t len = _projectDir.length(); + if (len > 0 && result.compare(0, len, _projectDir) == 0) + { + result = "$(PROJDIR)"; + result.append(DIRECTORY_SEPARATOR); + result.append(path.substr(len)); + } + return result; +} + +string ProjectConfig::replaceProjectDirToFullPath(const string &path) const +{ + if (isAbsolutePath(path)) return path; + + if (path.length() == 0) return _projectDir; + + string result = path; + if (path.compare(0, 10, "$(PROJDIR)") == 0) + { + result = _projectDir; + string suffix = path.substr(10); + if (suffix[0] == DIRECTORY_SEPARATOR_CHAR) + { + suffix = suffix.substr(1); + } + result.append(suffix); + } + return result; +} + +bool ProjectConfig::isAbsolutePath(const string &path) const +{ + if (DIRECTORY_SEPARATOR_CHAR == '/') + { + return path.length() > 0 && path[0] == '/'; + } + return path.length() > 2 && path[1] == ':'; +} + +string ProjectConfig::dealWithSpaceWithPath(const string &path) const +{ +#if defined(_WINDOWS) + string ret("\""); + ret += path; + if (path[path.length() - 1] == '\\') + { + ret += "\\"; + } + ret += "\""; + return ret; +#else + return path; +#endif +} diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/ProjectConfig.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/ProjectConfig.h new file mode 100644 index 0000000000..22958bf5c6 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/ProjectConfig.h @@ -0,0 +1,148 @@ + +#ifndef __PROJECT_CONFIG_H_ +#define __PROJECT_CONFIG_H_ + +#include +#include + +using namespace std; + +#include "cocos2d.h" +#include "CCLuaStack.h" + +#define kCCRuntimeDebuggerNone 0 +#define kCCRuntimeDebuggerLDT 1 +#define kCCRuntimeDebuggerCodeIDE 2 +#define kCCRuntimeDebuggerStudio 3 + +#define kProjectConfigProjectDir 1 // -workdir "PATH" +#define kProjectConfigScriptFile 2 // -script "FILENAME" +#define kProjectConfigPackagePath 4 // -package.path "PATH;PATH" +#define kProjectConfigWritablePath 8 // -writable "PATH" +#define kProjectConfigFrameSize 16 // -size 960x640 +#define kProjectConfigFrameScale 32 // -scale 1.0 +#define kProjectConfigShowConsole 64 // -console, -disable-console +#define kProjectConfigLoadPrecompiledFramework 128 // -load-framework, -disable-load-framework +#define kProjectConfigWriteDebugLogToFile 256 // -write-debug-log, -disable-write-debug-log +#define kProjectConfigWindowOffset 512 // -offset {0,0} +#define kProjectConfigDebugger 1024 // -debugger-ldt, -debugger-codeide, -disable-debugger +#define kProjectConfigListen 2048 // +#define kProjectConfigSearchPath 4096 // + +#define kProjectConfigOpenRecent (kProjectConfigProjectDir | kProjectConfigScriptFile | kProjectConfigPackagePath | kProjectConfigWritablePath | kProjectConfigFrameSize | kProjectConfigFrameScale | kProjectConfigShowConsole | kProjectConfigLoadPrecompiledFramework | kProjectConfigWriteDebugLogToFile) + +#define kProjectConfigAll (kProjectConfigProjectDir | kProjectConfigScriptFile | kProjectConfigPackagePath | kProjectConfigWritablePath | kProjectConfigFrameSize | kProjectConfigFrameScale | kProjectConfigShowConsole | kProjectConfigLoadPrecompiledFramework | kProjectConfigWriteDebugLogToFile | kProjectConfigWindowOffset | kProjectConfigDebugger | kProjectConfigListen | kProjectConfigSearchPath) + + +#define kProjectConfigConsolePort 6010 +#define kProjectConfigUploadPort 6020 + +class ProjectConfig +{ +public: + ProjectConfig(); + + static const int DEFAULT_WIDTH = 640; + static const int DEFAULT_HEIGHT = 960; + + string getProjectDir() const; + void setProjectDir(const string &projectDir); + + string getScriptFile() const; + string getScriptFileRealPath() const; + void setScriptFile(const string &scriptFile); + + string getWritablePath() const; + string getWritableRealPath() const; + void setWritablePath(const string &writablePath); + + string getPackagePath() const; + string getNormalizedPackagePath() const; + void setPackagePath(const string &packagePath); + void addPackagePath(const string &packagePath); + vector getPackagePathArray() const; + + cocos2d::Size getFrameSize() const; + void setFrameSize(const cocos2d::Size &frameSize); + bool isLandscapeFrame() const; + bool isPortraitFrame() const; + void changeFrameOrientation(); + void changeFrameOrientationToPortait(); + void changeFrameOrientationToLandscape(); + + float getFrameScale() const; + void setFrameScale(float frameScale); + + bool isShowConsole() const; + void setShowConsole(bool showConsole); + + bool isLoadPrecompiledFramework() const; + void setLoadPrecompiledFramework(bool load); + + bool isWriteDebugLogToFile() const; + void setWriteDebugLogToFile(bool writeDebugLogToFile); + void setDebugLogFilePath(const std::string &logFile); + string getDebugLogFilePath() const; + + cocos2d::Vec2 getWindowOffset() const; + void setWindowOffset(const cocos2d::Vec2 &windowOffset); + + int getDebuggerType() const; + void setDebuggerType(int debuggerType); + + void parseCommandLine(const vector &args); + string makeCommandLine(unsigned int mask = kProjectConfigAll) const; + vector makeCommandLineVector(unsigned int mask = kProjectConfigAll) const; + + void setConsolePort(int port); + int getConsolePort(); + void setFileUploadPort(int port); + int getFileUploadPort(); + // @address: 127.0.0.1 + void setBindAddress(const std::string &address); + const std::string &getBindAddress() const; + void setSearchPath(const vector &args); + const vector &getSearchPath() const; + + bool isAppMenu() const; + bool isResizeWindow() const; + bool isRetinaDisplay() const; + + bool validate() const; + void dump(); + +private: + string _projectDir; + string _scriptFile; + string _packagePath; + string _writablePath; + cocos2d::Size _frameSize; + float _frameScale; + bool _showConsole; + bool _loadPrecompiledFramework; + bool _writeDebugLogToFile; + bool _restartProcess; + cocos2d::Vec2 _windowOffset; + int _debuggerType; + bool _isAppMenu; + bool _isResizeWindow; + bool _isRetinaDisplay; + string _debugLogFile; + int _consolePort; + int _fileUploadPort; + string _bindAddress; + vector _searchPath; + + void normalize(); + string replaceProjectDirToMacro(const string &path) const; + string replaceProjectDirToFullPath(const string &path) const; + bool isAbsolutePath(const string &path) const; + + /** + * windows : Y:\Documents\CocosProjects\Cocos Project\ -> "Y:\Documents\CocosProjects\Cocos Project\\" + * other : return @path + */ + string dealWithSpaceWithPath(const string &path) const; +}; + +#endif // __PROJECT_CONFIG_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/SimulatorConfig.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/SimulatorConfig.cpp new file mode 100644 index 0000000000..092a7a8fdf --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/SimulatorConfig.cpp @@ -0,0 +1,77 @@ + +#include "SimulatorConfig.h" +#include + +SimulatorConfig *SimulatorConfig::_instance = NULL; + +SimulatorConfig *SimulatorConfig::getInstance() +{ + if (!_instance) + { + _instance = new SimulatorConfig(); + } + return _instance; +} + +SimulatorConfig::SimulatorConfig() +{ + _screenSizeArray.push_back(SimulatorScreenSize("iPhone 3Gs (320x480)", 320, 480)); + _screenSizeArray.push_back(SimulatorScreenSize("iPhone 4 (640x960)", 640, 960)); + _screenSizeArray.push_back(SimulatorScreenSize("iPhone 5 (640x1136)", 640, 1136)); + _screenSizeArray.push_back(SimulatorScreenSize("iPad (768x1024)", 768, 1024)); + _screenSizeArray.push_back(SimulatorScreenSize("iPad Retina (1536x2048)", 1536, 2048)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (480x800)", 480, 800)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (480x854)", 480, 854)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (540x960)", 540, 960)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (600x1024)", 600, 1024)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (720x1280)", 720, 1280)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (800x1280)", 800, 1280)); + _screenSizeArray.push_back(SimulatorScreenSize("Android (1080x1920)", 1080, 1920)); +} + +int SimulatorConfig::getScreenSizeCount() const +{ + return (int)_screenSizeArray.size(); +} + +SimulatorScreenSize SimulatorConfig::getScreenSize(int index) const +{ + return _screenSizeArray.at(index); +} + +int SimulatorConfig::checkScreenSize(const cocos2d::Size &size) const +{ + int width = size.width; + int height = size.height; + + if (width > height) + { + int w = width; + width = height; + height = w; + } + + int count = (int)_screenSizeArray.size(); + for (int i = 0; i < count; ++i) + { + const SimulatorScreenSize &size = _screenSizeArray[i]; + if (size.width == width && size.height == height) + { + return i; + } + } + + return -1; +} + +// helper + +void SimulatorConfig::makeNormalizePath(string *path, const char *directorySeparator/* = NULL*/) +{ + if (!directorySeparator) directorySeparator = DIRECTORY_SEPARATOR; + size_t pos = std::string::npos; + while ((pos = path->find_first_of("/\\", pos + 1)) != std::string::npos) + { + path->replace(pos, 1, directorySeparator); + } +} diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/SimulatorConfig.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/SimulatorConfig.h new file mode 100644 index 0000000000..e8306272f4 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/ProjectConfig/SimulatorConfig.h @@ -0,0 +1,57 @@ + +#ifndef __SIMULATOR_CONFIG_H_ +#define __SIMULATOR_CONFIG_H_ + +#include +#include + +using namespace std; + +#include "cocos2d.h" + +#if defined(_WINDOWS) +#define DIRECTORY_SEPARATOR "\\" +#define DIRECTORY_SEPARATOR_CHAR '\\' +#else +#define DIRECTORY_SEPARATOR "/" +#define DIRECTORY_SEPARATOR_CHAR '/' +#endif + +typedef struct _SimulatorScreenSize { + string title; + int width; + int height; + + _SimulatorScreenSize(const string &title_, int width_, int height_) + { + title = title_; + width = width_; + height = height_; + } +} SimulatorScreenSize; + +typedef vector ScreenSizeArray; +typedef ScreenSizeArray::iterator ScreenSizeArrayIterator; + +class SimulatorConfig +{ +public: + static SimulatorConfig *getInstance(); + + // predefined screen size + int getScreenSizeCount() const; + SimulatorScreenSize getScreenSize(int index) const; + int checkScreenSize(const cocos2d::Size &size) const; + + // helper + static void makeNormalizePath(string *path, const char *directorySeparator = NULL); + +private: + SimulatorConfig(); + + static SimulatorConfig *_instance; + + ScreenSizeArray _screenSizeArray; +}; + +#endif // __SIMULATOR_CONFIG_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/cocos2dx_extra.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/cocos2dx_extra.h new file mode 100644 index 0000000000..cf7f3c8354 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/cocos2dx_extra.h @@ -0,0 +1,15 @@ + +#ifndef __COCOS2D_X_EXTRA_H_ +#define __COCOS2D_X_EXTRA_H_ + +#include "cocos2d.h" +#include + +using namespace std; +using namespace cocos2d; + +#define NS_CC_EXTRA_BEGIN namespace cocos2d { namespace extra { +#define NS_CC_EXTRA_END }} +#define USING_NS_CC_EXTRA using namespace cocos2d::extra + +#endif /* __COCOS2D_X_EXTRA_H_ */ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/lang b/templates/lua-template-runtime/frameworks/runtime-src/Classes/lang new file mode 100644 index 0000000000..fa00857116 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/lang @@ -0,0 +1,20 @@ +{ + "zh-CN": { + "View": "视图(&V)", + "Exit": "退出(&X)", + "File": "文件(&F)", + "Portrait": "ç«–å±", + "Landscape": "横å±", + "Refresh": "刷新(é‡å¯)", + "Zoom Out": "缩放" + }, + "zh-Hans": { + "View": "视图", + "Exit": "退出", + "File": "文件", + "Portrait": "ç«–å±", + "Landscape": "横å±", + "Refresh": "刷新(é‡å¯)", + "Zoom Out": "缩放" + } +} \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequest.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequest.cpp new file mode 100644 index 0000000000..d6cbd25b47 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequest.cpp @@ -0,0 +1,554 @@ +#include "network/CCHTTPRequest.h" +#include +#include +#include + +#if CC_LUA_ENGINE_ENABLED > 0 +extern "C" { +#include "lua.h" +} +#include "CCLuaEngine.h" +#endif +#include + + +NS_CC_EXTRA_BEGIN + +unsigned int HTTPRequest::s_id = 0; + +HTTPRequest *HTTPRequest::createWithUrl(HTTPRequestDelegate *delegate, + const char *url, + int method) +{ + HTTPRequest *request = new HTTPRequest(); + request->initWithDelegate(delegate, url, method); + request->autorelease(); + return request; +} + +#if CC_LUA_ENGINE_ENABLED > 0 +HTTPRequest *HTTPRequest::createWithUrlLua(LUA_FUNCTION listener, + const char *url, + int method) +{ + HTTPRequest *request = new HTTPRequest(); + request->initWithListener(listener, url, method); + request->autorelease(); + return request; +} +#endif + +bool HTTPRequest::initWithDelegate(HTTPRequestDelegate *delegate, const char *url, int method) +{ + _delegate = delegate; + return initWithUrl(url, method); +} + +#if CC_LUA_ENGINE_ENABLED > 0 +bool HTTPRequest::initWithListener(LUA_FUNCTION listener, const char *url, int method) +{ + _listener = listener; + return initWithUrl(url, method); +} +#endif + +bool HTTPRequest::initWithUrl(const char *url, int method) +{ + CCAssert(url, "HTTPRequest::initWithUrl() - invalid url"); + _curl = curl_easy_init(); + curl_easy_setopt(_curl, CURLOPT_URL, url); + curl_easy_setopt(_curl, CURLOPT_USERAGENT, "libcurl"); + curl_easy_setopt(_curl, CURLOPT_CONNECTTIMEOUT, DEFAULT_TIMEOUT); + curl_easy_setopt(_curl, CURLOPT_TIMEOUT, DEFAULT_TIMEOUT); + curl_easy_setopt(_curl, CURLOPT_NOSIGNAL, 1L); + + if (method == kCCHTTPRequestMethodPOST) + { + curl_easy_setopt(_curl, CURLOPT_POST, 1L); + curl_easy_setopt(_curl, CURLOPT_COPYPOSTFIELDS, ""); + } + + ++s_id; + // CCLOG("HTTPRequest[0x%04x] - create request with url: %s", s_id, url); + return true; +} + +HTTPRequest::~HTTPRequest(void) +{ + cleanup(); + if (_listener) + { +#if (CC_LUA_ENGINE_ENABLED > 0) + LuaEngine::getInstance()->removeScriptHandler(_listener); +#endif + } + // CCLOG("HTTPRequest[0x%04x] - request removed", s_id); +} + +void HTTPRequest::setRequestUrl(const char *url) +{ + CCAssert(url, "HTTPRequest::setRequestUrl() - invalid url"); + _url = url; + curl_easy_setopt(_curl, CURLOPT_URL, _url.c_str()); +} + +const string HTTPRequest::getRequestUrl(void) +{ + return _url; +} + +void HTTPRequest::addRequestHeader(const char *header) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::addRequestHeader() - request not idle"); + CCAssert(header, "HTTPRequest::addRequestHeader() - invalid header"); + _headers.push_back(string(header)); +} + +void HTTPRequest::addPOSTValue(const char *key, const char *value) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::addPOSTValue() - request not idle"); + CCAssert(key, "HTTPRequest::addPOSTValue() - invalid key"); + _postFields[string(key)] = string(value ? value : ""); +} + +void HTTPRequest::setPOSTData(const char *data) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::setPOSTData() - request not idle"); + CCAssert(data, "HTTPRequest::setPOSTData() - invalid post data"); + _postFields.clear(); + curl_easy_setopt(_curl, CURLOPT_POST, 1L); + curl_easy_setopt(_curl, CURLOPT_COPYPOSTFIELDS, data); +} + +void HTTPRequest::addFormFile(const char *name, const char *filePath, const char *contentType) +{ + curl_formadd(&_formPost, &_lastPost, + CURLFORM_COPYNAME, name, + CURLFORM_FILE, filePath, + CURLFORM_CONTENTTYPE, contentType, + CURLFORM_END); + //CCLOG("addFormFile %s %s %s", name, filePath, contentType); +} + +void HTTPRequest::addFormContents(const char *name, const char *value) +{ + curl_formadd(&_formPost, &_lastPost, + CURLFORM_COPYNAME, name, + CURLFORM_COPYCONTENTS, value, + CURLFORM_END); + //CCLOG("addFormContents %s %s", name, value); +} + +void HTTPRequest::setCookieString(const char *cookie) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::setAcceptEncoding() - request not idle"); + curl_easy_setopt(_curl, CURLOPT_COOKIE, cookie ? cookie : ""); +} + +const string HTTPRequest::getCookieString(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "HTTPRequest::getResponseData() - request not completed"); + return _responseCookies; +} + +void HTTPRequest::setAcceptEncoding(int acceptEncoding) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::setAcceptEncoding() - request not idle"); + switch (acceptEncoding) + { + case kCCHTTPRequestAcceptEncodingGzip: + curl_easy_setopt(_curl, CURLOPT_ACCEPT_ENCODING, "gzip"); + break; + + case kCCHTTPRequestAcceptEncodingDeflate: + curl_easy_setopt(_curl, CURLOPT_ACCEPT_ENCODING, "deflate"); + break; + + default: + curl_easy_setopt(_curl, CURLOPT_ACCEPT_ENCODING, "identity"); + } +} + +void HTTPRequest::setTimeout(int timeout) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::setTimeout() - request not idle"); + curl_easy_setopt(_curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(_curl, CURLOPT_TIMEOUT, timeout); +} + +bool HTTPRequest::start(void) +{ + CCAssert(_state == kCCHTTPRequestStateIdle, "HTTPRequest::start() - request not idle"); + + _state = kCCHTTPRequestStateInProgress; + _curlState = kCCHTTPRequestCURLStateBusy; + retain(); + + curl_easy_setopt(_curl, CURLOPT_HTTP_CONTENT_DECODING, 1); + curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, writeDataCURL); + curl_easy_setopt(_curl, CURLOPT_WRITEDATA, this); + curl_easy_setopt(_curl, CURLOPT_HEADERFUNCTION, writeHeaderCURL); + curl_easy_setopt(_curl, CURLOPT_WRITEHEADER, this); + curl_easy_setopt(_curl, CURLOPT_NOPROGRESS, false); + curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, progressCURL); + curl_easy_setopt(_curl, CURLOPT_PROGRESSDATA, this); + curl_easy_setopt(_curl, CURLOPT_COOKIEFILE, ""); + +#ifdef _WINDOWS_ + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + std::thread worker(requestCURL, this); + worker.detach(); + +#else + CreateThread(NULL, // default security attributes + 0, // use default stack size + requestCURL, // thread function name + this, // argument to thread function + 0, // use default creation flags + NULL); +#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WP8 + +#else + pthread_create(&_thread, NULL, requestCURL, this); + pthread_detach(_thread); +#endif + + Director::getInstance()->getScheduler()->scheduleUpdate(this, 0, false); + // CCLOG("HTTPRequest[0x%04x] - request start", s_id); + return true; +} + +void HTTPRequest::cancel(void) +{ + _delegate = NULL; + if (_state == kCCHTTPRequestStateIdle || _state == kCCHTTPRequestStateInProgress) + { + _state = kCCHTTPRequestStateCancelled; + } +} + +int HTTPRequest::getState(void) +{ + return _state; +} + +int HTTPRequest::getResponseStatusCode(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "Request not completed"); + return _responseCode; +} + +const HTTPRequestHeaders &HTTPRequest::getResponseHeaders(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "HTTPRequest::getResponseHeaders() - request not completed"); + return _responseHeaders; +} + +const string HTTPRequest::getResponseHeadersString() +{ + string buf; + for (HTTPRequestHeadersIterator it = _responseHeaders.begin(); it != _responseHeaders.end(); ++it) + { + buf.append(*it); + } + return buf; +} + +const string HTTPRequest::getResponseString(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "HTTPRequest::getResponseString() - request not completed"); + return string(_responseBuffer ? static_cast(_responseBuffer) : ""); +} + +void *HTTPRequest::getResponseData(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "HTTPRequest::getResponseData() - request not completed"); + void *buff = malloc(_responseDataLength); + memcpy(buff, _responseBuffer, _responseDataLength); + return buff; +} + +#if CC_LUA_ENGINE_ENABLED > 0 +LUA_STRING HTTPRequest::getResponseDataLua(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "HTTPRequest::getResponseDataLua() - request not completed"); + LuaStack *stack = LuaEngine::getInstance()->getLuaStack(); + stack->clean(); + stack->pushString(static_cast(_responseBuffer), (int)_responseDataLength); + return 1; +} +#endif + +int HTTPRequest::getResponseDataLength(void) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "Request not completed"); + return (int)_responseDataLength; +} + +size_t HTTPRequest::saveResponseData(const char *filename) +{ + CCAssert(_state == kCCHTTPRequestStateCompleted, "HTTPRequest::saveResponseData() - request not completed"); + + FILE *fp = fopen(filename, "wb"); + CCAssert(fp, "HTTPRequest::saveResponseData() - open file failure"); + + size_t writedBytes = _responseDataLength; + if (writedBytes > 0) + { + fwrite(_responseBuffer, _responseDataLength, 1, fp); + } + fclose(fp); + return writedBytes; +} + +int HTTPRequest::getErrorCode(void) +{ + return _errorCode; +} + +const string HTTPRequest::getErrorMessage(void) +{ + return _errorMessage; +} + +HTTPRequestDelegate* HTTPRequest::getDelegate(void) +{ + return _delegate; +} + +void HTTPRequest::checkCURLState(float dt) +{ + CC_UNUSED_PARAM(dt); + if (_curlState != kCCHTTPRequestCURLStateBusy) + { + Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); + release(); + } +} + +void HTTPRequest::update(float dt) +{ + if (_state == kCCHTTPRequestStateInProgress) + { +#if CC_LUA_ENGINE_ENABLED > 0 + if (_listener) + { + LuaValueDict dict; + + dict["name"] = LuaValue::stringValue("progress"); + dict["total"] = LuaValue::intValue((int)_dltotal); + dict["dltotal"] = LuaValue::intValue((int)_dlnow); + dict["request"] = LuaValue::ccobjectValue(this, "HTTPRequest"); + + LuaStack *stack = LuaEngine::getInstance()->getLuaStack(); + stack->clean(); + stack->pushLuaValueDict(dict); + stack->executeFunctionByHandler(_listener, 1); + } +#endif + return; + } + + Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); + if (_curlState != kCCHTTPRequestCURLStateIdle) + { + Director::getInstance()->getScheduler()->schedule(schedule_selector(HTTPRequest::checkCURLState), this, 0, false); + } + + if (_state == kCCHTTPRequestStateCompleted) + { + // CCLOG("HTTPRequest[0x%04x] - request completed", s_id); + if (_delegate) _delegate->requestFinished(this); + } + else + { + // CCLOG("HTTPRequest[0x%04x] - request failed", s_id); + if (_delegate) _delegate->requestFailed(this); + } + +#if CC_LUA_ENGINE_ENABLED > 0 + if (_listener) + { + LuaValueDict dict; + + switch (_state) + { + case kCCHTTPRequestStateCompleted: + dict["name"] = LuaValue::stringValue("completed"); + break; + + case kCCHTTPRequestStateCancelled: + dict["name"] = LuaValue::stringValue("cancelled"); + break; + + case kCCHTTPRequestStateFailed: + dict["name"] = LuaValue::stringValue("failed"); + break; + + default: + dict["name"] = LuaValue::stringValue("unknown"); + } + dict["request"] = LuaValue::ccobjectValue(this, "HTTPRequest"); + LuaStack *stack = LuaEngine::getInstance()->getLuaStack(); + stack->clean(); + stack->pushLuaValueDict(dict); + stack->executeFunctionByHandler(_listener, 1); + } +#endif +} + +// instance callback + +void HTTPRequest::onRequest(void) +{ + if (_postFields.size() > 0) + { + curl_easy_setopt(_curl, CURLOPT_POST, 1L); + stringbuf buf; + for (Fields::iterator it = _postFields.begin(); it != _postFields.end(); ++it) + { + char *part = curl_easy_escape(_curl, it->first.c_str(), 0); + buf.sputn(part, strlen(part)); + buf.sputc('='); + curl_free(part); + + part = curl_easy_escape(_curl, it->second.c_str(), 0); + buf.sputn(part, strlen(part)); + curl_free(part); + + buf.sputc('&'); + } + curl_easy_setopt(_curl, CURLOPT_COPYPOSTFIELDS, buf.str().c_str()); + } + + struct curl_slist *chunk = NULL; + for (HTTPRequestHeadersIterator it = _headers.begin(); it != _headers.end(); ++it) + { + chunk = curl_slist_append(chunk, (*it).c_str()); + } + + if (_formPost) + { + curl_easy_setopt(_curl, CURLOPT_HTTPPOST, _formPost); + } + + curl_slist *cookies = NULL; + curl_easy_setopt(_curl, CURLOPT_HTTPHEADER, chunk); + CURLcode code = curl_easy_perform(_curl); + curl_easy_getinfo(_curl, CURLINFO_RESPONSE_CODE, &_responseCode); + curl_easy_getinfo(_curl, CURLINFO_COOKIELIST, &cookies); + + if (cookies) + { + struct curl_slist *nc = cookies; + stringbuf buf; + while (nc) + { + buf.sputn(nc->data, strlen(nc->data)); + buf.sputc('\n'); + nc = nc->next; + } + _responseCookies = buf.str(); + curl_slist_free_all(cookies); + cookies = NULL; + } + + curl_easy_cleanup(_curl); + _curl = NULL; + if (_formPost) + { + curl_formfree(_formPost); + _formPost = NULL; + } + curl_slist_free_all(chunk); + + _errorCode = code; + _errorMessage = (code == CURLE_OK) ? "" : curl_easy_strerror(code); + _state = (code == CURLE_OK) ? kCCHTTPRequestStateCompleted : kCCHTTPRequestStateFailed; + _curlState = kCCHTTPRequestCURLStateClosed; +} + +size_t HTTPRequest::onWriteData(void *buffer, size_t bytes) +{ + if (_responseDataLength + bytes + 1 > _responseBufferLength) + { + _responseBufferLength += BUFFER_CHUNK_SIZE; + _responseBuffer = realloc(_responseBuffer, _responseBufferLength); + } + + memcpy(static_cast(_responseBuffer) + _responseDataLength, buffer, bytes); + _responseDataLength += bytes; + static_cast(_responseBuffer)[_responseDataLength] = 0; + return bytes; +} + +size_t HTTPRequest::onWriteHeader(void *buffer, size_t bytes) +{ + char *headerBuffer = new char[bytes + 1]; + headerBuffer[bytes] = 0; + memcpy(headerBuffer, buffer, bytes); + _responseHeaders.push_back(string(headerBuffer)); + delete []headerBuffer; + return bytes; +} + +int HTTPRequest::onProgress(double dltotal, double dlnow, double ultotal, double ulnow) +{ + _dltotal = dltotal; + _dlnow = dlnow; + _ultotal = ultotal; + _ulnow = ulnow; + + return _state == kCCHTTPRequestStateCancelled ? 1: 0; +} + +void HTTPRequest::cleanup(void) +{ + _state = kCCHTTPRequestStateCleared; + _responseBufferLength = 0; + _responseDataLength = 0; + if (_responseBuffer) + { + free(_responseBuffer); + _responseBuffer = NULL; + } + if (_curl) + { + curl_easy_cleanup(_curl); + _curl = NULL; + } +} + +// curl callback + +#ifdef _WINDOWS_ +DWORD WINAPI HTTPRequest::requestCURL(LPVOID userdata) +{ + static_cast(userdata)->onRequest(); + return 0; +} +#else // _WINDOWS_ +void *HTTPRequest::requestCURL(void *userdata) +{ + static_cast(userdata)->onRequest(); + return NULL; +} +#endif // _WINDOWS_ + +size_t HTTPRequest::writeDataCURL(void *buffer, size_t size, size_t nmemb, void *userdata) +{ + return static_cast(userdata)->onWriteData(buffer, size *nmemb); +} + +size_t HTTPRequest::writeHeaderCURL(void *buffer, size_t size, size_t nmemb, void *userdata) +{ + return static_cast(userdata)->onWriteHeader(buffer, size *nmemb); +} + +int HTTPRequest::progressCURL(void *userdata, double dltotal, double dlnow, double ultotal, double ulnow) +{ + return static_cast(userdata)->onProgress(dltotal, dlnow, ultotal, ulnow); +} + +NS_CC_EXTRA_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequest.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequest.h new file mode 100644 index 0000000000..5f37e9f41e --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequest.h @@ -0,0 +1,226 @@ + +#ifndef __CC_HTTP_REQUEST_H_ +#define __CC_HTTP_REQUEST_H_ + +#include "cocos2dx_extra.h" +#include "cocos2d.h" +#include "network/CCHTTPRequestDelegate.h" + +#if CC_LUA_ENGINE_ENABLED > 0 +#include "CCLuaEngine.h" +#endif + +#ifdef _WINDOWS_ +#include +#else +#include +#endif + +#include +#include +#include +#include +#include "curl/curl.h" + +using namespace std; +//USING_NS_CC; + +NS_CC_EXTRA_BEGIN + +#define kCCHTTPRequestMethodGET 0 +#define kCCHTTPRequestMethodPOST 1 + +#define kCCHTTPRequestAcceptEncodingIdentity 0 +#define kCCHTTPRequestAcceptEncodingGzip 1 +#define kCCHTTPRequestAcceptEncodingDeflate 2 + +#define kCCHTTPRequestStateIdle 0 +#define kCCHTTPRequestStateCleared 1 +#define kCCHTTPRequestStateInProgress 2 +#define kCCHTTPRequestStateCompleted 3 +#define kCCHTTPRequestStateCancelled 4 +#define kCCHTTPRequestStateFailed 5 + +#define kCCHTTPRequestCURLStateIdle 0 +#define kCCHTTPRequestCURLStateBusy 1 +#define kCCHTTPRequestCURLStateClosed 2 + +typedef vector HTTPRequestHeaders; +typedef HTTPRequestHeaders::iterator HTTPRequestHeadersIterator; + +class HTTPRequest : public Ref +{ +public: + static HTTPRequest *createWithUrl(HTTPRequestDelegate *delegate, + const char *url, + int method = kCCHTTPRequestMethodGET); + +#if CC_LUA_ENGINE_ENABLED > 0 + static HTTPRequest* createWithUrlLua(LUA_FUNCTION listener, + const char *url, + int method = kCCHTTPRequestMethodGET); +#endif + + ~HTTPRequest(void); + + /** @brief Set request url. */ + void setRequestUrl(const char *url); + + /** @brief Get request url. */ + const string getRequestUrl(void); + + /** @brief Add a custom header to the request. */ + void addRequestHeader(const char *header); + + /** @brief Add a POST variable to the request, POST only. */ + void addPOSTValue(const char *key, const char *value); + + /** @brief Set POST data to the request body, POST only. */ + void setPOSTData(const char *data); + + + void addFormFile(const char *name, const char *filePath, const char *fileType="application/octet-stream"); + void addFormContents(const char *name, const char *value); + + /** @brief Set/Get cookie string. */ + void setCookieString(const char *cookie); + const string getCookieString(void); + + /** @brief Set accept encoding. */ + void setAcceptEncoding(int acceptEncoding); + + /** @brief Number of seconds to wait before timing out - default is 10. */ + void setTimeout(int timeout); + + /** @brief Execute an asynchronous request. */ + bool start(void); + + /** @brief Cancel an asynchronous request, clearing all delegates first. */ + void cancel(void); + + /** @brief Get the request state. */ + int getState(void); + + /** @brief Return HTTP status code. */ + int getResponseStatusCode(void); + + /** @brief Return HTTP response headers. */ + const HTTPRequestHeaders &getResponseHeaders(void); + const string getResponseHeadersString(void); + + /** @brief Returns the contents of the result. */ + const string getResponseString(void); + + /** @brief Alloc memory block, return response data. use free() release memory block */ + void *getResponseData(void); + +#if CC_LUA_ENGINE_ENABLED > 0 + LUA_STRING getResponseDataLua(void); +#endif + + /** @brief Get response data length (bytes). */ + int getResponseDataLength(void); + + /** @brief Save response data to file. */ + size_t saveResponseData(const char *filename); + + /** @brief Get error code. */ + int getErrorCode(void); + + /** @brief Get error message. */ + const string getErrorMessage(void); + + /** @brief Return HTTPRequestDelegate delegate. */ + HTTPRequestDelegate* getDelegate(void); + + /** @brief timer function. */ + void checkCURLState(float dt); + virtual void update(float dt); + +private: + HTTPRequest(void) + : _delegate(NULL) + , _listener(0) + , _state(kCCHTTPRequestStateIdle) + , _errorCode(0) + , _responseCode(0) + , _responseBuffer(NULL) + , _responseBufferLength(0) + , _responseDataLength(0) + , _curlState(kCCHTTPRequestCURLStateIdle) + , _formPost(NULL) + , _lastPost(NULL) + , _dltotal(0) + , _dlnow(0) + , _ultotal(0) + , _ulnow(0) + { + } + bool initWithDelegate(HTTPRequestDelegate* delegate, const char *url, int method); +#if CC_LUA_ENGINE_ENABLED > 0 + bool initWithListener(LUA_FUNCTION listener, const char *url, int method); +#endif + bool initWithUrl(const char *url, int method); + + enum { + DEFAULT_TIMEOUT = 10, // 10 seconds + BUFFER_CHUNK_SIZE = 32768, // 32 KB + }; + + static unsigned int s_id; + string _url; + HTTPRequestDelegate* _delegate; + int _listener; + int _curlState; + + CURL *_curl; + curl_httppost *_formPost; + curl_httppost *_lastPost; + + int _state; + int _errorCode; + string _errorMessage; + + // request + typedef map Fields; + Fields _postFields; + HTTPRequestHeaders _headers; + + // response + int _responseCode; + HTTPRequestHeaders _responseHeaders; + void *_responseBuffer; + size_t _responseBufferLength; + size_t _responseDataLength; + string _responseCookies; + + double _dltotal; + double _dlnow; + double _ultotal; + double _ulnow; + + // private methods + void cleanup(void); + void cleanupRawResponseBuff(void); + + // instance callback + void onRequest(void); + size_t onWriteData(void *buffer, size_t bytes); + size_t onWriteHeader(void *buffer, size_t bytes); + int onProgress(double dltotal, double dlnow, double ultotal, double ulnow); + + // curl callback +#ifdef _WINDOWS_ + static DWORD WINAPI requestCURL(LPVOID userdata); +#else + pthread_t _thread; + static void *requestCURL(void *userdata); +#endif + static size_t writeDataCURL(void *buffer, size_t size, size_t nmemb, void *userdata); + static size_t writeHeaderCURL(void *buffer, size_t size, size_t nmemb, void *userdata); + static int progressCURL(void *userdata, double dltotal, double dlnow, double ultotal, double ulnow); +}; + +NS_CC_EXTRA_END + +#endif /* __CC_HTTP_REQUEST_H_ */ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequestDelegate.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequestDelegate.h new file mode 100644 index 0000000000..aa23425a9b --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/network/CCHTTPRequestDelegate.h @@ -0,0 +1,20 @@ + +#ifndef __CC_EXTENSION_CCHTTP_REQUEST_DELEGATE_H_ +#define __CC_EXTENSION_CCHTTP_REQUEST_DELEGATE_H_ + +#include "cocos2dx_extra.h" + +NS_CC_EXTRA_BEGIN + +class HTTPRequest; + +class HTTPRequestDelegate +{ +public: + virtual void requestFinished(HTTPRequest* request) {} + virtual void requestFailed(HTTPRequest* request) {} +}; + +NS_CC_EXTRA_END + +#endif // __CC_EXTENSION_CCHTTP_REQUEST_DELEGATE_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/ConsoleCommand.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/ConsoleCommand.cpp index 3c7733b574..ba1b16a32a 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/ConsoleCommand.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/ConsoleCommand.cpp @@ -127,6 +127,9 @@ void ConsoleCommand::init() { _console->addCommand(commands[i]); } + + // set bind address + _console->setBindAddress(ConfigParser::getInstance()->getBindAddress()); #if(CC_PLATFORM_MAC == CC_TARGET_PLATFORM || CC_PLATFORM_WIN32 == CC_TARGET_PLATFORM) _console->listenOnTCP(ConfigParser::getInstance()->getConsolePort()); #else @@ -162,7 +165,7 @@ void ConsoleCommand::onSendCommand(int fd, const std::string &args) if(strcmp(strcmd.c_str(), "start-logic") == 0) { char szDebugArg[1024] = {0}; - sprintf(szDebugArg, "require('debugger')(%s,'%s')",dArgParse["debugcfg"].GetString(), ""); + snprintf(szDebugArg, sizeof(szDebugArg), "require('debugger')(%s,'%s')",dArgParse["debugcfg"].GetString(), ""); startScript(szDebugArg); dReplyParse.AddMember("code", 0, dReplyParse.GetAllocator()); @@ -294,6 +297,32 @@ void ConsoleCommand::onSendCommand(int fd, const std::string &args) dReplyParse.AddMember("code", 0, dReplyParse.GetAllocator()); } + else if (strcmp(strcmd.c_str(), "workdir") == 0) + { + if (dArgParse.HasMember("path")) + { + const rapidjson::Value& objectPath = dArgParse["path"]; + FileUtils::getInstance()->setDefaultResourceRootPath(objectPath.GetString()); + + rapidjson::Value bodyvalue(rapidjson::kObjectType); + bodyvalue.AddMember("path", objectPath.GetString(), dReplyParse.GetAllocator()); + dReplyParse.AddMember("body", bodyvalue, dReplyParse.GetAllocator()); + } + dReplyParse.AddMember("code", 0, dReplyParse.GetAllocator()); + } + else if (strcmp(strcmd.c_str(), "writablePath") == 0) + { + if (dArgParse.HasMember("path")) + { + const rapidjson::Value& objectPath = dArgParse["path"]; + FileUtils::getInstance()->setWritablePath(objectPath.GetString()); + + rapidjson::Value bodyvalue(rapidjson::kObjectType); + bodyvalue.AddMember("path", objectPath.GetString(), dReplyParse.GetAllocator()); + dReplyParse.AddMember("body", bodyvalue, dReplyParse.GetAllocator()); + } + dReplyParse.AddMember("code", 0, dReplyParse.GetAllocator()); + } rapidjson::StringBuffer buffer; rapidjson::Writer< rapidjson::StringBuffer > writer(buffer); diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/FileServer.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/FileServer.cpp index ba4217e3db..cd490ddb24 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/FileServer.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/FileServer.cpp @@ -25,6 +25,7 @@ THE SOFTWARE. #include "FileServer.h" #include "Runtime.h" #include "zlib.h" +#include "ConfigParser.h" // header files for directory operation #ifdef _WIN32 @@ -152,6 +153,17 @@ bool FileServer::listenOnTCP(int port) setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)); //setsockopt(listenfd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); + + auto address = ConfigParser::getInstance()->getBindAddress(); + // bind address +#if ((CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)) + if (address.length() > 0) + { + struct sockaddr_in *sin = (struct sockaddr_in*) res->ai_addr; + sin->sin_addr.s_addr = inet_addr(address.c_str()); + } +#endif + if (::bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) break; /* success */ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.cpp index c2088d222d..56300c969c 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.cpp @@ -35,19 +35,15 @@ THE SOFTWARE. #include static std::string g_projectPath; +static std::function s_gProjectLoader = [](std::string path) +{ + CCLOG("Please set loader for your project"); +}; void startScript(std::string strDebugArg) { - // register lua engine - auto engine = LuaEngine::getInstance(); - if (!strDebugArg.empty()) - { - // open debugger.lua module - cocos2d::log("debug args = %s", strDebugArg.c_str()); - luaopen_lua_debugger(engine->getLuaStack()->getLuaState()); - engine->executeString(strDebugArg.c_str()); - } - engine->executeScriptFile(ConfigParser::getInstance()->getEntryFile().c_str()); + resetDesignResolution(); + s_gProjectLoader(strDebugArg); } @@ -252,20 +248,27 @@ static void register_runtime_override_function(lua_State* tolua_S) lua_pop(tolua_S, 1); } -void initRuntime() +void initRuntime(const std::string& workPath) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_MAC) vector searchPathArray = FileUtils::getInstance()->getSearchPaths(); - extern std::string getCurAppPath(); - std::string appPath = getCurAppPath(); -#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) - appPath.append("/../../"); -#elif (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) - appPath.append("/../../../"); -#endif - appPath = replaceAll(appPath, "\\", "/"); - g_projectPath = appPath; + if (workPath.empty()) + { + extern std::string getCurAppPath(); + std::string appPath = getCurAppPath(); + #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + appPath.append("/../../"); + #elif (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) + appPath.append("/../../../"); + #endif + appPath = replaceAll(appPath, "\\", "/"); + g_projectPath = appPath; + } + else + { + g_projectPath = workPath; + } // add project's root directory to search path searchPathArray.insert(searchPathArray.begin(), g_projectPath); @@ -298,3 +301,33 @@ void endRuntime() FileServer::getShareInstance()->stop(); //FileServer::purge(); } + +//////////////////////// Loader //////////////////// + +void setLoader(std::function func) +{ + s_gProjectLoader = func; +} + +void luaScriptLoader(std::string strDebugArg) +{ + // register lua engine + auto engine = LuaEngine::getInstance(); + if (!strDebugArg.empty()) + { + // open debugger.lua module + cocos2d::log("debug args = %s", strDebugArg.c_str()); + luaopen_lua_debugger(engine->getLuaStack()->getLuaState()); + engine->executeString(strDebugArg.c_str()); + } + std::string code("require \""); + code.append(ConfigParser::getInstance()->getEntryFile().c_str()); + code.append("\""); + engine->executeString(code.c_str()); +} + +void resetDesignResolution() +{ + cocos2d::Size size = ConfigParser::getInstance()->getInitViewSize(); + Director::getInstance()->getOpenGLView()->setDesignResolutionSize(size.width, size.height, ResolutionPolicy::EXACT_FIT); +} \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.h index 7cede048ba..ffe85d9b31 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.h +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/runtime/Runtime.h @@ -26,6 +26,7 @@ THE SOFTWARE. #define _RUNTIME__H_ #include +#include void recvBuf(int fd, char *pbuf, unsigned long bufsize); @@ -39,11 +40,17 @@ const char* getRuntimeVersion(); void startScript(std::string strDebugArg); -void initRuntime(); +void initRuntime(const std::string& workPath); void startRuntime(); void endRuntime(); +// +void resetDesignResolution(); +const char* getRuntimeVersion(); +void luaScriptLoader(std::string strDebugArg); +void setLoader(std::function func); + #endif // _RUNTIME__H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppEvent.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppEvent.cpp new file mode 100644 index 0000000000..85dfe64aac --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppEvent.cpp @@ -0,0 +1,33 @@ +// +// AppEvent.cpp +// Simulator +// +// + +#include "AppEvent.h" + +AppEvent::AppEvent(const std::string& eventName, int type) +: EventCustom(eventName) +, _eventName(eventName) +{ + setEventType(type); +} + +void AppEvent::setEventType(int type) +{ + _eventType = type; +} +int AppEvent::getEventType() +{ + return _eventType; +} + +void AppEvent::setDataString(std::string data) +{ + _dataString = data; +} + +std::string AppEvent::getDataString() +{ + return _dataString; +} \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppEvent.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppEvent.h new file mode 100644 index 0000000000..0810ac5769 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppEvent.h @@ -0,0 +1,47 @@ +// +// AppEvent.h +// Simulator +// +// + +#ifndef __Simulator__AppEvent__ +#define __Simulator__AppEvent__ + +#include +#include "cocos2d.h" + +// encode / decode json +#include "json/document.h" +#include "json/filestream.h" +#include "json/stringbuffer.h" +#include "json/writer.h" + +enum +{ + APP_EVENT_MENU = 1, + APP_EVENT_DROP = 2 +}; + +#define kAppEventDropName "APP.EVENT.DROP" +#define kAppEventName "APP.EVENT" + +class AppEvent : public cocos2d::EventCustom +{ +public: + /** Constructor */ + AppEvent(const std::string& eventName, int type); + + /** Gets event name */ + inline const std::string& getEventName() const { return _eventName; }; + + void setEventType(int type); + int getEventType(); + void setDataString(std::string data); + std::string getDataString(); +protected: + std::string _eventName; + std::string _dataString; + int _eventType; +}; + +#endif /* defined(__Simulator__AppEvent__) */ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppLang.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppLang.cpp new file mode 100644 index 0000000000..11d9319522 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppLang.cpp @@ -0,0 +1,75 @@ +// +// AppLang.cpp +// Simulator +// + +#include "AppLang.h" + +USING_NS_CC; + +AppLang::AppLang() + : _hasInit(false) +{ + _localizationFileName = "lang"; +} + +void AppLang::readLocalizationFile() +{ + if (!_hasInit) + { + _hasInit = true; + + std::string fullPathFile = FileUtils::getInstance()->fullPathForFilename(_localizationFileName.c_str()); + if (fullPathFile.compare(_localizationFileName) == 0) + { + cocos2d::log("[WARNING]:\nnot find %s", this->_localizationFileName.c_str()); + return; + } + std::string fileContent = FileUtils::getInstance()->getStringFromFile(fullPathFile); + + if(fileContent.empty()) + return; + + if (_docRootjson.Parse<0>(fileContent.c_str()).HasParseError()) + { + cocos2d::log("[WARNING]:\nread json file %s failed because of %s", fullPathFile.c_str(), _docRootjson.GetParseError()); + return; + } + } +} + +AppLang* AppLang::getInstance() +{ + static AppLang *lang = nullptr; + if (!lang) + { + lang = new AppLang; + lang->readLocalizationFile(); + } + return lang; +} + +std::string AppLang::getString(const std::string &lang, const std::string &key) +{ + std::string tmpKey = key; + const char *ckey = tmpKey.c_str(); + + std::string tmpLang = lang; + const char *langKey = tmpLang.c_str(); + + if (!_docRootjson.IsObject()) + { + return key; + } + + if (_docRootjson.HasMember(langKey)) + { + const rapidjson::Value& v = _docRootjson[langKey]; + if (v.HasMember(ckey)) + { + std::string tmpv = v[ckey].GetString(); + return v[ckey].GetString(); + } + } + return key; +} diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppLang.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppLang.h new file mode 100644 index 0000000000..8fc1c4f801 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/AppLang.h @@ -0,0 +1,33 @@ +// +// AppLang.h +// Simulator +// + +#ifndef __Simulator__AppLang__ +#define __Simulator__AppLang__ + +#include "cocos2d.h" +#include + +#include "json/document.h" +#include "DeviceEx.h" + +class AppLang +{ +public: + static AppLang* getInstance(); + + std::string getString(const std::string &lang, const std::string& key); + +protected: + AppLang(); + void readLocalizationFile(); + + bool _hasInit; + std::string _localizationFileName; + rapidjson::Document _docRootjson; +}; + +#define tr(key) AppLang::getInstance()->getString(player::DeviceEx::getInstance()->getCurrentUILangName(), key) + +#endif /* defined(__Simulator__AppLang__) */ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/DeviceEx.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/DeviceEx.h new file mode 100644 index 0000000000..7a168ef93f --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/DeviceEx.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include "PlayerMacros.h" + +PLAYER_NS_BEGIN + +class DeviceEx +{ +public: + static DeviceEx *getInstance(); + + std::string getCurrentUILangName(); + std::string getUserGUID(); + +private: + DeviceEx(); + void init(); + void makeUILangName(); + std::string makeUserGUID(); + + std::string _uiLangName; + std::string _userGUID; +}; + +PLAYER_NS_END \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerEditBoxServiceProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerEditBoxServiceProtocol.h new file mode 100644 index 0000000000..f751cd4d76 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerEditBoxServiceProtocol.h @@ -0,0 +1,37 @@ + +#ifndef __PLAYER_EDITBOX_SERVICE_PROTOCOL_H_ +#define __PLAYER_EDITBOX_SERVICE_PROTOCOL_H_ + +#include + +#include "cocos2d.h" +#include "PlayerMacros.h" +#include "PlayerServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerEditBoxServiceProtocol : public PlayerServiceProtocol +{ +public: + static const int FORMAT_NONE = 0; + static const int FORMAT_NUMBER = 1; + + virtual void showSingleLineEditBox(const cocos2d::Rect &rect) = 0; + virtual void showMultiLineEditBox(const cocos2d::Rect &rect) = 0; + virtual void hide() = 0; + + virtual void setText(const std::string &text) = 0; + virtual void setFont(const std::string &name, int size) = 0; + virtual void setFontColor(const cocos2d::Color3B &color) = 0; + virtual void setFormator(int formator) = 0; + + void registerHandler(int handler) { _handler = handler; } + int getHandler() { return _handler; } + +protected: + int _handler; +}; + +PLAYER_NS_END + +#endif // __PLAYER_EDITBOX_SERVICE_PROTOCOL_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerFileDialogServiceProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerFileDialogServiceProtocol.h new file mode 100644 index 0000000000..756d9323a9 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerFileDialogServiceProtocol.h @@ -0,0 +1,33 @@ + +#ifndef __PLAYER_FILE_DIALOG_SERVICE_PROTOCOL_H_ +#define __PLAYER_FILE_DIALOG_SERVICE_PROTOCOL_H_ + +#include +#include + +#include "PlayerMacros.h" +#include "PlayerServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerFileDialogServiceProtocol : public PlayerServiceProtocol +{ +public: + /** + * extensions = "Lua Script File|*.lua;JSON File|*.json"; + */ + virtual std::string openFile(const std::string &title, + const std::string &directory, + const std::string &extensions) const = 0; + virtual std::vector openMultiple(const std::string &title, + const std::string &directory, + const std::string &extensions) const = 0; + virtual std::string saveFile(const std::string &title, + const std::string &path) const = 0; + virtual std::string openDirectory(const std::string &title, + const std::string &directory) const = 0; +}; + +PLAYER_NS_END + +#endif // __PLAYER_FILE_DIALOG_SERVICE_PROTOCOL_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMacros.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMacros.h new file mode 100644 index 0000000000..32bedbe7b4 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMacros.h @@ -0,0 +1,9 @@ + +#ifndef __PLAYER_MACROS_H_ +#define __PLAYER_MACROS_H_ + +#define PLAYER_NS_BEGIN namespace player { +#define PLAYER_NS_END } +#define USING_PLAYER_NS using namespace player; + +#endif // __PLAYER_MACROS_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMenuServiceProtocol.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMenuServiceProtocol.cpp new file mode 100644 index 0000000000..30de089f04 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMenuServiceProtocol.cpp @@ -0,0 +1,53 @@ + +#include "PlayerMenuServiceProtocol.h" + +PLAYER_NS_BEGIN + +PlayerMenuItem::PlayerMenuItem() +: _order(0) +, _isGroup(false) +, _isEnabled(true) +, _isChecked(false) +{ +} + +PlayerMenuItem::~PlayerMenuItem() +{ +} + +std::string PlayerMenuItem::getMenuId() const +{ + return _menuId; +} + +std::string PlayerMenuItem::getTitle() const +{ + return _title; +} + +int PlayerMenuItem::getOrder() const +{ + return _order; +} + +bool PlayerMenuItem::isGroup() const +{ + return _isGroup; +} + +bool PlayerMenuItem::isEnabled() const +{ + return _isEnabled; +} + +bool PlayerMenuItem::isChecked() const +{ + return _isChecked; +} + +std::string PlayerMenuItem::getShortcut() const +{ + return _shortcut; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMenuServiceProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMenuServiceProtocol.h new file mode 100644 index 0000000000..dae521824b --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMenuServiceProtocol.h @@ -0,0 +1,66 @@ + +#ifndef __PLAYER_MENU_SERVICE_PROTOCOL_H +#define __PLAYER_MENU_SERVICE_PROTOCOL_H + +#include + +#include "cocos2d.h" +#include "PlayerMacros.h" +#include "PlayerServiceProtocol.h" + +PLAYER_NS_BEGIN + +#define kPlayerSuperModifyKey "super" +#define kPlayerShiftModifyKey "shift" +#define kPlayerCtrlModifyKey "ctrl" +#define kPlayerAltModifyKey "alt" + +class PlayerMenuItem : public cocos2d::Ref +{ +public: + virtual ~PlayerMenuItem(); + + std::string getMenuId() const; + std::string getTitle() const; + int getOrder() const; + bool isGroup() const; + bool isEnabled() const; + bool isChecked() const; + std::string getShortcut() const; + + virtual void setTitle(const std::string &title) = 0; + virtual void setEnabled(bool enabled) = 0; + virtual void setChecked(bool checked) = 0; + virtual void setShortcut(const std::string &shortcut) = 0; + +protected: + PlayerMenuItem(); + + std::string _menuId; + std::string _title; + int _order; + bool _isGroup; + bool _isEnabled; + bool _isChecked; // ignored when isGroup = true + std::string _shortcut; // ignored when isGroup = true +}; + +class PlayerMenuServiceProtocol : public PlayerServiceProtocol +{ +public: + static const int MAX_ORDER = 9999; + + virtual PlayerMenuItem *addItem(const std::string &menuId, + const std::string &title, + const std::string &parentId, + int order = MAX_ORDER) = 0; + virtual PlayerMenuItem *addItem(const std::string &menuId, + const std::string &title) = 0; + virtual PlayerMenuItem *getItem(const std::string &menuId) = 0; + virtual bool removeItem(const std::string &menuId) = 0; + virtual void setMenuBarEnabled(bool enabled) = 0; +}; + +PLAYER_NS_END + +#endif // __PLAYER_MENU_SERVICE_PROTOCOL_H diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMessageBoxServiceProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMessageBoxServiceProtocol.h new file mode 100644 index 0000000000..eb6e3fc0c8 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerMessageBoxServiceProtocol.h @@ -0,0 +1,35 @@ + +#ifndef __PLAYER_MESSAGEBOX_SERVICE_PROTOCOL_H +#define __PLAYER_MESSAGEBOX_SERVICE_PROTOCOL_H + +#include + +#include "PlayerMacros.h" +#include "PlayerServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerMessageBoxServiceProtocol : public PlayerServiceProtocol +{ +public: + static const int BUTTONS_OK = 0; + static const int BUTTONS_OK_CANCEL = 1; + static const int BUTTONS_YES_NO = 2; + static const int BUTTONS_YES_NO_CANCEL = 3; + + static const int BUTTON_OK = 0; + static const int BUTTON_CANCEL = 1; + static const int BUTTON_YES = 2; + static const int BUTTON_NO = 3; + + // Show a message box, return index of user clicked button + // + // @return int first button index is 0 + virtual int showMessageBox(const std::string &title, + const std::string &message, + int buttonsType = BUTTONS_OK) = 0; +}; + +PLAYER_NS_END + +#endif // __PLAYER_MESSAGEBOX_SERVICE_PROTOCOL_H diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerProtocol.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerProtocol.cpp new file mode 100644 index 0000000000..b428f6e658 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerProtocol.cpp @@ -0,0 +1,42 @@ + +#include "PlayerProtocol.h" +#include "base/ccMacros.h" + +PLAYER_NS_BEGIN + +USING_NS_CC; + +PlayerProtocol *PlayerProtocol::_instance = nullptr; + +PlayerProtocol::PlayerProtocol() +{ + CCASSERT(_instance == nullptr, "CAN NOT CREATE MORE PLAYER INSTANCE"); + _instance = this; +} + +PlayerProtocol::~PlayerProtocol() +{ + _instance = nullptr; +} + +PlayerProtocol *PlayerProtocol::getInstance() +{ + return _instance; +} + +void PlayerProtocol::purgeInstance() +{ + if (_instance) delete _instance; +} + +void PlayerProtocol::setPlayerSettings(const PlayerSettings &settings) +{ + _settings = settings; +} + +PlayerSettings PlayerProtocol::getPlayerSettings() const +{ + return _settings; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerProtocol.h new file mode 100644 index 0000000000..df7f80d40a --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerProtocol.h @@ -0,0 +1,58 @@ + +#ifndef __PLAYER_PROTOCOL_H_ +#define __PLAYER_PROTOCOL_H_ + +#include "PlayerMacros.h" +#include "PlayerSettings.h" + +#include "PlayerFileDialogServiceProtocol.h" +#include "PlayerMessageBoxServiceProtocol.h" +#include "PlayerMenuServiceProtocol.h" +#include "PlayerEditBoxServiceProtocol.h" +#include "PlayerTaskServiceProtocol.h" + +#include "ProjectConfig/ProjectConfig.h" + +PLAYER_NS_BEGIN + +class PlayerProtocol +{ +public: + virtual ~PlayerProtocol(); + + static PlayerProtocol *getInstance(); + static void purgeInstance(); + + void setPlayerSettings(const PlayerSettings &settings); + PlayerSettings getPlayerSettings() const; + + virtual PlayerFileDialogServiceProtocol *getFileDialogService() = 0; // implemented in platform related source files + virtual PlayerMessageBoxServiceProtocol *getMessageBoxService() = 0; + virtual PlayerMenuServiceProtocol *getMenuService() = 0; + virtual PlayerEditBoxServiceProtocol *getEditBoxService() = 0; + virtual PlayerTaskServiceProtocol *getTaskService() = 0; + + // player function + + virtual void quit() = 0; + virtual void relaunch() = 0; + virtual void openNewPlayer() = 0; + virtual void openNewPlayerWithProjectConfig(const ProjectConfig &config) = 0; + virtual void openProjectWithProjectConfig(const ProjectConfig &config) = 0; + + // window info + virtual int getPositionX() = 0; + virtual int getPositionY() = 0; + +protected: + PlayerProtocol(); // avoid create instance from outside + + PlayerSettings _settings; + +private: + static PlayerProtocol *_instance; +}; + +PLAYER_NS_END + +#endif // __PLAYER_PROTOCOL_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerServiceProtocol.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerServiceProtocol.cpp new file mode 100644 index 0000000000..b6623b928f --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerServiceProtocol.cpp @@ -0,0 +1,6 @@ + +#include "PlayerServiceProtocol.h" + +PLAYER_NS_BEGIN + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerServiceProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerServiceProtocol.h new file mode 100644 index 0000000000..cdaeb836c4 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerServiceProtocol.h @@ -0,0 +1,17 @@ + +#ifndef __PLAYER_SERVICE_PROTOCOL_H_ +#define __PLAYER_SERVICE_PROTOCOL_H_ + +#include "PlayerMacros.h" + +PLAYER_NS_BEGIN + +class PlayerServiceProtocol +{ +public: + virtual ~PlayerServiceProtocol() {}; +}; + +PLAYER_NS_END + +#endif // __PLAYER_SERVICE_PROTOCOL_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerSettings.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerSettings.cpp new file mode 100644 index 0000000000..1acc234448 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerSettings.cpp @@ -0,0 +1,2 @@ + +#include "PlayerSettings.h" diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerSettings.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerSettings.h new file mode 100644 index 0000000000..b98e628508 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerSettings.h @@ -0,0 +1,25 @@ + +#ifndef __PLAYER_SETTINGS_H_ +#define __PLAYER_SETTINGS_H_ + +#include "PlayerMacros.h" + +PLAYER_NS_BEGIN + +class PlayerSettings +{ +public: + PlayerSettings() + : openLastProject(false) + , offsetX(0) + , offsetY(0) + {} + + bool openLastProject; + int offsetX; + int offsetY; +}; + +PLAYER_NS_END + +#endif // __PLAYER_SETTINGS_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerTaskServiceProtocol.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerTaskServiceProtocol.cpp new file mode 100644 index 0000000000..394429695c --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerTaskServiceProtocol.cpp @@ -0,0 +1,68 @@ + +#include "PlayerTaskServiceProtocol.h" + +PLAYER_NS_BEGIN + +std::string PlayerTask::getName() const +{ + return _name; +} + +std::string PlayerTask::getExecutePath() const +{ + return _executePath; +} + +std::string PlayerTask::getCommandLineArguments() const +{ + return _commandLineArguments; +} + +std::string PlayerTask::getOutput() const +{ + return _output; +} + +int PlayerTask::getState() const +{ + return _state; +} + +bool PlayerTask::isIdle() const +{ + return _state == STATE_IDLE; +} + +bool PlayerTask::isRunning() const +{ + return _state == STATE_RUNNING; +} + +bool PlayerTask::isCompleted() const +{ + return _state == STATE_COMPLETED; +} + +float PlayerTask::getLifetime() const +{ + return _lifetime; +} + +int PlayerTask::getResultCode() const +{ + return _resultCode; +} + +PlayerTask::PlayerTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments) + : _name(name) + , _executePath(executePath) + , _commandLineArguments(commandLineArguments) + , _state(STATE_IDLE) + , _lifetime(0) + , _resultCode(0) +{ +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerTaskServiceProtocol.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerTaskServiceProtocol.h new file mode 100644 index 0000000000..02274acf60 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerTaskServiceProtocol.h @@ -0,0 +1,63 @@ + +#ifndef __PLAYER_TASK_SERVICE_PROTOCOL_H +#define __PLAYER_TASK_SERVICE_PROTOCOL_H + +#include + +#include "cocos2d.h" +#include "PlayerMacros.h" +#include "PlayerServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerTask : public cocos2d::Ref +{ +public: + static const int STATE_IDLE = 0; + static const int STATE_RUNNING = 1; + static const int STATE_COMPLETED = 2; + + virtual ~PlayerTask() {}; + + std::string getName() const; + std::string getExecutePath() const; + std::string getCommandLineArguments() const; + std::string getOutput() const; + int getState() const; + bool isIdle() const; + bool isRunning() const; + bool isCompleted() const; + float getLifetime() const; + int getResultCode() const; + + virtual bool run() = 0; + virtual void stop() = 0; + virtual void runInTerminal() = 0; + +protected: + PlayerTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + + std::string _name; + std::string _executePath; + std::string _commandLineArguments; + std::string _output; + float _lifetime; + int _state; + int _resultCode; +}; + +class PlayerTaskServiceProtocol : public PlayerServiceProtocol +{ +public: + virtual PlayerTask *createTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments) = 0; + virtual PlayerTask *getTask(const std::string &name) = 0; + virtual void removeTask(const std::string &name) = 0; +}; + +PLAYER_NS_END + +#endif // __PLAYER_TASK_SERVICE_PROTOCOL_H diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerUtils.cpp b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerUtils.cpp new file mode 100644 index 0000000000..0dee5a5648 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerUtils.cpp @@ -0,0 +1,2 @@ + +#include "PlayerUtils.h" diff --git a/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerUtils.h b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerUtils.h new file mode 100644 index 0000000000..b06fb94b22 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/Classes/service/PlayerUtils.h @@ -0,0 +1,36 @@ + +#ifndef __PLAYER_UTILS_H_ +#define __PLAYER_UTILS_H_ + +#include "PlayerMacros.h" + +#include +#include + +using namespace std; + +PLAYER_NS_BEGIN + +template +vector splitString(T str, T pattern) +{ + vector result; + str += pattern; + size_t size = str.size(); + + for (size_t i = 0; i < size; i++) + { + size_t pos = str.find(pattern, i); + if (pos < size) + { + T s = str.substr(i, pos - i); + result.push_back(s); + i = pos + pattern.size() - 1; + } + } + return result; +}; + +PLAYER_NS_END + +#endif // __PLAYER_UTILS_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk b/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk index c575689908..ef9e414e37 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.android/jni/Android.mk @@ -33,6 +33,9 @@ LOCAL_SRC_FILES := \ ../../Classes/VisibleRect.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/ConfigParser.cpp \ +../../Classes/ProjectConfig/ProjectConfig.cpp \ +../../Classes/ProjectConfig/SimulatorConfig.cpp \ +../../Classes/network/CCHTTPRequest.cpp \ hellolua/Runtime_android.cpp \ hellolua/main.cpp diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj index 3bbfe950e6..ca5e2fec39 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/HelloLua.xcodeproj/project.pbxproj @@ -77,6 +77,32 @@ 50D7C97017EBBEEC005D0B91 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50D7C96F17EBBEEC005D0B91 /* IOKit.framework */; }; 521A8E7019F0C3D200D177D7 /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 521A8E6E19F0C3D200D177D7 /* Default-667h@2x.png */; }; 521A8E7119F0C3D200D177D7 /* Default-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 521A8E6F19F0C3D200D177D7 /* Default-736h@3x.png */; }; + 9FFC06F91A4A733B00AED399 /* ConsoleWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9FFC06EA1A4A733B00AED399 /* ConsoleWindow.xib */; }; + 9FFC06FA1A4A733B00AED399 /* ConsoleWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06EC1A4A733B00AED399 /* ConsoleWindowController.m */; }; + 9FFC06FB1A4A733B00AED399 /* PlayerEditBoxServiceMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06EE1A4A733B00AED399 /* PlayerEditBoxServiceMac.mm */; }; + 9FFC06FC1A4A733B00AED399 /* PlayerFileDialogServiceMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06F01A4A733B00AED399 /* PlayerFileDialogServiceMac.mm */; }; + 9FFC06FD1A4A733B00AED399 /* PlayerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06F21A4A733B00AED399 /* PlayerMac.mm */; }; + 9FFC06FE1A4A733B00AED399 /* PlayerMenuServiceMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06F41A4A733B00AED399 /* PlayerMenuServiceMac.mm */; }; + 9FFC06FF1A4A733B00AED399 /* PlayerMessageBoxServiceMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06F61A4A733B00AED399 /* PlayerMessageBoxServiceMac.mm */; }; + 9FFC07001A4A733B00AED399 /* PlayerTaskServiceMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC06F81A4A733B00AED399 /* PlayerTaskServiceMac.mm */; }; + 9FFC07041A4A737300AED399 /* OpenUDIDMac.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07031A4A737300AED399 /* OpenUDIDMac.m */; }; + 9FFC07261A4A739200AED399 /* lang in Resources */ = {isa = PBXBuildFile; fileRef = 9FFC07061A4A739200AED399 /* lang */; }; + 9FFC07271A4A739200AED399 /* CCHTTPRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07081A4A739200AED399 /* CCHTTPRequest.cpp */; }; + 9FFC07281A4A739200AED399 /* ProjectConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC070C1A4A739200AED399 /* ProjectConfig.cpp */; }; + 9FFC07291A4A739200AED399 /* SimulatorConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC070E1A4A739200AED399 /* SimulatorConfig.cpp */; }; + 9FFC072A1A4A739200AED399 /* AppEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07111A4A739200AED399 /* AppEvent.cpp */; }; + 9FFC072B1A4A739200AED399 /* AppLang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07131A4A739200AED399 /* AppLang.cpp */; }; + 9FFC072C1A4A739200AED399 /* PlayerMenuServiceProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07191A4A739200AED399 /* PlayerMenuServiceProtocol.cpp */; }; + 9FFC072D1A4A739200AED399 /* PlayerProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC071C1A4A739200AED399 /* PlayerProtocol.cpp */; }; + 9FFC072E1A4A739200AED399 /* PlayerServiceProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC071E1A4A739200AED399 /* PlayerServiceProtocol.cpp */; }; + 9FFC072F1A4A739200AED399 /* PlayerSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07201A4A739200AED399 /* PlayerSettings.cpp */; }; + 9FFC07301A4A739200AED399 /* PlayerTaskServiceProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07221A4A739200AED399 /* PlayerTaskServiceProtocol.cpp */; }; + 9FFC07311A4A739200AED399 /* PlayerUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07241A4A739200AED399 /* PlayerUtils.cpp */; }; + 9FFC07331A4A73F700AED399 /* DeviceEx-mac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07321A4A73F700AED399 /* DeviceEx-mac.mm */; }; + 9FFC07361A4A764100AED399 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9FFC07341A4A764100AED399 /* MainMenu.xib */; }; + 9FFC073F1A4AA91100AED399 /* ProjectConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC070C1A4A739200AED399 /* ProjectConfig.cpp */; }; + 9FFC07401A4AA91B00AED399 /* CCHTTPRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC07081A4A739200AED399 /* CCHTTPRequest.cpp */; }; + 9FFC07411A4AAB2F00AED399 /* SimulatorConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9FFC070E1A4A739200AED399 /* SimulatorConfig.cpp */; }; AB6CB6F21A1F275E009C2562 /* ConnectWaitLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6CB6EC1A1F275E009C2562 /* ConnectWaitLayer.cpp */; }; AB6CB6F31A1F275E009C2562 /* ConnectWaitLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6CB6EC1A1F275E009C2562 /* ConnectWaitLayer.cpp */; }; AB6CB6F41A1F275E009C2562 /* ConsoleCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB6CB6EE1A1F275E009C2562 /* ConsoleCommand.cpp */; }; @@ -117,7 +143,6 @@ F293B3D915EB7BE500256477 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F293B3D815EB7BE500256477 /* Foundation.framework */; }; F293B3DB15EB7BE500256477 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F293B3DA15EB7BE500256477 /* CoreGraphics.framework */; }; F293BB9C15EB831F00256477 /* AppDelegate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F293BB7E15EB831F00256477 /* AppDelegate.cpp */; }; - F405C6C919ED14AA005AD31C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F405C6CB19ED14AA005AD31C /* MainMenu.xib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -262,6 +287,57 @@ 50D7C96F17EBBEEC005D0B91 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 521A8E6E19F0C3D200D177D7 /* Default-667h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-667h@2x.png"; sourceTree = ""; }; 521A8E6F19F0C3D200D177D7 /* Default-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-736h@3x.png"; sourceTree = ""; }; + 9FFC06EA1A4A733B00AED399 /* ConsoleWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConsoleWindow.xib; sourceTree = ""; }; + 9FFC06EB1A4A733B00AED399 /* ConsoleWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConsoleWindowController.h; sourceTree = ""; }; + 9FFC06EC1A4A733B00AED399 /* ConsoleWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConsoleWindowController.m; sourceTree = ""; }; + 9FFC06ED1A4A733B00AED399 /* PlayerEditBoxServiceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerEditBoxServiceMac.h; sourceTree = ""; }; + 9FFC06EE1A4A733B00AED399 /* PlayerEditBoxServiceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlayerEditBoxServiceMac.mm; sourceTree = ""; }; + 9FFC06EF1A4A733B00AED399 /* PlayerFileDialogServiceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerFileDialogServiceMac.h; sourceTree = ""; }; + 9FFC06F01A4A733B00AED399 /* PlayerFileDialogServiceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlayerFileDialogServiceMac.mm; sourceTree = ""; }; + 9FFC06F11A4A733B00AED399 /* PlayerMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerMac.h; sourceTree = ""; }; + 9FFC06F21A4A733B00AED399 /* PlayerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlayerMac.mm; sourceTree = ""; }; + 9FFC06F31A4A733B00AED399 /* PlayerMenuServiceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerMenuServiceMac.h; sourceTree = ""; }; + 9FFC06F41A4A733B00AED399 /* PlayerMenuServiceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlayerMenuServiceMac.mm; sourceTree = ""; }; + 9FFC06F51A4A733B00AED399 /* PlayerMessageBoxServiceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerMessageBoxServiceMac.h; sourceTree = ""; }; + 9FFC06F61A4A733B00AED399 /* PlayerMessageBoxServiceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlayerMessageBoxServiceMac.mm; sourceTree = ""; }; + 9FFC06F71A4A733B00AED399 /* PlayerTaskServiceMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerTaskServiceMac.h; sourceTree = ""; }; + 9FFC06F81A4A733B00AED399 /* PlayerTaskServiceMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlayerTaskServiceMac.mm; sourceTree = ""; }; + 9FFC07021A4A737300AED399 /* OpenUDIDMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenUDIDMac.h; sourceTree = ""; }; + 9FFC07031A4A737300AED399 /* OpenUDIDMac.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenUDIDMac.m; sourceTree = ""; }; + 9FFC07051A4A739200AED399 /* cocos2dx_extra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cocos2dx_extra.h; path = ../Classes/cocos2dx_extra.h; sourceTree = ""; }; + 9FFC07061A4A739200AED399 /* lang */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = lang; path = ../Classes/lang; sourceTree = ""; }; + 9FFC07081A4A739200AED399 /* CCHTTPRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCHTTPRequest.cpp; sourceTree = ""; }; + 9FFC07091A4A739200AED399 /* CCHTTPRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCHTTPRequest.h; sourceTree = ""; }; + 9FFC070A1A4A739200AED399 /* CCHTTPRequestDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCHTTPRequestDelegate.h; sourceTree = ""; }; + 9FFC070C1A4A739200AED399 /* ProjectConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProjectConfig.cpp; sourceTree = ""; }; + 9FFC070D1A4A739200AED399 /* ProjectConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectConfig.h; sourceTree = ""; }; + 9FFC070E1A4A739200AED399 /* SimulatorConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimulatorConfig.cpp; sourceTree = ""; }; + 9FFC070F1A4A739200AED399 /* SimulatorConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimulatorConfig.h; sourceTree = ""; }; + 9FFC07111A4A739200AED399 /* AppEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AppEvent.cpp; sourceTree = ""; }; + 9FFC07121A4A739200AED399 /* AppEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppEvent.h; sourceTree = ""; }; + 9FFC07131A4A739200AED399 /* AppLang.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AppLang.cpp; sourceTree = ""; }; + 9FFC07141A4A739200AED399 /* AppLang.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppLang.h; sourceTree = ""; }; + 9FFC07151A4A739200AED399 /* DeviceEx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceEx.h; sourceTree = ""; }; + 9FFC07161A4A739200AED399 /* PlayerEditBoxServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerEditBoxServiceProtocol.h; sourceTree = ""; }; + 9FFC07171A4A739200AED399 /* PlayerFileDialogServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerFileDialogServiceProtocol.h; sourceTree = ""; }; + 9FFC07181A4A739200AED399 /* PlayerMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerMacros.h; sourceTree = ""; }; + 9FFC07191A4A739200AED399 /* PlayerMenuServiceProtocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerMenuServiceProtocol.cpp; sourceTree = ""; }; + 9FFC071A1A4A739200AED399 /* PlayerMenuServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerMenuServiceProtocol.h; sourceTree = ""; }; + 9FFC071B1A4A739200AED399 /* PlayerMessageBoxServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerMessageBoxServiceProtocol.h; sourceTree = ""; }; + 9FFC071C1A4A739200AED399 /* PlayerProtocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerProtocol.cpp; sourceTree = ""; }; + 9FFC071D1A4A739200AED399 /* PlayerProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerProtocol.h; sourceTree = ""; }; + 9FFC071E1A4A739200AED399 /* PlayerServiceProtocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerServiceProtocol.cpp; sourceTree = ""; }; + 9FFC071F1A4A739200AED399 /* PlayerServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerServiceProtocol.h; sourceTree = ""; }; + 9FFC07201A4A739200AED399 /* PlayerSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerSettings.cpp; sourceTree = ""; }; + 9FFC07211A4A739200AED399 /* PlayerSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerSettings.h; sourceTree = ""; }; + 9FFC07221A4A739200AED399 /* PlayerTaskServiceProtocol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerTaskServiceProtocol.cpp; sourceTree = ""; }; + 9FFC07231A4A739200AED399 /* PlayerTaskServiceProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerTaskServiceProtocol.h; sourceTree = ""; }; + 9FFC07241A4A739200AED399 /* PlayerUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerUtils.cpp; sourceTree = ""; }; + 9FFC07251A4A739200AED399 /* PlayerUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerUtils.h; sourceTree = ""; }; + 9FFC07321A4A73F700AED399 /* DeviceEx-mac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DeviceEx-mac.mm"; sourceTree = ""; }; + 9FFC07351A4A764100AED399 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 9FFC07371A4A765100AED399 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/MainMenu.xib"; sourceTree = ""; }; + 9FFC07381A4A902500AED399 /* CodeIDESupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CodeIDESupport.h; path = ../Classes/CodeIDESupport.h; sourceTree = ""; }; AB6CB6EC1A1F275E009C2562 /* ConnectWaitLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConnectWaitLayer.cpp; sourceTree = ""; }; AB6CB6ED1A1F275E009C2562 /* ConnectWaitLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectWaitLayer.h; sourceTree = ""; }; AB6CB6EE1A1F275E009C2562 /* ConsoleCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConsoleCommand.cpp; sourceTree = ""; }; @@ -300,7 +376,6 @@ F293B3DA15EB7BE500256477 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; F293BB7E15EB831F00256477 /* AppDelegate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AppDelegate.cpp; path = ../Classes/AppDelegate.cpp; sourceTree = ""; }; F293BB7F15EB831F00256477 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ../Classes/AppDelegate.h; sourceTree = ""; }; - F405C6CA19ED14AA005AD31C /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -456,9 +531,10 @@ 5023817117EBBE3400990C9B /* mac */ = { isa = PBXGroup; children = ( + 9FFC06E91A4A733B00AED399 /* service */, 5023817217EBBE3400990C9B /* Icon.icns */, + 9FFC07341A4A764100AED399 /* MainMenu.xib */, C07828F418B4D72E00BD2287 /* main.m */, - F405C6CB19ED14AA005AD31C /* MainMenu.xib */, C07828F618B4D72E00BD2287 /* SimulatorApp.h */, C07828F718B4D72E00BD2287 /* SimulatorApp.mm */, 5023817317EBBE3400990C9B /* Info.plist */, @@ -487,6 +563,91 @@ name = Icons; sourceTree = ""; }; + 9FFC06E91A4A733B00AED399 /* service */ = { + isa = PBXGroup; + children = ( + 9FFC07011A4A737300AED399 /* openudid */, + 9FFC06EA1A4A733B00AED399 /* ConsoleWindow.xib */, + 9FFC06EB1A4A733B00AED399 /* ConsoleWindowController.h */, + 9FFC06EC1A4A733B00AED399 /* ConsoleWindowController.m */, + 9FFC07321A4A73F700AED399 /* DeviceEx-mac.mm */, + 9FFC06ED1A4A733B00AED399 /* PlayerEditBoxServiceMac.h */, + 9FFC06EE1A4A733B00AED399 /* PlayerEditBoxServiceMac.mm */, + 9FFC06EF1A4A733B00AED399 /* PlayerFileDialogServiceMac.h */, + 9FFC06F01A4A733B00AED399 /* PlayerFileDialogServiceMac.mm */, + 9FFC06F11A4A733B00AED399 /* PlayerMac.h */, + 9FFC06F21A4A733B00AED399 /* PlayerMac.mm */, + 9FFC06F31A4A733B00AED399 /* PlayerMenuServiceMac.h */, + 9FFC06F41A4A733B00AED399 /* PlayerMenuServiceMac.mm */, + 9FFC06F51A4A733B00AED399 /* PlayerMessageBoxServiceMac.h */, + 9FFC06F61A4A733B00AED399 /* PlayerMessageBoxServiceMac.mm */, + 9FFC06F71A4A733B00AED399 /* PlayerTaskServiceMac.h */, + 9FFC06F81A4A733B00AED399 /* PlayerTaskServiceMac.mm */, + ); + path = service; + sourceTree = ""; + }; + 9FFC07011A4A737300AED399 /* openudid */ = { + isa = PBXGroup; + children = ( + 9FFC07021A4A737300AED399 /* OpenUDIDMac.h */, + 9FFC07031A4A737300AED399 /* OpenUDIDMac.m */, + ); + path = openudid; + sourceTree = ""; + }; + 9FFC07071A4A739200AED399 /* network */ = { + isa = PBXGroup; + children = ( + 9FFC07081A4A739200AED399 /* CCHTTPRequest.cpp */, + 9FFC07091A4A739200AED399 /* CCHTTPRequest.h */, + 9FFC070A1A4A739200AED399 /* CCHTTPRequestDelegate.h */, + ); + name = network; + path = ../Classes/network; + sourceTree = ""; + }; + 9FFC070B1A4A739200AED399 /* ProjectConfig */ = { + isa = PBXGroup; + children = ( + 9FFC070C1A4A739200AED399 /* ProjectConfig.cpp */, + 9FFC070D1A4A739200AED399 /* ProjectConfig.h */, + 9FFC070E1A4A739200AED399 /* SimulatorConfig.cpp */, + 9FFC070F1A4A739200AED399 /* SimulatorConfig.h */, + ); + name = ProjectConfig; + path = ../Classes/ProjectConfig; + sourceTree = ""; + }; + 9FFC07101A4A739200AED399 /* service */ = { + isa = PBXGroup; + children = ( + 9FFC07111A4A739200AED399 /* AppEvent.cpp */, + 9FFC07121A4A739200AED399 /* AppEvent.h */, + 9FFC07131A4A739200AED399 /* AppLang.cpp */, + 9FFC07141A4A739200AED399 /* AppLang.h */, + 9FFC07151A4A739200AED399 /* DeviceEx.h */, + 9FFC07161A4A739200AED399 /* PlayerEditBoxServiceProtocol.h */, + 9FFC07171A4A739200AED399 /* PlayerFileDialogServiceProtocol.h */, + 9FFC07181A4A739200AED399 /* PlayerMacros.h */, + 9FFC07191A4A739200AED399 /* PlayerMenuServiceProtocol.cpp */, + 9FFC071A1A4A739200AED399 /* PlayerMenuServiceProtocol.h */, + 9FFC071B1A4A739200AED399 /* PlayerMessageBoxServiceProtocol.h */, + 9FFC071C1A4A739200AED399 /* PlayerProtocol.cpp */, + 9FFC071D1A4A739200AED399 /* PlayerProtocol.h */, + 9FFC071E1A4A739200AED399 /* PlayerServiceProtocol.cpp */, + 9FFC071F1A4A739200AED399 /* PlayerServiceProtocol.h */, + 9FFC07201A4A739200AED399 /* PlayerSettings.cpp */, + 9FFC07211A4A739200AED399 /* PlayerSettings.h */, + 9FFC07221A4A739200AED399 /* PlayerTaskServiceProtocol.cpp */, + 9FFC07231A4A739200AED399 /* PlayerTaskServiceProtocol.h */, + 9FFC07241A4A739200AED399 /* PlayerUtils.cpp */, + 9FFC07251A4A739200AED399 /* PlayerUtils.h */, + ); + name = service; + path = ../Classes/service; + sourceTree = ""; + }; C00FD4891938512100C6382D /* runtime */ = { isa = PBXGroup; children = ( @@ -575,6 +736,12 @@ F293BB7C15EB830F00256477 /* Classes */ = { isa = PBXGroup; children = ( + 9FFC07381A4A902500AED399 /* CodeIDESupport.h */, + 9FFC07051A4A739200AED399 /* cocos2dx_extra.h */, + 9FFC07061A4A739200AED399 /* lang */, + 9FFC07071A4A739200AED399 /* network */, + 9FFC070B1A4A739200AED399 /* ProjectConfig */, + 9FFC07101A4A739200AED399 /* service */, 15427CE2198F237300DC375D /* lua_module_register.h */, C00FD4891938512100C6382D /* runtime */, C033B51A191B337200D06937 /* VisibleRect.cpp */, @@ -660,6 +827,8 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, + "zh-Hans", ); mainGroup = F293B3BD15EB7BE500256477; productRefGroup = F293B3C915EB7BE500256477 /* Products */; @@ -719,9 +888,11 @@ buildActionMask = 2147483647; files = ( C03781BA18BF655400FE4F13 /* res in Resources */, + 9FFC06F91A4A733B00AED399 /* ConsoleWindow.xib in Resources */, C03781BC18BF655400FE4F13 /* src in Resources */, - F405C6C919ED14AA005AD31C /* MainMenu.xib in Resources */, + 9FFC07261A4A739200AED399 /* lang in Resources */, 5023817617EBBE3400990C9B /* Icon.icns in Resources */, + 9FFC07361A4A764100AED399 /* MainMenu.xib in Resources */, C05D1C131923449100B808A4 /* config.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -779,19 +950,34 @@ files = ( AB6CB6F31A1F275E009C2562 /* ConnectWaitLayer.cpp in Sources */, C07828FA18B4D72E00BD2287 /* SimulatorApp.mm in Sources */, + 9FFC07291A4A739200AED399 /* SimulatorConfig.cpp in Sources */, 5023813317EBBCE400990C9B /* AppDelegate.cpp in Sources */, + 9FFC06FE1A4A733B00AED399 /* PlayerMenuServiceMac.mm in Sources */, + 9FFC06FA1A4A733B00AED399 /* ConsoleWindowController.m in Sources */, + 9FFC06FC1A4A733B00AED399 /* PlayerFileDialogServiceMac.mm in Sources */, C00FD4971938512100C6382D /* PlayEnable_png.cpp in Sources */, C00FD4951938512100C6382D /* PlayDisable_png.cpp in Sources */, + 9FFC072F1A4A739200AED399 /* PlayerSettings.cpp in Sources */, AB6CB6F51A1F275E009C2562 /* ConsoleCommand.cpp in Sources */, C033B51D191B337200D06937 /* VisibleRect.cpp in Sources */, + 9FFC06FF1A4A733B00AED399 /* PlayerMessageBoxServiceMac.mm in Sources */, + 9FFC06FB1A4A733B00AED399 /* PlayerEditBoxServiceMac.mm in Sources */, + 9FFC07311A4A739200AED399 /* PlayerUtils.cpp in Sources */, C00FD49D1938512100C6382D /* Shine_png.cpp in Sources */, 3EB515691952865D006966AA /* common.cc in Sources */, 15AA9649199B6D4600725633 /* lua_debugger.c in Sources */, + 9FFC072A1A4A739200AED399 /* AppEvent.cpp in Sources */, + 9FFC07041A4A737300AED399 /* OpenUDIDMac.m in Sources */, 3EB515651952865D006966AA /* repeated_field.cc in Sources */, + 9FFC072B1A4A739200AED399 /* AppLang.cpp in Sources */, 3EB5156B1952865D006966AA /* once.cc in Sources */, + 9FFC07301A4A739200AED399 /* PlayerTaskServiceProtocol.cpp in Sources */, 3EB5155D1952865D006966AA /* coded_stream.cc in Sources */, C00FD4991938512100C6382D /* Portrait_png.cpp in Sources */, C06C3797191A1D1E00617BED /* ConfigParser.cpp in Sources */, + 9FFC07271A4A739200AED399 /* CCHTTPRequest.cpp in Sources */, + 9FFC072E1A4A739200AED399 /* PlayerServiceProtocol.cpp in Sources */, + 9FFC07281A4A739200AED399 /* ProjectConfig.cpp in Sources */, 3EB5156D1952865D006966AA /* stringprintf.cc in Sources */, C07828F818B4D72E00BD2287 /* main.m in Sources */, 3EB515611952865D006966AA /* zero_copy_stream_impl_lite.cc in Sources */, @@ -800,8 +986,13 @@ C00FD49B1938512100C6382D /* Runtime.cpp in Sources */, 3EB515591952865D006966AA /* extension_set.cc in Sources */, 3EB5155B1952865D006966AA /* generated_message_util.cc in Sources */, + 9FFC072D1A4A739200AED399 /* PlayerProtocol.cpp in Sources */, C0619CD81896894800872C26 /* Runtime_ios-mac.mm in Sources */, + 9FFC072C1A4A739200AED399 /* PlayerMenuServiceProtocol.cpp in Sources */, + 9FFC07001A4A733B00AED399 /* PlayerTaskServiceMac.mm in Sources */, + 9FFC06FD1A4A733B00AED399 /* PlayerMac.mm in Sources */, 3EB5152D19528284006966AA /* Protos.pb.cc in Sources */, + 9FFC07331A4A73F700AED399 /* DeviceEx-mac.mm in Sources */, AB6CB6F71A1F275E009C2562 /* FileServer.cpp in Sources */, C00FD4931938512100C6382D /* Landscape_png.cpp in Sources */, 3EB5155F1952865D006966AA /* zero_copy_stream.cc in Sources */, @@ -817,6 +1008,7 @@ 3EB5156A1952865D006966AA /* once.cc in Sources */, C00FD4981938512100C6382D /* Portrait_png.cpp in Sources */, 5023812517EBBCAC00990C9B /* RootViewController.mm in Sources */, + 9FFC073F1A4AA91100AED399 /* ProjectConfig.cpp in Sources */, C00FD4921938512100C6382D /* Landscape_png.cpp in Sources */, F293BB9C15EB831F00256477 /* AppDelegate.cpp in Sources */, C00FD49A1938512100C6382D /* Runtime.cpp in Sources */, @@ -829,6 +1021,7 @@ 3EB515641952865D006966AA /* repeated_field.cc in Sources */, C00FD4941938512100C6382D /* PlayDisable_png.cpp in Sources */, C00FD49C1938512100C6382D /* Shine_png.cpp in Sources */, + 9FFC07401A4AA91B00AED399 /* CCHTTPRequest.cpp in Sources */, 3EB5156E1952865D006966AA /* wire_format_lite.cc in Sources */, AB6CB6F21A1F275E009C2562 /* ConnectWaitLayer.cpp in Sources */, 3EB515581952865D006966AA /* extension_set.cc in Sources */, @@ -841,6 +1034,7 @@ 3EB5155E1952865D006966AA /* zero_copy_stream.cc in Sources */, 3EB5155C1952865D006966AA /* coded_stream.cc in Sources */, C0619CD71896894800872C26 /* Runtime_ios-mac.mm in Sources */, + 9FFC07411A4AAB2F00AED399 /* SimulatorConfig.cpp in Sources */, 5023811817EBBCAC00990C9B /* AppController.mm in Sources */, AB6CB6F41A1F275E009C2562 /* ConsoleCommand.cpp in Sources */, ); @@ -872,10 +1066,11 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - F405C6CB19ED14AA005AD31C /* MainMenu.xib */ = { + 9FFC07341A4A764100AED399 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( - F405C6CA19ED14AA005AD31C /* en */, + 9FFC07351A4A764100AED399 /* Base */, + 9FFC07371A4A765100AED399 /* zh-Hans */, ); name = MainMenu.xib; sourceTree = ""; @@ -899,7 +1094,11 @@ CC_TARGET_OS_MAC, "$(inherited)", ); - HEADER_SEARCH_PATHS = "$(SRCROOT)/../Classes/protobuf-lite"; + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../Classes/protobuf-lite", + "$(SRCROOT)/../Classes/service", + "$(SRCROOT)/../Classes", + ); INFOPLIST_FILE = mac/Info.plist; LIBRARY_SEARCH_PATHS = ""; MACOSX_DEPLOYMENT_TARGET = 10.8; @@ -928,7 +1127,11 @@ CC_TARGET_OS_MAC, "$(inherited)", ); - HEADER_SEARCH_PATHS = "$(SRCROOT)/../Classes/protobuf-lite"; + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../Classes/protobuf-lite", + "$(SRCROOT)/../Classes/service", + "$(SRCROOT)/../Classes", + ); INFOPLIST_FILE = mac/Info.plist; LIBRARY_SEARCH_PATHS = ""; MACOSX_DEPLOYMENT_TARGET = 10.8; @@ -1004,13 +1207,17 @@ CC_TARGET_OS_IPHONE, "$(inherited)", ); - HEADER_SEARCH_PATHS = "$(SRCROOT)/../Classes/protobuf-lite"; + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../Classes/protobuf-lite", + "$(SRCROOT)/../Classes/service", + "$(SRCROOT)/../Classes", + ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(SRCROOT)/../../cocos2d-x/external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; }; name = Debug; @@ -1027,13 +1234,17 @@ CC_TARGET_OS_IPHONE, "$(inherited)", ); - HEADER_SEARCH_PATHS = "$(SRCROOT)/../Classes/protobuf-lite"; + HEADER_SEARCH_PATHS = ( + "$(SRCROOT)/../Classes/protobuf-lite", + "$(SRCROOT)/../Classes/service", + "$(SRCROOT)/../Classes", + ); INFOPLIST_FILE = ios/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios"; + USER_HEADER_SEARCH_PATHS = "$(inherited) $(SRCROOT)/../../cocos2d-x/cocos/platform/ios $(SRCROOT)/../../cocos2d-x/external/curl/include/ios"; VALID_ARCHS = "arm64 armv7"; }; name = Release; diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/Runtime_ios-mac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/Runtime_ios-mac.mm index ffa8f82acc..430ac534e0 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/Runtime_ios-mac.mm +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/Runtime_ios-mac.mm @@ -5,6 +5,9 @@ #include #include + +#include "ConfigParser.h" + using namespace std; string getIPAddress() @@ -13,6 +16,13 @@ string getIPAddress() struct ifaddrs * addrs; const struct ifaddrs * cursor; + // customized by user + auto &bindAddress = ConfigParser::getInstance()->getBindAddress(); + if (bindAddress.length() > 0) + { + return bindAddress; + } + success = getifaddrs(&addrs) == 0; if (success) { cursor = addrs; diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/Base.lproj/MainMenu.xib b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/Base.lproj/MainMenu.xib new file mode 100644 index 0000000000..95349511fa --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/Base.lproj/MainMenu.xib @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.h index d7815e3ef7..ca4b60ed34 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.h +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.h @@ -24,29 +24,35 @@ #include +#import + +#import "service/ConsoleWindowController.h" +#include "ProjectConfig/ProjectConfig.h" +#include "ProjectConfig/SimulatorConfig.h" #include "AppDelegate.h" void createSimulator(const char* viewName, float width, float height,bool isLandscape = true,float frameZoomFactor = 1.0f); -@interface AppController : NSObject +@interface AppController : NSObject { - NSWindow *window; + NSWindow *_window; NSMenu *menu; - NSFileHandle *fileHandle; + + AppDelegate *_app; + ProjectConfig _project; + int _debugLogFile; + + //log file + ConsoleWindowController *_consoleController; + NSFileHandle *_fileHandle; + //console pipe - NSPipe *pipe; - NSFileHandle *pipeReadHandle; + NSPipe *_pipe; + NSFileHandle *_pipeReadHandle; } @property (nonatomic, assign) IBOutlet NSMenu* menu; - -- (IBAction) onSetTop:(id)sender; -- (IBAction) onFileClose:(id)sender; -- (IBAction) onScreenPortait:(id)sender; -- (IBAction) onScreenLandscape:(id)sender; -- (IBAction) onScreenZoomOut:(id)sender; -- (IBAction) onRelaunch:(id)sender; - - +-(IBAction)onFileClose:(id)sender; +-(IBAction)onWindowAlwaysOnTop:(id)sender; @end diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm index 7d263e4868..6d0ce2d5cb 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/SimulatorApp.mm @@ -36,15 +36,19 @@ #include "ConfigParser.h" #include "cocos2d.h" +#include "CCLuaEngine.h" +#include "CodeIDESupport.h" -using namespace cocos2d; +#include "service/PlayerMac.h" +#include "service/AppEvent.h" +#include "service/AppLang.h" -bool g_landscape = false; -bool g_windTop = false; -cocos2d::Size g_screenSize; -GLViewImpl* g_eglView = nullptr; -static AppController* g_nsAppDelegate=nullptr; +#if (GLFW_VERSION_MAJOR >= 3) && (GLFW_VERSION_MINOR >= 1) +#define PLAYER_SUPPORT_DROP 1 +#else +#define PLAYER_SUPPORT_DROP 0 +#endif using namespace std; using namespace cocos2d; @@ -68,6 +72,17 @@ std::string getCurAppName(void) return appName; } +#if (PLAYER_SUPPORT_DROP > 0) +static void glfwDropFunc(GLFWwindow *window, int count, const char **files) +{ + AppEvent forwardEvent(kAppEventDropName, APP_EVENT_DROP); + std::string firstFile(files[0]); + forwardEvent.setDataString(firstFile); + + Director::getInstance()->getEventDispatcher()->dispatchEvent(&forwardEvent); +} +#endif + -(void) dealloc { Director::getInstance()->end(); @@ -79,226 +94,118 @@ std::string getCurAppName(void) - (void) applicationDidFinishLaunching:(NSNotification *)aNotification { - NSArray *args = [[NSProcessInfo processInfo] arguments]; + auto player = player::PlayerMac::create(); + player->setController(self); + + _debugLogFile = 0; - if (args != nullptr && [args count] >= 2) { - } - g_nsAppDelegate = self; - AppDelegate app; - Application::getInstance()->run(); - // After run, application needs to be terminated immediately. - [[NSApplication sharedApplication] terminate: self]; + [self parseCocosProjectConfig:&_project]; + [self updateProjectFromCommandLineArgs:&_project]; + [self createWindowAndGLView]; + [self startup]; } #pragma mark - #pragma mark functions -- (void) createSimulator:(NSString*)viewName viewWidth:(float)width viewHeight:(float)height factor:(float)frameZoomFactor -{ - if (g_eglView) - { - return; - } - - if(!g_landscape) - { - float tmpvalue =width; - width = height; - height = tmpvalue; - } - g_windTop = ConfigParser::getInstance()->isWindowTop(); - g_eglView = GLViewImpl::createWithRect([viewName cStringUsingEncoding:NSUTF8StringEncoding],cocos2d::Rect(0.0f,0.0f,width,height),frameZoomFactor); - auto director = Director::getInstance(); - director->setOpenGLView(g_eglView); - - window = glfwGetCocoaWindow(g_eglView->getWindow()); - [[NSApplication sharedApplication] setDelegate: self]; - - [self createViewMenu]; - [self updateMenu]; - [window center]; - - [window becomeFirstResponder]; - [window makeKeyAndOrderFront:self]; -} - -void createSimulator(const char* viewName, float width, float height,bool isLandscape,float frameZoomFactor) -{ - if(g_nsAppDelegate) - { - g_landscape = isLandscape; - if(height > width) - { - float tmpvalue =width; - width = height; - height = tmpvalue; - } - g_screenSize.width = width; - g_screenSize.height = height; - - [g_nsAppDelegate createSimulator:[NSString stringWithUTF8String:viewName] viewWidth:width viewHeight:height factor:frameZoomFactor]; - } - -} - -- (void) createViewMenu -{ - - NSMenu *submenu = [[[window menu] itemWithTitle:@"View"] submenu]; - - for (int i = ConfigParser::getInstance()->getScreenSizeCount() - 1; i >= 0; --i) - { - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(i); - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:[NSString stringWithCString:size.title.c_str() encoding:NSUTF8StringEncoding] - action:@selector(onViewChangeFrameSize:) - keyEquivalent:@""] autorelease]; - [item setTag:i]; - [submenu insertItem:item atIndex:0]; - } -} - - -- (void) updateMenu -{ - - NSMenu *menuScreen = [[[window menu] itemWithTitle:@"View"] submenu]; - NSMenuItem *itemPortait = [menuScreen itemWithTitle:@"Portait"]; - NSMenuItem *itemLandscape = [menuScreen itemWithTitle:@"Landscape"]; - if (g_landscape) - { - [itemPortait setState:NSOffState]; - [itemLandscape setState:NSOnState]; - } - else - { - [itemPortait setState:NSOnState]; - [itemLandscape setState:NSOffState]; - } - - NSMenu *menuControl = [[[window menu] itemWithTitle:@"Control"] submenu]; - NSMenuItem *itemTop = [menuControl itemWithTitle:@"Keep Window Top"]; - if (g_windTop) { - [window setLevel:NSFloatingWindowLevel]; - [itemTop setState:NSOnState]; - } - else - { - [window setLevel:NSNormalWindowLevel]; - [itemTop setState:NSOffState]; - } - - int scale = g_eglView->getFrameZoomFactor()*100; - - NSMenuItem *itemZoom100 = [menuScreen itemWithTitle:@"Actual (100%)"]; - NSMenuItem *itemZoom75 = [menuScreen itemWithTitle:@"Zoom Out (75%)"]; - NSMenuItem *itemZoom50 = [menuScreen itemWithTitle:@"Zoom Out (50%)"]; - NSMenuItem *itemZoom25 = [menuScreen itemWithTitle:@"Zoom Out (25%)"]; - [itemZoom100 setState:NSOffState]; - [itemZoom75 setState:NSOffState]; - [itemZoom50 setState:NSOffState]; - [itemZoom25 setState:NSOffState]; - if (scale == 100) - { - [itemZoom100 setState:NSOnState]; - } - else if (scale == 75) - { - [itemZoom75 setState:NSOnState]; - } - else if (scale == 50) - { - [itemZoom50 setState:NSOnState]; - } - else if (scale == 25) - { - [itemZoom25 setState:NSOnState]; - } - - int width = g_screenSize.width; - int height = g_screenSize.height; - if (height > width) - { - int w = width; - width = height; - height = w; - } - - int count = ConfigParser::getInstance()->getScreenSizeCount(); - for (int i = 0; i < count; ++i) - { - bool bSel = false; - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(i); - if (size.width == width && size.height == height) - { - bSel = true; - } - NSMenuItem *itemView = [menuScreen itemWithTitle:[NSString stringWithUTF8String:size.title.c_str()]]; - [itemView setState:(bSel? NSOnState : NSOffState)]; - } - - -} - - -- (void) updateView -{ - auto policy = g_eglView->getResolutionPolicy(); - auto designSize = g_eglView->getDesignResolutionSize(); - - if (g_landscape) - { - g_eglView->setFrameSize(g_screenSize.width, g_screenSize.height); - } - else - { - g_eglView->setFrameSize(g_screenSize.height, g_screenSize.width); - } - - g_eglView->setDesignResolutionSize(designSize.width, designSize.height, policy); - - [self updateMenu]; -} - -- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication +- (BOOL) windowShouldClose:(id)sender { return YES; } -- (BOOL) applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag -{ - return NO; -} - - (void) windowWillClose:(NSNotification *)notification { [[NSRunningApplication currentApplication] terminate]; } -- (IBAction) onSetTop:(id)sender +- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication { - g_windTop = !g_windTop; - [self updateMenu]; + return YES; } - -- (IBAction) onFileClose:(id)sender +- (NSMutableArray*) makeCommandLineArgsFromProjectConfig { - [[NSApplication sharedApplication] terminate:self]; + return [self makeCommandLineArgsFromProjectConfig:kProjectConfigAll]; } - -- (IBAction) onScreenPortait:(id)sender +- (NSMutableArray*) makeCommandLineArgsFromProjectConfig:(unsigned int)mask { - g_landscape = false; - [self updateView]; - + _project.setWindowOffset(Vec2(_window.frame.origin.x, _window.frame.origin.y)); + vector args = _project.makeCommandLineVector(); + NSMutableArray *commandArray = [NSMutableArray arrayWithCapacity:args.size()]; + for (auto &path : args) + { + [commandArray addObject:[NSString stringWithUTF8String:path.c_str()]]; + } + return commandArray; } -- (IBAction) onScreenLandscape:(id)sender +- (void) parseCocosProjectConfig:(ProjectConfig*)config { - g_landscape = true; - [self updateView]; + // get project directory + ProjectConfig tmpConfig; + NSArray *nsargs = [[NSProcessInfo processInfo] arguments]; + long n = [nsargs count]; + if (n >= 2) + { + vector args; + for (int i = 0; i < [nsargs count]; ++i) + { + string arg = [[nsargs objectAtIndex:i] cStringUsingEncoding:NSUTF8StringEncoding]; + if (arg.length()) args.push_back(arg); + } + + if (args.size() && args.at(1).at(0) == '/') + { + // FIXME: + // for Code IDE before RC2 + tmpConfig.setProjectDir(args.at(1)); + } + + tmpConfig.parseCommandLine(args); + } + + // set project directory as search root path + FileUtils::getInstance()->setDefaultResourceRootPath(tmpConfig.getProjectDir()); + + // parse config.json + auto parser = ConfigParser::getInstance(); + auto configPath = tmpConfig.getProjectDir().append(CONFIG_FILE); + parser->readConfig(configPath); + + // set information + config->setConsolePort(parser->getConsolePort()); + config->setFileUploadPort(parser->getUploadPort()); + config->setFrameSize(parser->getInitViewSize()); + if (parser->isLanscape()) + { + config->changeFrameOrientationToLandscape(); + } + config->setScriptFile(parser->getEntryFile()); +} + +- (void) updateProjectFromCommandLineArgs:(ProjectConfig*)config +{ + NSArray *nsargs = [[NSProcessInfo processInfo] arguments]; + long n = [nsargs count]; + if (n >= 2) + { + vector args; + for (int i = 0; i < [nsargs count]; ++i) + { + string arg = [[nsargs objectAtIndex:i] cStringUsingEncoding:NSUTF8StringEncoding]; + if (arg.length()) args.push_back(arg); + } + + if (args.size() && args.at(1).at(0) == '/') + { + // for Code IDE before RC2 + config->setProjectDir(args.at(1)); + config->setDebuggerType(kCCRuntimeDebuggerCodeIDE); + } + config->parseCommandLine(args); + } } - (void) launch:(NSArray*)args @@ -308,7 +215,8 @@ void createSimulator(const char* viewName, float width, float height,bool isLand NSError *error = [[[NSError alloc] init] autorelease]; [[NSWorkspace sharedWorkspace] launchApplicationAtURL:url options:NSWorkspaceLaunchNewInstance - configuration:configuration error:&error]; + configuration:configuration + error:&error]; } - (void) relaunch:(NSArray*)args @@ -317,33 +225,372 @@ void createSimulator(const char* viewName, float width, float height,bool isLand [[NSApplication sharedApplication] terminate:self]; } -- (IBAction) onRelaunch:(id)sender +- (void) relaunch { - NSArray* args=[[NSArray alloc] initWithObjects:@" ", nil]; - [self relaunch:args]; + [self relaunch:[self makeCommandLineArgsFromProjectConfig]]; } - -- (IBAction) onViewChangeFrameSize:(id)sender +- (void) createWindowAndGLView { - NSInteger index = [sender tag]; - if (index >= 0 && index < ConfigParser::getInstance()->getScreenSizeCount()) + GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; + GLView::setGLContextAttrs(glContextAttrs); + + // create console window **MUST** before create opengl view + if (_project.isShowConsole()) { - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(index); - g_screenSize.width = size.width; - g_screenSize.height = size.height; - [self updateView]; + [self openConsoleWindow]; + CCLOG("%s\n",Configuration::getInstance()->getInfo().c_str()); + } + + float frameScale = _project.getFrameScale(); + + // create opengl view + cocos2d::Size frameSize = _project.getFrameSize(); + + const cocos2d::Rect frameRect = cocos2d::Rect(0, 0, frameSize.width, frameSize.height); + std::stringstream title; + title << "Cocos Simulator - " << ConfigParser::getInstance()->getInitViewName(); + GLViewImpl *eglView = GLViewImpl::createWithRect(title.str(), frameRect, frameScale); + + auto director = Director::getInstance(); + director->setOpenGLView(eglView); + + _window = eglView->getCocoaWindow(); + [[NSApplication sharedApplication] setDelegate: self]; + [_window center]; + + if (_project.getProjectDir().length()) + { + [self setZoom:_project.getFrameScale()]; + Vec2 pos = _project.getWindowOffset(); + if (pos.x != 0 && pos.y != 0) + { + [_window setFrameOrigin:NSMakePoint(pos.x, pos.y)]; + } + } + +#if (PLAYER_SUPPORT_DROP > 0) + glfwSetDropCallback(eglView->getWindow(), glfwDropFunc); +#endif +} + +- (void) adjustEditMenuIndex +{ + NSApplication *thisApp = [NSApplication sharedApplication]; + NSMenu *mainMenu = [thisApp mainMenu]; + + NSMenuItem *editMenuItem = [mainMenu itemWithTitle:@"Edit"]; + if (editMenuItem) + { + NSUInteger index = 2; + if (index > [mainMenu itemArray].count) + index = [mainMenu itemArray].count; + [[editMenuItem menu] removeItem:editMenuItem]; + [mainMenu insertItem:editMenuItem atIndex:index]; + } +} +- (void) startup +{ + FileUtils::getInstance()->setPopupNotify(false); + + _project.dump(); + + const string projectDir = _project.getProjectDir(); + if (projectDir.length()) + { + FileUtils::getInstance()->setDefaultResourceRootPath(projectDir); + if (_project.isWriteDebugLogToFile()) + { + [self writeDebugLogToFile:_project.getDebugLogFilePath()]; + } + } + + const string writablePath = _project.getWritableRealPath(); + if (writablePath.length()) + { + FileUtils::getInstance()->setWritablePath(writablePath.c_str()); + } + + // path for looking Lang file, Studio Default images + NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; + FileUtils::getInstance()->addSearchPath(resourcePath.UTF8String); + + // app + _app = new AppDelegate(); + + [self setupUI]; + [self adjustEditMenuIndex]; + + _app->setProjectConfig(_project); + Application::getInstance()->run(); + // After run, application needs to be terminated immediately. + [NSApp terminate: self]; +} + +- (void) setupUI +{ + auto menuBar = player::PlayerProtocol::getInstance()->getMenuService(); + + // VIEW + menuBar->addItem("VIEW_MENU", tr("View")); + SimulatorConfig *config = SimulatorConfig::getInstance(); + int current = config->checkScreenSize(_project.getFrameSize()); + for (int i = 0; i < config->getScreenSizeCount(); i++) + { + SimulatorScreenSize size = config->getScreenSize(i); + std::stringstream menuId; + menuId << "VIEWSIZE_ITEM_MENU_" << i; + auto menuItem = menuBar->addItem(menuId.str(), size.title.c_str(), "VIEW_MENU"); + + if (i == current) + { + menuItem->setChecked(true); + } + } + + menuBar->addItem("DIRECTION_MENU_SEP", "-", "VIEW_MENU"); + menuBar->addItem("DIRECTION_PORTRAIT_MENU", tr("Portrait"), "VIEW_MENU") + ->setChecked(_project.isPortraitFrame()); + menuBar->addItem("DIRECTION_LANDSCAPE_MENU", tr("Landscape"), "VIEW_MENU") + ->setChecked(_project.isLandscapeFrame()); + + menuBar->addItem("VIEW_SCALE_MENU_SEP", "-", "VIEW_MENU"); + + std::vector scaleMenuVector; + auto scale100Menu = menuBar->addItem("VIEW_SCALE_MENU_100", tr("Zoom Out").append(" (100%)"), "VIEW_MENU"); + scale100Menu->setShortcut("super+0"); + + auto scale75Menu = menuBar->addItem("VIEW_SCALE_MENU_75", tr("Zoom Out").append(" (75%)"), "VIEW_MENU"); + scale75Menu->setShortcut("super+7"); + + auto scale50Menu = menuBar->addItem("VIEW_SCALE_MENU_50", tr("Zoom Out").append(" (50%)"), "VIEW_MENU"); + scale50Menu->setShortcut("super+6"); + + auto scale25Menu = menuBar->addItem("VIEW_SCALE_MENU_25", tr("Zoom Out").append(" (25%)"), "VIEW_MENU"); + scale25Menu->setShortcut("super+5"); + + int frameScale = int(_project.getFrameScale() * 100); + if (frameScale == 100) + { + scale100Menu->setChecked(true); + } + else if (frameScale == 75) + { + scale75Menu->setChecked(true); + } + else if (frameScale == 50) + { + scale50Menu->setChecked(true); + } + else if (frameScale == 25) + { + scale25Menu->setChecked(true); + } + else + { + scale100Menu->setChecked(true); + } + + scaleMenuVector.push_back(scale100Menu); + scaleMenuVector.push_back(scale75Menu); + scaleMenuVector.push_back(scale50Menu); + scaleMenuVector.push_back(scale25Menu); + + menuBar->addItem("REFRESH_MENU_SEP", "-", "VIEW_MENU"); + menuBar->addItem("REFRESH_MENU", tr("Refresh"), "VIEW_MENU")->setShortcut("super+r"); + + ProjectConfig &project = _project; + auto dispatcher = Director::getInstance()->getEventDispatcher(); + dispatcher->addEventListenerWithFixedPriority(EventListenerCustom::create(kAppEventName, [&project, scaleMenuVector](EventCustom* event){ + auto menuEvent = dynamic_cast(event); + if (menuEvent) + { + rapidjson::Document dArgParse; + dArgParse.Parse<0>(menuEvent->getDataString().c_str()); + if (dArgParse.HasMember("name")) + { + string strcmd = dArgParse["name"].GetString(); + + if (strcmd == "menuClicked") + { + player::PlayerMenuItem *menuItem = static_cast(menuEvent->getUserData()); + if (menuItem) + { + if (menuItem->isChecked()) + { + return ; + } + + string data = dArgParse["data"].GetString(); + auto player = player::PlayerProtocol::getInstance(); + + if ((data == "CLOSE_MENU") || (data == "EXIT_MENU")) + { + player->quit(); + } + else if (data == "REFRESH_MENU") + { + player->relaunch(); + } + else if (data.find("VIEW_SCALE_MENU_") == 0) // begin with VIEW_SCALE_MENU_ + { + string tmp = data.erase(0, strlen("VIEW_SCALE_MENU_")); + float scale = atof(tmp.c_str()) / 100.0f; + project.setFrameScale(scale); + + auto glview = static_cast(Director::getInstance()->getOpenGLView()); + glview->setFrameZoomFactor(scale); + + + // update scale menu state + for (auto &it : scaleMenuVector) + { + it->setChecked(false); + } + menuItem->setChecked(true); + } + else if (data.find("VIEWSIZE_ITEM_MENU_") == 0) // begin with VIEWSIZE_ITEM_MENU_ + { + string tmp = data.erase(0, strlen("VIEWSIZE_ITEM_MENU_")); + int index = atoi(tmp.c_str()); + SimulatorScreenSize size = SimulatorConfig::getInstance()->getScreenSize(index); + + if (project.isLandscapeFrame()) + { + std::swap(size.width, size.height); + } + + project.setFrameSize(cocos2d::Size(size.width, size.height)); + project.setWindowOffset(cocos2d::Vec2(player->getPositionX(), player->getPositionY())); + player->openProjectWithProjectConfig(project); + } + else if (data == "DIRECTION_PORTRAIT_MENU") + { + project.changeFrameOrientationToPortait(); + player->openProjectWithProjectConfig(project); + } + else if (data == "DIRECTION_LANDSCAPE_MENU") + { + project.changeFrameOrientationToLandscape(); + player->openProjectWithProjectConfig(project); + } + } + } + } + } + }), 1); + + // drop + AppDelegate *app = _app; + auto listener = EventListenerCustom::create(kAppEventDropName, [&project, app](EventCustom* event) + { + AppEvent *dropEvent = dynamic_cast(event); + if (dropEvent) + { + string dirPath = dropEvent->getDataString() + "/"; + string configFilePath = dirPath + CONFIG_FILE; + + if (FileUtils::getInstance()->isDirectoryExist(dirPath) && + FileUtils::getInstance()->isFileExist(configFilePath)) + { + // parse config.json + ConfigParser::getInstance()->readConfig(configFilePath); + + project.setProjectDir(dirPath); + project.setScriptFile(ConfigParser::getInstance()->getEntryFile()); + project.setWritablePath(dirPath); + + app->setProjectConfig(project); + app->reopenProject(); + } + } + }); + dispatcher->addEventListenerWithFixedPriority(listener, 1); +} + +- (void) openConsoleWindow +{ + if (!_consoleController) + { + _consoleController = [[ConsoleWindowController alloc] initWithWindowNibName:@"ConsoleWindow"]; + } + [_consoleController.window orderFrontRegardless]; + + //set console pipe + _pipe = [NSPipe pipe] ; + _pipeReadHandle = [_pipe fileHandleForReading] ; + + int outfd = [[_pipe fileHandleForWriting] fileDescriptor]; + if (dup2(outfd, fileno(stderr)) != fileno(stderr) || dup2(outfd, fileno(stdout)) != fileno(stdout)) + { + perror("Unable to redirect output"); + // [self showAlert:@"Unable to redirect output to console!" withTitle:@"player error"]; + } + else + { + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNotification:) name: NSFileHandleReadCompletionNotification object: _pipeReadHandle] ; + [_pipeReadHandle readInBackgroundAndNotify] ; } } - -- (IBAction) onScreenZoomOut:(id)sender +- (bool) writeDebugLogToFile:(const string)path { - if ([sender state] == NSOnState) return; - float scale = (float)[sender tag] / 100.0f; - g_eglView->setFrameZoomFactor(scale); - [self updateView]; + if (_debugLogFile) return true; + //log to file + if(_fileHandle) return true; + NSString *fPath = [NSString stringWithCString:path.c_str() encoding:[NSString defaultCStringEncoding]]; + [[NSFileManager defaultManager] createFileAtPath:fPath contents:nil attributes:nil] ; + _fileHandle = [NSFileHandle fileHandleForWritingAtPath:fPath]; + [_fileHandle retain]; + return true; } +- (void)handleNotification:(NSNotification *)note +{ + //NSLog(@"Received notification: %@", note); + [_pipeReadHandle readInBackgroundAndNotify] ; + NSData *data = [[note userInfo] objectForKey:NSFileHandleNotificationDataItem]; + NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; + + //show log to console + [_consoleController trace:str]; + if(_fileHandle!=nil){ + [_fileHandle writeData:[str dataUsingEncoding:NSUTF8StringEncoding]]; + } + +} +- (void) setZoom:(float)scale +{ + Director::getInstance()->getOpenGLView()->setFrameZoomFactor(scale); + _project.setFrameScale(scale); +} + +- (BOOL) applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag +{ + return NO; +} + +#pragma mark - + +-(IBAction)onFileClose:(id)sender +{ + [[NSApplication sharedApplication] terminate:self]; +} + +-(IBAction)onWindowAlwaysOnTop:(id)sender +{ + NSInteger state = [sender state]; + + if (state == NSOffState) + { + [_window setLevel:NSFloatingWindowLevel]; + [sender setState:NSOnState]; + } + else + { + [_window setLevel:NSNormalWindowLevel]; + [sender setState:NSOffState]; + } +} @end diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindow.xib b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindow.xib new file mode 100644 index 0000000000..1cc9932310 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindow.xib @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindowController.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindowController.h new file mode 100644 index 0000000000..7b1c06d215 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindowController.h @@ -0,0 +1,23 @@ + +#import + +@interface ConsoleWindowController : NSWindowController +{ + NSTextView *textView; + IBOutlet NSButton *checkScroll; + IBOutlet NSButton *topCheckBox; + NSMutableArray *linesCount; + NSUInteger traceCount; +} + +@property (assign) IBOutlet NSTextView *textView; + +- (void) trace:(NSString*)msg; +- (IBAction)onClear:(id)sender; +- (IBAction)onScrollChange:(id)sender; +- (IBAction)onTopChange:(id)sender; + +@end + + + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindowController.m b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindowController.m new file mode 100644 index 0000000000..aa56938433 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/ConsoleWindowController.m @@ -0,0 +1,100 @@ + +#import "ConsoleWindowController.h" + +@interface ConsoleWindowController () + +@end + +#define SKIP_LINES_COUNT 3 +#define MAX_LINE_LEN 4096 +#define MAX_LINES_COUNT 200 + +@implementation ConsoleWindowController +@synthesize textView; + +- (id)initWithWindow:(NSWindow *)window +{ + self = [super initWithWindow:window]; + if (self) + { + // Initialization code here. + linesCount = [[NSMutableArray arrayWithCapacity:MAX_LINES_COUNT + 1] retain]; + } + + return self; +} + +- (void)dealloc +{ + [linesCount release]; + [super dealloc]; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. +} + +- (void) trace:(NSString*)msg +{ + if (traceCount >= SKIP_LINES_COUNT && [msg length] > MAX_LINE_LEN) + { + msg = [NSString stringWithFormat:@"%@ ...", [msg substringToIndex:MAX_LINE_LEN - 4]]; + } + traceCount++; + NSFont *font = [NSFont fontWithName:@"Monaco" size:12.0]; + NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; + NSAttributedString *string = [[NSAttributedString alloc] initWithString:msg attributes:attrsDictionary]; + NSNumber *len = [NSNumber numberWithUnsignedInteger:[string length]]; + [linesCount addObject:len]; + + NSTextStorage *storage = [textView textStorage]; + [storage beginEditing]; + [storage appendAttributedString:string]; + + if ([linesCount count] >= MAX_LINES_COUNT) + { + len = [linesCount objectAtIndex:0]; + [storage deleteCharactersInRange:NSMakeRange(0, [len unsignedIntegerValue])]; + [linesCount removeObjectAtIndex:0]; + } + + [storage endEditing]; + [self changeScroll]; +} + +- (void) changeScroll +{ + BOOL scroll = [checkScroll state] == NSOnState; + if(scroll) + { + [self.textView scrollRangeToVisible: NSMakeRange(self.textView.string.length, 0)]; + } +} + +- (IBAction)onClear:(id)sender +{ + NSTextStorage *storage = [textView textStorage]; + [storage setAttributedString:[[[NSAttributedString alloc] initWithString:@""] autorelease]]; +} + +- (IBAction)onScrollChange:(id)sender +{ + [self changeScroll]; +} + +- (IBAction)onTopChange:(id)sender +{ + BOOL isTop = [topCheckBox state] == NSOnState; + if(isTop) + { + [self.window setLevel:NSFloatingWindowLevel]; + } + else + { + [self.window setLevel:NSNormalWindowLevel]; + } +} + +@end diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/DeviceEx-mac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/DeviceEx-mac.mm new file mode 100644 index 0000000000..afae0e88c7 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/DeviceEx-mac.mm @@ -0,0 +1,70 @@ +#include "DeviceEx.h" + +#import "openudid/OpenUDIDMac.h" + +using namespace std; +PLAYER_NS_BEGIN + +DeviceEx *DeviceEx::getInstance() +{ + static DeviceEx *instance = NULL; + if (!instance) + { + instance = new DeviceEx(); + instance->init(); + } + return instance; +} + +std::string DeviceEx::getCurrentUILangName() +{ + return _uiLangName; +} + +std::string DeviceEx::getUserGUID() +{ + return _userGUID; +} + + +////////// private ////////// + +DeviceEx::DeviceEx() + : _uiLangName("en") +{ + +} + +void DeviceEx::init() +{ + makeUILangName(); + makeUserGUID(); +} + +void DeviceEx::makeUILangName() +{ + NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; + NSArray *languages = [defs objectForKey:@"AppleLanguages"]; + if ([languages count] > 0) + { + NSString *lang = [languages objectAtIndex:0]; + _uiLangName = lang.UTF8String; + } +} + +std::string DeviceEx::makeUserGUID() +{ + if (_userGUID.length() <= 0) + { + _userGUID = string([[OpenUDIDMac value] cStringUsingEncoding:NSUTF8StringEncoding]); + + if (_userGUID.length() <= 0) + { + _userGUID = "guid-fixed-1234567890"; + } + } + + return _userGUID; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.h new file mode 100644 index 0000000000..94f52bcaba --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.h @@ -0,0 +1,61 @@ +// +// EditBoxServiceMac.h +// player +// + +#ifndef __player__EditBoxServiceMac__ +#define __player__EditBoxServiceMac__ + +#include "PlayerEditBoxServiceProtocol.h" + + +@interface EditBoxServiceImplMac : NSObject +{ + void* editBox_; + BOOL editState_; + NSMutableDictionary* placeholderAttributes_; +} + +@property(nonatomic, retain) NSTextField* textField; +@property(nonatomic, retain) NSMutableDictionary* placeholderAttributes; +@property(nonatomic, readonly, getter = isEditState) BOOL editState; +@property(nonatomic, assign) void* editBox; + +-(id) initWithFrame: (NSRect) frameRect editBox: (void*) editBox; +-(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)distance; +-(void) setPosition:(NSPoint) pos; +-(void) setContentSize:(NSSize) size; +-(void) visit; +-(void) openKeyboard; +-(void) closeKeyboard; + +@end + + +PLAYER_NS_BEGIN +class PlayerEditBoxServiceMac : public PlayerEditBoxServiceProtocol +{ +public: + PlayerEditBoxServiceMac(); + virtual ~PlayerEditBoxServiceMac(); + + // overwrite + virtual void showSingleLineEditBox(const cocos2d::Rect &rect) ; + virtual void showMultiLineEditBox(const cocos2d::Rect &rect) ; + virtual void hide() ; + + virtual void setText(const std::string &text); + virtual void setFont(const std::string &name, int size); + virtual void setFontColor(const cocos2d::Color3B &color); + + virtual void setFormator(int formator); +private: + void show(); + +private: + EditBoxServiceImplMac* _sysEdit; +}; + +PLAYER_NS_END + +#endif diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.mm new file mode 100644 index 0000000000..dc2b960130 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.mm @@ -0,0 +1,226 @@ + +#include "PlayerEditBoxServiceMac.h" + +#include "cocos2d.h" +#include "CCLuaEngine.h" +#include "glfw3native.h" + +// internal + +@implementation EditBoxServiceImplMac + +@synthesize textField = textField_; +@synthesize placeholderAttributes = placeholderAttributes_; +@synthesize editState = editState_; +@synthesize editBox = editBox_; + +- (id) getNSWindow +{ + auto glview = cocos2d::Director::getInstance()->getOpenGLView(); + return glview->getCocoaWindow(); +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [textField_ removeFromSuperview]; + [textField_ release]; + + [placeholderAttributes_ release]; + [super dealloc]; +} + +-(id) initWithFrame: (NSRect) frameRect editBox: (void*) editBox +{ + self = [super init]; + + if (self) + { + editState_ = NO; + self.textField = [[[NSTextField alloc] initWithFrame:frameRect] autorelease]; + + NSColor *newColor = [NSColor colorWithCalibratedRed:255 / 255.0f green:0 blue:0 alpha:1.0f]; + self.textField.textColor = newColor; + + NSFont *font = [NSFont systemFontOfSize:10]; //TODO need to delete hard code here. + textField_.font = font; + + [self setupTextField:textField_]; + + self.editBox = editBox; + self.placeholderAttributes = [NSMutableDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + [NSColor grayColor], NSForegroundColorAttributeName, + nil]; + + [[[self getNSWindow] contentView] addSubview:textField_]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(onTextDidChanged:) + name:NSControlTextDidEndEditingNotification + object:nil]; + } + + return self; +} + +- (void)onTextDidChanged:(NSNotification *) notification +{ + // hide first + [self.textField setHidden:YES]; + + player::PlayerEditBoxServiceMac *macEditBox = static_cast(self.editBox); + auto luaStack = cocos2d::LuaEngine::getInstance()->getLuaStack(); + + luaStack->pushString([self.textField.stringValue UTF8String]); + luaStack->executeFunctionByHandler(macEditBox->getHandler(), 1); +} + +- (void)setupTextField:(NSTextField *)textField +{ + [textField setTextColor:[NSColor whiteColor]]; + [textField setBackgroundColor:[NSColor clearColor]]; + [textField setBordered:NO]; + [textField setHidden:NO]; + [textField setWantsLayer:YES]; + [textField setDelegate:self]; +} + +-(void) doAnimationWhenKeyboardMoveWithDuration:(float)duration distance:(float)distance +{ + [[[self getNSWindow] contentView] doAnimationWhenKeyboardMoveWithDuration:duration distance:distance]; +} + +-(void) setPosition:(NSPoint) pos +{ + NSRect frame = [textField_ frame]; + frame.origin = pos; + [textField_ setFrame:frame]; +} + +-(void) setContentSize:(NSSize) size +{ + [self.textField setFrameSize:size]; +} + +-(void) visit +{ + +} + +-(void) openKeyboard +{ + if ([textField_ superview]) { + [textField_ becomeFirstResponder]; + } +} + +-(void) closeKeyboard +{ + if ([textField_ superview]) { + [textField_ resignFirstResponder]; + } +} + +- (BOOL)textFieldShouldReturn:(NSTextField *)sender +{ + if (sender == textField_) { + [sender resignFirstResponder]; + } + return NO; +} + +-(void)animationSelector +{ +} + +- (BOOL) control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector +{ + return NO; +} + +@end + + + +PLAYER_NS_BEGIN; + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +PlayerEditBoxServiceMac::PlayerEditBoxServiceMac() +{ + _handler = 0; + NSRect rect = NSMakeRect(0, 0, 100, 20); + _sysEdit = [[EditBoxServiceImplMac alloc] initWithFrame:rect editBox:this]; +} + +PlayerEditBoxServiceMac::~PlayerEditBoxServiceMac() +{ + [_sysEdit release]; +} + +void PlayerEditBoxServiceMac::showSingleLineEditBox(const cocos2d::Rect &rect) +{ + [[_sysEdit.textField cell] setLineBreakMode:NSLineBreakByTruncatingTail]; + [[_sysEdit.textField cell] setTruncatesLastVisibleLine:YES]; + + [_sysEdit setPosition:NSMakePoint(rect.origin.x, rect.origin.y)]; + [_sysEdit setContentSize:NSMakeSize(rect.size.width, rect.size.height)]; + + show(); +} + +void PlayerEditBoxServiceMac::showMultiLineEditBox(const cocos2d::Rect &rect) +{ + [[_sysEdit.textField cell] setLineBreakMode:NSLineBreakByCharWrapping]; + [[_sysEdit.textField cell] setTruncatesLastVisibleLine:NO]; + + [_sysEdit setPosition:NSMakePoint(rect.origin.x, rect.origin.y)]; + [_sysEdit setContentSize:NSMakeSize(rect.size.width, rect.size.height)]; + + show(); +} + +void PlayerEditBoxServiceMac::setText(const std::string &text) +{ + _sysEdit.textField.stringValue = [NSString stringWithUTF8String:text.c_str()]; +} + +void PlayerEditBoxServiceMac::setFont(const std::string &name, int size) +{ + NSString *fntName = [NSString stringWithUTF8String:name.c_str()]; + NSFont *textFont = [NSFont fontWithName:fntName size:size]; + if (textFont != nil) + { + [_sysEdit.textField setFont:textFont]; + } +} + +void PlayerEditBoxServiceMac::setFontColor(const cocos2d::Color3B &color) +{ + NSColor *textColor = [NSColor colorWithCalibratedRed:color.r / 255.0f green:color.g / 255.0f blue:color.b / 255.0f alpha:1.0f]; + _sysEdit.textField.textColor = textColor; +} + +// hide editbox +void PlayerEditBoxServiceMac::hide() +{ + [_sysEdit.textField setHidden:YES]; + [_sysEdit closeKeyboard]; +} + +void PlayerEditBoxServiceMac::show() +{ + [_sysEdit.textField setHidden:NO]; + [_sysEdit openKeyboard]; +} + +void PlayerEditBoxServiceMac::setFormator(int formator) +{ + CCLOG("Not support yet."); +} + +PLAYER_NS_END; \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.h new file mode 100644 index 0000000000..c71c0c6b1e --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.h @@ -0,0 +1,50 @@ +#ifndef __PLAY_FILE_DIALOG_SERVICE_MAC_H +#define __PLAY_FILE_DIALOG_SERVICE_MAC_H + +#include "PlayerMacros.h" +#include "PlayerFileDialogServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerFileDialogServiceMac : public PlayerFileDialogServiceProtocol +{ +public: + // 选择一个已有的文件,并返回文件的完整路径 + // 如果用户å–消对è¯æ¡†ï¼Œè¿”回空字符串 + // + // @param title 对è¯æ¡†æ ‡é¢˜ + // @param directory 默认打开的目录 + // + // 如果 directory ä¸ä¸ºç©ºï¼Œåˆ™å¯¹è¯æ¡†æ‰“开时,直接进入 directory å‚数指定的目录; + // å¦åˆ™è¿›å…¥è¿›ç¨‹å½“å‰ç›®å½•ï¼ˆCurrent Directory)。 + // + // @param extensions 用于é™åˆ¶å¯ä»¥æ‰“开的文件类型 + // + // extensions 示例: + // extensions = "Lua Script File|*.lua;JSON File|*.json"; + // + // æ¯ä¸€ç§ç±»åž‹åˆ†ä¸ºâ€œæè¿°â€å’Œâ€œæ‰©å±•åâ€ä¸¤éƒ¨åˆ†ï¼Œç”¨â€œ|â€åˆ†éš” + // 扩展å如果有多个,则用“,â€åˆ†éš” + // ä¸åŒç±»åž‹ç”¨â€œ;â€åˆ†éš” + // + // 如果 extensions å‚数为空,则表示å¯ä»¥é€‰æ‹©ä»»ä½•æ‰©å±•å的文件。 + // + + virtual std::string openFile(const std::string &title, + const std::string &directory, + const std::string &extensions) const; + + virtual std::vector openMultiple(const std::string &title, + const std::string &directory, + const std::string &extensions) const; + + virtual std::string saveFile(const std::string &title, + const std::string &path) const; + + virtual std::string openDirectory(const std::string &title, + const std::string &directory)const; +}; + +PLAYER_NS_END + +#endif // __PLAY_FILE_DIALOG_SERVICE_MAC_H \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.mm new file mode 100644 index 0000000000..413452bf9a --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.mm @@ -0,0 +1,174 @@ + +#include "PlayerFileDialogServiceMac.h" + +#include "glfw3.h" +#include "glfw3native.h" + +#define VALIDATE_FRAMEBUFFER { \ +NSOpenGLContext *__context = glfwGetNSGLContext(glfwGetCurrentContext()); \ +[__context makeCurrentContext]; \ +} + +PLAYER_NS_BEGIN + +std::string PlayerFileDialogServiceMac::openFile(const std::string &title, + const std::string &directory, + const std::string &extensions) const +{ + NSOpenPanel* openDlg = [NSOpenPanel openPanel]; + [openDlg setTitle:[NSString stringWithUTF8String:title.c_str()]]; + [openDlg setCanChooseDirectories:NO]; + [openDlg setCanChooseFiles:YES]; + [openDlg setCanHide:YES]; + [openDlg setCanCreateDirectories:NO]; + [openDlg setCanSelectHiddenExtension:NO]; + [openDlg setAllowsMultipleSelection:NO]; + + if (directory.length()) { + [openDlg setDirectoryURL:[NSURL fileURLWithPath:[NSString stringWithUTF8String:directory.c_str()]]]; + } + + if (extensions.length()) + { + NSMutableArray *fileTypes = [NSMutableArray array]; + + NSString *buff = [NSString stringWithUTF8String:extensions.c_str()]; + NSArray *extensionArray = [buff componentsSeparatedByString:@";"]; + + for (NSString *oneExtension in extensionArray) { + NSArray *tmpData = [oneExtension componentsSeparatedByString:@"|"]; + if ([tmpData count] > 1) + { + NSString *suffixString = [tmpData objectAtIndex:1]; + suffixString = [suffixString stringByReplacingOccurrencesOfString:@"*." withString:@""]; + [fileTypes addObjectsFromArray:[suffixString componentsSeparatedByString:@","]]; + } + } + + [openDlg setAllowedFileTypes:fileTypes]; + } + + std::string filePath; + if ([openDlg runModal] == NSFileHandlingPanelOKButton) + { + NSURL *url = [openDlg.URLs objectAtIndex:0]; + filePath = [[url path] UTF8String]; + } + + [openDlg close]; + VALIDATE_FRAMEBUFFER + return filePath; +} + +std::string PlayerFileDialogServiceMac::openDirectory( const std::string &title, + const std::string &directory) const +{ + NSOpenPanel* openDlg = [NSOpenPanel openPanel]; + [openDlg setTitle:[NSString stringWithUTF8String:title.c_str()]]; + [openDlg setCanChooseDirectories:YES]; + [openDlg setCanChooseFiles:NO]; + [openDlg setCanHide:YES]; + [openDlg setCanCreateDirectories:NO]; + [openDlg setCanSelectHiddenExtension:NO]; + [openDlg setAllowsMultipleSelection:NO]; + + if (directory.length()) { + [openDlg setDirectoryURL:[NSURL fileURLWithPath:[NSString stringWithUTF8String:directory.c_str()]]]; + } + + std::string path; + if ([openDlg runModal] == NSFileHandlingPanelOKButton) + { + NSURL *url = [openDlg.URLs objectAtIndex:0]; + path = [[url path] UTF8String]; + } + + [openDlg close]; + VALIDATE_FRAMEBUFFER + return path; +} + +std::vector PlayerFileDialogServiceMac::openMultiple( const std::string &title, + const std::string &directory, + const std::string &extensions) const +{ + NSOpenPanel* openDlg = [NSOpenPanel openPanel]; + [openDlg setTitle:[NSString stringWithUTF8String:title.c_str()]]; + [openDlg setCanChooseDirectories:YES]; + [openDlg setCanChooseFiles:YES]; + [openDlg setCanHide:YES]; + [openDlg setCanCreateDirectories:NO]; + [openDlg setCanSelectHiddenExtension:NO]; + [openDlg setAllowsMultipleSelection:YES]; + + if (directory.length()) { + [openDlg setDirectoryURL:[NSURL fileURLWithPath:[NSString stringWithUTF8String:directory.c_str()]]]; + } + + if (extensions.length()) + { + NSMutableArray *fileTypes = [NSMutableArray array]; + + NSString *buff = [NSString stringWithUTF8String:extensions.c_str()]; + NSArray *extensionArray = [buff componentsSeparatedByString:@";"]; + + for (NSString *oneExtension in extensionArray) { + NSArray *tmpData = [oneExtension componentsSeparatedByString:@"|"]; + if ([tmpData count] > 1) + { + NSString *suffixString = [tmpData objectAtIndex:1]; + suffixString = [suffixString stringByReplacingOccurrencesOfString:@"*." withString:@""]; + [fileTypes addObjectsFromArray:[suffixString componentsSeparatedByString:@","]]; + } + } + + [openDlg setAllowedFileTypes:fileTypes]; + } + + std::vector pathes; + if ([openDlg runModal] == NSFileHandlingPanelOKButton) + { + for (NSURL *url in openDlg.URLs) { + pathes.push_back([[url path] UTF8String]); + } + } + + [openDlg close]; + VALIDATE_FRAMEBUFFER + return pathes; +} + +std::string PlayerFileDialogServiceMac::saveFile(const std::string &title, + const std::string &path) const +{ + NSSavePanel* saveDlg = [NSSavePanel savePanel]; + [saveDlg setTitle:[NSString stringWithUTF8String:title.c_str()]]; + [saveDlg setCanHide:YES]; + [saveDlg setCanCreateDirectories:NO]; + [saveDlg setCanSelectHiddenExtension:NO]; + + + // set directory + NSString *tempPath = [NSString stringWithUTF8String:path.c_str()]; + NSString *directory = [tempPath stringByDeletingLastPathComponent]; + if (directory) + { + [saveDlg setDirectoryURL:[NSURL fileURLWithPath:directory]]; + } + + // set filename + [saveDlg setNameFieldStringValue:[tempPath lastPathComponent]]; + + std::string filePath; + if ([saveDlg runModal] == NSFileHandlingPanelOKButton) + { + NSURL *url = saveDlg.URL; + filePath = [[url path] UTF8String]; + } + + [saveDlg close]; + VALIDATE_FRAMEBUFFER + return filePath; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMac.h new file mode 100644 index 0000000000..971ada3630 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMac.h @@ -0,0 +1,52 @@ + +#ifndef __PLAYER_MAC_H_ +#define __PLAYER_MAC_H_ + +#include "PlayerProtocol.h" + +#include "PlayerEditBoxServiceMac.h" +#include "PlayerFileDialogServiceMac.h" +#include "PlayerMenuServiceMac.h" +#include "PlayerMessageBoxServiceMac.h" +#include "PlayerTaskServiceMac.h" + +#include "PlayerUtils.h" + +#include "ProjectConfig/ProjectConfig.h" +PLAYER_NS_BEGIN + +class PlayerMac : public PlayerProtocol +{ +public: + static PlayerMac *create(); + virtual ~PlayerMac(); + + virtual PlayerFileDialogServiceProtocol *getFileDialogService(); + virtual PlayerMessageBoxServiceProtocol *getMessageBoxService(); + virtual PlayerMenuServiceProtocol *getMenuService(); + virtual PlayerEditBoxServiceProtocol *getEditBoxService(); + virtual PlayerTaskServiceProtocol *getTaskService(); + + void quit(); + void relaunch(); + void openNewPlayer(); + void openNewPlayerWithProjectConfig(const ProjectConfig& config); + void openProjectWithProjectConfig(const ProjectConfig& config); + + void setController(id controller); + int getPositionX(); + int getPositionY(); +protected: + PlayerMac(); + + PlayerMenuServiceMac *_menuService; + PlayerMessageBoxServiceMac *_messageBoxService; + PlayerFileDialogServiceMac *_fileDialogService; + PlayerEditBoxServiceMac *_editBoxService; + PlayerTaskServiceMac *_taskService; + id _appController; +}; + +PLAYER_NS_END + +#endif // __PLAYER_MAC_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMac.mm new file mode 100644 index 0000000000..7bebdfeb04 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMac.mm @@ -0,0 +1,135 @@ + + +#include "PlayerMac.h" + + +PLAYER_NS_BEGIN +using namespace cocos2d; + +PlayerMac* PlayerMac::create() +{ + return new PlayerMac(); +} + + +PlayerMac::PlayerMac() +: PlayerProtocol() +, _fileDialogService(nullptr) +, _messageBoxService(nullptr) +, _menuService(nullptr) +, _editBoxService(nullptr) +, _appController(nullptr) +, _taskService(nullptr) +{ +} + + +PlayerMac::~PlayerMac() +{ + CC_SAFE_DELETE(_fileDialogService); + CC_SAFE_DELETE(_fileDialogService); + CC_SAFE_DELETE(_messageBoxService); + CC_SAFE_DELETE(_menuService); + CC_SAFE_DELETE(_editBoxService); + CC_SAFE_DELETE(_taskService); +} + +PlayerFileDialogServiceProtocol *PlayerMac::getFileDialogService() +{ + if (!_fileDialogService) + { + _fileDialogService = new PlayerFileDialogServiceMac(); + } + return _fileDialogService; +} + +PlayerMessageBoxServiceProtocol *PlayerMac::getMessageBoxService() +{ + if (!_messageBoxService) + { + _messageBoxService = new PlayerMessageBoxServiceMac(); + } + return _messageBoxService; +} + +PlayerMenuServiceProtocol *PlayerMac::getMenuService() +{ + if (!_menuService) + { + _menuService = new PlayerMenuServiceMac(); + } + return _menuService; +} + +PlayerEditBoxServiceProtocol *PlayerMac::getEditBoxService() +{ + if (!_editBoxService) + { + _editBoxService = new PlayerEditBoxServiceMac(); + } + return _editBoxService; +} + +PlayerTaskServiceProtocol *PlayerMac::getTaskService() +{ + + if (!_taskService) + { + _taskService = new PlayerTaskServiceMac(); + } + return _taskService; +} + +void PlayerMac::quit() +{ + cocos2d::Director::getInstance()->end(); +} + +void PlayerMac::relaunch() +{ + if (_appController && [_appController respondsToSelector:NSSelectorFromString(@"relaunch")]) + { + [_appController performSelector:NSSelectorFromString(@"relaunch")]; + } +} + +void PlayerMac::openNewPlayer() +{ +} + +void PlayerMac::openNewPlayerWithProjectConfig(const ProjectConfig& config) +{ + if (_appController && [_appController respondsToSelector:NSSelectorFromString(@"launch:")]) + { + NSString *commandLine = [NSString stringWithCString:config.makeCommandLine().c_str() + encoding:NSUTF8StringEncoding]; + NSArray *arguments = [NSMutableArray arrayWithArray:[commandLine componentsSeparatedByString:@" "]]; + + [_appController performSelector:NSSelectorFromString(@"launch:") withObject:arguments]; + } +} + +void PlayerMac::openProjectWithProjectConfig(const ProjectConfig& config) +{ + this->openNewPlayerWithProjectConfig(config); + this->quit(); +} + +void PlayerMac::setController(id controller) +{ + _appController = controller; +} + +int PlayerMac::getPositionX() +{ + NSWindow *window = dynamic_cast(Director::getInstance()->getOpenGLView())->getCocoaWindow(); + return window.frame.origin.x; +} + +int PlayerMac::getPositionY() +{ + NSWindow *window = dynamic_cast(Director::getInstance()->getOpenGLView())->getCocoaWindow(); + return window.frame.origin.y; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.h new file mode 100644 index 0000000000..228b4caf92 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.h @@ -0,0 +1,78 @@ + +#ifndef __PLAYER_MENU_SERVICE_MAC_H_ +#define __PLAYER_MENU_SERVICE_MAC_H_ + +#include + +#include "cocos2d.h" +#include "PlayerMacros.h" +#include "PlayerMenuServiceProtocol.h" + +// +// Menu item Helper +// + +PLAYER_NS_BEGIN +class PlayerMenuItemMac; +PLAYER_NS_END + +@interface NNMenuItem : NSMenuItem +@property (nonatomic) int scriptHandler; +@property (nonatomic) const player::PlayerMenuItemMac *macMenuItem; + ++(id) createMenuItem:(const player::PlayerMenuItemMac *) macMenuItem; +@end + + +// +// PlayerMenuItemMac +// + +PLAYER_NS_BEGIN + +class PlayerMenuItemMac : public PlayerMenuItem +{ +public: + static PlayerMenuItemMac *create(const std::string &menuId, const std::string &title); + virtual ~PlayerMenuItemMac(); + + virtual void setTitle(const std::string &title); + virtual void setEnabled(bool enabled); + virtual void setChecked(bool checked); + virtual void setShortcut(const std::string &shortcut); + +protected: + PlayerMenuItemMac(); + + PlayerMenuItemMac *_parent; + NNMenuItem *_menuItem; + NSMenu *_menu; + cocos2d::Vector _children; + + friend class PlayerMenuServiceMac; +}; + +class PlayerMenuServiceMac : public PlayerMenuServiceProtocol +{ +public: + PlayerMenuServiceMac(); + virtual ~PlayerMenuServiceMac(); + + virtual PlayerMenuItem *addItem(const std::string &menuId, const std::string &title, const std::string &parentId, int order = MAX_ORDER); + virtual PlayerMenuItem *addItem(const std::string &menuId, const std::string &title); + virtual PlayerMenuItem *getItem(const std::string &menuId); + virtual bool removeItem(const std::string &menuId); + virtual void setMenuBarEnabled(bool enabled); + +private: + bool removeItemInternal(const std::string &menuId, bool isUpdateChildrenOrder); + void updateChildrenOrder(PlayerMenuItemMac *parent); + +private: + PlayerMenuItemMac _root; + std::unordered_map _items; +}; + +PLAYER_NS_END + +#endif // __PLAYER_MENU_SERVICE_MAC_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.mm new file mode 100644 index 0000000000..882198a28a --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.mm @@ -0,0 +1,370 @@ + +#include "PlayerMenuServiceMac.h" +#include "PlayerUtils.h" + +#include "CCLuaEngine.h" +#include "cocos2d.h" +#include "AppEvent.h" + +USING_NS_CC; + +/////////////////////////////////////// menu helper ////////////////////////////////////////////// +static bool __G_IS_MENUBAR_ENABLED__ = true; // WTF + +@implementation NNMenuItem + + ++(id) createMenuItem:(const player::PlayerMenuItemMac *) macMenuItem +{ + if (macMenuItem->getTitle().compare("-") == 0) + { + return [NSMenuItem separatorItem]; + } + else + { + return [[[NNMenuItem alloc] initWithMenuItem:macMenuItem] autorelease]; + } + + return NULL; +} + +-(id) initWithMenuItem:(const player::PlayerMenuItemMac *) menuItem +{ + NSString *title = [NSString stringWithUTF8String:menuItem->getTitle().c_str()]; + title = [title stringByReplacingOccurrencesOfString:@"&" withString:@""]; + if ([super initWithTitle:title action:@selector(onClicked:) keyEquivalent:@""]) + { + self.target = self; + } + + self.macMenuItem = menuItem; + + return self; +} + +-(void) setShortcut:(std::string) shortcut +{ + std::vector fields = player::splitString(shortcut, std::string("+")); + + NSUInteger mask = [self keyEquivalentModifierMask]; + for (auto cut : fields) + { + if (cut == kPlayerSuperModifyKey) + { + mask |= NSCommandKeyMask; + } + else if (cut == kPlayerShiftModifyKey) + { + mask |= NSShiftKeyMask; + } + else if (cut == kPlayerCtrlModifyKey) + { + mask |= NSControlKeyMask; + } + else if (cut == kPlayerAltModifyKey) + { + mask |= NSAlternateKeyMask; + } + else + { + if (cut.length() == 1) + { + [self setKeyEquivalent:[NSString stringWithUTF8String:cut.c_str()]]; + } + else + { + CCLOG("[modifyItem] shortcut (%s) is invalid.", shortcut.c_str()); + } + } + } + + if (mask != 0) + { + [self setKeyEquivalentModifierMask:mask]; + } +} + +-(void) onClicked:(id)sender +{ + AppEvent event(kAppEventName, APP_EVENT_MENU); + + std::stringstream buf; + buf << "{\"data\":\"" << self.macMenuItem->getMenuId().c_str() << "\""; + buf << ",\"name\":" << "\"menuClicked\"" << "}"; + event.setDataString(buf.str()); + event.setUserData((void*)self.macMenuItem); + Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); +} + +-(BOOL) validateMenuItem:(NSMenuItem *)menuItem +{ + return __G_IS_MENUBAR_ENABLED__; +} + +@end + + + +PLAYER_NS_BEGIN + +// + +PlayerMenuItemMac *PlayerMenuItemMac::create(const std::string &menuId, const std::string &title) +{ + PlayerMenuItemMac *item = new PlayerMenuItemMac(); + item->_menuId = menuId; + item->_title = title; + item->autorelease(); + return item; +} + +PlayerMenuItemMac::PlayerMenuItemMac() + : _parent(nullptr) + , _menuItem(nullptr) + , _menu(nullptr) +{ +} + +PlayerMenuItemMac::~PlayerMenuItemMac() +{ + CC_SAFE_RELEASE(_parent); + if (_menuItem) + { + [_parent->_menu removeItem:_menuItem]; + } + + CCLOG("PlayerMenuItemWin::~PlayerMenuItemWin() - %s", _menuId.c_str()); +} + +void PlayerMenuItemMac::setTitle(const std::string &title) +{ + if (title.length() == 0) + { + CCLOG("MenuServiceWin::setTitle() - can not set menu title to empty, menu id (%s)", _menuId.c_str()); + return; + } + + _menuItem.title = [NSString stringWithUTF8String:title.c_str()]; + if (_menu) + { + _menu.title = _menuItem.title; + } + + _title = title; +} + +void PlayerMenuItemMac::setEnabled(bool enabled) +{ + _isEnabled = enabled; + + if (enabled) + { + [_menuItem setAction:@selector(onClicked:)]; + } + else + { + [_menuItem setAction:nil]; + } +} + +void PlayerMenuItemMac::setChecked(bool checked) +{ + _isChecked = checked; + [_menuItem setState:checked ? NSOnState : NSOffState]; +} + +void PlayerMenuItemMac::setShortcut(const std::string &shortcut) +{ + _shortcut = shortcut; + [_menuItem setShortcut:shortcut]; +} + + + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +PlayerMenuServiceMac::PlayerMenuServiceMac() +{ + // @TODO: build menu with **EDIT** menu + + NSApplication *thisApp = [NSApplication sharedApplication]; + _root._menu = [thisApp mainMenu]; +} + +PlayerMenuServiceMac::~PlayerMenuServiceMac() +{ + log("~PlayerMenuServiceMac"); + _items.clear(); +} + +PlayerMenuItem* PlayerMenuServiceMac::addItem(const std::string &menuId, const std::string &title, + const std::string &parentId, int order) +{ + if (menuId.length() == 0 || title.length() == 0) + { + CCLOG("PlayerMenuServiceMac::addItem() - menuId and title must is non-empty"); + return nullptr; + } + + // check menu id is exists + if (_items.find(menuId) != _items.end()) + { + CCLOG("PlayerMenuServiceMac::addItem() - menu id (%s) is exists", menuId.c_str()); + return nullptr; + } + + // set parent + PlayerMenuItemMac *parent = &_root; + if (parentId.length()) + { + // query parent menu + auto it = _items.find(parentId); + if (it != _items.end()) + { + parent = it->second; + } + } + + if (!parent->_menu) + { + NSMenu *nsmenu = [[NSMenu alloc] initWithTitle:[parent->_menuItem title]]; + [parent->_parent->_menu setSubmenu:nsmenu forItem:parent->_menuItem]; + parent->_menu = nsmenu; + parent->_isGroup = true; + } + + + // create new menu item + PlayerMenuItemMac *item = PlayerMenuItemMac::create(menuId, title); + item->_parent = parent; + item->_parent->retain(); + + // check new menu item position + int childSize = (int) [parent->_menu itemArray].count; + childSize = (int) parent->_children.size(); + if (order > childSize) + { + order = childSize; + } + else if (order < 0) + { + order = 0; + } + + + // add menu item to menu bar + int newIndex = order; + if (parent == &_root) + { + newIndex += 1; + } + NNMenuItem *newItem = [NNMenuItem createMenuItem:item]; + [parent->_menu insertItem:newItem atIndex:newIndex]; + item->_menuItem = newItem; + + + // update menu state + parent->_children.insert(order, item); + _items[item->_menuId] = item; + updateChildrenOrder(parent); + + return item; +} + +PlayerMenuItem* PlayerMenuServiceMac::addItem(const std::string &menuId, const std::string &title) +{ + return addItem(menuId, title, ""); +} + +PlayerMenuItem* PlayerMenuServiceMac::getItem(const std::string &menuId) +{ + auto it = _items.find(menuId); + if (it == _items.end()) + { + CCLOG("MenuServiceWin::getItem() - Invalid menu id (%s)", menuId.c_str()); + return nullptr; + } + + return it->second; +} + +bool PlayerMenuServiceMac::removeItem(const std::string &menuId) +{ + return removeItemInternal(menuId, true);; +} + +void PlayerMenuServiceMac::setMenuBarEnabled(bool enabled) +{ + __G_IS_MENUBAR_ENABLED__ = enabled; +} + +#pragma mark - private - + +bool PlayerMenuServiceMac::removeItemInternal(const std::string &menuId, bool isUpdateChildrenOrder) +{ + auto it = _items.find(menuId); + if (it == _items.end()) + { + CCLOG("MenuServiceWin::removeItem() - Invalid menu id (%s)", menuId.c_str()); + return false; + } + + PlayerMenuItemMac *item = it->second; + if (item->_children.size() == 0) + { + // remove item from parent + bool removed = false; + auto *theChildren = &item->_parent->_children; + for (auto it = theChildren->begin(); it != theChildren->end(); ++it) + { + if ((*it)->_menuItem == item->_menuItem) + { + theChildren->erase(it); + removed = true; + break; + } + } + + if (!removed) + { + CCLOG("MenuServiceWin::removeItem() - remove menu item (%s) failed, not found command id from parent->children", item->_menuId.c_str()); + } + + // remove menu id mapping + _items.erase(menuId); + if (isUpdateChildrenOrder) + { + updateChildrenOrder(item->_parent); + } + return true; + } + else + { + // remove all children + while (item->_children.size() != 0) + { + PlayerMenuItemMac *child = *item->_children.begin(); + if (!removeItemInternal(child->_menuId.c_str(), false)) + { + break; + return false; + } + } + return removeItemInternal(menuId, true); + } + + return false; +} + +void PlayerMenuServiceMac::updateChildrenOrder(PlayerMenuItemMac *parent) +{ + auto *children = &parent->_children; + int order = 0; + for (auto it = children->begin(); it != children->end(); ++it) + { + (*it)->_order = order; + order++; + } +} + +PLAYER_NS_END \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMessageBoxServiceMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMessageBoxServiceMac.h new file mode 100644 index 0000000000..0aec41fae5 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMessageBoxServiceMac.h @@ -0,0 +1,29 @@ + +#ifndef __PLAYER_MessageBoxServiceMac_h +#define __PLAYER_MessageBoxServiceMac_h + +#include + +#include "PlayerMacros.h" +#include "PlayerMessageBoxServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerMessageBoxServiceMac : public PlayerMessageBoxServiceProtocol +{ +public: + virtual int showMessageBox(const std::string &title, + const std::string &message, + int buttonsType = BUTTONS_OK); +protected: + struct MessageBoxInfo + { + std::string title; + const int buttonId; + }; + std::vector getTitles(int buttons); +}; + +PLAYER_NS_END + +#endif // __PLAYER_MessageBoxServiceMac_h diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMessageBoxServiceMac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMessageBoxServiceMac.mm new file mode 100644 index 0000000000..fe3f77b5ad --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMessageBoxServiceMac.mm @@ -0,0 +1,58 @@ + +#include "PlayerMessageBoxServiceMac.h" + +PLAYER_NS_BEGIN + +int PlayerMessageBoxServiceMac::showMessageBox(const std::string &title, + const std::string &message, + int buttonsType) +{ + NSAlert *alert = [[NSAlert alloc] init]; + + auto titles = getTitles(buttonsType); + for (auto& title : titles) + { + [alert addButtonWithTitle:[NSString stringWithUTF8String:title.title.c_str()]]; + } + + [alert setMessageText:[NSString stringWithUTF8String:title.c_str()]]; + [alert setInformativeText:[NSString stringWithUTF8String:message.c_str()]]; + [alert setAlertStyle:NSWarningAlertStyle]; + + int index = (int)[alert runModal] - NSAlertFirstButtonReturn; + return titles.at(index).buttonId; +} + +std::vector PlayerMessageBoxServiceMac::getTitles(int buttons) +{ + std::vector titles; + + switch (buttons) { + case BUTTONS_OK: + titles.push_back({"OK", BUTTON_OK}); + break; + + case BUTTONS_OK_CANCEL: + titles.push_back({"OK", BUTTON_OK}); + titles.push_back({"Cancel", BUTTON_CANCEL}); + break; + + case BUTTONS_YES_NO: + titles.push_back({"Yes", BUTTON_YES}); + titles.push_back({"No", BUTTON_NO}); + break; + + case BUTTONS_YES_NO_CANCEL: + titles.push_back({"Yes", BUTTON_YES}); + titles.push_back({"No", BUTTON_NO}); + titles.push_back({"Cancel", BUTTON_CANCEL}); + break; + + default: + break; + } + + return titles; +} + +PLAYER_NS_END \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.h new file mode 100644 index 0000000000..9adbeeb993 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.h @@ -0,0 +1,75 @@ + +#ifndef __PLAYER_TASK_SERVICE_MAC_H_ +#define __PLAYER_TASK_SERVICE_MAC_H_ + +#include + +#include "PlayerTaskServiceProtocol.h" + +PLAYER_NS_BEGIN +class PlayerTaskMac; +PLAYER_NS_END + +@interface PlayerTaskPrivate : NSObject +{ + NSFileHandle *fileHandle; +} + +@property (assign) NSTask *buildTask; +@property (assign) BOOL isRunning; +@property (assign) int exitCode; +@property (retain) NSString *output; + +- (void) runScriptAsyn:(NSString *)absScriptPath withArguments:(NSArray *) arguments; +@end + +PLAYER_NS_BEGIN + +class PlayerTaskMac : public PlayerTask +{ +public: + static PlayerTaskMac *create(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + + virtual ~PlayerTaskMac(); + + virtual bool run(); + virtual void stop(); + virtual void runInTerminal(); + + // check task status + virtual void update(float dt); + + void appendOutput(const char *data); +protected: + PlayerTaskMac(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + + void cleanup(); + std::u16string makeCommandLine() const; + + PlayerTaskPrivate *_taskPrivate; +}; + +class PlayerTaskServiceMac : public PlayerTaskServiceProtocol +{ +public: + PlayerTaskServiceMac(); + virtual ~PlayerTaskServiceMac(); + + virtual PlayerTask *createTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + virtual PlayerTask *getTask(const std::string &name); + virtual void removeTask(const std::string &name); + +protected: + cocos2d::Map _tasks; +}; + +PLAYER_NS_END + + +#endif // __PLAYER_TASK_SERVICE_MAC_H_ \ No newline at end of file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.mm b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.mm new file mode 100644 index 0000000000..6d011ffd68 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.mm @@ -0,0 +1,241 @@ + +#include "PlayerTaskServiceMac.h" + +@implementation PlayerTaskPrivate + +-(id) init +{ + if ((self = [super init])) { + _isRunning = NO; + _exitCode = 0; + } + + return self; +} + +-(void) dealloc +{ + [_output release]; + [super dealloc]; +} + +-(void)performSelectorInBackground:(SEL)selector withObjects:(id)object, ... +{ + NSMethodSignature *signature = [self methodSignatureForSelector:selector]; + + // setup the invocation + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + invocation.target = self; + invocation.selector = selector; + + // associate the arguments + va_list objects; + va_start(objects, object); + unsigned int objectCounter = 2; + for (id obj = object; obj != nil; obj = va_arg(objects, id)) + { + [invocation setArgument:&obj atIndex:objectCounter++]; + } + va_end(objects); + + // make sure to invoke on a background queue + NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithInvocation:invocation]; + NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init]; + [backgroundQueue addOperation:operation]; +} + +- (void) runScriptAsyn:(NSString *)absScriptPath withArguments:(NSArray *) arguments +{ + _isRunning = YES; + [self performSelectorInBackground:@selector(runScriptSync:withArguments:) + withObjects:absScriptPath, arguments, nil]; +} + +- (void) runScriptSync:(NSString *)absScriptPath withArguments:(NSArray *)arguments +{ + if (!absScriptPath) + { + CCLOG("Please check your script (%s)", absScriptPath.UTF8String); + return ; + } + + _buildTask = [[NSTask alloc] init]; + [_buildTask setLaunchPath:absScriptPath]; + + if (!arguments) + { + arguments = [NSArray array]; + } + [_buildTask setArguments:arguments]; + + // + NSPipe *pipe; + pipe = [NSPipe pipe]; + [_buildTask setStandardOutput: pipe]; + + fileHandle = [pipe fileHandleForReading]; + + // + [_buildTask launch]; + [_buildTask waitUntilExit]; + + NSData *data; + data = [fileHandle readDataToEndOfFile]; + + _output = [[NSString alloc] initWithData: data + encoding: NSUTF8StringEncoding]; + _isRunning = NO; + _exitCode = [_buildTask terminationStatus]; + + [fileHandle closeFile]; + [_buildTask release]; + _buildTask = nil; +} + +@end + +PLAYER_NS_BEGIN + +PlayerTaskMac *PlayerTaskMac::create(const std::string &name, const std::string &executePath, const std::string &commandLineArguments) +{ + PlayerTaskMac *task = new PlayerTaskMac(name, executePath, commandLineArguments); + task->autorelease(); + return task; +} + +PlayerTaskMac::PlayerTaskMac(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments) +: PlayerTask(name, executePath, commandLineArguments) +{ + _taskPrivate = [[PlayerTaskPrivate alloc] init]; +} + +PlayerTaskMac::~PlayerTaskMac() +{ + cleanup(); +} + +bool PlayerTaskMac::run() +{ + if (!isIdle()) + { + CCLOG("PlayerTaskMac::run() - task is not idle"); + return false; + } + + NSString *commandLine = [NSString stringWithCString:_commandLineArguments.c_str() + encoding:NSUTF8StringEncoding]; + [_taskPrivate runScriptAsyn:[NSString stringWithUTF8String:_executePath.data()] + withArguments:[NSMutableArray arrayWithArray:[commandLine componentsSeparatedByString:@" "]]]; + _state = STATE_RUNNING; + + cocos2d::Director::getInstance()->getScheduler()->scheduleUpdate(this, 0, false); + return true; +} + +void PlayerTaskMac::runInTerminal() +{ + NSString *s = [NSString stringWithFormat: + @"tell application \"Terminal\" to do script \"%s %s\"", _executePath.c_str(), _commandLineArguments.c_str()]; + + NSAppleScript *as = [[NSAppleScript alloc] initWithSource: s]; + [as executeAndReturnError:nil]; +} + +void PlayerTaskMac::stop() +{ + cleanup(); +} + +void PlayerTaskMac::update(float dt) +{ + _lifetime += dt; + + if (_taskPrivate.isRunning) + { + return ; + } + + cocos2d::Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); + cleanup(); +} + +void PlayerTaskMac::appendOutput(const char *data) +{ + _output.append(data); +} + +void PlayerTaskMac::cleanup() +{ + + _state = STATE_COMPLETED; + + [NSObject cancelPreviousPerformRequestsWithTarget:_taskPrivate]; + [_taskPrivate.buildTask interrupt]; + + _resultCode = _taskPrivate.exitCode; + _output.append(_taskPrivate.output.UTF8String); + + [_taskPrivate release]; + _taskPrivate = nil; + CCLOG("\nCMD: (exit code: %d) %s", _resultCode, _output.c_str()); + + cocos2d::Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(_name); +} + +std::u16string PlayerTaskMac::makeCommandLine() const +{ + std::stringstream buf; + buf << "\""; + buf << _executePath; + buf << "\" "; + buf << _commandLineArguments; + + std::u16string u16command; + cocos2d::StringUtils::UTF8ToUTF16(buf.str(), u16command); + return u16command; +} + +PlayerTaskServiceMac::PlayerTaskServiceMac() +{ +} + +PlayerTaskServiceMac::~PlayerTaskServiceMac() +{ + for (auto it = _tasks.begin(); it != _tasks.end(); ++it) + { + it->second->stop(); + } +} + +PlayerTask *PlayerTaskServiceMac::createTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments) +{ + CCASSERT(_tasks.find(name) == _tasks.end(), "Task already exists."); + PlayerTaskMac *task = PlayerTaskMac::create(name, executePath, commandLineArguments); + _tasks.insert(name, task); + return task; +} + +PlayerTask *PlayerTaskServiceMac::getTask(const std::string &name) +{ + auto it = _tasks.find(name); + return it != _tasks.end() ? it->second : nullptr; +} + +void PlayerTaskServiceMac::removeTask(const std::string &name) +{ + auto it = _tasks.find(name); + if (it != _tasks.end()) + { + if (!it->second->isCompleted()) + { + it->second->stop(); + } + _tasks.erase(it); + } +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/openudid/OpenUDIDMac.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/openudid/OpenUDIDMac.h new file mode 100644 index 0000000000..57d5d115bd --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/openudid/OpenUDIDMac.h @@ -0,0 +1,65 @@ +// +// OpenUDID.h +// openudid +// +// initiated by Yann Lechelle (cofounder @Appsfire) on 8/28/11. +// Copyright 2011 OpenUDID.org +// +// Main branches +// iOS code: https://github.com/ylechelle/OpenUDID +// + +/* + !!! IMPORTANT !!! + + IF YOU ARE GOING TO INTEGRATE OpenUDID INSIDE A (STATIC) LIBRARY, + PLEASE MAKE SURE YOU REFACTOR THE OpenUDID CLASS WITH A PREFIX OF YOUR OWN, + E.G. ACME_OpenUDID. THIS WILL AVOID CONFUSION BY DEVELOPERS WHO ARE ALSO + USING OpenUDID IN THEIR OWN CODE. + + !!! IMPORTANT !!! + +*/ + +/* + http://en.wikipedia.org/wiki/Zlib_License + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#import + +// +// Usage: +// #include "OpenUDID.h" +// NSString* openUDID = [OpenUDID value]; +// + +#define kOpenUDIDErrorNone 0 +#define kOpenUDIDErrorOptedOut 1 +#define kOpenUDIDErrorCompromised 2 + +@interface OpenUDIDMac : NSObject { +} ++ (NSString*) value; ++ (NSString*) valueWithError:(NSError**)error; ++ (void) setOptOut:(BOOL)optOutValue; + +@end diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/openudid/OpenUDIDMac.m b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/openudid/OpenUDIDMac.m new file mode 100644 index 0000000000..9e9026cabb --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/openudid/OpenUDIDMac.m @@ -0,0 +1,383 @@ +// +// OpenUDIDMac.m +// openudid +// +// initiated by Yann Lechelle (cofounder @Appsfire) on 8/28/11. +// Copyright 2011 OpenUDID.org +// +// Initiators/root branches +// iOS code: https://github.com/ylechelle/OpenUDID +// Android code: https://github.com/vieux/OpenUDID +// +// Contributors: +// https://github.com/ylechelle/OpenUDID/contributors +// + +/* + http://en.wikipedia.org/wiki/Zlib_License + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#if __has_feature(objc_arc) +#error This file uses the classic non-ARC retain/release model; hints below... + // to selectively compile this file as non-ARC, do as follows: + // https://img.skitch.com/20120717-g3ag5h9a6ehkgpmpjiuen3qpwp.png +#endif + +#import "OpenUDIDMac.h" +#import // Need to import for CC_MD5 access +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR +#import +#import +#else +#import +#endif + +#define OpenUDIDLog(fmt, ...) +//#define OpenUDIDLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); +//#define OpenUDIDLog(fmt, ...) NSLog((@"[Line %d] " fmt), __LINE__, ##__VA_ARGS__); + +static NSString * kOpenUDIDSessionCache = nil; +static NSString * const kOpenUDIDKey = @"OpenUDID"; +static NSString * const kOpenUDIDSlotKey = @"OpenUDID_slot"; +static NSString * const kOpenUDIDAppUIDKey = @"OpenUDID_appUID"; +static NSString * const kOpenUDIDTSKey = @"OpenUDID_createdTS"; +static NSString * const kOpenUDIDOOTSKey = @"OpenUDID_optOutTS"; +static NSString * const kOpenUDIDDomain = @"org.OpenUDID"; +static NSString * const kOpenUDIDSlotPBPrefix = @"org.OpenUDID.slot."; +static int const kOpenUDIDRedundancySlots = 100; + +@interface OpenUDIDMac (Private) ++ (void) _setDict:(id)dict forPasteboard:(id)pboard; ++ (NSMutableDictionary*) _getDictFromPasteboard:(id)pboard; ++ (NSString*) _generateFreshOpenUDID; +@end + +@implementation OpenUDIDMac + +// Archive a NSDictionary inside a pasteboard of a given type +// Convenience method to support iOS & Mac OS X +// ++ (void) _setDict:(id)dict forPasteboard:(id)pboard { +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + [pboard setData:[NSKeyedArchiver archivedDataWithRootObject:dict] forPasteboardType:kOpenUDIDDomain]; +#else + [pboard setData:[NSKeyedArchiver archivedDataWithRootObject:dict] forType:kOpenUDIDDomain]; +#endif +} + +// Retrieve an NSDictionary from a pasteboard of a given type +// Convenience method to support iOS & Mac OS X +// ++ (NSMutableDictionary*) _getDictFromPasteboard:(id)pboard { +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + id item = [pboard dataForPasteboardType:kOpenUDIDDomain]; +#else + id item = [pboard dataForType:kOpenUDIDDomain]; +#endif + if (item) { + @try{ + item = [NSKeyedUnarchiver unarchiveObjectWithData:item]; + } @catch(NSException* e) { + OpenUDIDLog(@"Unable to unarchive item %@ on pasteboard!", [pboard name]); + item = nil; + } + } + + // return an instance of a MutableDictionary + return [NSMutableDictionary dictionaryWithDictionary:(item == nil || [item isKindOfClass:[NSDictionary class]]) ? item : nil]; +} + +// Private method to create and return a new OpenUDID +// Theoretically, this function is called once ever per application when calling [OpenUDID value] for the first time. +// After that, the caching/pasteboard/redundancy mechanism inside [OpenUDID value] returns a persistent and cross application OpenUDID +// ++ (NSString*) _generateFreshOpenUDID { + + NSString* _openUDID = nil; + + // August 2011: One day, this may no longer be allowed in iOS. When that is, just comment this line out. + // March 25th 2012: this day has come, let's remove this "outlawed" call... +#if TARGET_OS_IPHONE +// if([UIDevice instancesRespondToSelector:@selector(uniqueIdentifier)]){ +// _openUDID = [[UIDevice currentDevice] uniqueIdentifier]; +// } +#endif + // Next we generate a UUID. + // UUIDs (Universally Unique Identifiers), also known as GUIDs (Globally Unique Identifiers) or IIDs + // (Interface Identifiers), are 128-bit values guaranteed to be unique. A UUID is made unique over + // both space and time by combining a value unique to the computer on which it was generated—usually the + // Ethernet hardware address—and a value representing the number of 100-nanosecond intervals since + // October 15, 1582 at 00:00:00. + // We then hash this UUID with md5 to get 32 bytes, and then add 4 extra random bytes + // Collision is possible of course, but unlikely and suitable for most industry needs (e.g. aggregate tracking) + // + if (_openUDID==nil) { + CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault); + CFStringRef cfstring = CFUUIDCreateString(kCFAllocatorDefault, uuid); + const char *cStr = CFStringGetCStringPtr(cfstring,CFStringGetFastestEncoding(cfstring)); + unsigned char result[16]; + CC_MD5( cStr, (unsigned int)strlen(cStr), result ); + CFRelease(uuid); + + _openUDID = [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%08x", + result[0], result[1], result[2], result[3], + result[4], result[5], result[6], result[7], + result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15], + (unsigned int)(arc4random() % NSUIntegerMax)]; + } + + // Call to other developers in the Open Source community: + // + // feel free to suggest better or alternative "UDID" generation code above. + // NOTE that the goal is NOT to find a better hash method, but rather, find a decentralized (i.e. not web-based) + // 160 bits / 20 bytes random string generator with the fewest possible collisions. + // + + return _openUDID; +} + + +// Main public method that returns the OpenUDID +// This method will generate and store the OpenUDID if it doesn't exist, typically the first time it is called +// It will return the null udid (forty zeros) if the user has somehow opted this app out (this is subject to 3rd party implementation) +// Otherwise, it will register the current app and return the OpenUDID +// ++ (NSString*) value { + return [OpenUDIDMac valueWithError:nil]; +} + ++ (NSString*) valueWithError:(NSError **)error { + + if (kOpenUDIDSessionCache!=nil) { + if (error!=nil) + *error = [NSError errorWithDomain:kOpenUDIDDomain + code:kOpenUDIDErrorNone + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"OpenUDID in cache from first call",@"description", nil]]; + return kOpenUDIDSessionCache; + } + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // The AppUID will uniquely identify this app within the pastebins + // + NSString * appUID = (NSString *) [defaults objectForKey:kOpenUDIDAppUIDKey]; + if(appUID == nil) + { + // generate a new uuid and store it in user defaults + CFUUIDRef uuid = CFUUIDCreate(NULL); + appUID = (NSString *) CFUUIDCreateString(NULL, uuid); + CFRelease(uuid); + } + + NSString* openUDID = nil; + NSString* myRedundancySlotPBid = nil; + NSDate* optedOutDate = nil; + BOOL optedOut = NO; + BOOL saveLocalDictToDefaults = NO; + BOOL isCompromised = NO; + + // Do we have a local copy of the OpenUDID dictionary? + // This local copy contains a copy of the openUDID, myRedundancySlotPBid (and unused in this block, the local bundleid, and the timestamp) + // + id localDict = [defaults objectForKey:kOpenUDIDKey]; + if ([localDict isKindOfClass:[NSDictionary class]]) { + localDict = [NSMutableDictionary dictionaryWithDictionary:localDict]; // we might need to set/overwrite the redundancy slot + openUDID = [localDict objectForKey:kOpenUDIDKey]; + myRedundancySlotPBid = [localDict objectForKey:kOpenUDIDSlotKey]; + optedOutDate = [localDict objectForKey:kOpenUDIDOOTSKey]; + optedOut = optedOutDate!=nil; + OpenUDIDLog(@"localDict = %@",localDict); + } + + // Here we go through a sequence of slots, each of which being a UIPasteboard created by each participating app + // The idea behind this is to both multiple and redundant representations of OpenUDIDs, as well as serve as placeholder for potential opt-out + // + NSString* availableSlotPBid = nil; + NSMutableDictionary* frequencyDict = [NSMutableDictionary dictionaryWithCapacity:kOpenUDIDRedundancySlots]; + for (int n=0; n0)? [arrayOfUDIDs lastObject] : nil; + OpenUDIDLog(@"Freq Dict = %@\nMost reliable %@",frequencyDict,mostReliableOpenUDID); + + // if openUDID was not retrieved from the local preferences, then let's try to get it from the frequency dictionary above + // + if (openUDID==nil) { + if (mostReliableOpenUDID==nil) { + // this is the case where this app instance is likely to be the first one to use OpenUDID on this device + // we create the OpenUDID, legacy or semi-random (i.e. most certainly unique) + // + openUDID = [OpenUDIDMac _generateFreshOpenUDID]; + } else { + // or we leverage the OpenUDID shared by other apps that have already gone through the process + // + openUDID = mostReliableOpenUDID; + } + // then we create a local representation + // + if (localDict==nil) { + localDict = [NSMutableDictionary dictionaryWithCapacity:4]; + [localDict setObject:openUDID forKey:kOpenUDIDKey]; + [localDict setObject:appUID forKey:kOpenUDIDAppUIDKey]; + [localDict setObject:[NSDate date] forKey:kOpenUDIDTSKey]; + if (optedOut) [localDict setObject:optedOutDate forKey:kOpenUDIDTSKey]; + saveLocalDictToDefaults = YES; + } + } + else { + // Sanity/tampering check + // + if (mostReliableOpenUDID!=nil && ![mostReliableOpenUDID isEqualToString:openUDID]) + isCompromised = YES; + } + + // Here we store in the available PB slot, if applicable + // + OpenUDIDLog(@"Available Slot %@ Existing Slot %@",availableSlotPBid,myRedundancySlotPBid); + if (availableSlotPBid!=nil && (myRedundancySlotPBid==nil || [availableSlotPBid isEqualToString:myRedundancySlotPBid])) { +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + UIPasteboard* slotPB = [UIPasteboard pasteboardWithName:availableSlotPBid create:YES]; + [slotPB setPersistent:YES]; +#else + NSPasteboard* slotPB = [NSPasteboard pasteboardWithName:availableSlotPBid]; +#endif + + // save slotPBid to the defaults, and remember to save later + // + if (localDict) { + [localDict setObject:availableSlotPBid forKey:kOpenUDIDSlotKey]; + saveLocalDictToDefaults = YES; + } + + // Save the local dictionary to the corresponding UIPasteboard slot + // + if (openUDID && localDict) + [OpenUDIDMac _setDict:localDict forPasteboard:slotPB]; + } + + // Save the dictionary locally if applicable + // + if (localDict && saveLocalDictToDefaults) + [defaults setObject:localDict forKey:kOpenUDIDKey]; + + // If the UIPasteboard external representation marks this app as opted-out, then to respect privacy, we return the ZERO OpenUDID, a sequence of 40 zeros... + // This is a *new* case that developers have to deal with. Unlikely, statistically low, but still. + // To circumvent this and maintain good tracking (conversion ratios, etc.), developers are invited to calculate how many of their users have opted-out from the full set of users. + // This ratio will let them extrapolate convertion ratios more accurately. + // + if (optedOut) { + if (error!=nil) *error = [NSError errorWithDomain:kOpenUDIDDomain + code:kOpenUDIDErrorOptedOut + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Application with unique id %@ is opted-out from OpenUDID as of %@",appUID,optedOutDate],@"description", nil]]; + + kOpenUDIDSessionCache = [[NSString stringWithFormat:@"%040x",0] retain]; + return kOpenUDIDSessionCache; + } + + // return the well earned openUDID! + // + if (error!=nil) { + if (isCompromised) + *error = [NSError errorWithDomain:kOpenUDIDDomain + code:kOpenUDIDErrorCompromised + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Found a discrepancy between stored OpenUDID (reliable) and redundant copies; one of the apps on the device is most likely corrupting the OpenUDID protocol",@"description", nil]]; + else + *error = [NSError errorWithDomain:kOpenUDIDDomain + code:kOpenUDIDErrorNone + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"OpenUDID succesfully retrieved",@"description", nil]]; + } + kOpenUDIDSessionCache = [openUDID retain]; + return kOpenUDIDSessionCache; +} + ++ (void) setOptOut:(BOOL)optOutValue { + + // init call + [OpenUDIDMac value]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // load the dictionary from local cache or create one + id dict = [defaults objectForKey:kOpenUDIDKey]; + if ([dict isKindOfClass:[NSDictionary class]]) { + dict = [NSMutableDictionary dictionaryWithDictionary:dict]; + } else { + dict = [NSMutableDictionary dictionaryWithCapacity:2]; + } + + // set the opt-out date or remove key, according to parameter + if (optOutValue) + [dict setObject:[NSDate date] forKey:kOpenUDIDOOTSKey]; + else + [dict removeObjectForKey:kOpenUDIDOOTSKey]; + + // store the dictionary locally + [defaults setObject:dict forKey:kOpenUDIDKey]; + + OpenUDIDLog(@"Local dict after opt-out = %@",dict); + + // reset memory cache + kOpenUDIDSessionCache = nil; + +} + +@end diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/zh-Hans.lproj/MainMenu.xib b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/zh-Hans.lproj/MainMenu.xib new file mode 100644 index 0000000000..8b6ba8420f --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/zh-Hans.lproj/MainMenu.xib @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj index 0d9aafbd37..ddb4399b40 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj @@ -68,7 +68,7 @@ - $(ProjectDir)..\Classes;$(ProjectDir)..\Classes\runtime;$(ProjectDir)..\Classes\protobuf-lite;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) + $(ProjectDir)..\Classes;$(ProjectDir)..\Classes\runtime;$(ProjectDir)..\Classes\service;$(ProjectDir)..\Classes\protobuf-lite;$(EngineRoot)external\win32-specific\zlib\include;$(EngineRoot)cocos\scripting\lua-bindings\auto;$(EngineRoot)cocos\scripting\lua-bindings\manual;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\lua\lua;$(EngineRoot)external\lua\tolua;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)external\curl\include\win32;$(EngineRoot)extensions;$(EngineRoot);%(AdditionalIncludeDirectories) Level3 @@ -119,7 +119,8 @@ - xcopy /Y /Q "$(OutDir)*.dll" "$(ProjectDir)..\..\..\runtime\win32\" + xcopy /Y /Q "$(OutDir)*.dll" "$(ProjectDir)..\..\..\runtime\win32\" +xcopy /Y /Q "$(ProjectDir)..\Classes\lang" "$(ProjectDir)..\..\..\runtime\win32\" @@ -164,24 +165,25 @@ - if exist "$(LocalDebuggerWorkingDirectory)" rd /s /q "$(LocalDebuggerWorkingDirectory)" -mkdir "$(LocalDebuggerWorkingDirectory)" -mkdir "$(LocalDebuggerWorkingDirectory)\src" -mkdir "$(LocalDebuggerWorkingDirectory)\res" -xcopy "$(ProjectDir)..\..\..\src" "$(LocalDebuggerWorkingDirectory)\src" /e /Y -xcopy "$(ProjectDir)..\..\..\res" "$(LocalDebuggerWorkingDirectory)\res" /e /Y -copy "$(ProjectDir)..\..\..\config.json" "$(LocalDebuggerWorkingDirectory)\config.json" /Y - + if not exist "$(LocalDebuggerWorkingDirectory)" mkdir "$(LocalDebuggerWorkingDirectory)" copy files + + xcopy /Y /Q "$(OutDir)*.dll" "$(ProjectDir)..\..\..\runtime\win32\" +xcopy /Y /Q "$(ProjectDir)..\Classes\lang" "$(ProjectDir)..\..\..\runtime\win32\" + + + + + @@ -210,14 +212,37 @@ copy "$(ProjectDir)..\..\..\config.json" "$(LocalDebuggerWorkingDirectory)\confi + + + + + + + + + + + + + - + + + + + + + + + + + @@ -241,10 +266,25 @@ copy "$(ProjectDir)..\..\..\config.json" "$(LocalDebuggerWorkingDirectory)\confi + + + + + + + + - + + + + + + + + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj.filters b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj.filters index bae1cfc2f4..e27b524f4d 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj.filters +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/HelloLua.vcxproj.filters @@ -16,6 +16,18 @@ {28edb895-7c19-408b-abd6-130196087d96} + + {b0ffeea4-e5fa-483a-8be4-c26a9ed47c60} + + + {e2010b29-c067-4846-8f28-667d95056987} + + + {6a6237c1-312d-4c66-82b3-b0de869920c8} + + + {9d6fbab4-6525-4c43-9438-9d3923429d52} + @@ -24,9 +36,6 @@ win32 - - win32 - Classes @@ -118,6 +127,81 @@ Classes\runtime + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\network + + + Classes\network + + + Classes\ProjectConfig + + + Classes\ProjectConfig + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + @@ -126,9 +210,6 @@ win32 - - win32 - win32 @@ -207,6 +288,63 @@ Classes\runtime + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\service + + + Classes\network + + + Classes\ProjectConfig + + + Classes\ProjectConfig + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + + + win32\service + diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/Runtime_win32.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/Runtime_win32.cpp index cb2671d0c4..aa06b86d29 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/Runtime_win32.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/Runtime_win32.cpp @@ -6,6 +6,7 @@ #include #include "cocos2d.h" +#include "ConfigParser.h" using namespace std; string getIPAddress() @@ -15,6 +16,13 @@ string getIPAddress() char *ip=nullptr; PHOSTENT hostinfo; + // customized by user + auto &bindAddress = ConfigParser::getInstance()->getBindAddress(); + if (!bindAddress.empty()) + { + return bindAddress; + } + if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 ) { if( gethostname ( name, sizeof(name)) == 0) diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.cpp deleted file mode 100644 index 8b6ffb025e..0000000000 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.cpp +++ /dev/null @@ -1,369 +0,0 @@ -/**************************************************************************** -Copyright (c) 2013 cocos2d-x.org - -http://www.cocos2d-x.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -****************************************************************************/ - -#include "SimulatorWindow.h" - -#include "cocos2d.h" -#include "resource.h" -#include "runtime/Runtime.h" -#include "ConfigParser.h" - -#include -#include -using namespace std; -using namespace cocos2d; - - -WNDPROC g_oldProc=NULL; -bool g_landscape=false; -bool g_windTop = false; -CCSize g_screenSize; -GLView* g_eglView=NULL; -INT_PTR CALLBACK AboutDialogCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - - -void createViewMenu() -{ - HMENU hSysMenu = GetSystemMenu(g_eglView->getWin32Window(), FALSE); - HMENU viewMenu = GetSubMenu(hSysMenu, 8); - for (int i = ConfigParser::getInstance()->getScreenSizeCount() - 1; i >= 0; --i) - { - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(i); - wstring menuName; - menuName.assign(size.title.begin(), size.title.end()); - - MENUITEMINFO item; - ZeroMemory(&item, sizeof(item)); - item.cbSize = sizeof(item); - item.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING; - item.fType = MFT_STRING; - item.wID = ID_VIEW_SIZE + i; - item.dwTypeData = (LPTSTR)menuName.c_str(); - item.cch = menuName.length(); - - InsertMenuItem(viewMenu, 0, TRUE, &item); - } -} - -void updateMenu() -{ - HMENU hSysMenu = GetSystemMenu(g_eglView->getWin32Window(), FALSE); - HMENU viewMenu = GetSubMenu(hSysMenu, 8); - HMENU viewControl = GetSubMenu(hSysMenu, 9); - - if (g_landscape) - { - CheckMenuItem(viewMenu, ID_VIEW_PORTRAIT, MF_BYCOMMAND | MF_UNCHECKED); - CheckMenuItem(viewMenu, ID_VIEW_LANDSCAPE, MF_BYCOMMAND | MF_CHECKED); - } - else - { - CheckMenuItem(viewMenu, ID_VIEW_PORTRAIT, MF_BYCOMMAND | MF_CHECKED); - CheckMenuItem(viewMenu, ID_VIEW_LANDSCAPE, MF_BYCOMMAND | MF_UNCHECKED); - } - - if (g_windTop) - { - ::SetWindowPos(g_eglView->getWin32Window(),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); - CheckMenuItem(viewControl, ID_CONTROL_TOP, MF_BYCOMMAND | MF_CHECKED); - - }else - { - ::SetWindowPos(g_eglView->getWin32Window(),HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); - CheckMenuItem(viewControl, ID_CONTROL_TOP, MF_BYCOMMAND | MF_UNCHECKED); - } - int width = g_screenSize.width; - int height = g_screenSize.height; - if (height > width) - { - int w = width; - width = height; - height = w; - } - - int count = ConfigParser::getInstance()->getScreenSizeCount(); - for (int i = 0; i < count; ++i) - { - bool bSel = false; - - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(i); - if (size.width == width && size.height == height) - { - bSel = true; - } - CheckMenuItem(viewMenu, i, MF_BYPOSITION | (bSel? MF_CHECKED : MF_UNCHECKED)); - } - - int scale=g_eglView->getFrameZoomFactor()*100; - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT100, MF_BYCOMMAND | MF_UNCHECKED); - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT75, MF_BYCOMMAND | MF_UNCHECKED); - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT50, MF_BYCOMMAND | MF_UNCHECKED); - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT25, MF_BYCOMMAND | MF_UNCHECKED); - switch (scale) - { - case 100: - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT100, MF_BYCOMMAND | MF_CHECKED); - break; - case 75: - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT75, MF_BYCOMMAND | MF_CHECKED); - break; - case 50: - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT50, MF_BYCOMMAND | MF_CHECKED); - break; - case 25: - CheckMenuItem(viewMenu, ID_VIEW_ZOOMOUT25, MF_BYCOMMAND | MF_CHECKED); - break; - default: - break; - } -} - -/*@brief updateView*/ -void updateView() -{ - - auto policy = g_eglView->getResolutionPolicy(); - auto designSize = g_eglView->getDesignResolutionSize(); - - if (g_landscape) - { - g_eglView->setFrameSize(g_screenSize.width, g_screenSize.height); - } - else - { - g_eglView->setFrameSize(g_screenSize.height, g_screenSize.width); - } - - g_eglView->setDesignResolutionSize(designSize.width, designSize.height, policy); - - updateMenu(); -} - -void onViewChangeOrientation(int viewMenuID) -{ - if (viewMenuID == ID_VIEW_PORTRAIT && g_landscape) - { - g_landscape = false; - updateView(); - } - else if (viewMenuID == ID_VIEW_LANDSCAPE && !g_landscape) - { - g_landscape = true; - updateView(); - } -} - -void onViewZoomOut(int viewMenuID) -{ - float scale = 1.0; - switch (viewMenuID) - { - case ID_VIEW_ZOOMOUT100: - scale=1.0; - break; - case ID_VIEW_ZOOMOUT75: - scale=0.75; - break; - case ID_VIEW_ZOOMOUT50: - scale=0.50; - break; - case ID_VIEW_ZOOMOUT25: - scale=0.25; - break; - default: - break; - } - dynamic_cast(g_eglView)->setFrameZoomFactor(scale); - updateView(); -} - -void onViewChangeFrameSize(int viewMenuID) -{ - int index = viewMenuID - ID_VIEW_SIZE; - if (index >= 0 && index < ConfigParser::getInstance()->getScreenSizeCount()) - { - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(index); - g_screenSize.width = size.width; - g_screenSize.height = size.height; - updateView(); - } -} - -void onHelpAbout() -{ - DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_ABOUT), g_eglView->getWin32Window(), AboutDialogCallback); -} - -void shutDownApp() -{ - HWND hWnd=g_eglView->getWin32Window(); - ::SendMessage(hWnd,WM_CLOSE,NULL,NULL); -} - -void reStart() -{ - PROCESS_INFORMATION info; - STARTUPINFO startup; - TCHAR szPath[128]={0}; - TCHAR *szCmdLine=NULL; - GetModuleFileName(NULL, szPath, sizeof(szPath)); - szCmdLine = GetCommandLine(); - GetStartupInfo(&startup); - BOOL bSucc = CreateProcess(szPath, szCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startup, &info); - if(bSucc) - { - ExitProcess(-1); - } -} -/*@brief new windows process*/ -LRESULT CALLBACK SNewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - int wmId, wmEvent; - switch (message) - { - case WM_KEYDOWN: - if (wParam == VK_F5) - { - reStart(); - break; - } - case WM_SYSCOMMAND: - { - wmId = LOWORD(wParam); - wmEvent = HIWORD(wParam); - - switch (wmId) - { - case ID_CONTROL_TOP: - g_windTop = !g_windTop; - updateView(); - break; - case ID_FILE_EXIT: - shutDownApp(); - break; - - case ID_VIEW_PORTRAIT: - case ID_VIEW_LANDSCAPE: - onViewChangeOrientation(wmId); - break; - - case ID_VIEW_ZOOMOUT100: - case ID_VIEW_ZOOMOUT75: - case ID_VIEW_ZOOMOUT50: - case ID_VIEW_ZOOMOUT25: - onViewZoomOut(wmId); - break; - - case ID_CONTROL_RELOAD: - reStart(); - break; - - case ID_HELP_ABOUT: - onHelpAbout(); - break; - default: - if (wmId >= ID_VIEW_SIZE && wmId <= ID_VIEW_SIZE + ConfigParser::getInstance()->getScreenSizeCount() - 1) - { - onViewChangeFrameSize(wmId); - break; - } - //return 0; - } - } - break; - } - return g_oldProc(hWnd, message, wParam, lParam); -} - -/*@brief AboutDialog Callback*/ -INT_PTR CALLBACK AboutDialogCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - UNREFERENCED_PARAMETER(lParam); - switch (message) - { - case WM_INITDIALOG: - return (INT_PTR)TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) - { - EndDialog(hDlg, LOWORD(wParam)); - return (INT_PTR)TRUE; - } - break; - } - return (INT_PTR)FALSE; -} - -void createSimulator(const char* viewName, float width, float height, bool isLandscape, float frameZoomFactor) -{ - if (g_eglView) - { - return; - } - - g_landscape = isLandscape; - if(height > width) - { - float tmpvalue =width; - width = height; - height = tmpvalue; - } - g_screenSize.width = width; - g_screenSize.height = height; - - if(!g_landscape) - { - float tmpvalue =width; - width = height; - height = tmpvalue; - } - g_windTop = ConfigParser::getInstance()->isWindowTop(); - - g_eglView = GLViewImpl::createWithRect(viewName,Rect(0,0,width,height),frameZoomFactor); - auto director = Director::getInstance(); - director->setOpenGLView(g_eglView); - - HWND hWnd=g_eglView->getWin32Window(); - HMENU hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU_COCOS)); - HMENU hSysMenu = GetSystemMenu(hWnd, FALSE); - HMENU hviewMenu = GetSubMenu(hMenu,1); - HMENU hcontrolMenu = GetSubMenu(hMenu,2); - AppendMenu(hSysMenu,MF_SEPARATOR,0,NULL); - if (hSysMenu != INVALID_HANDLE_VALUE && hMenu != INVALID_HANDLE_VALUE) - { - AppendMenu(hSysMenu, MF_POPUP, (UINT)hviewMenu, TEXT("view")); - AppendMenu(hSysMenu, MF_POPUP, (UINT)hcontrolMenu, TEXT("control")); - } - //SetMenu(hWnd, hMenu); - createViewMenu(); - updateMenu(); - - g_oldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)SNewWndProc); - if (g_oldProc==0) - { - printf("SetWindowLong NewWndProc Error:%d\n",GetLastError()); - } - -} diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.h deleted file mode 100644 index abb12ab69d..0000000000 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.h +++ /dev/null @@ -1,33 +0,0 @@ -/**************************************************************************** -Copyright (c) 2013 cocos2d-x.org - -http://www.cocos2d-x.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -****************************************************************************/ - -#ifndef __SIMULATOR_WINDOW_H_ -#define __SIMULATOR_WINDOW_H_ - -/************************ -@brief create Simulator -*********************************/ -void createSimulator(const char* viewName, float width, float height,bool isLandscape = true,float frameZoomFactor = 1.0f); - -#endif /* __PROJECT_CONFIG_H_ */ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/game.rc b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/game.rc index 46a66d6cf7..6df3e868ac 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/game.rc +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/game.rc @@ -47,30 +47,9 @@ END IDR_MENU_COCOS MENU BEGIN - POPUP "&File" + POPUP "°ïÖú(&H)" BEGIN - MENUITEM SEPARATOR - MENUITEM "E&xit", ID_FILE_EXIT - END - POPUP "&View" - BEGIN - MENUITEM SEPARATOR - MENUITEM "&Portrait", ID_VIEW_PORTRAIT - MENUITEM "&Landscape", ID_VIEW_LANDSCAPE - MENUITEM SEPARATOR - MENUITEM "&Actual(100%)", ID_VIEW_ZOOMOUT100 - MENUITEM "Zoom Out(75%)", ID_VIEW_ZOOMOUT75 - MENUITEM "Zoom Out(50%)", ID_VIEW_ZOOMOUT50 - MENUITEM "Zoom Out(25%)", ID_VIEW_ZOOMOUT25 - END - POPUP "&Control" - BEGIN - MENUITEM "Restart(F5)", ID_CONTROL_RELOAD - MENUITEM "Keep Window Top", ID_CONTROL_TOP - END - POPUP "&Help" - BEGIN - MENUITEM "&About ...", ID_HELP_ABOUT + MENUITEM "¹ØÓÚ(&A)", ID_HELP_ABOUT END END @@ -86,7 +65,7 @@ CAPTION "About Simulator" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,173,69,63,18 - LTEXT "Cocos2d-x-Simulator",IDC_STATIC,29,17,169,25 + CTEXT "Cocos Simulator",IDC_STATIC,28,23,173,17 END @@ -112,6 +91,30 @@ END ///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// English resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU_COCOS MENU +BEGIN + POPUP "&Help" + BEGIN + MENUITEM "&About ...", ID_HELP_ABOUT + END +END + +#endif // English resources +///////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////// // English (United States) resources diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/main.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/main.cpp index 8f4987defa..9ddaf6e212 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/main.cpp +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/main.cpp @@ -1,73 +1,14 @@ #include "main.h" -#include "AppDelegate.h" -#include "cocos2d.h" +#include "service/PlayerWin.h" #include -USING_NS_CC; - -// uncomment below line, open debug console -//#define USE_WIN32_CONSOLE int APIENTRY _tWinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPTSTR lpCmdLine, - int nCmdShow) + HINSTANCE hPrevInstance, + LPTSTR lpCmdLine, + int nCmdShow) { - UNREFERENCED_PARAMETER(hPrevInstance); - UNREFERENCED_PARAMETER(lpCmdLine); - - LPWSTR *szArgList=nullptr; - int argCount=0; - - szArgList = CommandLineToArgvW(GetCommandLine(),&argCount); - if (argCount >=2 ) - { - int iLen = 2*wcslen(szArgList[1]); - char* chRtn = new char[iLen+1]; - wcstombs(chRtn,szArgList[1],iLen+1); - delete [] chRtn; - } - LocalFree(szArgList); - -#ifdef USE_WIN32_CONSOLE - AllocConsole(); - freopen("CONIN$", "r", stdin); - freopen("CONOUT$", "w", stdout); - freopen("CONOUT$", "w", stderr); -#endif - - // create the application instance - AppDelegate app; - int ret = Application::getInstance()->run(); - -#ifdef USE_WIN32_CONSOLE - if (!ret) - { - system("pause"); - } - FreeConsole(); -#endif - - return ret; -} -std::string getCurAppPath(void) -{ - TCHAR szAppDir[MAX_PATH]={0}; - if (!GetModuleFileName(NULL,szAppDir,MAX_PATH)) - return ""; - int nEnd=0; - for (int i=0;szAppDir[i];i++) - { - if(szAppDir[i]=='\\') - nEnd = i; - } - szAppDir[nEnd] = 0; - int iLen = 2*wcslen(szAppDir); - char* chRtn = new char[iLen+1]; - wcstombs(chRtn,szAppDir,iLen+1); - std::string strPath = chRtn; - delete [] chRtn; - chRtn=NULL; - char fuldir[MAX_PATH]={0}; - _fullpath(fuldir,strPath.c_str(),MAX_PATH); - return fuldir; + UNREFERENCED_PARAMETER(hPrevInstance); + UNREFERENCED_PARAMETER(lpCmdLine); + auto player = player::PlayerWin::getInstance(); + return player->run(); } diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/DeviceEx-win32.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/DeviceEx-win32.cpp new file mode 100644 index 0000000000..0434edab72 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/DeviceEx-win32.cpp @@ -0,0 +1,137 @@ +#include "DeviceEx.h" + +// for mac address +#include +#include +#pragma comment(lib,"Iphlpapi.lib") + +using namespace std; +PLAYER_NS_BEGIN + +DeviceEx *DeviceEx::getInstance() +{ + static DeviceEx *instance = NULL; + if (!instance) + { + instance = new DeviceEx(); + instance->init(); + } + return instance; +} + +std::string DeviceEx::getCurrentUILangName() +{ + return _uiLangName; +} + +std::string DeviceEx::getUserGUID() +{ + return _userGUID; +} + + +////////// private ////////// + +DeviceEx::DeviceEx() + : _uiLangName("en") +{ + +} + +void DeviceEx::init() +{ + makeUILangName(); + makeUserGUID(); +} + +void DeviceEx::makeUILangName() +{ + // + // get language + // http://msdn.microsoft.com/en-us/library/windows/apps/jj244362(v=vs.105).aspx + // + ULONG numLanguages = 0; + DWORD cchLanguagesBuffer = 0; + BOOL hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages, NULL, &cchLanguagesBuffer); + if (hr) + { + WCHAR* pwszLanguagesBuffer = new WCHAR[cchLanguagesBuffer]; + hr = GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &numLanguages, pwszLanguagesBuffer, &cchLanguagesBuffer); + if (hr) + { + size_t size = wcslen(pwszLanguagesBuffer) * 3 + 1; + char* dest = new char[size]; + memset(dest, 0, size); + WideCharToMultiByte(CP_UTF8, 0, pwszLanguagesBuffer, -1, dest, size, NULL, NULL); + _uiLangName = dest; + } + delete pwszLanguagesBuffer; + } +} + +static bool getMacAddress(string& macstring) +{ + bool ret = false; + ULONG ipInfoLen = sizeof(IP_ADAPTER_INFO); + PIP_ADAPTER_INFO adapterInfo = (IP_ADAPTER_INFO *)malloc(ipInfoLen); + if (adapterInfo == NULL) + { + return false; + } + + if (GetAdaptersInfo(adapterInfo, &ipInfoLen) == ERROR_BUFFER_OVERFLOW) + { + free(adapterInfo); + adapterInfo = (IP_ADAPTER_INFO *)malloc(ipInfoLen); + if (adapterInfo == NULL) + { + return false; + } + } + + if (GetAdaptersInfo(adapterInfo, &ipInfoLen) == NO_ERROR) + { + for (PIP_ADAPTER_INFO pAdapter = adapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next) + { + if (pAdapter->Type != MIB_IF_TYPE_ETHERNET) + { + continue; + } + + if (pAdapter->AddressLength != 6) + { + continue; + } + + char buf32[32]; + sprintf(buf32, "%02X-%02X-%02X-%02X-%02X-%02X", + int(pAdapter->Address[0]), + int(pAdapter->Address[1]), + int(pAdapter->Address[2]), + int(pAdapter->Address[3]), + int(pAdapter->Address[4]), + int(pAdapter->Address[5])); + macstring = buf32; + ret = true; + break; + } + } + + free(adapterInfo); + return ret; +} + +std::string DeviceEx::makeUserGUID() +{ + if (_userGUID.length() <= 0) + { + if (!getMacAddress(_userGUID)) + { + _userGUID = "guid-fixed-1234567890"; + } + } + + return _userGUID; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerEditBoxServiceWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerEditBoxServiceWin.cpp new file mode 100644 index 0000000000..fd0d0270d4 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerEditBoxServiceWin.cpp @@ -0,0 +1,98 @@ + +#include + +#include "stdafx.h" +#include "cocos2d.h" +#include "PlayerEditBoxServiceWin.h" + +PLAYER_NS_BEGIN + +PlayerEditBoxServiceWin::PlayerEditBoxServiceWin(HWND hwnd) +: _hfont(NULL) +{ + _hwnd = hwnd; + HINSTANCE instance = (HINSTANCE)GetWindowLong(_hwnd, GWL_HINSTANCE); + DWORD style = WS_CHILD | ES_LEFT | ES_AUTOHSCROLL; + _hwndSingle = CreateWindowEx(WS_EX_CLIENTEDGE, L"Edit", L"", style, 0, 0, 0, 0, _hwnd, NULL, instance, NULL); + style = WS_CHILD | ES_MULTILINE | ES_LEFT | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL; + _hwndMulti = CreateWindowEx(WS_EX_CLIENTEDGE, L"Edit", L"", style, 0, 0, 0, 0, _hwnd, NULL, instance, NULL); +} + +PlayerEditBoxServiceWin::~PlayerEditBoxServiceWin() +{ + removeFont(); + DestroyWindow(_hwndSingle); + DestroyWindow(_hwndMulti); +} + +void PlayerEditBoxServiceWin::showSingleLineEditBox(const cocos2d::Rect &rect) +{ + MoveWindow(_hwndSingle, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height, TRUE); + ShowWindow(_hwndSingle, SW_SHOW); + SetFocus(_hwndSingle); +} + +void PlayerEditBoxServiceWin::showMultiLineEditBox(const cocos2d::Rect &rect) +{ + MoveWindow(_hwndMulti, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height, TRUE); + ShowWindow(_hwndMulti, SW_SHOW); + SetFocus(_hwndMulti); +} + +void PlayerEditBoxServiceWin::hide() +{ +} + +void PlayerEditBoxServiceWin::setText(const std::string &text) +{ +} + +void PlayerEditBoxServiceWin::setFont(const std::string &name, int size) +{ + removeFont(); + + std::u16string u16name; + cocos2d::StringUtils::UTF8ToUTF16(name, u16name); + + HDC hdc = GetDC(_hwnd); + size = -MulDiv(size, GetDeviceCaps(hdc, LOGPIXELSY), 72); + ReleaseDC(_hwnd, hdc); + + _hfont = CreateFont(size, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, + 0, OUT_DEFAULT_PRECIS, FW_NORMAL, DEFAULT_QUALITY, DEFAULT_PITCH, + (LPCTSTR)u16name.c_str()); + if (!_hfont) + { + DWORD err = GetLastError(); + CCLOG("PlayerEditBoxServiceWin::setFont() - create HFONT for font \"%s\" failed, error code = 0x%08x", + name.c_str(), err); + } + else + { + SendMessage(_hwndSingle, WM_SETFONT, (WPARAM)_hfont, NULL); + SendMessage(_hwndMulti, WM_SETFONT, (WPARAM)_hfont, NULL); + } +} + +void PlayerEditBoxServiceWin::setFontColor(const cocos2d::Color3B &color) +{ + +} + +void PlayerEditBoxServiceWin::removeFont() +{ + if (_hfont) + { + SendMessage(_hwndSingle, WM_SETFONT, NULL, NULL); + SendMessage(_hwndMulti, WM_SETFONT, NULL, NULL); + DeleteObject(_hfont); + } + _hfont = NULL; +} + +void PlayerEditBoxServiceWin::setFormator(int /*formator*/ ) +{ + +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerEditBoxServiceWin.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerEditBoxServiceWin.h new file mode 100644 index 0000000000..a481720e6f --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerEditBoxServiceWin.h @@ -0,0 +1,36 @@ + +#ifndef __PLAYER_EDITBOX_SERVICE_WIN_H_ +#define __PLAYER_EDITBOX_SERVICE_WIN_H_ + +#include "stdafx.h" +#include "PlayerEditBoxServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerEditBoxServiceWin : public PlayerEditBoxServiceProtocol +{ +public: + PlayerEditBoxServiceWin(HWND hwnd); + virtual ~PlayerEditBoxServiceWin(); + + virtual void showSingleLineEditBox(const cocos2d::Rect &rect); + virtual void showMultiLineEditBox(const cocos2d::Rect &rect); + virtual void hide(); + + virtual void setText(const std::string &text); + virtual void setFont(const std::string &name, int size); + virtual void setFontColor(const cocos2d::Color3B &color); + + virtual void setFormator(int formator); +protected: + HWND _hwnd; + HWND _hwndSingle; + HWND _hwndMulti; + HFONT _hfont; + + void removeFont(); +}; + +PLAYER_NS_END + +#endif // __PLAYER_EDITBOX_SERVICE_WIN_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerFileDialogServiceWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerFileDialogServiceWin.cpp new file mode 100644 index 0000000000..53a20d5e5c --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerFileDialogServiceWin.cpp @@ -0,0 +1,265 @@ + +#include + +#include "stdafx.h" +#include +#include +#include + +#include "cocos2d.h" +#include "PlayerUtils.h" +#include "PlayerFileDialogServiceWin.h" + +PLAYER_NS_BEGIN + +PlayerFileDialogServiceWin::PlayerFileDialogServiceWin(HWND hwnd) +: _hwnd(hwnd) +{ +} + +std::string PlayerFileDialogServiceWin::openFile(const std::string &title, + const std::string &directory, + const std::string &extensions) const +{ + vector result = openMultipleInternal(title, directory, extensions, false); + if (result.size()) + { + return result.at(0); + } + return std::string(); +} + +std::vector PlayerFileDialogServiceWin::openMultiple(const std::string &title, + const std::string &directory, + const std::string &extensions) const +{ + return openMultipleInternal(title, directory, extensions, true); +} + +std::string PlayerFileDialogServiceWin::saveFile(const std::string &title, + const std::string &path) const +{ + std::u16string u16title; + cocos2d::StringUtils::UTF8ToUTF16(title, u16title); + + WCHAR buff[MAX_PATH + 1] = {0}; + if (path.length() > 0) + { + std::u16string u16filename; + cocos2d::StringUtils::UTF8ToUTF16(path, u16filename); + wcscpy_s(buff, (WCHAR*)u16filename.c_str()); + } + + OPENFILENAME ofn = {0}; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = _hwnd; + ofn.lpstrFilter = L"All Files (*.*)\0*.*\0"; + ofn.lpstrTitle = (LPCTSTR)u16title.c_str(); + ofn.Flags = OFN_DONTADDTORECENT | OFN_ENABLESIZING | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_LONGNAMES; + ofn.lpstrFile = buff; + ofn.nMaxFile = MAX_PATH; + + std::string result; + if (!GetSaveFileName(&ofn)) + { + // user cancel dialog, GetSaveFileName() will return FALSE + DWORD err = CommDlgExtendedError(); + if (err) + { + CCLOG("PlayerFileDialogServiceWin::saveFile() - failed, title (%s), error code = %u", title.c_str(), err); + } + return result; + } + + cocos2d::StringUtils::UTF16ToUTF8((char16_t*)buff, result); + return result; +} + +// for openDirectory +int CALLBACK BrowseFolderCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) +{ + if (uMsg == BFFM_INITIALIZED && lpData) + { + LPCTSTR path = (LPCTSTR)lpData; + SendMessage(hwnd, BFFM_SETSELECTION, true, (LPARAM)path); + } + return 0; +} + +std::string PlayerFileDialogServiceWin::openDirectory(const std::string &title, + const std::string &directory) const +{ + std::u16string u16title; + cocos2d::StringUtils::UTF8ToUTF16(title, u16title); + + WCHAR basedir[MAX_PATH + 1]; + if (directory.length()) + { + std::u16string u16directory; + cocos2d::StringUtils::UTF8ToUTF16(directory, u16directory); + wcscpy_s(basedir, (WCHAR*)u16directory.c_str()); + } + else + { + GetCurrentDirectory(MAX_PATH, basedir); + } + + WCHAR buff[MAX_PATH + 1] = {0}; + BROWSEINFO bi = {0}; + bi.hwndOwner = _hwnd; + bi.pszDisplayName = buff; + bi.lpszTitle = (LPCTSTR)u16title.c_str(); + bi.lParam = (LPARAM)basedir; + bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NONEWFOLDERBUTTON | BIF_NEWDIALOGSTYLE; + bi.lpfn = BrowseFolderCallback; + + PIDLIST_ABSOLUTE pid = SHBrowseForFolder(&bi); + if (pid) + { + SHGetPathFromIDList(pid, buff); + std::string result; + cocos2d::StringUtils::UTF16ToUTF8((char16_t*)buff, result); + return result; + } + else + { + return std::string(""); + } +} + +LPTSTR PlayerFileDialogServiceWin::parseExtensions(const std::string &extensions) const +{ + static WCHAR *defaultExtensions = L"All Files (*.*)\0*.*\0"; + if (extensions.length() == 0) + { + WCHAR *buff = new WCHAR[wcslen(defaultExtensions) + 1]; + wcscpy(buff, defaultExtensions); + return buff; + } + + // "Lua Script File|*.lua;JSON File|*.json" + // to + // "Lua Script File (*.lua)\0*.lua\0JSON File (*.json)\0*.json\0"; + std::u16string u16extensions; + std::u16string split1((char16_t*)L";"); + std::u16string split2((char16_t*)L"|"); + cocos2d::StringUtils::UTF8ToUTF16(extensions, u16extensions); + vector pairs = splitString(u16extensions, split1); + + size_t buffsize = extensions.length() * 6; + WCHAR *buff = new WCHAR[buffsize]; + memset(buff, 0, sizeof(WCHAR) * buffsize); + size_t offset = 0; + for (auto it = pairs.begin(); it != pairs.end(); ++it) + { + vector p = splitString(*it, split2); + std::u16string descr, ext; + if (p.size() < 2) + { + descr = ext = *it; + } + else + { + descr = p.at(0); + ext = p.at(1); + } + + wcscat(buff + offset, (WCHAR*)descr.c_str()); + wcscat(buff + offset, L" ("); + wcscat(buff + offset, (WCHAR*)ext.c_str()); + wcscat(buff + offset, L")"); + offset += descr.length() + ext.length() + 4; + wcscat(buff + offset, (WCHAR*)ext.c_str()); + offset += ext.length() + 1; + } + + return buff; +} + +std::vector PlayerFileDialogServiceWin::openMultipleInternal(const std::string &title, + const std::string &directory, + const std::string &extensions, + bool isMulti) const +{ + std::u16string u16title; + cocos2d::StringUtils::UTF8ToUTF16(title, u16title); + + WCHAR basedir[MAX_PATH + 1]; + if (directory.length()) + { + std::u16string u16directory; + cocos2d::StringUtils::UTF8ToUTF16(directory, u16directory); + wcscpy_s(basedir, (WCHAR*)u16directory.c_str()); + } + else + { + GetCurrentDirectory(MAX_PATH, basedir); + } + + size_t buffsize = MAX_PATH; + if (isMulti) buffsize = MAX_PATH * 64; + WCHAR *buff = new WCHAR[buffsize + 1]; + memset(buff, 0, sizeof(WCHAR) * (buffsize + 1)); + + OPENFILENAME ofn = {0}; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = _hwnd; + ofn.lpstrFilter = parseExtensions(extensions); + ofn.lpstrTitle = (LPCTSTR)u16title.c_str(); + ofn.lpstrInitialDir = basedir; + ofn.Flags = OFN_DONTADDTORECENT | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_LONGNAMES; + if (isMulti) ofn.Flags |= OFN_ALLOWMULTISELECT | OFN_EXPLORER; + ofn.lpstrFile = buff; + ofn.nMaxFile = buffsize; + + vector result; + BOOL ret = GetOpenFileName(&ofn); + delete[] ofn.lpstrFilter; + if (!ret) + { + // user cancel dialog, GetOpenFileName() will return FALSE + DWORD err = CommDlgExtendedError(); + if (err) + { + CCLOG("PlayerFileDialogServiceWin::openMultipleInternal() - failed, title (%s), error code = %u", title.c_str(), err); + } + delete[] buff; + return result; + } + + if (isMulti) + { + WORD offset = 0; + std::string path; + while (buff[offset] != '\0') + { + std::string filename; + std::u16string u16filename((char16_t*)(buff + offset)); + cocos2d::StringUtils::UTF16ToUTF8(u16filename, filename); + + if (offset == 0) + { + path = filename; + if (path[path.length() - 1] != '\\') + { + path.append("\\"); + } + } + else + { + result.push_back(path + filename); + } + offset += u16filename.length() + 1; + } + } + else + { + std::string path; + cocos2d::StringUtils::UTF16ToUTF8((char16_t*)buff, path); + result.push_back(path); + } + delete[] buff; + return result; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerFileDialogServiceWin.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerFileDialogServiceWin.h new file mode 100644 index 0000000000..6804fe6fa5 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerFileDialogServiceWin.h @@ -0,0 +1,38 @@ + +#ifndef __PLAYER_FILE_DIALOG_SERVICE_WIN_H_ +#define __PLAYER_FILE_DIALOG_SERVICE_WIN_H_ + +#include "stdafx.h" +#include "PlayerFileDialogServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerFileDialogServiceWin : public PlayerFileDialogServiceProtocol +{ +public: + PlayerFileDialogServiceWin(HWND hwnd); + + virtual std::string openFile(const std::string &title, + const std::string &directory, + const std::string &extensions) const; + virtual std::vector openMultiple(const std::string &title, + const std::string &directory, + const std::string &extensions) const; + virtual std::string saveFile(const std::string &title, + const std::string &path) const; + virtual std::string openDirectory(const std::string &title, + const std::string &directory) const; + +protected: + HWND _hwnd; + + LPTSTR parseExtensions(const std::string &extensions) const; + vector openMultipleInternal(const std::string &title, + const std::string &directory, + const std::string &extensions, + bool isMulti) const; +}; + +PLAYER_NS_END + +#endif // __PLAYER_FILE_DIALOG_SERVICE_WIN_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMenuServiceWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMenuServiceWin.cpp new file mode 100644 index 0000000000..66a0cf2af0 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMenuServiceWin.cpp @@ -0,0 +1,351 @@ + +#include "PlayerMenuServiceWin.h" + +PLAYER_NS_BEGIN + +PlayerMenuItemWin *PlayerMenuItemWin::create(const std::string &menuId, const std::string &title) +{ + PlayerMenuItemWin *item = new PlayerMenuItemWin(); + item->_menuId = menuId; + item->_title = title; + item->autorelease(); + return item; +} + +PlayerMenuItemWin::PlayerMenuItemWin() + : _parent(nullptr) + , _commandId(0) + , _hmenu(NULL) + , _menubarEnabled(true) +{ +} + +PlayerMenuItemWin::~PlayerMenuItemWin() +{ + CC_SAFE_RELEASE(_parent); + if (_hmenu) + { + CCLOG("PlayerMenuItemWin::~PlayerMenuItemWin() - %s (HMENU)", _menuId.c_str()); + DestroyMenu(_hmenu); + } + else + { + CCLOG("PlayerMenuItemWin::~PlayerMenuItemWin() - %s", _menuId.c_str()); + } +} + +void PlayerMenuItemWin::setTitle(const std::string &title) +{ + if (title.length() == 0) + { + CCLOG("MenuServiceWin::setTitle() - can not set menu title to empty, menu id (%s)", _menuId.c_str()); + return; + } + + MENUITEMINFO menuitem; + menuitem.cbSize = sizeof(menuitem); + menuitem.fMask = MIIM_FTYPE | MIIM_STRING; + menuitem.fType = (title.compare("-") == 0) ? MFT_SEPARATOR : MFT_STRING; + std::u16string u16title; + cocos2d::StringUtils::UTF8ToUTF16(title, u16title); + menuitem.dwTypeData = (LPTSTR)u16title.c_str(); + if (SetMenuItemInfo(_parent->_hmenu, _commandId, MF_BYCOMMAND, &menuitem)) + { + _title = title; + } + else + { + DWORD err = GetLastError(); + CCLOG("MenuServiceWin::setTitle() - set menu title failed, menu id (%s). error code = %u", _menuId.c_str(), err); + } +} + +void PlayerMenuItemWin::setEnabled(bool enabled) +{ + MENUITEMINFO menuitem = {0}; + menuitem.cbSize = sizeof(menuitem); + menuitem.fMask = MIIM_STATE; + menuitem.fState = (enabled && _menubarEnabled) ? MFS_ENABLED : MFS_DISABLED; + if (SetMenuItemInfo(_parent->_hmenu, _commandId, MF_BYCOMMAND, &menuitem)) + { + _isEnabled = enabled; + } + else + { + DWORD err = GetLastError(); + CCLOG("MenuServiceWin::setEnabled() - set menu enabled failed, menu id (%s). error code = %u", _menuId.c_str(), err); + } +} + +void PlayerMenuItemWin::setChecked(bool checked) +{ + MENUITEMINFO menuitem; + menuitem.cbSize = sizeof(menuitem); + menuitem.fMask = MIIM_STATE; + menuitem.fState = (checked) ? MFS_CHECKED : MFS_UNCHECKED; + if (SetMenuItemInfo(_parent->_hmenu, _commandId, MF_BYCOMMAND, &menuitem)) + { + _isChecked = checked; + } + else + { + DWORD err = GetLastError(); + CCLOG("MenuServiceWin::setChecked() - set menu checked failed, menu id (%s). error code = %u", _menuId.c_str(), err); + } +} + +void PlayerMenuItemWin::setShortcut(const std::string &shortcut) +{ + +} + + +// MenuServiceWin + +WORD PlayerMenuServiceWin::_newCommandId = 0x1000; + +PlayerMenuServiceWin::PlayerMenuServiceWin(HWND hwnd) + : _hwnd(hwnd) + , _menubarEnabled(true) +{ + // create menu + _root._menuId = "__ROOT__"; + _root._commandId = 0; + + // hwnd has menu + HMENU menu = GetMenu(hwnd); + if (menu) + { + _root._hmenu = menu; + } + else + { + _root._hmenu = CreateMenu(); + SetMenu(hwnd, _root._hmenu); + } +} + +PlayerMenuServiceWin::~PlayerMenuServiceWin() +{ +} + +PlayerMenuItem *PlayerMenuServiceWin::addItem(const std::string &menuId, + const std::string &title, + const std::string &parentId, + int order /* = MAX_ORDER */) +{ + if (menuId.length() == 0 || title.length() == 0) + { + CCLOG("MenuServiceWin::addItem() - menuId and title must is non-empty"); + return nullptr; + } + + // check menu id is exists + if (_items.find(menuId) != _items.end()) + { + CCLOG("MenuServiceWin::addItem() - menu id (%s) is exists", menuId.c_str()); + return false; + } + + // set parent + PlayerMenuItemWin *parent = &_root; + if (parentId.length()) + { + // query parent menu + auto it = _items.find(parentId); + if (it != _items.end()) + { + parent = it->second; + } + } + + if (!parent->_hmenu) + { + // create menu handle for parent (convert parent to submenu) + parent->_hmenu = CreateMenu(); + parent->_isGroup = true; + MENUITEMINFO menuitem; + menuitem.cbSize = sizeof(menuitem); + menuitem.fMask = MIIM_SUBMENU; + menuitem.hSubMenu = parent->_hmenu; + if (!SetMenuItemInfo(parent->_parent->_hmenu, parent->_commandId, MF_BYCOMMAND, &menuitem)) + { + DWORD err = GetLastError(); + CCLOG("MenuServiceWin::addItem() - set menu handle failed, menu id (%s). error code = %u", parent->_menuId.c_str(), err); + return nullptr; + } + } + + // create new menu item + _newCommandId++; + PlayerMenuItemWin *item = PlayerMenuItemWin::create(menuId, title); + item->_commandId = _newCommandId; + item->_parent = parent; + item->_parent->retain(); + + // add menu item to menu bar + MENUITEMINFO menuitem; + menuitem.cbSize = sizeof(menuitem); + menuitem.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STATE | MIIM_STRING; + menuitem.fType = (item->_title.compare("-") == 0) ? MFT_SEPARATOR : MFT_STRING; + menuitem.fState = (item->_isEnabled) ? MFS_ENABLED : MFS_DISABLED; + menuitem.fState |= (item->_isChecked) ? MFS_CHECKED : MFS_UNCHECKED; + std::u16string u16title; + cocos2d::StringUtils::UTF8ToUTF16(item->_title, u16title); + menuitem.dwTypeData = (LPTSTR)u16title.c_str(); + menuitem.wID = _newCommandId; + + // check new menu item position + if (order > parent->_children.size()) + { + order = parent->_children.size(); + } + else if (order < 0) + { + order = 0; + } + + // create new menu item + if (!InsertMenuItem(parent->_hmenu, order, TRUE, &menuitem)) + { + DWORD err = GetLastError(); + CCLOG("MenuServiceWin::addItem() - insert new menu item failed, menu id (%s). error code = %u", item->_menuId.c_str(), err); + item->release(); + return nullptr; + } + + // update menu state + parent->_children.insert(order, item); + _items[item->_menuId] = item; + _commandId2menuId[item->_commandId] = item->_menuId; + updateChildrenOrder(parent); + + return item; +} + +PlayerMenuItem *PlayerMenuServiceWin::addItem(const std::string &menuId, + const std::string &title) +{ + return addItem(menuId, title, ""); +} + +PlayerMenuItem *PlayerMenuServiceWin::getItem(const std::string &menuId) +{ + auto it = _items.find(menuId); + if (it == _items.end()) + { + CCLOG("MenuServiceWin::getItem() - Invalid menu id (%s)", menuId.c_str()); + return nullptr; + } + + return it->second; +} + +bool PlayerMenuServiceWin::removeItem(const std::string &menuId) +{ + return removeItemInternal(menuId, true); +} + +void PlayerMenuServiceWin::setMenuBarEnabled(bool enabled) +{ + _menubarEnabled = enabled; + + UINT state = enabled ? MFS_ENABLED : MFS_DISABLED; + for (auto it = _root._children.begin(); it != _root._children.end(); ++it) + { + PlayerMenuItemWin *item = *it; + MENUITEMINFO menuitem = {0}; + menuitem.cbSize = sizeof(menuitem); + menuitem.fMask = MIIM_STATE; + menuitem.fState = state; + SetMenuItemInfo(item->_parent->_hmenu, item->_commandId, MF_BYCOMMAND, &menuitem); + item->_menubarEnabled = enabled; + } +} + +PlayerMenuItemWin *PlayerMenuServiceWin::getItemByCommandId(WORD commandId) +{ + auto it = _commandId2menuId.find(commandId); + if (it == _commandId2menuId.end()) return nullptr; + return _items[it->second]; +} + +bool PlayerMenuServiceWin::removeItemInternal(const std::string &menuId, bool isUpdateChildrenOrder) +{ + auto it = _items.find(menuId); + if (it == _items.end()) + { + CCLOG("MenuServiceWin::removeItem() - Invalid menu id (%s)", menuId.c_str()); + return false; + } + + PlayerMenuItemWin *item = it->second; + if (item->_children.size() == 0) + { + if (!DeleteMenu(item->_parent->_hmenu, item->_commandId, MF_BYCOMMAND)) + { + DWORD err = GetLastError(); + CCLOG("MenuServiceWin::removeItem() - remove menu item failed, menu id (%s). error code = %u", item->_menuId.c_str(), err); + return false; + } + + // remove item from parent + bool removed = false; + auto *children = &item->_parent->_children; + for (auto it = children->begin(); it != children->end(); ++it) + { + if ((*it)->_commandId == item->_commandId) + { + CCLOG("MenuServiceWin::removeItem() - remove menu item (%s)", item->_menuId.c_str()); + children->erase(it); + removed = true; + break; + } + } + + if (!removed) + { + CCLOG("MenuServiceWin::removeItem() - remove menu item (%s) failed, not found command id from parent->children", item->_menuId.c_str()); + } + + // remove menu id mapping + _items.erase(menuId); + _commandId2menuId.erase(item->_commandId); + if (isUpdateChildrenOrder) + { + updateChildrenOrder(item->_parent); + } + DrawMenuBar(_hwnd); + return true; + } + else + { + // remove all children + while (item->_children.size() != 0) + { + PlayerMenuItemWin *child = *item->_children.begin(); + if (!removeItemInternal(child->_menuId.c_str(), false)) + { + break; + return false; + } + } + return removeItemInternal(menuId, true); + } + + return false; +} + + +void PlayerMenuServiceWin::updateChildrenOrder(PlayerMenuItemWin *parent) +{ + auto *children = &parent->_children; + int order = 0; + for (auto it = children->begin(); it != children->end(); ++it) + { + (*it)->_order = order; + order++; + } +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMenuServiceWin.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMenuServiceWin.h new file mode 100644 index 0000000000..3d0c13a9ac --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMenuServiceWin.h @@ -0,0 +1,70 @@ + +#ifndef __PLAYER_MENU_SERVICE_WIN_H_ +#define __PLAYER_MENU_SERVICE_WIN_H_ + +#include +#include + +#include "cocos2d.h" +#include "stdafx.h" +#include "PlayerMenuServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerMenuItemWin : public PlayerMenuItem +{ +public: + static PlayerMenuItemWin *create(const std::string &menuId, const std::string &title); + virtual ~PlayerMenuItemWin(); + + virtual void setTitle(const std::string &title); + virtual void setEnabled(bool enabled); + virtual void setChecked(bool checked); + virtual void setShortcut(const std::string &shortcut); + +protected: + PlayerMenuItemWin(); + + PlayerMenuItemWin *_parent; + UINT _commandId; + HMENU _hmenu; + bool _menubarEnabled; + cocos2d::Vector _children; + + friend class PlayerMenuServiceWin; +}; + +class PlayerMenuServiceWin : public PlayerMenuServiceProtocol +{ +public: + PlayerMenuServiceWin(HWND hwnd); + virtual ~PlayerMenuServiceWin(); + + virtual PlayerMenuItem *addItem(const std::string &menuId, + const std::string &title, + const std::string &parentId, + int order = MAX_ORDER); + virtual PlayerMenuItem *addItem(const std::string &menuId, + const std::string &title); + virtual PlayerMenuItem *getItem(const std::string &menuId); + virtual bool removeItem(const std::string &menuId); + virtual void setMenuBarEnabled(bool enabled); + + PlayerMenuItemWin *getItemByCommandId(WORD commandId); + +private: + static WORD _newCommandId; + + HWND _hwnd; + bool _menubarEnabled; + PlayerMenuItemWin _root; + std::unordered_map _items; + std::unordered_map _commandId2menuId; + + bool removeItemInternal(const std::string &menuId, bool isUpdateChildrenOrder); + void updateChildrenOrder(PlayerMenuItemWin *parent); +}; + +PLAYER_NS_END + +#endif // __PLAYER_MENU_SERVICE_WIN_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMessageBoxServiceWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMessageBoxServiceWin.cpp new file mode 100644 index 0000000000..bbcdca47eb --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMessageBoxServiceWin.cpp @@ -0,0 +1,67 @@ + +#include "PlayerMessageBoxServiceWin.h" + +PLAYER_NS_BEGIN + +PlayerMessageBoxServiceWin::PlayerMessageBoxServiceWin(HWND hwnd) +: _hwnd(hwnd) +{ +} + +int PlayerMessageBoxServiceWin::showMessageBox(const std::string &title, + const std::string &message, + int buttonsType /* = BUTTONS_OK */) +{ + std::u16string u16title; + cocos2d::StringUtils::UTF8ToUTF16(title, u16title); + std::u16string u16message; + cocos2d::StringUtils::UTF8ToUTF16(message, u16message); + + CCLOG("PlayerMessageBoxServiceWin::showMessageBox() - title = %s, message = %s", title.c_str(), message.c_str()); + + UINT mbtype = MB_APPLMODAL; + switch (buttonsType) + { + case BUTTONS_OK_CANCEL: + mbtype |= MB_OKCANCEL | MB_ICONQUESTION; + break; + + case BUTTONS_YES_NO: + mbtype |= MB_YESNO | MB_ICONQUESTION; + break; + + case BUTTONS_YES_NO_CANCEL: + mbtype |= MB_YESNOCANCEL | MB_ICONQUESTION; + break; + + default: + mbtype |= MB_OK | MB_ICONINFORMATION; + } + + // MessageBox() used by cocos2d + int result = ::MessageBoxW(_hwnd, (LPCTSTR)u16message.c_str(), (LPCTSTR)u16title.c_str(), mbtype); + + switch (result) + { + case IDCANCEL: + result = BUTTON_CANCEL; + break; + + case IDYES: + result = BUTTON_YES; + break; + + case IDNO: + result = BUTTON_NO; + break; + + default: + result = BUTTON_OK; + } + + CCLOG("PlayerMessageBoxServiceWin::showMessageBox() - result = %d", result); + + return result; +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMessageBoxServiceWin.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMessageBoxServiceWin.h new file mode 100644 index 0000000000..ecff6d3ffc --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerMessageBoxServiceWin.h @@ -0,0 +1,28 @@ + +#ifndef __PLAYER_MESSAGEBOX_SERVICE_WIN_H_ +#define __PLAYER_MESSAGEBOX_SERVICE_WIN_H_ + +#include + +#include "stdafx.h" +#include "cocos2d.h" +#include "PlayerMessageBoxServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerMessageBoxServiceWin : public PlayerMessageBoxServiceProtocol +{ +public: + PlayerMessageBoxServiceWin(HWND hwnd); + + virtual int showMessageBox(const std::string &title, + const std::string &message, + int buttonsType = BUTTONS_OK); + +protected: + HWND _hwnd; +}; + +PLAYER_NS_END + +#endif // __PLAYER_MESSAGEBOX_SERVICE_WIN_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerTaskServiceWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerTaskServiceWin.cpp new file mode 100644 index 0000000000..4e65e03fa4 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerTaskServiceWin.cpp @@ -0,0 +1,272 @@ + +#include + +#include "stdafx.h" +#include "shellapi.h" +#include "PlayerTaskServiceWin.h" + +static const int MAX_LOG_LENGTH = 16 * 1024;// from 2dx + +PLAYER_NS_BEGIN + +PlayerTaskWin *PlayerTaskWin::create(const std::string &name, const std::string &executePath, const std::string &commandLineArguments) +{ + PlayerTaskWin *task = new PlayerTaskWin(name, executePath, commandLineArguments); + task->autorelease(); + return task; +} + +PlayerTaskWin::PlayerTaskWin(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments) + : PlayerTask(name, executePath, commandLineArguments) + , _childStdInRead(NULL) + , _childStdInWrite(NULL) + , _childStdOutRead(NULL) + , _childStdOutWrite(NULL) + , _outputBuff(NULL) + , _outputBuffWide(NULL) +{ + ZeroMemory(&_pi, sizeof(_pi)); +} + +PlayerTaskWin::~PlayerTaskWin() +{ + cleanup(); +} + +bool PlayerTaskWin::run() +{ + if (!isIdle()) + { + CCLOG("PlayerTaskWin::run() - task is not idle"); + return false; + } + + //BOOL WINAPI CreateProcess( + // _In_opt_ LPCTSTR lpApplicationName, + // _Inout_opt_ LPTSTR lpCommandLine, + // _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, + // _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, + // _In_ BOOL bInheritHandles, + // _In_ DWORD dwCreationFlags, + // _In_opt_ LPVOID lpEnvironment, + // _In_opt_ LPCTSTR lpCurrentDirectory, + // _In_ LPSTARTUPINFO lpStartupInfo, + // _Out_ LPPROCESS_INFORMATION lpProcessInformation + //); + + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx + SECURITY_ATTRIBUTES sa = {0}; + sa.nLength = sizeof(sa); + sa.bInheritHandle = TRUE; + + // Create a pipe for the child process's STDOUT. + if (!CreatePipe(&_childStdOutRead, &_childStdOutWrite, &sa, 0) || !SetHandleInformation(_childStdOutRead, HANDLE_FLAG_INHERIT, 0)) + { + CCLOG("PlayerTaskWin::run() - create stdout handle failed, for execute %s", _executePath.c_str()); + cleanup(); + return false; + } + + // Create a pipe for the child process's STDIN. + if (!CreatePipe(&_childStdInRead, &_childStdInWrite, &sa, 0) || !SetHandleInformation(_childStdInWrite, HANDLE_FLAG_INHERIT, 0)) + { + CCLOG("PlayerTaskWin::run() - create stdout handle failed, for execute %s", _executePath.c_str()); + cleanup(); + return false; + } + + ZeroMemory(&_pi, sizeof(_pi)); + STARTUPINFO si = {0}; + + si.cb = sizeof(STARTUPINFO); + si.hStdError = _childStdOutWrite; + si.hStdOutput = _childStdOutWrite; + si.hStdInput = _childStdInRead; + si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; + si.wShowWindow = SW_HIDE; + +#define MAX_COMMAND 4096 //MAX_PATH + const std::u16string u16command = makeCommandLine(); + WCHAR command[MAX_COMMAND]; + wcscpy_s(command, MAX_COMMAND, (WCHAR*)u16command.c_str()); + + BOOL success = CreateProcess(NULL, + command, // command line + NULL, // process security attributes + NULL, // primary thread security attributes + TRUE, // handles are inherited + 0, // creation flags + NULL, // use parent's environment + NULL, // use parent's current directory + &si, // STARTUPINFO pointer + &_pi); // receives PROCESS_INFORMATION + + if (!success) + { + CCLOG("PlayerTaskWin::run() - create process failed, for execute %s", _executePath.c_str()); + cleanup(); + return false; + } + + _outputBuff = new CHAR[BUFF_SIZE + 1]; + _outputBuffWide = new WCHAR[BUFF_SIZE]; + _state = STATE_RUNNING; + + cocos2d::Director::getInstance()->getScheduler()->scheduleUpdate(this, 0, false); + return true; +} + +void PlayerTaskWin::runInTerminal() +{ + std::stringstream buf; + buf << "/K "; + buf << _executePath; + buf << " "; + buf << _commandLineArguments; + + std::u16string u16command; + cocos2d::StringUtils::UTF8ToUTF16(buf.str(), u16command); + + ShellExecute(NULL, NULL, L"CMD.EXE", (WCHAR*)u16command.c_str(), NULL, SW_SHOWNORMAL); +} + +void PlayerTaskWin::stop() +{ + if (_pi.hProcess) + { + TerminateProcess(_pi.hProcess, 0); + _resultCode = -1; + } + cleanup(); +} + +void PlayerTaskWin::update(float dt) +{ + _lifetime += dt; + + // read output + for (;;) + { + DWORD readCount = 0; + PeekNamedPipe(_childStdOutRead, NULL, NULL, NULL, &readCount, NULL); + if (readCount == 0) break; + if (_output.length() > MAX_LOG_LENGTH) break; + + readCount = 0; + ZeroMemory(_outputBuff, BUFF_SIZE + 1); + BOOL success = ReadFile(_childStdOutRead, _outputBuff, BUFF_SIZE - 1, &readCount, NULL); + if (!success || readCount == 0) break; + + int chars = MultiByteToWideChar(CP_OEMCP, 0, _outputBuff, readCount, _outputBuffWide, BUFF_SIZE); + if (chars) + { + ZeroMemory(_outputBuff, BUFF_SIZE + 1); + WideCharToMultiByte(CP_UTF8, 0, _outputBuffWide, chars, _outputBuff, BUFF_SIZE + 1, 0, NULL); + _output.append(_outputBuff); + if (_output.length() > MAX_LOG_LENGTH) break; + } + } + + // get child process exit code + DWORD resultCode = 0; + if (GetExitCodeProcess(_pi.hProcess, &resultCode)) + { + if (resultCode == STILL_ACTIVE) return; + _resultCode = (int)resultCode; + } + else + { + // unexpected error + _resultCode = (int)GetLastError(); + } + + cocos2d::Director::getInstance()->getScheduler()->unscheduleAllForTarget(this); + cleanup(); +} + +void PlayerTaskWin::cleanup() +{ + if (_pi.hProcess) CloseHandle(_pi.hProcess); + if (_pi.hThread) CloseHandle(_pi.hThread); + ZeroMemory(&_pi, sizeof(_pi)); + + if (_outputBuff) delete[] _outputBuff; + _outputBuff = NULL; + if (_outputBuffWide) delete[] _outputBuffWide; + _outputBuffWide = NULL; + + if (_childStdOutRead) CloseHandle(_childStdOutRead); + if (_childStdOutWrite) CloseHandle(_childStdOutWrite); + if (_childStdInRead) CloseHandle(_childStdInRead); + if (_childStdInWrite) CloseHandle(_childStdInWrite); + + _childStdOutRead = NULL; + _childStdOutWrite = NULL; + _childStdInRead = NULL; + _childStdInWrite = NULL; + + _state = STATE_COMPLETED; + + CCLOG("CMD: %s", _output.c_str()); + + cocos2d::Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(_name); +} + +std::u16string PlayerTaskWin::makeCommandLine() const +{ + std::stringstream buf; + buf << "\""; + buf << _executePath; + buf << "\" "; + buf << _commandLineArguments; + + std::u16string u16command; + cocos2d::StringUtils::UTF8ToUTF16(buf.str(), u16command); + return u16command; +} + +PlayerTaskServiceWin::PlayerTaskServiceWin(HWND hwnd) + : _hwnd(hwnd) +{ +} + +PlayerTaskServiceWin::~PlayerTaskServiceWin() +{ + for (auto it = _tasks.begin(); it != _tasks.end(); ++it) + { + it->second->stop(); + } +} + +PlayerTask *PlayerTaskServiceWin::createTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments) +{ + CCASSERT(_tasks.find(name) == _tasks.end(), "Task already exists."); + PlayerTaskWin *task = PlayerTaskWin::create(name, executePath, commandLineArguments); + _tasks.insert(name, task); + return task; +} + +PlayerTask *PlayerTaskServiceWin::getTask(const std::string &name) +{ + auto it = _tasks.find(name); + return it != _tasks.end() ? it->second : nullptr; +} + +void PlayerTaskServiceWin::removeTask(const std::string &name) +{ + auto it = _tasks.find(name); + if (it != _tasks.end()) + { + if (!it->second->isCompleted()) + { + it->second->stop(); + } + _tasks.erase(it); + } +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerTaskServiceWin.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerTaskServiceWin.h new file mode 100644 index 0000000000..578bd81a0a --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerTaskServiceWin.h @@ -0,0 +1,65 @@ + +#ifndef __PLAYER_TASK_SERVICE_WIN_H_ +#define __PLAYER_TASK_SERVICE_WIN_H_ + +#include + +#include "PlayerTaskServiceProtocol.h" + +PLAYER_NS_BEGIN + +class PlayerTaskWin : public PlayerTask +{ +public: + static PlayerTaskWin *create(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + + virtual ~PlayerTaskWin(); + + virtual bool run(); + virtual void stop(); + virtual void runInTerminal(); + + // check task status + virtual void update(float dt); + +protected: + PlayerTaskWin(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + + void cleanup(); + std::u16string makeCommandLine() const; + + HANDLE _childStdInRead; + HANDLE _childStdInWrite; + HANDLE _childStdOutRead; + HANDLE _childStdOutWrite; + PROCESS_INFORMATION _pi; + + static const size_t BUFF_SIZE = 4096; + CHAR *_outputBuff; + WCHAR *_outputBuffWide; +}; + +class PlayerTaskServiceWin : public PlayerTaskServiceProtocol +{ +public: + PlayerTaskServiceWin(HWND hwnd); + virtual ~PlayerTaskServiceWin(); + + virtual PlayerTask *createTask(const std::string &name, + const std::string &executePath, + const std::string &commandLineArguments); + virtual PlayerTask *getTask(const std::string &name); + virtual void removeTask(const std::string &name); + +protected: + HWND _hwnd; + cocos2d::Map _tasks; +}; + +PLAYER_NS_END + +#endif // __PLAYER_TASK_SERVICE_WIN_H_ diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp new file mode 100644 index 0000000000..aa62c3033c --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.cpp @@ -0,0 +1,863 @@ + +#pragma comment(lib, "comctl32.lib") +#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'\"") + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PlayerWin.h" + +#include "glfw3.h" +#include "glfw3native.h" + +#include "CCLuaEngine.h" +#include "AppEvent.h" +#include "AppLang.h" +#include "ConfigParser.h" + +USING_NS_CC; + +static WNDPROC g_oldWindowProc = NULL; +INT_PTR CALLBACK AboutDialogCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + UNREFERENCED_PARAMETER(lParam); + switch (message) + { + case WM_INITDIALOG: + return (INT_PTR)TRUE; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, LOWORD(wParam)); + return (INT_PTR)TRUE; + } + break; + } + return (INT_PTR)FALSE; +} +void onHelpAbout() +{ + DialogBox(GetModuleHandle(NULL), + MAKEINTRESOURCE(IDD_DIALOG_ABOUT), + Director::getInstance()->getOpenGLView()->getWin32Window(), + AboutDialogCallback); +} + +void shutDownApp() +{ + auto glview = dynamic_cast (Director::getInstance()->getOpenGLView()); + HWND hWnd = glview->getWin32Window(); + ::SendMessage(hWnd, WM_CLOSE, NULL, NULL); +} + +std::string getCurAppPath(void) +{ + TCHAR szAppDir[MAX_PATH] = { 0 }; + if (!GetModuleFileName(NULL, szAppDir, MAX_PATH)) + return ""; + int nEnd = 0; + for (int i = 0; szAppDir[i]; i++) + { + if (szAppDir[i] == '\\') + nEnd = i; + } + szAppDir[nEnd] = 0; + int iLen = 2 * wcslen(szAppDir); + char* chRtn = new char[iLen + 1]; + wcstombs(chRtn, szAppDir, iLen + 1); + std::string strPath = chRtn; + delete[] chRtn; + chRtn = NULL; + char fuldir[MAX_PATH] = { 0 }; + _fullpath(fuldir, strPath.c_str(), MAX_PATH); + return fuldir; +} + +PLAYER_NS_BEGIN + +PlayerWin *PlayerWin::_instance = nullptr; + +PlayerWin::PlayerWin() + : _app(nullptr) + , _hwnd(NULL) + , _hwndConsole(NULL) + , _writeDebugLogFile(nullptr) + , _messageBoxService(nullptr) + , _menuService(nullptr) + , _editboxService(nullptr) + , _taskService(nullptr) +{ +} + +PlayerWin::~PlayerWin() +{ + CC_SAFE_DELETE(_menuService); + CC_SAFE_DELETE(_messageBoxService); + CC_SAFE_DELETE(_fileDialogService); + CC_SAFE_DELETE(_app); + if (_writeDebugLogFile) + { + fclose(_writeDebugLogFile); + } + + _instance = nullptr; +} + +PlayerWin *PlayerWin::getInstance() +{ + if (!_instance) + { + _instance = new PlayerWin(); + } + return _instance; +} + +PlayerFileDialogServiceProtocol *PlayerWin::getFileDialogService() +{ + return _fileDialogService; +} + +PlayerMessageBoxServiceProtocol *PlayerWin::getMessageBoxService() +{ + return _messageBoxService; +} + +PlayerMenuServiceProtocol *PlayerWin::getMenuService() +{ + return _menuService; +} + +PlayerEditBoxServiceProtocol *PlayerWin::getEditBoxService() +{ + return _editboxService; +} + +PlayerTaskServiceProtocol *PlayerWin::getTaskService() +{ + return _taskService; +} + +void PlayerWin::quit() +{ + Director::getInstance()->end(); +} + +void PlayerWin::relaunch() +{ + _project.setWindowOffset(Vec2(getPositionX(), getPositionY())); + openNewPlayerWithProjectConfig(_project); + + quit(); +} + +void PlayerWin::openNewPlayer() +{ + openNewPlayerWithProjectConfig(_project); +} + +void PlayerWin::openNewPlayerWithProjectConfig(const ProjectConfig &config) +{ + static long taskid = 100; + stringstream buf; + buf << taskid++; + + string commandLine; + commandLine.append(getApplicationExePath()); + commandLine.append(" "); + commandLine.append(config.makeCommandLine()); + + CCLOG("PlayerWin::openNewPlayerWithProjectConfig(): %s", commandLine.c_str()); + + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx + SECURITY_ATTRIBUTES sa = {0}; + sa.nLength = sizeof(sa); + + PROCESS_INFORMATION pi = {0}; + STARTUPINFO si = {0}; + si.cb = sizeof(STARTUPINFO); + +#define MAX_COMMAND 1024 // lenth of commandLine is always beyond MAX_PATH + + WCHAR command[MAX_COMMAND]; + memset(command, 0, sizeof(command)); + MultiByteToWideChar(CP_UTF8, 0, commandLine.c_str(), -1, command, MAX_COMMAND); + + BOOL success = CreateProcess(NULL, + command, // command line + NULL, // process security attributes + NULL, // primary thread security attributes + FALSE, // handles are inherited + 0, // creation flags + NULL, // use parent's environment + NULL, // use parent's current directory + &si, // STARTUPINFO pointer + &pi); // receives PROCESS_INFORMATION + + if (!success) + { + CCLOG("PlayerTaskWin::run() - create process failed, for execute %s", commandLine.c_str()); + } +} + +void PlayerWin::openProjectWithProjectConfig(const ProjectConfig &config) +{ + openNewPlayerWithProjectConfig(config); + quit(); +} + +int PlayerWin::getPositionX() +{ + RECT rect; + GetWindowRect(_hwnd, &rect); + return rect.left; +} + +int PlayerWin::getPositionY() +{ + RECT rect; + GetWindowRect(_hwnd, &rect); + return rect.top; +} + +int PlayerWin::run() +{ + INITCOMMONCONTROLSEX InitCtrls; + InitCtrls.dwSize = sizeof(InitCtrls); + InitCtrls.dwICC = ICC_WIN95_CLASSES; + InitCommonControlsEx(&InitCtrls); + + parseCocosProjectConfig(_project); + + // load project config from command line args + vector args; + for (int i = 0; i < __argc; ++i) + { + wstring ws(__wargv[i]); + string s; + s.assign(ws.begin(), ws.end()); + args.push_back(s); + } + _project.parseCommandLine(args); + + if (_project.getProjectDir().empty()) + { + if (args.size() == 2) + { + // for Code IDE before RC2 + _project.setProjectDir(args.at(1)); + _project.setDebuggerType(kCCRuntimeDebuggerCodeIDE); + } + } + + // create the application instance + _app = new AppDelegate(); + _app->setProjectConfig(_project); + + // create console window + if (_project.isShowConsole()) + { + AllocConsole(); + _hwndConsole = GetConsoleWindow(); + if (_hwndConsole != NULL) + { + ShowWindow(_hwndConsole, SW_SHOW); + BringWindowToTop(_hwndConsole); + freopen("CONOUT$", "wt", stdout); + freopen("CONOUT$", "wt", stderr); + + HMENU hmenu = GetSystemMenu(_hwndConsole, FALSE); + if (hmenu != NULL) + { + DeleteMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); + } + } + } + + // log file + if (_project.isWriteDebugLogToFile()) + { + const string debugLogFilePath = _project.getDebugLogFilePath(); + _writeDebugLogFile = fopen(debugLogFilePath.c_str(), "w"); + if (!_writeDebugLogFile) + { + CCLOG("Cannot create debug log file %s", debugLogFilePath.c_str()); + } + } + + // set environments + SetCurrentDirectoryA(_project.getProjectDir().c_str()); + FileUtils::getInstance()->setDefaultResourceRootPath(_project.getProjectDir()); + FileUtils::getInstance()->setWritablePath(_project.getWritableRealPath().c_str()); + + // check screen DPI + HDC screen = GetDC(0); + int dpi = GetDeviceCaps(screen, LOGPIXELSX); + ReleaseDC(0, screen); + + // set scale with DPI + // 96 DPI = 100 % scaling + // 120 DPI = 125 % scaling + // 144 DPI = 150 % scaling + // 192 DPI = 200 % scaling + // http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx#dpi_and_the_desktop_scaling_factor + // + // enable DPI-Aware with DeclareDPIAware.manifest + // http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx#declaring_dpi_awareness + float screenScale = 1.0f; + if (dpi >= 120 && dpi < 144) + { + screenScale = 1.25f; + } + else if (dpi >= 144 && dpi < 192) + { + screenScale = 1.5f; + } + else if (dpi >= 192) + { + screenScale = 2.0f; + } + CCLOG("SCREEN DPI = %d, SCREEN SCALE = %0.2f", dpi, screenScale); + + // create opengl view + Size frameSize = _project.getFrameSize(); + float frameScale = 1.0f; + if (_project.isRetinaDisplay()) + { + frameSize.width *= screenScale; + frameSize.height *= screenScale; + } + else + { + frameScale = screenScale; + } + + const Rect frameRect = Rect(0, 0, frameSize.width, frameSize.height); + const bool isResize = _project.isResizeWindow(); + std::stringstream title; + title << "Cocos Simulator - " << ConfigParser::getInstance()->getInitViewName(); + auto glview = GLViewImpl::createWithRect(title.str(), frameRect, frameScale); + _hwnd = glview->getWin32Window(); + DragAcceptFiles(_hwnd, TRUE); + //SendMessage(_hwnd, WM_SETICON, ICON_BIG, (LPARAM)icon); + //SendMessage(_hwnd, WM_SETICON, ICON_SMALL, (LPARAM)icon); + //FreeResource(icon); + + auto director = Director::getInstance(); + director->setOpenGLView(glview); + + director->setAnimationInterval(1.0 / 60.0); + + // set window position + if (_project.getProjectDir().length()) + { + setZoom(_project.getFrameScale()); + } + Vec2 pos = _project.getWindowOffset(); + if (pos.x != 0 && pos.y != 0) + { + RECT rect; + GetWindowRect(_hwnd, &rect); + MoveWindow(_hwnd, pos.x, pos.y, rect.right - rect.left, rect.bottom - rect.top, FALSE); + } + + // register event handlers + auto eventDispatcher = director->getEventDispatcher(); + eventDispatcher->addCustomEventListener("APP.VIEW_SCALE", CC_CALLBACK_1(PlayerWin::onWindowScale, this)); + + // path for looking Lang file, Studio Default images + FileUtils::getInstance()->addSearchPath(getApplicationPath().c_str()); + + // init player services + initServices(); + setupUI(); + DrawMenuBar(_hwnd); + + // prepare + FileUtils::getInstance()->setPopupNotify(false); + _project.dump(); + auto app = Application::getInstance(); + + g_oldWindowProc = (WNDPROC)SetWindowLong(_hwnd, GWL_WNDPROC, (LONG)PlayerWin::windowProc); + + // update window size + RECT rect; + GetWindowRect(_hwnd, &rect); + MoveWindow(_hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top + GetSystemMetrics(SM_CYMENU), FALSE); + + // startup message loop + return app->run(); +} + +// services +void PlayerWin::initServices() +{ + CCASSERT(_menuService == nullptr, "CAN'T INITIALIZATION SERVICES MORE THAN ONCE"); + _menuService = new PlayerMenuServiceWin(_hwnd); + _messageBoxService = new PlayerMessageBoxServiceWin(_hwnd); + _fileDialogService = new PlayerFileDialogServiceWin(_hwnd); + _editboxService = new PlayerEditBoxServiceWin(_hwnd); + _taskService = new PlayerTaskServiceWin(_hwnd); + + if (!_project.isAppMenu()) + { + // remove menu + SetMenu(_hwnd, NULL); + } +} + +void PlayerWin::onWindowScale(EventCustom* event) +{ + //float scale = atof(event->getDataString().c_str()); + //setZoom(scale); + + //if (_project.isAppMenu() && GetMenu(_hwnd)) + //{ + // // update window size + // RECT rect; + // GetWindowRect(_hwnd, &rect); + // MoveWindow(_hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top + GetSystemMetrics(SM_CYMENU), FALSE); + //} +} + +void PlayerWin::setupUI() +{ + auto menuBar = player::PlayerProtocol::getInstance()->getMenuService(); + + // FILE + menuBar->addItem("FILE_MENU", tr("File")); + menuBar->addItem("EXIT_MENU", tr("Exit"), "FILE_MENU"); + + // VIEW + menuBar->addItem("VIEW_MENU", tr("View")); + SimulatorConfig *config = SimulatorConfig::getInstance(); + int current = config->checkScreenSize(_project.getFrameSize()); + for (int i = 0; i < config->getScreenSizeCount(); i++) + { + SimulatorScreenSize size = config->getScreenSize(i); + std::stringstream menuId; + menuId << "VIEWSIZE_ITEM_MENU_" << i; + auto menuItem = menuBar->addItem(menuId.str(), size.title.c_str(), "VIEW_MENU"); + + if (i == current) + { + menuItem->setChecked(true); + } + } + + menuBar->addItem("DIRECTION_MENU_SEP", "-", "VIEW_MENU"); + menuBar->addItem("DIRECTION_PORTRAIT_MENU", tr("Portrait"), "VIEW_MENU") + ->setChecked(_project.isPortraitFrame()); + menuBar->addItem("DIRECTION_LANDSCAPE_MENU", tr("Landscape"), "VIEW_MENU") + ->setChecked(_project.isLandscapeFrame()); + + menuBar->addItem("VIEW_SCALE_MENU_SEP", "-", "VIEW_MENU"); + std::vector scaleMenuVector; + auto scale100Menu = menuBar->addItem("VIEW_SCALE_MENU_100", tr("Zoom Out").append(" (100%)"), "VIEW_MENU"); + auto scale75Menu = menuBar->addItem("VIEW_SCALE_MENU_75", tr("Zoom Out").append(" (75%)"), "VIEW_MENU"); + auto scale50Menu = menuBar->addItem("VIEW_SCALE_MENU_50", tr("Zoom Out").append(" (50%)"), "VIEW_MENU"); + auto scale25Menu = menuBar->addItem("VIEW_SCALE_MENU_25", tr("Zoom Out").append(" (25%)"), "VIEW_MENU"); + int frameScale = int(_project.getFrameScale() * 100); + if (frameScale == 100) + { + scale100Menu->setChecked(true); + } + else if (frameScale == 75) + { + scale75Menu->setChecked(true); + } + else if (frameScale == 50) + { + scale50Menu->setChecked(true); + } + else if (frameScale == 25) + { + scale25Menu->setChecked(true); + } + else + { + scale100Menu->setChecked(true); + } + + scaleMenuVector.push_back(scale100Menu); + scaleMenuVector.push_back(scale75Menu); + scaleMenuVector.push_back(scale50Menu); + scaleMenuVector.push_back(scale25Menu); + + menuBar->addItem("REFRESH_MENU_SEP", "-", "VIEW_MENU"); + menuBar->addItem("REFRESH_MENU", tr("Refresh"), "VIEW_MENU"); + + HWND &hwnd = _hwnd; + ProjectConfig &project = _project; + auto dispatcher = Director::getInstance()->getEventDispatcher(); + dispatcher->addEventListenerWithFixedPriority(EventListenerCustom::create("APP.EVENT", [&project, &hwnd, scaleMenuVector](EventCustom* event){ + auto menuEvent = dynamic_cast(event); + if (menuEvent) + { + rapidjson::Document dArgParse; + dArgParse.Parse<0>(menuEvent->getDataString().c_str()); + if (dArgParse.HasMember("name")) + { + string strcmd = dArgParse["name"].GetString(); + + if (strcmd == "menuClicked") + { + player::PlayerMenuItem *menuItem = static_cast(menuEvent->getUserData()); + if (menuItem) + { + if (menuItem->isChecked()) + { + return; + } + + string data = dArgParse["data"].GetString(); + auto player = player::PlayerProtocol::getInstance(); + + if ((data == "CLOSE_MENU") || (data == "EXIT_MENU")) + { + player->quit(); + } + else if (data == "REFRESH_MENU") + { + player->relaunch(); + } + else if (data.find("VIEW_SCALE_MENU_") == 0) // begin with VIEW_SCALE_MENU_ + { + string tmp = data.erase(0, strlen("VIEW_SCALE_MENU_")); + float scale = atof(tmp.c_str()) / 100.0f; + project.setFrameScale(scale); + + auto glview = static_cast(Director::getInstance()->getOpenGLView()); + glview->setFrameZoomFactor(scale); + + // update scale menu state + for (auto &it : scaleMenuVector) + { + it->setChecked(false); + } + menuItem->setChecked(true); + + // update window size + RECT rect; + GetWindowRect(hwnd, &rect); + MoveWindow(hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top + GetSystemMetrics(SM_CYMENU), FALSE); + + // fix: can not update window on some windows system + ::SendMessage(hwnd, WM_MOVE, NULL, NULL); + } + else if (data.find("VIEWSIZE_ITEM_MENU_") == 0) // begin with VIEWSIZE_ITEM_MENU_ + { + string tmp = data.erase(0, strlen("VIEWSIZE_ITEM_MENU_")); + int index = atoi(tmp.c_str()); + SimulatorScreenSize size = SimulatorConfig::getInstance()->getScreenSize(index); + + if (project.isLandscapeFrame()) + { + std::swap(size.width, size.height); + } + + project.setFrameSize(cocos2d::Size(size.width, size.height)); + project.setWindowOffset(cocos2d::Vec2(player->getPositionX(), player->getPositionY())); + player->openProjectWithProjectConfig(project); + } + else if (data == "DIRECTION_PORTRAIT_MENU") + { + project.changeFrameOrientationToPortait(); + player->openProjectWithProjectConfig(project); + } + else if (data == "DIRECTION_LANDSCAPE_MENU") + { + project.changeFrameOrientationToLandscape(); + player->openProjectWithProjectConfig(project); + } + } + } + } + } + }), 1); + + AppDelegate *app = _app; + auto listener = EventListenerCustom::create(kAppEventDropName, [&project, app](EventCustom* event) + { + AppEvent *dropEvent = dynamic_cast(event); + if (dropEvent) + { + string dirPath = dropEvent->getDataString() + "/"; + string configFilePath = dirPath + CONFIG_FILE; + + if (FileUtils::getInstance()->isDirectoryExist(dirPath) && + FileUtils::getInstance()->isFileExist(configFilePath)) + { + // parse config.json + ConfigParser::getInstance()->readConfig(configFilePath); + + project.setProjectDir(dirPath); + project.setScriptFile(ConfigParser::getInstance()->getEntryFile()); + project.setWritablePath(dirPath); + + app->setProjectConfig(project); + app->reopenProject(); + } + } + }); + dispatcher->addEventListenerWithFixedPriority(listener, 1); +} + +void PlayerWin::setZoom(float frameScale) +{ + _project.setFrameScale(frameScale); + cocos2d::Director::getInstance()->getOpenGLView()->setFrameZoomFactor(frameScale); +} + +// debug log +void PlayerWin::writeDebugLog(const char *log) +{ + if (!_writeDebugLogFile) return; + + fputs(log, _writeDebugLogFile); + fputc('\n', _writeDebugLogFile); + fflush(_writeDebugLogFile); +} + +void PlayerWin::parseCocosProjectConfig(ProjectConfig &config) +{ + // get project directory + ProjectConfig tmpConfig; + // load project config from command line args + vector args; + for (int i = 0; i < __argc; ++i) + { + wstring ws(__wargv[i]); + string s; + s.assign(ws.begin(), ws.end()); + args.push_back(s); + } + + if (args.size() >= 2) + { + if (args.size() && args.at(1).at(0) == '/') + { + // FIXME: + // for Code IDE before RC2 + tmpConfig.setProjectDir(args.at(1)); + } + + tmpConfig.parseCommandLine(args); + } + + // set project directory as search root path + FileUtils::getInstance()->setDefaultResourceRootPath(tmpConfig.getProjectDir().c_str()); + + // parse config.json + auto parser = ConfigParser::getInstance(); + auto configPath = tmpConfig.getProjectDir().append(CONFIG_FILE); + parser->readConfig(configPath); + + // set information + config.setConsolePort(parser->getConsolePort()); + config.setFileUploadPort(parser->getUploadPort()); + config.setFrameSize(parser->getInitViewSize()); + if (parser->isLanscape()) + { + config.changeFrameOrientationToLandscape(); + } + config.setScriptFile(parser->getEntryFile()); +} + +// +// D:\aaa\bbb\ccc\ddd\abc.txt --> D:/aaa/bbb/ccc/ddd/abc.txt +// +std::string PlayerWin::convertPathFormatToUnixStyle(const std::string& path) +{ + std::string ret = path; + int len = ret.length(); + for (int i = 0; i < len; ++i) + { + if (ret[i] == '\\') + { + ret[i] = '/'; + } + } + return ret; +} + +// +// @return: C:/Users/win8/Documents/ +// +std::string PlayerWin::getUserDocumentPath() +{ + TCHAR filePath[MAX_PATH]; + SHGetSpecialFolderPath(NULL, filePath, CSIDL_PERSONAL, FALSE); + int length = 2 * wcslen(filePath); + char* tempstring = new char[length + 1]; + wcstombs(tempstring, filePath, length + 1); + string userDocumentPath(tempstring); + free(tempstring); + + userDocumentPath = convertPathFormatToUnixStyle(userDocumentPath); + userDocumentPath.append("/"); + + return userDocumentPath; +} + +// +// convert Unicode/LocalCode TCHAR to Utf8 char +// +char* PlayerWin::convertTCharToUtf8(const TCHAR* src) +{ +#ifdef UNICODE + WCHAR* tmp = (WCHAR*)src; + size_t size = wcslen(src) * 3 + 1; + char* dest = new char[size]; + memset(dest, 0, size); + WideCharToMultiByte(CP_UTF8, 0, tmp, -1, dest, size, NULL, NULL); + return dest; +#else + char* tmp = (char*)src; + uint32 size = strlen(tmp) + 1; + WCHAR* dest = new WCHAR[size]; + memset(dest, 0, sizeof(WCHAR)*size); + MultiByteToWideChar(CP_ACP, 0, src, -1, dest, (int)size); // convert local code to unicode. + + size = wcslen(dest) * 3 + 1; + char* dest2 = new char[size]; + memset(dest2, 0, size); + WideCharToMultiByte(CP_UTF8, 0, dest, -1, dest2, size, NULL, NULL); // convert unicode to utf8. + delete[] dest; + return dest2; +#endif +} + +// +std::string PlayerWin::getApplicationExePath() +{ + TCHAR szFileName[MAX_PATH]; + GetModuleFileName(NULL, szFileName, MAX_PATH); + std::u16string u16ApplicationName; + char *applicationExePath = convertTCharToUtf8(szFileName); + std::string path(applicationExePath); + CC_SAFE_FREE(applicationExePath); + + return path; +} + +std::string PlayerWin::getApplicationPath() +{ + std::string path = getApplicationExePath(); + size_t pos; + while ((pos = path.find_first_of("\\")) != std::string::npos) + { + path.replace(pos, 1, "/"); + } + size_t p = path.find_last_of("/"); + string workdir; + if (p != path.npos) + { + workdir = path.substr(0, p); + } + + return workdir; +} + +LRESULT CALLBACK PlayerWin::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (!_instance) return 0; + + switch (uMsg) + { + case WM_COMMAND: + { + if (HIWORD(wParam) == 0) + { + // menu + WORD menuId = LOWORD(wParam); + PlayerMenuItemWin *menuItem = _instance->_menuService->getItemByCommandId(menuId); + if (menuItem) + { + AppEvent event("APP.EVENT", APP_EVENT_MENU); + + std::stringstream buf; + buf << "{\"data\":\"" << menuItem->getMenuId().c_str() << "\""; + buf << ",\"name\":" << "\"menuClicked\"" << "}"; + event.setDataString(buf.str()); + event.setUserData(menuItem); + Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); + } + + if (menuId == ID_HELP_ABOUT) + { + onHelpAbout(); + } + } + break; + } + case WM_KEYDOWN: + { + if (wParam == VK_F5) + { + PlayerProtocol::getInstance()->relaunch(); + } + break; + } + + case WM_COPYDATA: + { + PCOPYDATASTRUCT pMyCDS = (PCOPYDATASTRUCT) lParam; + if (pMyCDS->dwData == 1) + { + const char *szBuf = (const char*)(pMyCDS->lpData); + PlayerWin::getInstance()->writeDebugLog(szBuf); + break; + } + } + + case WM_DESTROY: + { + DragAcceptFiles(hWnd, FALSE); + break; + } + + case WM_DROPFILES: + { + HDROP hDrop = (HDROP)wParam; + + const int count = DragQueryFileW(hDrop, 0xffffffff, NULL, 0); + + if (count > 0) + { + int fileIndex = 0; + + const UINT length = DragQueryFileW(hDrop, fileIndex, NULL, 0); + WCHAR* buffer = (WCHAR*)calloc(length + 1, sizeof(WCHAR)); + + DragQueryFileW(hDrop, fileIndex, buffer, length + 1); + char *utf8 = PlayerWin::convertTCharToUtf8(buffer); + std::string firstFile(utf8); + CC_SAFE_FREE(utf8); + DragFinish(hDrop); + + // broadcast drop event + AppEvent forwardEvent("APP.EVENT.DROP", APP_EVENT_DROP); + forwardEvent.setDataString(firstFile); + + Director::getInstance()->getEventDispatcher()->dispatchEvent(&forwardEvent); + } + } // WM_DROPFILES + + } + return g_oldWindowProc(hWnd, uMsg, wParam, lParam); +} + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.h new file mode 100644 index 0000000000..8b815ab5f0 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/PlayerWin.h @@ -0,0 +1,82 @@ +#pragma once + +#include "stdafx.h" +#include "Resource.h" +#include "cocos2d.h" +#include "AppDelegate.h" +#include "ProjectConfig/ProjectConfig.h" +#include "ProjectConfig/SimulatorConfig.h" + +#include "PlayerMacros.h" +#include "PlayerProtocol.h" +#include "PlayerMenuServiceWin.h" +#include "PlayerMessageBoxServiceWin.h" +#include "PlayerFileDialogServiceWin.h" +#include "PlayerEditBoxServiceWin.h" +#include "PlayerTaskServiceWin.h" + +PLAYER_NS_BEGIN + +class PlayerWin : public PlayerProtocol, public cocos2d::Ref +{ +public: + static PlayerWin *getInstance(); + virtual ~PlayerWin(); + int run(); + + virtual PlayerFileDialogServiceProtocol *getFileDialogService(); + virtual PlayerMessageBoxServiceProtocol *getMessageBoxService(); + virtual PlayerMenuServiceProtocol *getMenuService(); + virtual PlayerEditBoxServiceProtocol *getEditBoxService(); + virtual PlayerTaskServiceProtocol *getTaskService(); + + virtual void quit(); + virtual void relaunch(); + virtual void openNewPlayer(); + virtual void openNewPlayerWithProjectConfig(const ProjectConfig &config); + virtual void openProjectWithProjectConfig(const ProjectConfig &config); + + virtual int getPositionX(); + virtual int getPositionY(); +protected: + PlayerWin(); + + static PlayerWin *_instance; + ProjectConfig _project; + HWND _hwnd; + HWND _hwndConsole; + AppDelegate *_app; + FILE *_writeDebugLogFile; + + PlayerMenuServiceWin *_menuService; + PlayerMessageBoxServiceWin *_messageBoxService; + PlayerFileDialogServiceWin *_fileDialogService; + PlayerEditBoxServiceWin *_editboxService; + PlayerTaskServiceWin *_taskService; + + // services + void initServices(); + + // event handlers + void onWindowScale(cocos2d::EventCustom* event); + + // + void setupUI(); + void setZoom(float frameScale); + + // debug log + void writeDebugLog(const char *log); + void parseCocosProjectConfig(ProjectConfig &config); + + // helper + std::string convertPathFormatToUnixStyle(const std::string& path); + std::string getUserDocumentPath(); + std::string getApplicationExePath(); + std::string getApplicationPath(); + static char* convertTCharToUtf8(const TCHAR* src); + + static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +}; + + +PLAYER_NS_END diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/resource.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/resource.h new file mode 100644 index 0000000000..7515c91c41 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/resource.h @@ -0,0 +1,38 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by game.rc +// +#define IDS_PROJNAME 100 +#define IDR_TESTLUA 100 +#define IDR_MENU_COCOS 201 +#define IDD_DIALOG1 202 +#define IDD_DIALOG_ABOUT 202 +#define IDC_EDIT2 1001 +#define ID_VIEW_SIZE 30001 +#define ID_FILE_NEW_WINDOW 32771 +#define ID_VIEW_PORTRAIT 32775 +#define ID_VIEW_LANDSCAPE 32776 +#define ID_VIEW_CUSTOM 32777 +#define ID_HELP_ABOUT 32778 +#define ID_FILE_EXIT 32779 +#define ID_Menu 32780 +#define ID_Menu32781 32781 +#define ID_TEST_RESET 32782 +#define ID_CONTROL 32783 +#define ID_CONTROL_RELOAD 32784 +#define ID_VIEW_ZOOMOUT100 32785 +#define ID_VIEW_ZOOMOUT75 32786 +#define ID_VIEW_ZOOMOUT50 32787 +#define ID_VIEW_ZOOMOUT25 32788 +#define ID_CONTROL_TOP 32793 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 204 +#define _APS_NEXT_COMMAND_VALUE 32794 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/stdafx.cpp b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/stdafx.cpp new file mode 100644 index 0000000000..b8b9773e01 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// player.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/stdafx.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/stdafx.h new file mode 100644 index 0000000000..bb80440ee2 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/stdafx.h @@ -0,0 +1,21 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + +// C RunTime Header Files +#include +#include +#include +#include + + +// TODO: reference additional headers your program requires here diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/targetver.h b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/targetver.h new file mode 100644 index 0000000000..87c0086de7 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/service/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/tests/cpp-empty-test/Resources/ipad/CloseNormal.png b/tests/cpp-empty-test/Resources/ipad/CloseNormal.png index 85a44c0d03..70030ec75a 100644 Binary files a/tests/cpp-empty-test/Resources/ipad/CloseNormal.png and b/tests/cpp-empty-test/Resources/ipad/CloseNormal.png differ diff --git a/tests/cpp-empty-test/Resources/ipad/CloseSelected.png b/tests/cpp-empty-test/Resources/ipad/CloseSelected.png index 42c55a30a2..2227e6e175 100644 Binary files a/tests/cpp-empty-test/Resources/ipad/CloseSelected.png and b/tests/cpp-empty-test/Resources/ipad/CloseSelected.png differ diff --git a/tests/cpp-empty-test/Resources/ipad/HelloWorld.png b/tests/cpp-empty-test/Resources/ipad/HelloWorld.png index 709d78b7f3..52f4a6a300 100644 Binary files a/tests/cpp-empty-test/Resources/ipad/HelloWorld.png and b/tests/cpp-empty-test/Resources/ipad/HelloWorld.png differ diff --git a/tests/cpp-empty-test/Resources/ipadhd/CloseNormal.png b/tests/cpp-empty-test/Resources/ipadhd/CloseNormal.png index c0cac81271..bee9c18843 100644 Binary files a/tests/cpp-empty-test/Resources/ipadhd/CloseNormal.png and b/tests/cpp-empty-test/Resources/ipadhd/CloseNormal.png differ diff --git a/tests/cpp-empty-test/Resources/ipadhd/CloseSelected.png b/tests/cpp-empty-test/Resources/ipadhd/CloseSelected.png index 8df43e29a4..311603fed6 100644 Binary files a/tests/cpp-empty-test/Resources/ipadhd/CloseSelected.png and b/tests/cpp-empty-test/Resources/ipadhd/CloseSelected.png differ diff --git a/tests/cpp-empty-test/Resources/ipadhd/HelloWorld.png b/tests/cpp-empty-test/Resources/ipadhd/HelloWorld.png index 7aa1e9dc79..6775fb99f1 100644 Binary files a/tests/cpp-empty-test/Resources/ipadhd/HelloWorld.png and b/tests/cpp-empty-test/Resources/ipadhd/HelloWorld.png differ diff --git a/tests/cpp-empty-test/Resources/iphone/CloseNormal.png b/tests/cpp-empty-test/Resources/iphone/CloseNormal.png index 8ff9369dc9..a52fde01ea 100644 Binary files a/tests/cpp-empty-test/Resources/iphone/CloseNormal.png and b/tests/cpp-empty-test/Resources/iphone/CloseNormal.png differ diff --git a/tests/cpp-empty-test/Resources/iphone/CloseSelected.png b/tests/cpp-empty-test/Resources/iphone/CloseSelected.png index f75c4179a5..c6527a903f 100644 Binary files a/tests/cpp-empty-test/Resources/iphone/CloseSelected.png and b/tests/cpp-empty-test/Resources/iphone/CloseSelected.png differ diff --git a/tests/cpp-empty-test/Resources/iphone/HelloWorld.png b/tests/cpp-empty-test/Resources/iphone/HelloWorld.png index 9d6facb318..ccb48aad5e 100644 Binary files a/tests/cpp-empty-test/Resources/iphone/HelloWorld.png and b/tests/cpp-empty-test/Resources/iphone/HelloWorld.png differ diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp index 0a4f31b5bb..444a4d0f13 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -27,107 +27,6 @@ THE SOFTWARE. #include #include "../testResource.h" -////////////DrawLine///////////////////// - -class DrawLine3D: public Node -{ -public: - /** creates and initialize a node */ - static DrawLine3D* create(); - - /** - * Draw 3D Line - */ - void drawLine(const Vec3 &from, const Vec3 &to, const Color4F &color); - - /** Clear the geometry in the node's buffer. */ - void clear() - { - _buffer.clear(); - } - - void onDraw(const Mat4 &transform, uint32_t flags); - - // Overrides - virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; - -CC_CONSTRUCTOR_ACCESS: - DrawLine3D() - { - - } - virtual ~DrawLine3D() - { - - } - virtual bool init(); - -protected: - struct V3F_C4B - { - Vec3 vertices; - Color4B colors; - }; - - std::vector _buffer; - - CustomCommand _customCommand; - -private: - CC_DISALLOW_COPY_AND_ASSIGN(DrawLine3D); -}; - -DrawLine3D* DrawLine3D::create() -{ - auto ret = new (std::nothrow) DrawLine3D(); - if (ret && ret->init()) - return ret; - CC_SAFE_DELETE(ret); - return nullptr; -} - -bool DrawLine3D::init() -{ - setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_COLOR)); - return true; -} - -void DrawLine3D::drawLine(const Vec3 &from, const Vec3 &to, const Color4F &color) -{ - Color4B col = Color4B(color); - DrawLine3D::V3F_C4B vertex; - vertex.vertices = from; - vertex.colors = col; - _buffer.push_back(vertex); - vertex.vertices = to; - _buffer.push_back(vertex); -} - -void DrawLine3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) -{ - _customCommand.init(_globalZOrder); - _customCommand.func = CC_CALLBACK_0(DrawLine3D::onDraw, this, transform, flags); - renderer->addCommand(&_customCommand); -} - -void DrawLine3D::onDraw(const Mat4 &transform, uint32_t flags) -{ - auto glProgram = getGLProgram(); - glProgram->use(); - glProgram->setUniformsForBuiltins(transform); - glEnable(GL_DEPTH_TEST); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_POSITION); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(V3F_C4B), &(_buffer[0].vertices)); - - glEnableVertexAttribArray(GLProgram::VERTEX_ATTRIB_COLOR); - glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(V3F_C4B), &(_buffer[0].colors)); - glDrawArrays(GL_LINES, 0, static_cast(_buffer.size())); - glDisable(GL_DEPTH_TEST); -} - -//////////////////////////////////////////////////////////////////////////////// - enum { IDC_NEXT = 100, @@ -140,6 +39,7 @@ static int sceneIdx = -1; static std::function createFunctions[] = { CL(Camera3DTestDemo), + CL(CameraClippingDemo) }; #define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0])) @@ -354,7 +254,7 @@ void Camera3DTestDemo::onEnter() _layer3D->addChild(_camera); } SwitchViewCallback(this,CameraType::ThirdCamera); - DrawLine3D* line =DrawLine3D::create(); + DrawNode3D* line =DrawNode3D::create(); //draw x for( int j =-20; j<=20 ;j++) { @@ -755,6 +655,314 @@ void Camera3DTestDemo::onTouchesRotateRightEnd(Touch* touch, Event* event) { _bRotateRight = false; } + +//////////////////////////////////////////////////////////// +// CameraClippingDemo +CameraClippingDemo::CameraClippingDemo(void) +: BaseTest() +, _layer3D(nullptr) +, _cameraType(CameraType::FirstCamera) +, _cameraFirst(nullptr) +, _cameraThird(nullptr) +, _moveAction(nullptr) +, _drawAABB(nullptr) +, _drawFrustum(nullptr) +, _row(3) +{ +} +CameraClippingDemo::~CameraClippingDemo(void) +{ +} + +std::string CameraClippingDemo::title() const +{ + return "Camera Frustum Clipping"; +} + +void CameraClippingDemo::restartCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild(restartSpriteTestAction()); + + Director::getInstance()->replaceScene(s); + s->release(); +} + +void CameraClippingDemo::nextCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild( nextSpriteTestAction() ); + Director::getInstance()->replaceScene(s); + s->release(); +} + +void CameraClippingDemo::backCallback(Ref* sender) +{ + auto s = new (std::nothrow) Camera3DTestScene(); + s->addChild( backSpriteTestAction() ); + Director::getInstance()->replaceScene(s); + s->release(); +} + +void CameraClippingDemo::onEnter() +{ + BaseTest::onEnter(); + schedule(schedule_selector(CameraClippingDemo::update), 0.0f); + + auto s = Director::getInstance()->getWinSize(); + auto listener = EventListenerTouchAllAtOnce::create(); + listener->onTouchesBegan = CC_CALLBACK_2(CameraClippingDemo::onTouchesBegan, this); + listener->onTouchesMoved = CC_CALLBACK_2(CameraClippingDemo::onTouchesMoved, this); + listener->onTouchesEnded = CC_CALLBACK_2(CameraClippingDemo::onTouchesEnded, this); + _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); + auto layer3D=Layer::create(); + addChild(layer3D,0); + _layer3D=layer3D; + + // swich camera + MenuItemFont::setFontName("fonts/arial.ttf"); + MenuItemFont::setFontSize(20); + + auto menuItem1 = MenuItemFont::create("Switch Camera", CC_CALLBACK_1(CameraClippingDemo::switchViewCallback,this)); + menuItem1->setColor(Color3B(0,200,20)); + auto menu = Menu::create(menuItem1,NULL); + menu->setPosition(Vec2::ZERO); + menuItem1->setPosition(VisibleRect::left().x + 80, VisibleRect::top().y -70); + addChild(menu, 1); + + // + - + MenuItemFont::setFontSize(40); + auto decrease = MenuItemFont::create(" - ", CC_CALLBACK_1(CameraClippingDemo::delSpriteCallback, this)); + decrease->setColor(Color3B(0,200,20)); + auto increase = MenuItemFont::create(" + ", CC_CALLBACK_1(CameraClippingDemo::addSpriteCallback, this)); + increase->setColor(Color3B(0,200,20)); + + menu = Menu::create(decrease, increase, nullptr); + menu->alignItemsHorizontally(); + menu->setPosition(Vec2(s.width - 60, VisibleRect::top().y -70)); + addChild(menu, 1); + + TTFConfig ttfCount("fonts/Marker Felt.ttf", 30); + _labelSprite3DCount = Label::createWithTTF(ttfCount,"0 sprits"); + _labelSprite3DCount->setColor(Color3B(0,200,20)); + _labelSprite3DCount->setPosition(Vec2(s.width/2, VisibleRect::top().y -70)); + addChild(_labelSprite3DCount); + + // aabb drawNode3D + _drawAABB = DrawNode3D::create(); + _drawAABB->setCameraMask((unsigned short) CameraFlag::USER1); + addChild(_drawAABB); + + // frustum drawNode3D + _drawFrustum = DrawNode3D::create(); + _drawFrustum->setCameraMask((unsigned short) CameraFlag::USER1); + addChild(_drawFrustum); + + // set camera + switchViewCallback(this); + + // add sprite + addSpriteCallback(nullptr); +} + +void CameraClippingDemo::onExit() +{ + BaseTest::onExit(); + if (_cameraFirst) + { + _cameraFirst = nullptr; + } + if (_cameraThird) + { + _cameraThird = nullptr; + } +} + +void CameraClippingDemo::update(float dt) +{ + _drawAABB->clear(); + + if(_cameraType == CameraType::ThirdCamera) + drawCameraFrustum(); + + Vector& children = _layer3D->getChildren(); + Vec3 corners[8]; + + for (const auto& iter: children) + { + const AABB& aabb = static_cast(iter)->getAABB(); + if (_cameraFirst->isVisibleInFrustum(&aabb)) + { + aabb.getCorners(corners); + _drawAABB->drawCube(corners, Color4F(0, 1, 0, 1)); + } + } +} + +void CameraClippingDemo::reachEndCallBack() +{ + _cameraFirst->stopActionByTag(100); + auto inverse = (MoveTo*)_moveAction->reverse(); + inverse->retain(); + _moveAction->release(); + _moveAction = inverse; + auto rot = RotateBy::create(1.f, Vec3(0.f, 180.f, 0.f)); + auto seq = Sequence::create(rot, _moveAction, CallFunc::create(CC_CALLBACK_0(CameraClippingDemo::reachEndCallBack, this)), nullptr); + seq->setTag(100); + _cameraFirst->runAction(seq); +} + +void CameraClippingDemo::switchViewCallback(Ref* sender) +{ + auto s = Director::getInstance()->getWinSize(); + + if (_cameraFirst == nullptr) + { + _cameraFirst = Camera::createPerspective(30, (GLfloat)s.width/s.height, 10, 200); + _cameraFirst->setCameraFlag(CameraFlag::USER8); + _cameraFirst->setPosition3D(Vec3(-100,0,0)); + _cameraFirst->lookAt(Vec3(1000,0,0), Vec3(0, 1, 0)); + _moveAction = MoveTo::create(4.f, Vec2(100, 0)); + _moveAction->retain(); + auto seq = Sequence::create(_moveAction, CallFunc::create(CC_CALLBACK_0(CameraClippingDemo::reachEndCallBack, this)), nullptr); + seq->setTag(100); + _cameraFirst->runAction(seq); + addChild(_cameraFirst); + } + + if (_cameraThird == nullptr) + { + _cameraThird = Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000); + _cameraThird->setCameraFlag(CameraFlag::USER8); + _cameraThird->setPosition3D(Vec3(0, 130, 130)); + _cameraThird->lookAt(Vec3(0,0,0), Vec3(0, 1, 0)); + addChild(_cameraThird); + } + + if(_cameraType == CameraType::FirstCamera) + { + _cameraType = CameraType::ThirdCamera; + _cameraThird->setCameraFlag(CameraFlag::USER1); + _cameraThird->enableFrustumCulling(false, false); + _cameraFirst->setCameraFlag(CameraFlag::USER8); + } + else if(_cameraType == CameraType::ThirdCamera) + { + _cameraType = CameraType::FirstCamera; + _cameraFirst->setCameraFlag(CameraFlag::USER1); + _cameraFirst->enableFrustumCulling(true, true); + _cameraThird->setCameraFlag(CameraFlag::USER8); + _drawFrustum->clear(); + } +} + +void CameraClippingDemo::addSpriteCallback(Ref* sender) +{ + _layer3D->removeAllChildren(); + _objects.clear(); + _drawAABB->clear(); + + ++_row; + for (int x = -_row; x < _row; x++) + { + for (int z = -_row; z < _row; z++) + { + auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b"); + sprite->setPosition3D(Vec3(x * 30, 0, z * 30)); + sprite->setRotation3D(Vec3(0,180,0)); + _objects.push_back(sprite); + _layer3D->addChild(sprite); + } + } + + // set layer mask. + _layer3D->setCameraMask( (unsigned short) CameraFlag::USER1); + + // update sprite number + char szText[16]; + sprintf(szText,"%ld sprits",_layer3D->getChildrenCount()); + _labelSprite3DCount->setString(szText); +} + +void CameraClippingDemo::delSpriteCallback(Ref* sender) +{ + if (_row == 0) return; + + _layer3D->removeAllChildren(); + _objects.clear(); + + --_row; + for (int x = -_row; x < _row; x++) + { + for (int z = -_row; z < _row; z++) + { + auto sprite = Sprite3D::create("Sprite3DTest/orc.c3b"); + sprite->setPosition3D(Vec3(x * 30, 0, z * 30)); + _objects.push_back(sprite); + _layer3D->addChild(sprite); + } + } + + // set layer mask. + _layer3D->setCameraMask((unsigned short) CameraFlag::USER1); + + // update sprite number + char szText[16]; + sprintf(szText,"%ld sprits",_layer3D->getChildrenCount()); + _labelSprite3DCount->setString(szText); +} + +void CameraClippingDemo::drawCameraFrustum() +{ + _drawFrustum->clear(); + auto size = Director::getInstance()->getWinSize(); + + Color4F color(1.f, 1.f, 0.f, 1); + + // top-left + Vec3 tl_0,tl_1; + Vec3 src(0,0,0); + _cameraFirst->unproject(size, &src, &tl_0); + src = Vec3(0,0,1); + _cameraFirst->unproject(size, &src, &tl_1); + + // top-right + Vec3 tr_0,tr_1; + src = Vec3(size.width,0,0); + _cameraFirst->unproject(size, &src, &tr_0); + src = Vec3(size.width,0,1); + _cameraFirst->unproject(size, &src, &tr_1); + + // bottom-left + Vec3 bl_0,bl_1; + src = Vec3(0,size.height,0); + _cameraFirst->unproject(size, &src, &bl_0); + src = Vec3(0,size.height,1); + _cameraFirst->unproject(size, &src, &bl_1); + + // bottom-right + Vec3 br_0,br_1; + src = Vec3(size.width,size.height,0); + _cameraFirst->unproject(size, &src, &br_0); + src = Vec3(size.width,size.height,1); + _cameraFirst->unproject(size, &src, &br_1); + + _drawFrustum->drawLine(tl_0, tl_1, color); + _drawFrustum->drawLine(tr_0, tr_1, color); + _drawFrustum->drawLine(bl_0, bl_1, color); + _drawFrustum->drawLine(br_0, br_1, color); + + _drawFrustum->drawLine(tl_0, tr_0, color); + _drawFrustum->drawLine(tr_0, br_0, color); + _drawFrustum->drawLine(br_0, bl_0, color); + _drawFrustum->drawLine(bl_0, tl_0, color); + + _drawFrustum->drawLine(tl_1, tr_1, color); + _drawFrustum->drawLine(tr_1, br_1, color); + _drawFrustum->drawLine(br_1, bl_1, color); + _drawFrustum->drawLine(bl_1, tl_1, color); +} + void Camera3DTestScene::runThisTest() { auto layer = nextSpriteTestAction(); diff --git a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h index 9d24a0fdb7..21eb61a872 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.h @@ -27,11 +27,14 @@ THE SOFTWARE. #include "../testBasic.h" #include "../BaseTest.h" +#include "../Sprite3DTest/DrawNode3D.h" #include + namespace cocos2d { class Sprite3D; class Delay; } + enum State { State_None = 0, @@ -106,6 +109,45 @@ protected: Label* _ZoomInlabel; Label* _ZoomOutlabel; }; + +class CameraClippingDemo : public BaseTest +{ +public: + CREATE_FUNC(CameraClippingDemo); + CameraClippingDemo(void); + virtual ~CameraClippingDemo(void); + + void restartCallback(Ref* sender); + void nextCallback(Ref* sender); + void backCallback(Ref* sender); + + virtual void onEnter() override; + virtual void onExit() override; + + virtual void update(float dt) override; + + // overrides + virtual std::string title() const override; + void reachEndCallBack(); + void switchViewCallback(Ref* sender); + void addSpriteCallback(Ref* sender); + void delSpriteCallback(Ref* sender); + + void drawCameraFrustum(); + +protected: + Label* _labelSprite3DCount; + Layer* _layer3D; + std::vector _objects; + CameraType _cameraType; + Camera* _cameraFirst; + Camera* _cameraThird; + MoveBy* _moveAction; + DrawNode3D* _drawAABB; + DrawNode3D* _drawFrustum; + int _row; +}; + class Camera3DTestScene : public TestScene { public: diff --git a/tests/cpp-tests/Resources/Images/Comet.png b/tests/cpp-tests/Resources/Images/Comet.png index fa1209bc51..2d127a3816 100755 Binary files a/tests/cpp-tests/Resources/Images/Comet.png and b/tests/cpp-tests/Resources/Images/Comet.png differ diff --git a/tests/cpp-tests/Resources/Images/CyanSquare.png b/tests/cpp-tests/Resources/Images/CyanSquare.png index 6d0efb7003..a09e345c3a 100755 Binary files a/tests/cpp-tests/Resources/Images/CyanSquare.png and b/tests/cpp-tests/Resources/Images/CyanSquare.png differ diff --git a/tests/cpp-tests/Resources/Images/CyanTriangle.png b/tests/cpp-tests/Resources/Images/CyanTriangle.png index b443ce9ba9..d98aff8dcb 100755 Binary files a/tests/cpp-tests/Resources/Images/CyanTriangle.png and b/tests/cpp-tests/Resources/Images/CyanTriangle.png differ diff --git a/tests/cpp-tests/Resources/Images/Fog.png b/tests/cpp-tests/Resources/Images/Fog.png index fc30666cf7..1634043480 100755 Binary files a/tests/cpp-tests/Resources/Images/Fog.png and b/tests/cpp-tests/Resources/Images/Fog.png differ diff --git a/tests/cpp-tests/Resources/Images/HelloWorld.png b/tests/cpp-tests/Resources/Images/HelloWorld.png index 5fe89fb5bd..b92aeeb7f6 100755 Binary files a/tests/cpp-tests/Resources/Images/HelloWorld.png and b/tests/cpp-tests/Resources/Images/HelloWorld.png differ diff --git a/tests/cpp-tests/Resources/Images/Icon.png b/tests/cpp-tests/Resources/Images/Icon.png index 4fcc6fddff..378483a33d 100755 Binary files a/tests/cpp-tests/Resources/Images/Icon.png and b/tests/cpp-tests/Resources/Images/Icon.png differ diff --git a/tests/cpp-tests/Resources/Images/MagentaSquare.png b/tests/cpp-tests/Resources/Images/MagentaSquare.png index e9f161e7ac..e27f4ffbe9 100755 Binary files a/tests/cpp-tests/Resources/Images/MagentaSquare.png and b/tests/cpp-tests/Resources/Images/MagentaSquare.png differ diff --git a/tests/cpp-tests/Resources/Images/Pea.png b/tests/cpp-tests/Resources/Images/Pea.png index 4b97bd1265..8575e84651 100755 Binary files a/tests/cpp-tests/Resources/Images/Pea.png and b/tests/cpp-tests/Resources/Images/Pea.png differ diff --git a/tests/cpp-tests/Resources/Images/PlanetCute-1024x1024.png b/tests/cpp-tests/Resources/Images/PlanetCute-1024x1024.png index c839baf999..7b047c6f1b 100644 Binary files a/tests/cpp-tests/Resources/Images/PlanetCute-1024x1024.png and b/tests/cpp-tests/Resources/Images/PlanetCute-1024x1024.png differ diff --git a/tests/cpp-tests/Resources/Images/SendScoreButton.png b/tests/cpp-tests/Resources/Images/SendScoreButton.png index c0b900a5eb..974b5193dd 100755 Binary files a/tests/cpp-tests/Resources/Images/SendScoreButton.png and b/tests/cpp-tests/Resources/Images/SendScoreButton.png differ diff --git a/tests/cpp-tests/Resources/Images/SendScoreButtonPressed.png b/tests/cpp-tests/Resources/Images/SendScoreButtonPressed.png index 71a4316b42..e650bc4d36 100755 Binary files a/tests/cpp-tests/Resources/Images/SendScoreButtonPressed.png and b/tests/cpp-tests/Resources/Images/SendScoreButtonPressed.png differ diff --git a/tests/cpp-tests/Resources/Images/SpinningPeas.png b/tests/cpp-tests/Resources/Images/SpinningPeas.png index 378d55f052..24cf345bbf 100755 Binary files a/tests/cpp-tests/Resources/Images/SpinningPeas.png and b/tests/cpp-tests/Resources/Images/SpinningPeas.png differ diff --git a/tests/cpp-tests/Resources/Images/SpookyPeas.png b/tests/cpp-tests/Resources/Images/SpookyPeas.png index 378d55f052..24cf345bbf 100755 Binary files a/tests/cpp-tests/Resources/Images/SpookyPeas.png and b/tests/cpp-tests/Resources/Images/SpookyPeas.png differ diff --git a/tests/cpp-tests/Resources/Images/YellowSquare.png b/tests/cpp-tests/Resources/Images/YellowSquare.png index a6b4818def..e3956432e6 100755 Binary files a/tests/cpp-tests/Resources/Images/YellowSquare.png and b/tests/cpp-tests/Resources/Images/YellowSquare.png differ diff --git a/tests/cpp-tests/Resources/Images/YellowTriangle.png b/tests/cpp-tests/Resources/Images/YellowTriangle.png index e6e03b352e..bbad41e271 100755 Binary files a/tests/cpp-tests/Resources/Images/YellowTriangle.png and b/tests/cpp-tests/Resources/Images/YellowTriangle.png differ diff --git a/tests/cpp-tests/Resources/Images/arrows.png b/tests/cpp-tests/Resources/Images/arrows.png index b32243805d..77ead2d112 100755 Binary files a/tests/cpp-tests/Resources/Images/arrows.png and b/tests/cpp-tests/Resources/Images/arrows.png differ diff --git a/tests/cpp-tests/Resources/Images/arrowsBar.png b/tests/cpp-tests/Resources/Images/arrowsBar.png index 2c70da3c7e..bd5cd73a2c 100755 Binary files a/tests/cpp-tests/Resources/Images/arrowsBar.png and b/tests/cpp-tests/Resources/Images/arrowsBar.png differ diff --git a/tests/cpp-tests/Resources/Images/assetMgrBackground2.png b/tests/cpp-tests/Resources/Images/assetMgrBackground2.png index 61c1c53747..3ef262edd5 100755 Binary files a/tests/cpp-tests/Resources/Images/assetMgrBackground2.png and b/tests/cpp-tests/Resources/Images/assetMgrBackground2.png differ diff --git a/tests/cpp-tests/Resources/Images/assetMgrBackground3.png b/tests/cpp-tests/Resources/Images/assetMgrBackground3.png index 15d3c36ce1..4baa0c5bc8 100755 Binary files a/tests/cpp-tests/Resources/Images/assetMgrBackground3.png and b/tests/cpp-tests/Resources/Images/assetMgrBackground3.png differ diff --git a/tests/cpp-tests/Resources/Images/atlastest.png b/tests/cpp-tests/Resources/Images/atlastest.png index 2aaf84affb..51db470a8a 100755 Binary files a/tests/cpp-tests/Resources/Images/atlastest.png and b/tests/cpp-tests/Resources/Images/atlastest.png differ diff --git a/tests/cpp-tests/Resources/Images/b1.png b/tests/cpp-tests/Resources/Images/b1.png index 547e1c78c6..93ee8252f0 100755 Binary files a/tests/cpp-tests/Resources/Images/b1.png and b/tests/cpp-tests/Resources/Images/b1.png differ diff --git a/tests/cpp-tests/Resources/Images/b2.png b/tests/cpp-tests/Resources/Images/b2.png index 2818054a9c..8cc30415fb 100755 Binary files a/tests/cpp-tests/Resources/Images/b2.png and b/tests/cpp-tests/Resources/Images/b2.png differ diff --git a/tests/cpp-tests/Resources/Images/background.png b/tests/cpp-tests/Resources/Images/background.png index 61c1c53747..3ef262edd5 100755 Binary files a/tests/cpp-tests/Resources/Images/background.png and b/tests/cpp-tests/Resources/Images/background.png differ diff --git a/tests/cpp-tests/Resources/Images/background1.png b/tests/cpp-tests/Resources/Images/background1.png index abd4b23cdf..55458ff57b 100755 Binary files a/tests/cpp-tests/Resources/Images/background1.png and b/tests/cpp-tests/Resources/Images/background1.png differ diff --git a/tests/cpp-tests/Resources/Images/background2.png b/tests/cpp-tests/Resources/Images/background2.png index b56dda22b7..2c5bc0b8d6 100755 Binary files a/tests/cpp-tests/Resources/Images/background2.png and b/tests/cpp-tests/Resources/Images/background2.png differ diff --git a/tests/cpp-tests/Resources/Images/background3.png b/tests/cpp-tests/Resources/Images/background3.png index 15d3c36ce1..4baa0c5bc8 100755 Binary files a/tests/cpp-tests/Resources/Images/background3.png and b/tests/cpp-tests/Resources/Images/background3.png differ diff --git a/tests/cpp-tests/Resources/Images/ball.png b/tests/cpp-tests/Resources/Images/ball.png index 632bf68652..2379f371fa 100755 Binary files a/tests/cpp-tests/Resources/Images/ball.png and b/tests/cpp-tests/Resources/Images/ball.png differ diff --git a/tests/cpp-tests/Resources/Images/bitmapFontTest3.png b/tests/cpp-tests/Resources/Images/bitmapFontTest3.png index d19379f5e7..501e3d315a 100755 Binary files a/tests/cpp-tests/Resources/Images/bitmapFontTest3.png and b/tests/cpp-tests/Resources/Images/bitmapFontTest3.png differ diff --git a/tests/cpp-tests/Resources/Images/blocks.png b/tests/cpp-tests/Resources/Images/blocks.png index c409b3bbbd..dd38d8b448 100755 Binary files a/tests/cpp-tests/Resources/Images/blocks.png and b/tests/cpp-tests/Resources/Images/blocks.png differ diff --git a/tests/cpp-tests/Resources/Images/blocks9.png b/tests/cpp-tests/Resources/Images/blocks9.png index b02c0c7ca0..1013f6ad0c 100755 Binary files a/tests/cpp-tests/Resources/Images/blocks9.png and b/tests/cpp-tests/Resources/Images/blocks9.png differ diff --git a/tests/cpp-tests/Resources/Images/blocks9r.png b/tests/cpp-tests/Resources/Images/blocks9r.png index d6c08720ae..582d21752b 100755 Binary files a/tests/cpp-tests/Resources/Images/blocks9r.png and b/tests/cpp-tests/Resources/Images/blocks9r.png differ diff --git a/tests/cpp-tests/Resources/Images/blocks9ss.png b/tests/cpp-tests/Resources/Images/blocks9ss.png index 9acb77c8a2..0956f1d084 100755 Binary files a/tests/cpp-tests/Resources/Images/blocks9ss.png and b/tests/cpp-tests/Resources/Images/blocks9ss.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-about-normal-vertical.png b/tests/cpp-tests/Resources/Images/btn-about-normal-vertical.png index b8fbfaffab..08a1ce61b4 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-about-normal-vertical.png and b/tests/cpp-tests/Resources/Images/btn-about-normal-vertical.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-about-normal.png b/tests/cpp-tests/Resources/Images/btn-about-normal.png index cc70572ceb..455ca632c0 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-about-normal.png and b/tests/cpp-tests/Resources/Images/btn-about-normal.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-about-selected.png b/tests/cpp-tests/Resources/Images/btn-about-selected.png index 3e128add37..20f12ecb37 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-about-selected.png and b/tests/cpp-tests/Resources/Images/btn-about-selected.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-highscores-normal.png b/tests/cpp-tests/Resources/Images/btn-highscores-normal.png index 2ef41a2836..c5c86c2de3 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-highscores-normal.png and b/tests/cpp-tests/Resources/Images/btn-highscores-normal.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-highscores-selected.png b/tests/cpp-tests/Resources/Images/btn-highscores-selected.png index cda72edb44..ae5d9481d4 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-highscores-selected.png and b/tests/cpp-tests/Resources/Images/btn-highscores-selected.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-play-normal.png b/tests/cpp-tests/Resources/Images/btn-play-normal.png index baf17158fc..976f700de0 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-play-normal.png and b/tests/cpp-tests/Resources/Images/btn-play-normal.png differ diff --git a/tests/cpp-tests/Resources/Images/btn-play-selected.png b/tests/cpp-tests/Resources/Images/btn-play-selected.png index 80b6a2ffec..d8e8aba243 100755 Binary files a/tests/cpp-tests/Resources/Images/btn-play-selected.png and b/tests/cpp-tests/Resources/Images/btn-play-selected.png differ diff --git a/tests/cpp-tests/Resources/Images/bugs/bug886.png b/tests/cpp-tests/Resources/Images/bugs/bug886.png index 6b9dcb4915..99fcdbbaff 100755 Binary files a/tests/cpp-tests/Resources/Images/bugs/bug886.png and b/tests/cpp-tests/Resources/Images/bugs/bug886.png differ diff --git a/tests/cpp-tests/Resources/Images/bugs/circle.png b/tests/cpp-tests/Resources/Images/bugs/circle.png index e49cdb3fde..04722e626e 100755 Binary files a/tests/cpp-tests/Resources/Images/bugs/circle.png and b/tests/cpp-tests/Resources/Images/bugs/circle.png differ diff --git a/tests/cpp-tests/Resources/Images/bugs/corner.png b/tests/cpp-tests/Resources/Images/bugs/corner.png index c8d26a4d61..8bd0bab1b0 100755 Binary files a/tests/cpp-tests/Resources/Images/bugs/corner.png and b/tests/cpp-tests/Resources/Images/bugs/corner.png differ diff --git a/tests/cpp-tests/Resources/Images/bugs/edge.png b/tests/cpp-tests/Resources/Images/bugs/edge.png index 62cdfbdaad..e8bc0ee308 100755 Binary files a/tests/cpp-tests/Resources/Images/bugs/edge.png and b/tests/cpp-tests/Resources/Images/bugs/edge.png differ diff --git a/tests/cpp-tests/Resources/Images/bugs/fill.png b/tests/cpp-tests/Resources/Images/bugs/fill.png index b8845ac3f7..dfebed80c5 100755 Binary files a/tests/cpp-tests/Resources/Images/bugs/fill.png and b/tests/cpp-tests/Resources/Images/bugs/fill.png differ diff --git a/tests/cpp-tests/Resources/Images/bugs/picture.png b/tests/cpp-tests/Resources/Images/bugs/picture.png index 1833e88f76..64fc17070c 100755 Binary files a/tests/cpp-tests/Resources/Images/bugs/picture.png and b/tests/cpp-tests/Resources/Images/bugs/picture.png differ diff --git a/tests/cpp-tests/Resources/Images/close.png b/tests/cpp-tests/Resources/Images/close.png index 8593bf9f32..ef3b1d12ae 100755 Binary files a/tests/cpp-tests/Resources/Images/close.png and b/tests/cpp-tests/Resources/Images/close.png differ diff --git a/tests/cpp-tests/Resources/Images/elephant1_Diffuse.png b/tests/cpp-tests/Resources/Images/elephant1_Diffuse.png index 05f532150f..e73b2baa82 100755 Binary files a/tests/cpp-tests/Resources/Images/elephant1_Diffuse.png and b/tests/cpp-tests/Resources/Images/elephant1_Diffuse.png differ diff --git a/tests/cpp-tests/Resources/Images/elephant1_Normal.png b/tests/cpp-tests/Resources/Images/elephant1_Normal.png index c5c837817a..6da6f09e06 100755 Binary files a/tests/cpp-tests/Resources/Images/elephant1_Normal.png and b/tests/cpp-tests/Resources/Images/elephant1_Normal.png differ diff --git a/tests/cpp-tests/Resources/Images/f1.png b/tests/cpp-tests/Resources/Images/f1.png index 4fd7bdbbb4..385e22707b 100755 Binary files a/tests/cpp-tests/Resources/Images/f1.png and b/tests/cpp-tests/Resources/Images/f1.png differ diff --git a/tests/cpp-tests/Resources/Images/f2.png b/tests/cpp-tests/Resources/Images/f2.png index e752eda24d..388a7399c5 100755 Binary files a/tests/cpp-tests/Resources/Images/f2.png and b/tests/cpp-tests/Resources/Images/f2.png differ diff --git a/tests/cpp-tests/Resources/Images/fire-grayscale.png b/tests/cpp-tests/Resources/Images/fire-grayscale.png index 01e96e2f31..5f48174f59 100755 Binary files a/tests/cpp-tests/Resources/Images/fire-grayscale.png and b/tests/cpp-tests/Resources/Images/fire-grayscale.png differ diff --git a/tests/cpp-tests/Resources/Images/fire.png b/tests/cpp-tests/Resources/Images/fire.png index 81c6d2410b..dd2be34cff 100755 Binary files a/tests/cpp-tests/Resources/Images/fire.png and b/tests/cpp-tests/Resources/Images/fire.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini.png b/tests/cpp-tests/Resources/Images/grossini.png index afb316017e..fad80b8e9a 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini.png and b/tests/cpp-tests/Resources/Images/grossini.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_01.png b/tests/cpp-tests/Resources/Images/grossini_dance_01.png index 97e93d394d..93aa6e983a 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_01.png and b/tests/cpp-tests/Resources/Images/grossini_dance_01.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_02.png b/tests/cpp-tests/Resources/Images/grossini_dance_02.png index 2eba532a32..bf03d3312c 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_02.png and b/tests/cpp-tests/Resources/Images/grossini_dance_02.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_03.png b/tests/cpp-tests/Resources/Images/grossini_dance_03.png index 544a1356d3..e01c593b40 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_03.png and b/tests/cpp-tests/Resources/Images/grossini_dance_03.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_04.png b/tests/cpp-tests/Resources/Images/grossini_dance_04.png index 21db6b0c9b..c9b0ae2529 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_04.png and b/tests/cpp-tests/Resources/Images/grossini_dance_04.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_05.png b/tests/cpp-tests/Resources/Images/grossini_dance_05.png index 26fc1bb3fc..e65e6b2feb 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_05.png and b/tests/cpp-tests/Resources/Images/grossini_dance_05.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_06.png b/tests/cpp-tests/Resources/Images/grossini_dance_06.png index 5248eb636d..4c3be2334f 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_06.png and b/tests/cpp-tests/Resources/Images/grossini_dance_06.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_07.png b/tests/cpp-tests/Resources/Images/grossini_dance_07.png index 159cb86c12..4c38de3a78 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_07.png and b/tests/cpp-tests/Resources/Images/grossini_dance_07.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_08.png b/tests/cpp-tests/Resources/Images/grossini_dance_08.png index afb316017e..fad80b8e9a 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_08.png and b/tests/cpp-tests/Resources/Images/grossini_dance_08.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_09.png b/tests/cpp-tests/Resources/Images/grossini_dance_09.png index 3595e45a6f..b0fa9aded3 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_09.png and b/tests/cpp-tests/Resources/Images/grossini_dance_09.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_10.png b/tests/cpp-tests/Resources/Images/grossini_dance_10.png index 6f3e36a767..0abb6eab93 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_10.png and b/tests/cpp-tests/Resources/Images/grossini_dance_10.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_11.png b/tests/cpp-tests/Resources/Images/grossini_dance_11.png index c201f068f2..7285fd6c76 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_11.png and b/tests/cpp-tests/Resources/Images/grossini_dance_11.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_12.png b/tests/cpp-tests/Resources/Images/grossini_dance_12.png index 89395c2461..ce7d672004 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_12.png and b/tests/cpp-tests/Resources/Images/grossini_dance_12.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_13.png b/tests/cpp-tests/Resources/Images/grossini_dance_13.png index 5026872179..92cbbd4da1 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_13.png and b/tests/cpp-tests/Resources/Images/grossini_dance_13.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_14.png b/tests/cpp-tests/Resources/Images/grossini_dance_14.png index 38c10271fa..ee7d1bba0a 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_14.png and b/tests/cpp-tests/Resources/Images/grossini_dance_14.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_atlas-mono.png b/tests/cpp-tests/Resources/Images/grossini_dance_atlas-mono.png index 0a08f47624..932ba39c59 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_atlas-mono.png and b/tests/cpp-tests/Resources/Images/grossini_dance_atlas-mono.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_atlas.png b/tests/cpp-tests/Resources/Images/grossini_dance_atlas.png index 4f654ae902..12bca1310f 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_atlas.png and b/tests/cpp-tests/Resources/Images/grossini_dance_atlas.png differ diff --git a/tests/cpp-tests/Resources/Images/grossini_dance_atlas_nomipmap.png b/tests/cpp-tests/Resources/Images/grossini_dance_atlas_nomipmap.png index 433053e373..12bca1310f 100755 Binary files a/tests/cpp-tests/Resources/Images/grossini_dance_atlas_nomipmap.png and b/tests/cpp-tests/Resources/Images/grossini_dance_atlas_nomipmap.png differ diff --git a/tests/cpp-tests/Resources/Images/grossinis_sister1-testalpha.png b/tests/cpp-tests/Resources/Images/grossinis_sister1-testalpha.png index cde864f674..1715123a8b 100755 Binary files a/tests/cpp-tests/Resources/Images/grossinis_sister1-testalpha.png and b/tests/cpp-tests/Resources/Images/grossinis_sister1-testalpha.png differ diff --git a/tests/cpp-tests/Resources/Images/grossinis_sister1.png b/tests/cpp-tests/Resources/Images/grossinis_sister1.png index 6de1205c68..5be7918a60 100755 Binary files a/tests/cpp-tests/Resources/Images/grossinis_sister1.png and b/tests/cpp-tests/Resources/Images/grossinis_sister1.png differ diff --git a/tests/cpp-tests/Resources/Images/grossinis_sister2.png b/tests/cpp-tests/Resources/Images/grossinis_sister2.png index 3683d7f79f..b25d759a8f 100755 Binary files a/tests/cpp-tests/Resources/Images/grossinis_sister2.png and b/tests/cpp-tests/Resources/Images/grossinis_sister2.png differ diff --git a/tests/cpp-tests/Resources/Images/hole_effect.png b/tests/cpp-tests/Resources/Images/hole_effect.png index 24ea114ebd..da1f7e215b 100755 Binary files a/tests/cpp-tests/Resources/Images/hole_effect.png and b/tests/cpp-tests/Resources/Images/hole_effect.png differ diff --git a/tests/cpp-tests/Resources/Images/hole_stencil.png b/tests/cpp-tests/Resources/Images/hole_stencil.png index e27f848906..9f69c3e0cb 100755 Binary files a/tests/cpp-tests/Resources/Images/hole_stencil.png and b/tests/cpp-tests/Resources/Images/hole_stencil.png differ diff --git a/tests/cpp-tests/Resources/Images/labelatlas.png b/tests/cpp-tests/Resources/Images/labelatlas.png index e91d0af540..41486794cd 100755 Binary files a/tests/cpp-tests/Resources/Images/labelatlas.png and b/tests/cpp-tests/Resources/Images/labelatlas.png differ diff --git a/tests/cpp-tests/Resources/Images/landscape-1024x1024.png b/tests/cpp-tests/Resources/Images/landscape-1024x1024.png index 365a14b283..b592a8ba20 100644 Binary files a/tests/cpp-tests/Resources/Images/landscape-1024x1024.png and b/tests/cpp-tests/Resources/Images/landscape-1024x1024.png differ diff --git a/tests/cpp-tests/Resources/Images/menuitemsprite.png b/tests/cpp-tests/Resources/Images/menuitemsprite.png index afc28e1967..ae97b916b2 100755 Binary files a/tests/cpp-tests/Resources/Images/menuitemsprite.png and b/tests/cpp-tests/Resources/Images/menuitemsprite.png differ diff --git a/tests/cpp-tests/Resources/Images/noise.png b/tests/cpp-tests/Resources/Images/noise.png index 32a561c7f6..22be01654c 100755 Binary files a/tests/cpp-tests/Resources/Images/noise.png and b/tests/cpp-tests/Resources/Images/noise.png differ diff --git a/tests/cpp-tests/Resources/Images/paddle.png b/tests/cpp-tests/Resources/Images/paddle.png index 03cc9816c2..eefd7e7535 100755 Binary files a/tests/cpp-tests/Resources/Images/paddle.png and b/tests/cpp-tests/Resources/Images/paddle.png differ diff --git a/tests/cpp-tests/Resources/Images/particles.png b/tests/cpp-tests/Resources/Images/particles.png index ca6519ea57..236e5a07a7 100755 Binary files a/tests/cpp-tests/Resources/Images/particles.png and b/tests/cpp-tests/Resources/Images/particles.png differ diff --git a/tests/cpp-tests/Resources/Images/pattern1.png b/tests/cpp-tests/Resources/Images/pattern1.png index 86ce74f2f2..a55490726d 100755 Binary files a/tests/cpp-tests/Resources/Images/pattern1.png and b/tests/cpp-tests/Resources/Images/pattern1.png differ diff --git a/tests/cpp-tests/Resources/Images/piece.png b/tests/cpp-tests/Resources/Images/piece.png index 8a63dc85f3..41367e4574 100755 Binary files a/tests/cpp-tests/Resources/Images/piece.png and b/tests/cpp-tests/Resources/Images/piece.png differ diff --git a/tests/cpp-tests/Resources/Images/powered.png b/tests/cpp-tests/Resources/Images/powered.png index 98a5695df6..0ef51fd3a8 100755 Binary files a/tests/cpp-tests/Resources/Images/powered.png and b/tests/cpp-tests/Resources/Images/powered.png differ diff --git a/tests/cpp-tests/Resources/Images/r1.png b/tests/cpp-tests/Resources/Images/r1.png index 827a77226e..96c0708831 100755 Binary files a/tests/cpp-tests/Resources/Images/r1.png and b/tests/cpp-tests/Resources/Images/r1.png differ diff --git a/tests/cpp-tests/Resources/Images/r2.png b/tests/cpp-tests/Resources/Images/r2.png index 727a1c687e..1caf31f4bd 100755 Binary files a/tests/cpp-tests/Resources/Images/r2.png and b/tests/cpp-tests/Resources/Images/r2.png differ diff --git a/tests/cpp-tests/Resources/Images/snow.png b/tests/cpp-tests/Resources/Images/snow.png index 9e12963498..860b581076 100755 Binary files a/tests/cpp-tests/Resources/Images/snow.png and b/tests/cpp-tests/Resources/Images/snow.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-0.png index 54dd046cac..8256a52992 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-1.png index 94b993ff6a..ea7d815696 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-2.png index a960fb422b..fb444b3348 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-3.png index 248adc2861..81f6c287b9 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-4.png index 6d9fffe207..a0d5ba8621 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-5.png index 7edc344f62..307968b441 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-6.png index 8b07eec9ab..e98bbcd94e 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-7.png index 465f8987d1..5c13bee7b5 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-0-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-0.png index b9e8b1ccd1..5583645981 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-1.png index cb9c7cc5da..665bb8b606 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-2.png index f401ee3cc5..f73989bc71 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-3.png index 59e4aa28c2..92cdc270d9 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-4.png index 076bd79a9d..d4c4ff36b1 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-5.png index 7be6aae280..95fb8ba7e9 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-6.png index a094ec3920..b576d2e3e6 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-7.png index 0661a3ceb5..f0367c971d 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-1-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-0.png index 858e724856..71044a10b1 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-1.png index f58a1d5612..3feb9e940f 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-2.png index d2c2ca52c5..e7e8740439 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-3.png index 2850465796..6ef5cc5e78 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-4.png index eb07b0bc97..c6ac17cac8 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-5.png index f6a37ad718..d496e3d027 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-6.png index b8585641b3..066b38a5cf 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-7.png index f2f37134cf..78c89fc748 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-2-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-0.png index cfa22a2e37..230107e65b 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-1.png index f9ffcf4afc..ec5990d451 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-2.png index 75bcbe70b0..70b510b38c 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-3.png index b94e7331d7..3b7d911e22 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-4.png index 05a25a5e38..8455784e3a 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-5.png index fe5fb49166..2d28698df5 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-6.png index 76e085fd51..fdc30ee923 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-7.png index 2cc0027a8f..7dfd55fda3 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-3-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-0.png index 3d452a84ad..6bfc144c7e 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-1.png index 378f91102f..15d6eb1543 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-2.png index 32a3a5a25c..32190cb70d 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-3.png index 8e491dc466..2e0320578a 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-4.png index 72a5fa7cc8..f0708bb421 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-5.png index 6a45458fbe..6c9ec9f39f 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-6.png index a85227dfec..d93f278fd7 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-7.png index 323db8d923..5dce60c711 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-4-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-0.png index cb82489db3..1adff7adee 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-1.png index efcc883e83..c3e56fe166 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-2.png index 1c93479476..3659a67fe5 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-3.png index ce9af4ea11..5e771251db 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-4.png index b8bb2a0b06..907c3696c2 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-5.png index 7cbd26e6ee..a9175a5d0b 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-6.png index 4e927716ec..14bf384a9c 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-7.png index 39a374f7d1..6d30170147 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-5-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-0.png index 648e110602..11be173003 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-1.png index ac22fd3be7..259b7aed53 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-2.png index 68bc9f5187..b9bae9d703 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-3.png index e5b021ebbe..a84b7b5d09 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-4.png index 580cb35121..5ec22013c4 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-5.png index fbda801103..3c07dc5190 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-6.png index a44fcf9d75..de9e1e6b4a 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-7.png index def42d0bcf..0cf0e8fc17 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-6-7.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-0.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-0.png index c785688f11..58964c3fd8 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-0.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-0.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-1.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-1.png index 9cf9145af2..b733b95b4f 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-1.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-1.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-2.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-2.png index ead396ac25..14404fa36b 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-2.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-2.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-3.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-3.png index e905bf5342..1770b6982f 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-3.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-3.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-4.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-4.png index 07cf84c009..3be136596e 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-4.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-4.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-5.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-5.png index ab1daafd3b..594a7a8a73 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-5.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-5.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-6.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-6.png index b5f98b8520..72a7ff1870 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-6.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-6.png differ diff --git a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-7.png b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-7.png index 50ffb8f7c6..0287bd7711 100755 Binary files a/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-7.png and b/tests/cpp-tests/Resources/Images/sprites_test/sprite-7-7.png differ diff --git a/tests/cpp-tests/Resources/Images/spritesheet1.png b/tests/cpp-tests/Resources/Images/spritesheet1.png index 9246a8bc97..7ab88aaa4e 100755 Binary files a/tests/cpp-tests/Resources/Images/spritesheet1.png and b/tests/cpp-tests/Resources/Images/spritesheet1.png differ diff --git a/tests/cpp-tests/Resources/Images/stars-grayscale.png b/tests/cpp-tests/Resources/Images/stars-grayscale.png index 94a4ec693c..fe47acd4fc 100755 Binary files a/tests/cpp-tests/Resources/Images/stars-grayscale.png and b/tests/cpp-tests/Resources/Images/stars-grayscale.png differ diff --git a/tests/cpp-tests/Resources/Images/stars.png b/tests/cpp-tests/Resources/Images/stars.png index f493dcc334..fe47acd4fc 100755 Binary files a/tests/cpp-tests/Resources/Images/stars.png and b/tests/cpp-tests/Resources/Images/stars.png differ diff --git a/tests/cpp-tests/Resources/Images/stars2-grayscale.png b/tests/cpp-tests/Resources/Images/stars2-grayscale.png index c11557b03e..ef841f9df5 100755 Binary files a/tests/cpp-tests/Resources/Images/stars2-grayscale.png and b/tests/cpp-tests/Resources/Images/stars2-grayscale.png differ diff --git a/tests/cpp-tests/Resources/Images/stars2.png b/tests/cpp-tests/Resources/Images/stars2.png index cfb429d1c4..ef841f9df5 100755 Binary files a/tests/cpp-tests/Resources/Images/stars2.png and b/tests/cpp-tests/Resources/Images/stars2.png differ diff --git a/tests/cpp-tests/Resources/Images/stone.png b/tests/cpp-tests/Resources/Images/stone.png index b42f9d96ee..0696080621 100755 Binary files a/tests/cpp-tests/Resources/Images/stone.png and b/tests/cpp-tests/Resources/Images/stone.png differ diff --git a/tests/cpp-tests/Resources/Images/streak.png b/tests/cpp-tests/Resources/Images/streak.png index b228f382bd..c602c98fc1 100755 Binary files a/tests/cpp-tests/Resources/Images/streak.png and b/tests/cpp-tests/Resources/Images/streak.png differ diff --git a/tests/cpp-tests/Resources/Images/test-rgba1.png b/tests/cpp-tests/Resources/Images/test-rgba1.png index c9e55ee9b8..302c63a08a 100755 Binary files a/tests/cpp-tests/Resources/Images/test-rgba1.png and b/tests/cpp-tests/Resources/Images/test-rgba1.png differ diff --git a/tests/cpp-tests/Resources/Images/test_blend.png b/tests/cpp-tests/Resources/Images/test_blend.png index 415e1dede7..de4cd69292 100755 Binary files a/tests/cpp-tests/Resources/Images/test_blend.png and b/tests/cpp-tests/Resources/Images/test_blend.png differ diff --git a/tests/cpp-tests/Resources/Images/test_image.png b/tests/cpp-tests/Resources/Images/test_image.png index fc2c0d6853..eaf9474764 100755 Binary files a/tests/cpp-tests/Resources/Images/test_image.png and b/tests/cpp-tests/Resources/Images/test_image.png differ diff --git a/tests/cpp-tests/Resources/Images/test_image_ai88.png b/tests/cpp-tests/Resources/Images/test_image_ai88.png index 3bb0dd06b5..7d0aa31107 100755 Binary files a/tests/cpp-tests/Resources/Images/test_image_ai88.png and b/tests/cpp-tests/Resources/Images/test_image_ai88.png differ diff --git a/tests/cpp-tests/Resources/Images/test_image_i8.png b/tests/cpp-tests/Resources/Images/test_image_i8.png index bf522eef00..d352738904 100755 Binary files a/tests/cpp-tests/Resources/Images/test_image_i8.png and b/tests/cpp-tests/Resources/Images/test_image_i8.png differ diff --git a/tests/cpp-tests/Resources/Images/test_image_rgb888.png b/tests/cpp-tests/Resources/Images/test_image_rgb888.png index 21d2f91a86..173b63093f 100755 Binary files a/tests/cpp-tests/Resources/Images/test_image_rgb888.png and b/tests/cpp-tests/Resources/Images/test_image_rgb888.png differ diff --git a/tests/cpp-tests/Resources/Images/test_image_rgba8888.png b/tests/cpp-tests/Resources/Images/test_image_rgba8888.png index 6106230854..c6b6395312 100755 Binary files a/tests/cpp-tests/Resources/Images/test_image_rgba8888.png and b/tests/cpp-tests/Resources/Images/test_image_rgba8888.png differ diff --git a/tests/cpp-tests/Resources/Images/texture1024x1024.png b/tests/cpp-tests/Resources/Images/texture1024x1024.png index 9e98dbe222..12a15fae99 100755 Binary files a/tests/cpp-tests/Resources/Images/texture1024x1024.png and b/tests/cpp-tests/Resources/Images/texture1024x1024.png differ diff --git a/tests/cpp-tests/Resources/Images/texture2048x2048.png b/tests/cpp-tests/Resources/Images/texture2048x2048.png index 282ae566e7..3db29c49dc 100755 Binary files a/tests/cpp-tests/Resources/Images/texture2048x2048.png and b/tests/cpp-tests/Resources/Images/texture2048x2048.png differ diff --git a/tests/cpp-tests/Resources/Images/texture512x512.png b/tests/cpp-tests/Resources/Images/texture512x512.png index 5eafc45f88..170c02fd82 100755 Binary files a/tests/cpp-tests/Resources/Images/texture512x512.png and b/tests/cpp-tests/Resources/Images/texture512x512.png differ diff --git a/tests/cpp-tests/Resources/Images/ui.png b/tests/cpp-tests/Resources/Images/ui.png index baf6a6bef4..9a702b025f 100755 Binary files a/tests/cpp-tests/Resources/Images/ui.png and b/tests/cpp-tests/Resources/Images/ui.png differ diff --git a/tests/cpp-tests/Resources/Images/white-512x512.png b/tests/cpp-tests/Resources/Images/white-512x512.png index 9a0eb5a892..170c02fd82 100755 Binary files a/tests/cpp-tests/Resources/Images/white-512x512.png and b/tests/cpp-tests/Resources/Images/white-512x512.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/CyanSquare.png b/tests/cpp-tests/Resources/hd/Images/CyanSquare.png index 509961b3d3..f552f44956 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/CyanSquare.png and b/tests/cpp-tests/Resources/hd/Images/CyanSquare.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/Icon.png b/tests/cpp-tests/Resources/hd/Images/Icon.png index e42124a15c..eea077ca2d 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/Icon.png and b/tests/cpp-tests/Resources/hd/Images/Icon.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/MagentaSquare.png b/tests/cpp-tests/Resources/hd/Images/MagentaSquare.png index 14411c7f30..c81a4387fc 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/MagentaSquare.png and b/tests/cpp-tests/Resources/hd/Images/MagentaSquare.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/YellowSquare.png b/tests/cpp-tests/Resources/hd/Images/YellowSquare.png index 5975e65716..85ee45ad43 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/YellowSquare.png and b/tests/cpp-tests/Resources/hd/Images/YellowSquare.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/arrows.png b/tests/cpp-tests/Resources/hd/Images/arrows.png index 1a24e6fdec..2bb760a397 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/arrows.png and b/tests/cpp-tests/Resources/hd/Images/arrows.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/arrowsBar.png b/tests/cpp-tests/Resources/hd/Images/arrowsBar.png index 694b4d9768..41b0735179 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/arrowsBar.png and b/tests/cpp-tests/Resources/hd/Images/arrowsBar.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/b1.png b/tests/cpp-tests/Resources/hd/Images/b1.png index a3c16adf65..8e799db7af 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/b1.png and b/tests/cpp-tests/Resources/hd/Images/b1.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/b2.png b/tests/cpp-tests/Resources/hd/Images/b2.png index ffa527ca93..3ceb3e6ccf 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/b2.png and b/tests/cpp-tests/Resources/hd/Images/b2.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/background1.png b/tests/cpp-tests/Resources/hd/Images/background1.png index 79a3a895ba..f3e0bb43f4 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/background1.png and b/tests/cpp-tests/Resources/hd/Images/background1.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/background2.png b/tests/cpp-tests/Resources/hd/Images/background2.png index 33b72a1055..4075ef39c0 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/background2.png and b/tests/cpp-tests/Resources/hd/Images/background2.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/background3.png b/tests/cpp-tests/Resources/hd/Images/background3.png index 1bc43ec857..deef861517 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/background3.png and b/tests/cpp-tests/Resources/hd/Images/background3.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/ball.png b/tests/cpp-tests/Resources/hd/Images/ball.png index 5460578a6f..a9b5b569b8 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/ball.png and b/tests/cpp-tests/Resources/hd/Images/ball.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/blocks.png b/tests/cpp-tests/Resources/hd/Images/blocks.png index 6dfad5943c..64ed615e86 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/blocks.png and b/tests/cpp-tests/Resources/hd/Images/blocks.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/blocks9.png b/tests/cpp-tests/Resources/hd/Images/blocks9.png index 8f209b94a6..e41ca2c492 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/blocks9.png and b/tests/cpp-tests/Resources/hd/Images/blocks9.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/blocks9ss.png b/tests/cpp-tests/Resources/hd/Images/blocks9ss.png index 4b1eedbf87..5fc40c4f41 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/blocks9ss.png and b/tests/cpp-tests/Resources/hd/Images/blocks9ss.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/bugs/circle.png b/tests/cpp-tests/Resources/hd/Images/bugs/circle.png index 143b38b9c6..6afff53d29 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/bugs/circle.png and b/tests/cpp-tests/Resources/hd/Images/bugs/circle.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/bugs/picture.png b/tests/cpp-tests/Resources/hd/Images/bugs/picture.png index 9fa44269c1..0c3c568d5c 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/bugs/picture.png and b/tests/cpp-tests/Resources/hd/Images/bugs/picture.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/bugs/test_issue_1179.png b/tests/cpp-tests/Resources/hd/Images/bugs/test_issue_1179.png index e49cdb3fde..04722e626e 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/bugs/test_issue_1179.png and b/tests/cpp-tests/Resources/hd/Images/bugs/test_issue_1179.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/close.png b/tests/cpp-tests/Resources/hd/Images/close.png index 24c1ec49a7..4b4d817e44 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/close.png and b/tests/cpp-tests/Resources/hd/Images/close.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/f1.png b/tests/cpp-tests/Resources/hd/Images/f1.png index 606181fab4..be28b78e34 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/f1.png and b/tests/cpp-tests/Resources/hd/Images/f1.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/f2.png b/tests/cpp-tests/Resources/hd/Images/f2.png index 8cd548b51b..f933ad1d1f 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/f2.png and b/tests/cpp-tests/Resources/hd/Images/f2.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini.png b/tests/cpp-tests/Resources/hd/Images/grossini.png index 43a18a41eb..a0a76f5c2f 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini.png and b/tests/cpp-tests/Resources/hd/Images/grossini.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_01.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_01.png index b49771089d..2a8aab2015 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_01.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_01.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_02.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_02.png index 9bc351bd0c..b2052cb727 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_02.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_02.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_03.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_03.png index 48195aa57a..da543a9b92 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_03.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_03.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_04.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_04.png index 7e5fa06a67..6653968f89 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_04.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_04.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_05.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_05.png index e3942aa9d0..ccb8f72b1b 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_05.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_05.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_06.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_06.png index d5e69be833..d26bd64997 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_06.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_06.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_07.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_07.png index 735b75f521..b58d9df9f9 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_07.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_07.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_08.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_08.png index 964f05f8b7..4fad28ce48 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_08.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_08.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_09.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_09.png index c88efa0cfd..eaf6644b8a 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_09.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_09.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_10.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_10.png index 04458278d8..095ae812dd 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_10.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_10.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_11.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_11.png index dc21059e25..8d6848d4e1 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_11.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_11.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_12.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_12.png index f1e2f29da9..f062bde9f7 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_12.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_12.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_13.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_13.png index 44cb66190e..3df970d981 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_13.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_13.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_14.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_14.png index c38fd6fb5c..92a4bc9041 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_14.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_14.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossini_dance_atlas.png b/tests/cpp-tests/Resources/hd/Images/grossini_dance_atlas.png index f71b42ce11..9a8bb38c10 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossini_dance_atlas.png and b/tests/cpp-tests/Resources/hd/Images/grossini_dance_atlas.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossinis_sister1.png b/tests/cpp-tests/Resources/hd/Images/grossinis_sister1.png index 4e2d6541e3..ec22292e11 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossinis_sister1.png and b/tests/cpp-tests/Resources/hd/Images/grossinis_sister1.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/grossinis_sister2.png b/tests/cpp-tests/Resources/hd/Images/grossinis_sister2.png index ec9bb5cc7c..c3b392d1e8 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/grossinis_sister2.png and b/tests/cpp-tests/Resources/hd/Images/grossinis_sister2.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/hole_effect.png b/tests/cpp-tests/Resources/hd/Images/hole_effect.png index 94020e295b..50eddb1c12 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/hole_effect.png and b/tests/cpp-tests/Resources/hd/Images/hole_effect.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/hole_stencil.png b/tests/cpp-tests/Resources/hd/Images/hole_stencil.png index 48c132565d..253d46d547 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/hole_stencil.png and b/tests/cpp-tests/Resources/hd/Images/hole_stencil.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/paddle.png b/tests/cpp-tests/Resources/hd/Images/paddle.png index 47af8601f1..43520a61ae 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/paddle.png and b/tests/cpp-tests/Resources/hd/Images/paddle.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/particles.png b/tests/cpp-tests/Resources/hd/Images/particles.png index 664a48e6d3..be07eba222 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/particles.png and b/tests/cpp-tests/Resources/hd/Images/particles.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/r1.png b/tests/cpp-tests/Resources/hd/Images/r1.png index 6b51dc4509..41cbbb5d6f 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/r1.png and b/tests/cpp-tests/Resources/hd/Images/r1.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/r2.png b/tests/cpp-tests/Resources/hd/Images/r2.png index ef1f2b4979..676732f19d 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/r2.png and b/tests/cpp-tests/Resources/hd/Images/r2.png differ diff --git a/tests/cpp-tests/Resources/hd/Images/ui.png b/tests/cpp-tests/Resources/hd/Images/ui.png index 40bdfb87fe..a14a4fbcf1 100755 Binary files a/tests/cpp-tests/Resources/hd/Images/ui.png and b/tests/cpp-tests/Resources/hd/Images/ui.png differ