diff --git a/AUTHORS b/AUTHORS index cf242d0b93..eeaf5c123e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -536,6 +536,7 @@ Developers: musikov Fixing a bug that missing precision when getting strokeColor and fontFillColor + added Turkish and Ukrainian language support hawkwood (Justin Hawkwood) Fixing a bug that EditBox doesn't show any text if it's initialized with text. diff --git a/CHANGELOG b/CHANGELOG index 8d2f8079c2..674fcde4f4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,11 +1,15 @@ cocos2d-x-3.4beta0 ?? + [NEW] 3D: support frustum culling [NEW] Action: MoveTo and MoveBy support Vec3 - [NEW] Allocator: add custom allocator support, global, default, fixed block, object pool. + [NEW] Allocator: add custom allocator support, global, default, fixed block, object pool + [NEW] Application: added Turkish and Ukrainian language support [NEW] UI:LoadingBar: add TextureResType to LoadingBar's create method [NEW] Director: add setClearColor() to set clear values for the color buffers + [FIX] ui::Button: fix setTitleColor calls method setColor instead of setTextColor of title label. [FIX] FileUtils: WebP format with alpha channel displayed wrong [FIX] Label: content size of Label is incorrect if the string is set to empty string + [FIX] GLProgramState: fix assert error caused by outdated uniform and attribute cache cocos2d-x-3.3 Dec.12 [FIX] Billboard: allow billboard rotate along z axis 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 9c6ba8d15d..8216151edb 100644 --- a/build/cocos2d_libs.xcodeproj/project.pbxproj +++ b/build/cocos2d_libs.xcodeproj/project.pbxproj @@ -1170,6 +1170,10 @@ 29394CF519B01DBA00D2DE1A /* UIWebViewImpl-ios.h in Headers */ = {isa = PBXBuildFile; fileRef = 29394CEE19B01DBA00D2DE1A /* UIWebViewImpl-ios.h */; }; 29394CF619B01DBA00D2DE1A /* UIWebViewImpl-ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29394CEF19B01DBA00D2DE1A /* UIWebViewImpl-ios.mm */; }; 29394CF719B01DBA00D2DE1A /* UIWebViewImpl-ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29394CEF19B01DBA00D2DE1A /* UIWebViewImpl-ios.mm */; }; + 296BF6151A44059B0038EC44 /* UIShaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 296BF6141A44059B0038EC44 /* UIShaders.h */; }; + 296BF6161A44059B0038EC44 /* UIShaders.h in Headers */ = {isa = PBXBuildFile; fileRef = 296BF6141A44059B0038EC44 /* UIShaders.h */; }; + 296BF6181A4405CB0038EC44 /* UIShaders.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 296BF6171A4405CB0038EC44 /* UIShaders.cpp */; }; + 296BF6191A4405CB0038EC44 /* UIShaders.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 296BF6171A4405CB0038EC44 /* UIShaders.cpp */; }; 2986667F18B1B246000E39CA /* CCTweenFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2986667818B1B079000E39CA /* CCTweenFunction.cpp */; }; 299754F4193EC95400A54AC3 /* ObjectFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */; }; 299754F5193EC95400A54AC3 /* ObjectFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */; }; @@ -2400,6 +2404,9 @@ 29394CEF19B01DBA00D2DE1A /* UIWebViewImpl-ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UIWebViewImpl-ios.mm"; sourceTree = ""; }; 2958244919873D8E00F9746D /* UIScale9Sprite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UIScale9Sprite.cpp; sourceTree = ""; }; 2958244A19873D8E00F9746D /* UIScale9Sprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIScale9Sprite.h; sourceTree = ""; }; + 296BF6131A4403380038EC44 /* ccShader_grayscale.frag */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = ccShader_grayscale.frag; sourceTree = ""; }; + 296BF6141A44059B0038EC44 /* UIShaders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIShaders.h; sourceTree = ""; }; + 296BF6171A4405CB0038EC44 /* UIShaders.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UIShaders.cpp; sourceTree = ""; }; 2986667818B1B079000E39CA /* CCTweenFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCTweenFunction.cpp; sourceTree = ""; }; 2986667918B1B079000E39CA /* CCTweenFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCTweenFunction.h; sourceTree = ""; }; 299754F2193EC95400A54AC3 /* ObjectFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ObjectFactory.cpp; path = ../base/ObjectFactory.cpp; sourceTree = ""; }; @@ -4182,6 +4189,7 @@ 2905F9E618CF08D000240AA3 /* ui */ = { isa = PBXGroup; children = ( + 296BF6121A4403380038EC44 /* shaders */, 29CB8F531929D67D00C841D6 /* widgets */, 29CB8F521929D65500C841D6 /* experimental */, 29CB8F511929D64500C841D6 /* base */, @@ -4214,6 +4222,16 @@ path = UIEditBox; sourceTree = ""; }; + 296BF6121A4403380038EC44 /* shaders */ = { + isa = PBXGroup; + children = ( + 296BF6131A4403380038EC44 /* ccShader_grayscale.frag */, + 296BF6141A44059B0038EC44 /* UIShaders.h */, + 296BF6171A4405CB0038EC44 /* UIShaders.cpp */, + ); + path = shaders; + sourceTree = ""; + }; 29CB8F501929D63600C841D6 /* layout */ = { isa = PBXGroup; children = ( @@ -5477,6 +5495,7 @@ 5034CA2F191D591100CE6051 /* ccShader_PositionTexture.vert in Headers */, 15AE1C1219AAE2C600C27E9E /* CCPhysicsDebugNode.h in Headers */, 50ABBE951925AB6F00A911A9 /* CCProfiling.h in Headers */, + 296BF6151A44059B0038EC44 /* UIShaders.h in Headers */, 5034CA4B191D591100CE6051 /* ccShader_Label_df_glow.frag in Headers */, 50ABBE4F1925AB6F00A911A9 /* CCEventCustom.h in Headers */, 50ABBD521925AB0000A911A9 /* Quaternion.h in Headers */, @@ -5898,6 +5917,7 @@ 50ABBD571925AB0000A911A9 /* TransformUtils.h in Headers */, 1A570115180BC8EE0088DEC7 /* CCDrawNode.h in Headers */, 1A57011E180BC90D0088DEC7 /* CCGrabber.h in Headers */, + 296BF6161A44059B0038EC44 /* UIShaders.h in Headers */, 1A570122180BC90D0088DEC7 /* CCGrid.h in Headers */, 15AE1AB319AAD40300C27E9E /* b2CircleContact.h in Headers */, 5034CA2E191D591100CE6051 /* ccShader_PositionTextureA8Color.frag in Headers */, @@ -6789,6 +6809,7 @@ 15AE1B5119AADA9900C27E9E /* UIPageView.cpp in Sources */, 50ED2BE619BEAF7900A0AB90 /* UIEditBoxImpl-wp8.cpp in Sources */, 15AE18EC19AAD35000C27E9E /* CCActionObject.cpp in Sources */, + 296BF6181A4405CB0038EC44 /* UIShaders.cpp in Sources */, 1A01C68E18F57BE800EFE3A6 /* CCDictionary.cpp in Sources */, 50ABBD381925AB0000A911A9 /* CCAffineTransform.cpp in Sources */, 46C02E0718E91123004B7456 /* xxhash.c in Sources */, @@ -7149,6 +7170,7 @@ 50ABC0061926664800A911A9 /* CCThread-apple.mm in Sources */, B375107C1823ACA100B3BA6A /* CCPhysicsBodyInfo_chipmunk.cpp in Sources */, 50ABBEB61925AB6F00A911A9 /* CCUserDefault-android.cpp in Sources */, + 296BF6191A4405CB0038EC44 /* UIShaders.cpp in Sources */, 1A57034C180BD09B0088DEC7 /* tinyxml2.cpp in Sources */, 50ABBDB61925AB4100A911A9 /* CCTexture2D.cpp in Sources */, 15AE1BAB19AADFDF00C27E9E /* UILayout.cpp in Sources */, diff --git a/cocos/2d/CCCamera.cpp b/cocos/2d/CCCamera.cpp index a1763b889a..89baefd956 100644 --- a/cocos/2d/CCCamera.cpp +++ b/cocos/2d/CCCamera.cpp @@ -70,7 +70,7 @@ Camera::Camera() , _viewProjectionDirty(true) , _cameraFlag(1) , _frustumDirty(true) -, _enableFrustumCull(true) +, _enableFrustumCulling(true) { } @@ -253,22 +253,22 @@ void Camera::unproject(const Size& viewport, Vec3* src, Vec3* dst) const dst->set(screen.x, screen.y, screen.z); } -void Camera::enableFrustumCull(bool bEnalbe, bool bClipZ) +void Camera::enableFrustumCulling(bool enalbe, bool clipZ) { - _enableFrustumCull = bEnalbe; - _frustum.setClipZ(bClipZ); + _enableFrustumCulling = enalbe; + _frustum.setClipZ(clipZ); } -bool Camera::visibleInFrustum(const AABB& aabb) const +bool Camera::isVisibleInFrustum(const AABB* aabb) const { - if (_enableFrustumCull) + if (_enableFrustumCulling) { if (_frustumDirty) { _frustum.initFrustum(this); _frustumDirty = false; } - return !_frustum.isOutFrustum(aabb); + return !_frustum.isOutOfFrustum(*aabb); } return true; } diff --git a/cocos/2d/CCCamera.h b/cocos/2d/CCCamera.h index 0013ef90b7..bd4e73fb15 100644 --- a/cocos/2d/CCCamera.h +++ b/cocos/2d/CCCamera.h @@ -139,12 +139,12 @@ public: /** * Enable frustum culling */ - void enableFrustumCull(bool bEnalbe, bool bClipZ); + void enableFrustumCulling(bool enalbe, bool clipZ); /** * Is this aabb visible in frustum */ - bool visibleInFrustum(const AABB& aabb)const; + bool isVisibleInFrustum(const AABB* aabb)const; //override virtual void onEnter() override; @@ -184,7 +184,7 @@ protected: unsigned short _cameraFlag; // camera flag mutable Frustum _frustum; // camera frustum mutable bool _frustumDirty; - bool _enableFrustumCull; + bool _enableFrustumCulling; static Camera* _visitingCamera; friend class Director; diff --git a/cocos/2d/CCNode.cpp b/cocos/2d/CCNode.cpp index 95f98f9127..f52a1b5a98 100644 --- a/cocos/2d/CCNode.cpp +++ b/cocos/2d/CCNode.cpp @@ -336,6 +336,8 @@ void Node::setRotation(float rotation) updatePhysicsBodyRotation(getScene()); } #endif + + updateRotationQuat(); } float Node::getRotationSkewX() const @@ -357,6 +359,8 @@ void Node::setRotation3D(const Vec3& rotation) // rotation Z is decomposed in 2 to simulate Skew for Flash animations _rotationZ_Y = _rotationZ_X = rotation.z; + + updateRotationQuat(); #if CC_USE_PHYSICS if (_physicsBody != nullptr) @@ -374,6 +378,44 @@ Vec3 Node::getRotation3D() const return Vec3(_rotationX,_rotationY,_rotationZ_X); } +void Node::updateRotationQuat() +{ + // convert Euler angle to quaternion + // when _rotationZ_X == _rotationZ_Y, _rotationQuat = RotationZ_X * RotationY * RotationX + // when _rotationZ_X != _rotationZ_Y, _rotationQuat = RotationY * RotationX + float halfRadx = CC_DEGREES_TO_RADIANS(_rotationX / 2.f), halfRady = CC_DEGREES_TO_RADIANS(_rotationY / 2.f), halfRadz = _rotationZ_X == _rotationZ_Y ? -CC_DEGREES_TO_RADIANS(_rotationZ_X / 2.f) : 0; + float coshalfRadx = cosf(halfRadx), sinhalfRadx = sinf(halfRadx), coshalfRady = cosf(halfRady), sinhalfRady = sinf(halfRady), coshalfRadz = cosf(halfRadz), sinhalfRadz = sinf(halfRadz); + _rotationQuat.x = sinhalfRadx * coshalfRady * coshalfRadz - coshalfRadx * sinhalfRady * sinhalfRadz; + _rotationQuat.y = coshalfRadx * sinhalfRady * coshalfRadz + sinhalfRadx * coshalfRady * sinhalfRadz; + _rotationQuat.z = coshalfRadx * coshalfRady * sinhalfRadz - sinhalfRadx * sinhalfRady * coshalfRadz; + _rotationQuat.w = coshalfRadx * coshalfRady * coshalfRadz + sinhalfRadx * sinhalfRady * sinhalfRadz; +} + +void Node::updateRotation3D() +{ + //convert quaternion to Euler angle + float x = _rotationQuat.x, y = _rotationQuat.y, z = _rotationQuat.z, w = _rotationQuat.w; + _rotationX = atan2f(2.f * (w * x + y * z), 1.f - 2.f * (x * x + y * y)); + _rotationY = asinf(2.f * (w * y - z * x)); + _rotationZ_X = atanf(2.f * (w * z + x * y) / (1.f - 2.f * (y * y + z * z))); + + _rotationX = CC_RADIANS_TO_DEGREES(_rotationX); + _rotationY = CC_RADIANS_TO_DEGREES(_rotationY); + _rotationZ_X = _rotationZ_Y = -CC_RADIANS_TO_DEGREES(_rotationZ_X); +} + +void Node::setRotationQuat(const Quaternion& quat) +{ + _rotationQuat = quat; + updateRotation3D(); + _transformUpdated = _transformDirty = _inverseDirty = true; +} + +Quaternion Node::getRotationQuat() const +{ + return _rotationQuat; +} + void Node::setRotationSkewX(float rotationX) { if (_rotationZ_X == rotationX) @@ -388,6 +430,8 @@ void Node::setRotationSkewX(float rotationX) _rotationZ_X = rotationX; _transformUpdated = _transformDirty = _inverseDirty = true; + + updateRotationQuat(); } float Node::getRotationSkewY() const @@ -409,6 +453,8 @@ void Node::setRotationSkewY(float rotationY) _rotationZ_Y = rotationY; _transformUpdated = _transformDirty = _inverseDirty = true; + + updateRotationQuat(); } /// scale getter @@ -1708,11 +1754,12 @@ const Mat4& Node::getNodeToParentTransform() const y += _anchorPointInPoints.y; } + bool needsSkewMatrix = ( _skewX || _skewY ); // Rotation values // Change rotation code to handle X and Y // If we skew with the exact same value for both x and y then we're simply just rotating float cx = 1, sx = 0, cy = 1, sy = 0; - if (_rotationZ_X || _rotationZ_Y) + if (_rotationZ_X != _rotationZ_Y || (! needsSkewMatrix && !_anchorPointInPoints.equals(Vec2::ZERO))) { float radiansX = -CC_DEGREES_TO_RADIANS(_rotationZ_X); float radiansY = -CC_DEGREES_TO_RADIANS(_rotationZ_Y); @@ -1722,8 +1769,6 @@ const Mat4& Node::getNodeToParentTransform() const sy = sinf(radiansY); } - bool needsSkewMatrix = ( _skewX || _skewY ); - Vec2 anchorPoint(_anchorPointInPoints.x * _scaleX, _anchorPointInPoints.y * _scaleY); // optimization: @@ -1737,39 +1782,26 @@ const Mat4& Node::getNodeToParentTransform() const // Build Transform Matrix // Adjusted transform calculation for rotational skew - float mat[] = { - cy * _scaleX, sy * _scaleX, 0, 0, - -sx * _scaleY, cx * _scaleY, 0, 0, - 0, 0, _scaleZ, 0, - x, y, z, 1 }; - - _transform.set(mat); - - if(!_ignoreAnchorPointForPosition) + Mat4::createRotation(_rotationQuat, &_transform); + if (_rotationZ_X != _rotationZ_Y) { - _transform.translate(anchorPoint.x, anchorPoint.y, 0); + float m0 = _transform.m[0], m1 = _transform.m[1], m4 = _transform.m[4], m5 = _transform.m[5], m8 = _transform.m[8], m9 = _transform.m[9]; + _transform.m[0] = cy * m0 - sx * m1, _transform.m[4] = cy * m4 - sx * m5, _transform.m[8] = cy * m8 - sx * m9; + _transform.m[1] = sy * m0 + cx * m1, _transform.m[5] = sy * m4 + cx * m5, _transform.m[9] = sy * m8 + cx * m9; } - - // FIXME: - // FIX ME: Expensive operation. - // FIX ME: It should be done together with the rotationZ - if(_rotationY) + if (_scaleX != 1.f) { - Mat4 rotY; - Mat4::createRotationY(CC_DEGREES_TO_RADIANS(_rotationY), &rotY); - _transform = _transform * rotY; + _transform.m[0] *= _scaleX, _transform.m[1] *= _scaleX, _transform.m[2] *= _scaleX; } - if(_rotationX) + if (_scaleY != 1.f) { - Mat4 rotX; - Mat4::createRotationX(CC_DEGREES_TO_RADIANS(_rotationX), &rotX); - _transform = _transform * rotX; + _transform.m[4] *= _scaleY, _transform.m[5] *= _scaleY, _transform.m[6] *= _scaleY; } - - if(!_ignoreAnchorPointForPosition) + if (_scaleZ != 1.f) { - _transform.translate(-anchorPoint.x, -anchorPoint.y, 0); + _transform.m[8] *= _scaleZ, _transform.m[9] *= _scaleZ, _transform.m[10] *= _scaleZ; } + _transform.m[12] = x, _transform.m[13] = y, _transform.m[14] = z; // FIXME:: Try to inline skew // If skew is needed, apply skew and then anchor point diff --git a/cocos/2d/CCNode.h b/cocos/2d/CCNode.h index f177184848..84d26dba42 100644 --- a/cocos/2d/CCNode.h +++ b/cocos/2d/CCNode.h @@ -541,6 +541,17 @@ public: * returns the rotation (X,Y,Z) in degrees. */ virtual Vec3 getRotation3D() const; + + /** + * set rotation by quaternion + */ + virtual void setRotationQuat(const Quaternion& quat); + + /** + * return the rotation by quaternion, Note that when _rotationZ_X == _rotationZ_Y, the returned quaternion equals to RotationZ_X * RotationY * RotationX, + * it equals to RotationY * RotationX otherwise + */ + virtual Quaternion getRotationQuat() const; /** * Sets the X rotation (angle) of the node in degrees which performs a horizontal rotational skew. @@ -1596,6 +1607,11 @@ protected: //check whether this camera mask is visible by the current visiting camera bool isVisitableByVisitingCamera() const; + // update quaternion from Rotation3D + void updateRotationQuat(); + // update Rotation3D from quaternion + void updateRotation3D(); + #if CC_USE_PHYSICS void updatePhysicsBodyTransform(Scene* layer); virtual void updatePhysicsBodyPosition(Scene* layer); @@ -1614,6 +1630,8 @@ protected: // rotation Z is decomposed in 2 to simulate Skew for Flash animations float _rotationZ_X; ///< rotation angle on Z-axis, component X float _rotationZ_Y; ///< rotation angle on Z-axis, component Y + + Quaternion _rotationQuat; ///rotation using quaternion, if _rotationZ_X == _rotationZ_Y, _rotationQuat = RotationZ_X * RotationY * RotationX, else _rotationQuat = RotationY * RotationX float _scaleX; ///< scaling factor on x-axis float _scaleY; ///< scaling factor on y-axis 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..5359e95c83 100644 --- a/cocos/2d/CCSprite.h +++ b/cocos/2d/CCSprite.h @@ -159,7 +159,7 @@ public: /** * Updates the quad according the rotation, position, scale values. */ - virtual void updateTransform(void); + virtual void updateTransform(); /** * Returns the batch node object if this sprite is rendered by SpriteBatchNode @@ -232,7 +232,7 @@ public: /** * Returns whether or not a SpriteFrame is being displayed */ - virtual bool isFrameDisplayed(SpriteFrame *pFrame) const; + virtual bool isFrameDisplayed(SpriteFrame *frame) const; /** * Returns the current displayed frame. @@ -264,7 +264,7 @@ public: * * @return true if the sprite needs to be updated in the Atlas, false otherwise. */ - virtual bool isDirty(void) const { return _dirty; } + virtual bool isDirty() const { return _dirty; } /** * Makes the Sprite to be updated in the Atlas. @@ -276,17 +276,17 @@ public: * @js NA * @lua NA */ - inline V3F_C4B_T2F_Quad getQuad(void) const { return _quad; } + inline V3F_C4B_T2F_Quad getQuad() const { return _quad; } /** * Returns whether or not the texture rectangle is rotated. */ - inline bool isTextureRectRotated(void) const { return _rectRotated; } + inline bool isTextureRectRotated() const { return _rectRotated; } /** * Returns the index used on the TextureAtlas. */ - inline ssize_t getAtlasIndex(void) const { return _atlasIndex; } + inline ssize_t getAtlasIndex() const { return _atlasIndex; } /** * Sets the index used on the TextureAtlas. @@ -297,22 +297,22 @@ public: /** * Returns the rect of the Sprite in points */ - inline const Rect& getTextureRect(void) { return _rect; } + inline const Rect& getTextureRect() const { return _rect; } /** * Gets the weak reference of the TextureAtlas when the sprite is rendered using via SpriteBatchNode */ - inline TextureAtlas* getTextureAtlas(void) { return _textureAtlas; } + inline TextureAtlas* getTextureAtlas() const { return _textureAtlas; } /** * Sets the weak reference of the TextureAtlas when the sprite is rendered using via SpriteBatchNode */ - inline void setTextureAtlas(TextureAtlas *pobTextureAtlas) { _textureAtlas = pobTextureAtlas; } + inline void setTextureAtlas(TextureAtlas *textureAtlas) { _textureAtlas = textureAtlas; } /** * Gets the offset position of the sprite. Calculated automatically by editors like Zwoptex. */ - inline const Vec2& getOffsetPosition(void) const { return _offsetPosition; } + inline const Vec2& getOffsetPosition() const { return _offsetPosition; } /** @@ -325,7 +325,7 @@ public: * * @return true if the sprite is flipped horizontally, false otherwise. */ - bool isFlippedX(void) const; + bool isFlippedX() const; /** * Sets whether the sprite should be flipped horizontally or not. * @@ -351,7 +351,7 @@ public: * * @return true if the sprite is flipped vertically, false otherwise. */ - bool isFlippedY(void) const; + bool isFlippedY() const; /** * Sets whether the sprite should be flipped vertically or not. * @@ -418,16 +418,16 @@ public: virtual void setVisible(bool bVisible) override; virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; virtual void setOpacityModifyRGB(bool modify) override; - virtual bool isOpacityModifyRGB(void) const override; + virtual bool isOpacityModifyRGB() const override; /// @} CC_CONSTRUCTOR_ACCESS: - Sprite(void); - virtual ~Sprite(void); + Sprite(); + virtual ~Sprite(); /* Initializes an empty sprite with nothing init. */ - virtual bool init(void); + virtual bool init(); /** * Initializes a sprite with a texture. @@ -471,7 +471,7 @@ CC_CONSTRUCTOR_ACCESS: * @param pSpriteFrame A SpriteFrame object. It should includes a valid texture and a rect * @return true if the sprite is initialized properly, false otherwise. */ - virtual bool initWithSpriteFrame(SpriteFrame *pSpriteFrame); + virtual bool initWithSpriteFrame(SpriteFrame *spriteFrame); /** * Initializes a sprite with an sprite frame name. @@ -515,11 +515,11 @@ CC_CONSTRUCTOR_ACCESS: protected: - void updateColor(void); + void updateColor(); virtual void setTextureCoords(Rect rect); - virtual void updateBlendFunc(void); - virtual void setReorderChildDirtyRecursively(void); - virtual void setDirtyRecursively(bool bValue); + virtual void updateBlendFunc(); + virtual void setReorderChildDirtyRecursively(); + virtual void setDirtyRecursively(bool value); // // Data used when the sprite is rendered using a SpriteSheet @@ -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 3c458dd63e..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\*.* + + @@ -445,6 +447,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + @@ -599,11 +602,13 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + + @@ -864,6 +869,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + @@ -972,6 +978,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\chipmunk\prebuilt\win32\release-lib\*.* + diff --git a/cocos/2d/libcocos2d.vcxproj.filters b/cocos/2d/libcocos2d.vcxproj.filters index 2b7c3c2788..d9bbc8fc34 100644 --- a/cocos/2d/libcocos2d.vcxproj.filters +++ b/cocos/2d/libcocos2d.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -244,6 +244,9 @@ {e1848cce-b225-42c4-bb6e-6430b6da123b} + + {e6eaa24a-a21e-4c1d-b6b2-19326d129af2} + @@ -1313,6 +1316,9 @@ cocostudio\reader\WidgetReader\ArmatureNodeReader + + ui\shaders + @@ -2568,6 +2574,9 @@ cocostudio\reader\WidgetReader\ArmatureNodeReader + + ui\shaders + @@ -2595,5 +2604,8 @@ 3d + + ui\shaders + \ No newline at end of file diff --git a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems index 3d2ab32d4d..1ecd22703a 100644 --- a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems +++ b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems @@ -70,11 +70,13 @@ + + @@ -185,6 +187,7 @@ + @@ -311,6 +314,7 @@ + @@ -341,6 +345,7 @@ + @@ -487,11 +492,13 @@ + + @@ -595,6 +602,7 @@ + @@ -699,6 +707,7 @@ + @@ -730,6 +739,7 @@ + @@ -830,6 +840,7 @@ + @@ -866,6 +877,7 @@ + diff --git a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters index abd28a29b8..952f32bc42 100644 --- a/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters +++ b/cocos/2d/libcocos2d_8_1/libcocos2d_8_1/libcocos2d_8_1.Shared/libcocos2d_8_1.Shared.vcxitems.filters @@ -1267,6 +1267,21 @@ cocostudio\reader\WidgetReader\ArmatureNodeReader + + ui\shaders + + + cocostudio\TimelineAction + + + 3d + + + 3d + + + platform\winrt + @@ -2345,6 +2360,21 @@ cocostudio\reader\WidgetReader\ArmatureNodeReader + + ui\shaders + + + cocostudio\TimelineAction + + + 3d + + + 3d + + + platform\winrt + @@ -2578,6 +2608,9 @@ {1151b6b3-739f-4cff-add0-6b772fa7d226} + + {10d3def7-52ba-4939-8de7-d9960a752f1e} + @@ -2689,5 +2722,11 @@ 2d + + ui\shaders + + + 3d + \ No newline at end of file diff --git a/cocos/2d/libcocos2d_wp8.vcxproj b/cocos/2d/libcocos2d_wp8.vcxproj index 9ff4ef101c..8ac8de6188 100644 --- a/cocos/2d/libcocos2d_wp8.vcxproj +++ b/cocos/2d/libcocos2d_wp8.vcxproj @@ -224,15 +224,18 @@ + + + @@ -332,6 +335,7 @@ + @@ -457,6 +461,7 @@ + @@ -488,6 +493,7 @@ + @@ -662,11 +668,13 @@ + + @@ -814,6 +822,7 @@ + @@ -917,6 +926,7 @@ + Create @@ -951,6 +961,7 @@ + @@ -1057,6 +1068,7 @@ + @@ -1086,6 +1098,7 @@ + diff --git a/cocos/2d/libcocos2d_wp8.vcxproj.filters b/cocos/2d/libcocos2d_wp8.vcxproj.filters index 4222bbc3d3..b0702d9063 100644 --- a/cocos/2d/libcocos2d_wp8.vcxproj.filters +++ b/cocos/2d/libcocos2d_wp8.vcxproj.filters @@ -245,6 +245,9 @@ {939d9d3e-06b3-494e-affd-070c2c1cbe1d} + + {f6df0f43-3b03-4746-b786-4323895be3b1} + @@ -1317,6 +1320,21 @@ cocostudio\reader\WidgetReader\ArmatureNodeReader + + ui\shaders + + + cocostudio\TimelineAction + + + 3d + + + 3d + + + platform\winrt + @@ -2556,6 +2574,24 @@ cocostudio\reader\WidgetReader\ArmatureNodeReader + + ui\shaders + + + cocostudio\TimelineAction + + + 3d + + + 3d + + + 3d + + + platform\winrt + @@ -2645,5 +2681,11 @@ renderer\shaders + + ui\shaders + + + 3d + \ No newline at end of file diff --git a/cocos/3d/CCFrustum.cpp b/cocos/3d/CCFrustum.cpp index 10fc0a5cac..ace97e6098 100755 --- a/cocos/3d/CCFrustum.cpp +++ b/cocos/3d/CCFrustum.cpp @@ -27,46 +27,44 @@ NS_CC_BEGIN -bool Frustum::initFrustum(const Camera* pCamera) +bool Frustum::initFrustum(const Camera* camera) { - _bInit = true; - createPlane(pCamera); + _initialized = true; + createPlane(camera); return true; } -bool Frustum::isOutFrustum(const AABB& aabb) const +bool Frustum::isOutOfFrustum(const AABB& aabb) const { - if (_bInit) + if (_initialized) { Vec3 point; - int nplane = _bClipZ ? 6 : 4; - for (int i = 0; i < nplane; i++) + 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) == Plane::FRONT_PLANE ) + if (_plane[i].getSide(point) == PointSide::FRONT_PLANE ) return true; } } return false; } -bool Frustum::isOutFrustum(const OBB& obb) const +bool Frustum::isOutOfFrustum(const OBB& obb) const { - if (_bInit) + if (_initialized) { Vec3 point; - - int nplane = _bClipZ ? 6 : 4; - + 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 < nplane; i++) + for (int i = 0; i < plane; i++) { const Vec3& normal = _plane[i].getNormal(); point = obb._center; @@ -74,16 +72,16 @@ bool Frustum::isOutFrustum(const OBB& obb) const 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) == Plane::FRONT_PLANE) + if (_plane[i].getSide(point) == PointSide::FRONT_PLANE) return true; } } return false; } -void Frustum::createPlane(const Camera* pcamera) +void Frustum::createPlane(const Camera* camera) { - const Mat4& mat = pcamera->getViewProjectionMatrix(); + 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 diff --git a/cocos/3d/CCFrustum.h b/cocos/3d/CCFrustum.h index 48f71c1a5d..86638342b1 100755 --- a/cocos/3d/CCFrustum.h +++ b/cocos/3d/CCFrustum.h @@ -41,38 +41,38 @@ public: /** * Constructor & Destructor. */ - Frustum(): _bInit(false), _bClipZ(true){} + Frustum(): _initialized(false), _clipZ(true){} ~Frustum(){} /** * init frustum from camera. */ - bool initFrustum(const Camera* pCamera); + bool initFrustum(const Camera* camera); /** * is aabb out of frustum. */ - bool isOutFrustum(const AABB& aabb) const; + bool isOutOfFrustum(const AABB& aabb) const; /** * is obb out of frustum */ - bool isOutFrustum(const OBB& obb) const; + bool isOutOfFrustum(const OBB& obb) const; /** * get & set z clip. if bclipZ == true use near and far plane */ - void setClipZ(bool bclipZ) { _bClipZ = bclipZ; } - bool isClipZ() { return _bClipZ; } + void setClipZ(bool clipZ) { _clipZ = clipZ; } + bool isClipZ() { return _clipZ; } protected: /** * create clip plane */ - void createPlane(const Camera* pcamera); + void createPlane(const Camera* camera); Plane _plane[6]; // clip plane, left, right, top, bottom, near, far - bool _bClipZ; // use near and far clip plane - bool _bInit; + bool _clipZ; // use near and far clip plane + bool _initialized; }; NS_CC_END 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 index 7668ea28b3..722ed2e91d 100755 --- a/cocos/3d/CCPlane.cpp +++ b/cocos/3d/CCPlane.cpp @@ -27,9 +27,11 @@ NS_CC_BEGIN Plane::Plane() +: +_normal(0.f, 0.f, 1.f), +_dist(0.f) { - _normal.set(0.0f, 0.0f, 1.0f); - _dist = 0.0f; + } // create plane from tree point @@ -54,9 +56,7 @@ 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); } @@ -81,15 +81,15 @@ float Plane::dist2Plane(const Vec3& p) const } -Plane::POINT_SIDE Plane::getSide(const Vec3& point) const +PointSide Plane::getSide(const Vec3& point) const { float dist = dist2Plane(point); if (dist > 0) - return Plane::FRONT_PLANE; + return PointSide::FRONT_PLANE; else if (dist < 0) - return Plane::BEHIND_PLANE; - - return Plane::ON_PLANE; + return PointSide::BEHIND_PLANE; + else + return PointSide::IN_PLANE; } NS_CC_END diff --git a/cocos/3d/CCPlane.h b/cocos/3d/CCPlane.h index 1ce1cb5ec7..b94377250a 100755 --- a/cocos/3d/CCPlane.h +++ b/cocos/3d/CCPlane.h @@ -30,16 +30,15 @@ NS_CC_BEGIN +enum class PointSide +{ + IN_PLANE, + FRONT_PLANE, + BEHIND_PLANE, +}; + class CC_DLL Plane { -public: - enum POINT_SIDE - { - ON_PLANE, - FRONT_PLANE, - BEHIND_PLANE, - }; - public: /** * create plane from tree point. @@ -55,6 +54,10 @@ public: * create plane from normal and a point on plane. */ Plane(const Vec3& normal, const Vec3& point); + + /** + * create a default plan whose normal is (0, 0, 1), and _dist is 0, xoy plan in fact. + */ Plane(); /** @@ -90,7 +93,7 @@ public: /** * Return the side where the point is. */ - POINT_SIDE getSide(const Vec3& point) const; + PointSide getSide(const Vec3& point) const; protected: Vec3 _normal; diff --git a/cocos/3d/CCRay.cpp b/cocos/3d/CCRay.cpp index 604311676f..046901e8ef 100755 --- a/cocos/3d/CCRay.cpp +++ b/cocos/3d/CCRay.cpp @@ -142,17 +142,17 @@ bool Ray::intersects(const OBB& obb) const 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; + 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; + return _origin + dis * _direction; } void Ray::set(const Vec3& origin, const Vec3& direction) diff --git a/cocos/3d/CCSprite3D.cpp b/cocos/3d/CCSprite3D.cpp index 4d6f56dcd0..d98ee8e258 100644 --- a/cocos/3d/CCSprite3D.cpp +++ b/cocos/3d/CCSprite3D.cpp @@ -151,6 +151,10 @@ void Sprite3D::afterAsyncLoad(void* param) setTexture(asyncParam->texPath); } } + else + { + CCLOG("file load failed: %s ", asyncParam->modlePath.c_str()); + } asyncParam->afterLoadCallback(this, asyncParam->callbackParam); } } @@ -598,7 +602,7 @@ static Texture2D * getDummyTexture() void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { // camera clipping - if(!Camera::getVisitingCamera()->visibleInFrustum(this->getAABB())) + if(!Camera::getVisitingCamera()->isVisibleInFrustum(&this->getAABB())) return; if (_skeleton) 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/base/CCConsole.cpp b/cocos/base/CCConsole.cpp index 30e267aa8b..bab98e4668 100644 --- a/cocos/base/CCConsole.cpp +++ b/cocos/base/CCConsole.cpp @@ -42,6 +42,7 @@ #define bzero(a, b) memset(a, 0, b); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) #include "inet_ntop_winrt.h" +#include "inet_pton_winrt.h" #include "CCWinRTUtils.h" #endif #else @@ -201,6 +202,25 @@ static const char* inet_ntop(int af, const void* src, char* dst, int cnt) } #endif +static const int CCLOG_STRING_TAG = 1; +void SendLogToWindow(const char *log) +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) + // Send data as a message + COPYDATASTRUCT myCDS; + myCDS.dwData = CCLOG_STRING_TAG; + myCDS.cbData = (DWORD)strlen(log) + 1; + myCDS.lpData = (PVOID)log; + if (Director::getInstance()->getOpenGLView()) + { + HWND hwnd = Director::getInstance()->getOpenGLView()->getWin32Window(); + SendMessage(hwnd, + WM_COPYDATA, + (WPARAM)(HWND)hwnd, + (LPARAM)(LPVOID)&myCDS); + } +#endif +} // // Free functions to log @@ -222,6 +242,7 @@ static void _log(const char *format, va_list args) OutputDebugStringW(wszBuf); WideCharToMultiByte(CP_ACP, 0, wszBuf, -1, buf, sizeof(buf), nullptr, FALSE); printf("%s", buf); + SendLogToWindow(buf); fflush(stdout); #else // Linux, Mac, iOS, etc @@ -259,6 +280,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[] = { @@ -345,6 +367,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 */ @@ -1140,6 +1178,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 1c82486a19..85cb33ee7f 100644 --- a/cocos/base/CCConsole.h +++ b/cocos/base/CCConsole.h @@ -51,7 +51,6 @@ typedef SSIZE_T ssize_t; #include "base/ccMacros.h" #include "platform/CCPlatformMacros.h" - NS_CC_BEGIN /// The max length of CCLog message. @@ -101,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(); @@ -144,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..d8393bc147 100644 --- a/cocos/base/CCDirector.cpp +++ b/cocos/base/CCDirector.cpp @@ -61,6 +61,10 @@ THE SOFTWARE. #include "platform/CCApplication.h" //#include "platform/CCGLViewImpl.h" +#if CC_ENABLE_SCRIPT_BINDING +#include "CCScriptSupport.h" +#endif + /** Position of the FPS @@ -120,12 +124,16 @@ bool Director::init(void) _FPSLabel = _drawnBatchesLabel = _drawnVerticesLabel = nullptr; _totalFrames = 0; _lastUpdate = new struct timeval; + _secondsPerFrame = 1.0f; // paused ? _paused = false; // purge ? _purgeDirectorInNextLoop = false; + + // restart ? + _restartDirectorInNextLoop = false; _winSizeInPoints = Size::ZERO; @@ -940,17 +948,22 @@ void Director::end() _purgeDirectorInNextLoop = true; } -void Director::purgeDirector() +void Director::restart() +{ + _restartDirectorInNextLoop = true; +} + +void Director::reset() { // cleanup scheduler getScheduler()->unscheduleAll(); - // Disable event dispatching + // Remove all events if (_eventDispatcher) { - _eventDispatcher->setEnabled(false); + _eventDispatcher->removeAllEventListeners(); } - + if (_runningScene) { _runningScene->onExit(); @@ -960,22 +973,22 @@ void Director::purgeDirector() _runningScene = nullptr; _nextScene = nullptr; - + // remove all objects, but don't release it. // runWithScene might be executed after 'end'. _scenesStack.clear(); - + stopAnimation(); - + CC_SAFE_RELEASE_NULL(_FPSLabel); CC_SAFE_RELEASE_NULL(_drawnBatchesLabel); CC_SAFE_RELEASE_NULL(_drawnVerticesLabel); - + // purge bitmap cache FontFNT::purgeCachedData(); - + FontFreeType::shutdownFreeType(); - + // purge all managed caches #if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) @@ -996,13 +1009,18 @@ void Director::purgeDirector() GLProgramStateCache::destroyInstance(); FileUtils::destroyInstance(); AsyncTaskPool::destoryInstance(); - + // cocos2d-x specific data structures UserDefault::destroyInstance(); GL::invalidateStateCache(); destroyTextureCache(); +} + +void Director::purgeDirector() +{ + reset(); CHECK_GL_ERROR_DEBUG(); @@ -1017,6 +1035,23 @@ void Director::purgeDirector() release(); } +void Director::restartDirector() +{ + reset(); + + // Texture cache need to be reinitialized + initTextureCache(); + + // release the objects + PoolManager::getInstance()->getCurrentPool()->clear(); + + // Real restart in script level +#if CC_ENABLE_SCRIPT_BINDING + ScriptEvent scriptEvent(kRestartGame, NULL); + ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&scriptEvent); +#endif +} + void Director::setNextScene() { bool runningIsTransition = dynamic_cast(_runningScene) != nullptr; @@ -1304,6 +1339,11 @@ void DisplayLinkDirector::mainLoop() _purgeDirectorInNextLoop = false; purgeDirector(); } + else if (_restartDirectorInNextLoop) + { + _restartDirectorInNextLoop = false; + restartDirector(); + } else if (! _invalid) { drawScene(); diff --git a/cocos/base/CCDirector.h b/cocos/base/CCDirector.h index 644722629d..93c209c4d0 100644 --- a/cocos/base/CCDirector.h +++ b/cocos/base/CCDirector.h @@ -287,6 +287,10 @@ public: The "delta time" will be 0 (as if the game wasn't paused) */ void resume(); + + /** Restart the director + */ + void restart(); /** Stops the animation. Nothing will be drawn. The main loop won't be triggered anymore. If you don't want to pause your animation call [pause] instead. @@ -396,9 +400,14 @@ public: void resetMatrixStack(); protected: + void reset(); + void purgeDirector(); bool _purgeDirectorInNextLoop; // this flag will be set to true in end() + void restartDirector(); + bool _restartDirectorInNextLoop; // this flag will be set to true in restart() + void setNextScene(); void showStats(); diff --git a/cocos/base/CCScriptSupport.h b/cocos/base/CCScriptSupport.h index da896a9f07..4506d44233 100644 --- a/cocos/base/CCScriptSupport.h +++ b/cocos/base/CCScriptSupport.h @@ -211,7 +211,8 @@ enum ScriptEventType kAccelerometerEvent, kControlEvent, kCommonEvent, - kComponentEvent + kComponentEvent, + kRestartGame }; struct BasicScriptData 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/ActionTimeline/CCActionTimeline.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp index 3f60a792ff..6ab3e3cf69 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.cpp @@ -91,6 +91,18 @@ bool ActionTimeline::init() return true; } +void ActionTimeline::play(std::string name, bool loop) +{ + if(_indexes.find(name) == _indexes.end()) + { + CCLOG("Cann't find action indexes for %s.", name.c_str()); + return; + } + + ActionIndexes& indexes = _indexes[name]; + gotoFrameAndPlay(indexes.startIndex, indexes.endIndex, loop); +} + void ActionTimeline::gotoFrameAndPlay(int startIndex) { gotoFrameAndPlay(startIndex, true); @@ -266,6 +278,28 @@ void ActionTimeline::removeTimeline(Timeline* timeline) } } +void ActionTimeline::addIndexes(const ActionIndexes& indexes) +{ + if(_indexes.find(indexes.name) != _indexes.end()) + { + CCLOG("ActionIndexes (%s) already exsists.", indexes.name.c_str()); + return; + } + + _indexes[indexes.name] = indexes; +} + +void ActionTimeline::removeIndexes(std::string name) +{ + if(_indexes.find(name) == _indexes.end()) + { + CCLOG("ActionIndexes %s don't exsists.", name.c_str()); + return; + } + + _indexes.erase(name); +} + void ActionTimeline::setFrameEventCallFunc(std::function listener) { _frameEventListener = listener; diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h index 76a3299d78..567188dec2 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimeline.h @@ -31,6 +31,13 @@ THE SOFTWARE. NS_TIMELINE_BEGIN +struct ActionIndexes +{ + std::string name; + int startIndex; + int endIndex; +}; + class CC_STUDIO_DLL ActionTimelineData : public cocos2d::Ref { public: @@ -57,6 +64,8 @@ public: virtual ~ActionTimeline(); virtual bool init(); + + virtual void play(std::string name, bool loop); /** Goto the specified frame index, and start playing from this index. * @param startIndex The animation will play from this index. @@ -88,6 +97,7 @@ public: * @param startIndex The animation will pause at this index. */ virtual void gotoFrameAndPause(int startIndex); + /** Pause the animation. */ virtual void pause(); @@ -122,7 +132,11 @@ public: /** add Timeline to ActionTimeline */ virtual void addTimeline(Timeline* timeline); virtual void removeTimeline(Timeline* timeline); - + + /** add ActionIndexes */ + virtual void addIndexes(const ActionIndexes& indexes); + virtual void removeIndexes(std::string name); + virtual const cocos2d::Vector& getTimelines() const { return _timelineList; } /** Set ActionTimeline's frame event callback function */ @@ -168,6 +182,7 @@ protected: std::function _frameEventListener; std::function _lastFrameListener; + std::map _indexes; }; NS_TIMELINE_END diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp index bb3c9e9d40..f6db2f1ae1 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CCActionTimelineCache.cpp @@ -439,6 +439,7 @@ ActionTimeline* ActionTimelineCache::loadAnimationActionWithFlatBuffersFile(cons float speed = nodeAction->speed(); action->setTimeSpeed(speed); + auto timelines = nodeAction->timeLines(); int timelineLength = timelines->size(); for (int i = 0; i < timelineLength; i++) diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp index 04164ab28b..3eff6259f9 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp +++ b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.cpp @@ -181,6 +181,7 @@ CSLoader::CSLoader() , _jsonPath("") , _monoCocos2dxVersion("") , _rootNode(nullptr) +, _csBuildID("2.0.8.0") { CREATE_CLASS_NODE_READER_INFO(NodeReader); CREATE_CLASS_NODE_READER_INFO(SingleNodeReader); @@ -782,6 +783,21 @@ Node* CSLoader::nodeWithFlatBuffersFile(const std::string &fileName) Data buf = FileUtils::getInstance()->getDataFromFile(fullPath); auto csparsebinary = GetCSParseBinary(buf.getBytes()); + + auto csBuildId = csparsebinary->version(); + if (csBuildId) + { + CCASSERT(strcmp(_csBuildID.c_str(), csBuildId->c_str()) == 0, + String::createWithFormat("%s%s%s%s%s%s%s%s", + "The build id of your CocosStudio exported file(", + csBuildId->c_str(), + ") and the build id of your cocos reader(", + _csBuildID.c_str(), + ") are not match.\n", + "Please get the correct cocos reader from ", + "https://github.com/chukong/cocos-reader", + " and replace the reader in your Cocos2d-x")->getCString()); + } // decode plist auto textures = csparsebinary->textures(); @@ -791,9 +807,6 @@ Node* CSLoader::nodeWithFlatBuffersFile(const std::string &fileName) { SpriteFrameCache::getInstance()->addSpriteFramesWithFile(textures->Get(i)->c_str()); } - - auto v = csparsebinary->version(); - if (v) _csdVersion = v->c_str(); Node* node = nodeWithFlatBuffers(csparsebinary->nodeTree()); @@ -1137,9 +1150,6 @@ Node* CSLoader::createNodeWithFlatBuffersForSimulator(const std::string& filenam auto nodeTree = csparsebinary->nodeTree(); - auto v = csparsebinary->version(); - if (v) _csdVersion = v->c_str(); - Node* node = nodeWithFlatBuffersForSimulator(nodeTree); _rootNode = nullptr; diff --git a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h index 93b2e16d7a..505645e5fc 100644 --- a/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h +++ b/cocos/editor-support/cocostudio/ActionTimeline/CSLoader.h @@ -104,7 +104,6 @@ public: cocos2d::Node* createNodeWithFlatBuffersForSimulator(const std::string& filename); cocos2d::Node* nodeWithFlatBuffersForSimulator(const flatbuffers::NodeTree* nodetree); - std::string getCsdVersion() { return _csdVersion; } protected: @@ -151,8 +150,7 @@ protected: std::string _monoCocos2dxVersion; Node* _rootNode; -// std::vector _loadingNodeParentHierarchy; - std::string _csdVersion; + std::string _csBuildID; }; NS_CC_END diff --git a/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp b/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp index 8397e5668c..a780c70bf4 100644 --- a/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp +++ b/cocos/editor-support/cocostudio/FlatBuffersSerialize.cpp @@ -1218,19 +1218,19 @@ Offset FlatBuffersSerialize::createProjectNodeOptionsForSimu if (name == "FileData") { - const tinyxml2::XMLAttribute* attribute = child->FirstAttribute(); + const tinyxml2::XMLAttribute* attributeFileData = child->FirstAttribute(); - while (attribute) + while (attributeFileData) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeFileData->Name(); + std::string value = attributeFileData->Value(); if (name == "Path") { filename = value; } - attribute = attribute->Next(); + attributeFileData = attributeFileData->Next(); } } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp index 2494264820..f4c0032d07 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ArmatureNodeReader/ArmatureNodeReader.cpp @@ -115,17 +115,25 @@ 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()); - ArmatureDataManager::getInstance()->addArmatureFileInfo(FileUtils::getInstance()->fullPathForFilename(filepath)); + std::string fullpath = FileUtils::getInstance()->fullPathForFilename(filepath); + + std::string dirpath = fullpath.substr(0, fullpath.find_last_of("/")); + FileUtils::getInstance()->addSearchPath(dirpath); + + ArmatureDataManager::getInstance()->addArmatureFileInfo(fullpath); custom->init(getArmatureName(filepath)); + std::string currentname = options->currentAnimationName()->c_str(); if (options->isAutoPlay()) - custom->getAnimation()->play(options->currentAnimationName()->c_str(), -1, options->isLoop()); + custom->getAnimation()->play(currentname, -1, options->isLoop()); else - custom->getAnimation()->setIsPlaying(false); + { + custom->getAnimation()->play(currentname); + custom->getAnimation()->gotoAndPause(0); + } } cocos2d::Node* ArmatureNodeReader::createNodeWithFlatBuffers(const flatbuffers::Table *nodeOptions) @@ -148,9 +156,9 @@ cocos2d::Node* ArmatureNodeReader::createNodeWithFlatBuffers(const flatbuffers: std::string ArmatureNodeReader::getArmatureName(const std::string& exporJsonPath) { //FileUtils.getFileData(exporJsonPath, "r", size) // need read armature name in exportJsonPath - int end = exporJsonPath.find_last_of("."); - int start = exporJsonPath.find_last_of("\\") + 1; - int start1 = exporJsonPath.find_last_of("/") + 1; + size_t end = exporJsonPath.find_last_of("."); + size_t start = exporJsonPath.find_last_of("\\") + 1; + size_t start1 = exporJsonPath.find_last_of("/") + 1; if (start < start1) start = start1; diff --git a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp index b08901c889..00c64e7049 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.cpp @@ -776,12 +776,20 @@ namespace cocostudio } int CheckBoxReader::getResourceType(std::string key) - { - if(key == "Normal" || key == "Default" || key == "MarkedSubImage") - { - return 0; - } - - return 1; - } + { + if(key == "Normal" || key == "Default") + { + return 0; + } + + FlatBuffersSerialize* fbs = FlatBuffersSerialize::getInstance(); + if(fbs->_isSimulator) + { + if(key == "MarkedSubImage") + { + return 0; + } + } + return 1; + } } diff --git a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp index 4272f4b14a..e43ade4575 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.cpp @@ -185,11 +185,11 @@ namespace cocostudio if (name == "InnerNodeSize") { - auto attribute = child->FirstAttribute(); - while (attribute) + auto attributeInnerNodeSize = child->FirstAttribute(); + while (attributeInnerNodeSize) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeInnerNodeSize->Name(); + std::string value = attributeInnerNodeSize->Value(); if (name == "Width") { @@ -200,17 +200,17 @@ namespace cocostudio innerSize.height = atof(value.c_str()); } - attribute = attribute->Next(); + attributeInnerNodeSize = attributeInnerNodeSize->Next(); } } else if (name == "Size" && backGroundScale9Enabled) { - auto attribute = child->FirstAttribute(); + auto attributeSize = child->FirstAttribute(); - while (attribute) + while (attributeSize) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeSize->Name(); + std::string value = attributeSize->Value(); if (name == "X") { @@ -221,17 +221,17 @@ namespace cocostudio scale9Size.height = atof(value.c_str()); } - attribute = attribute->Next(); + attributeSize = attributeSize->Next(); } } else if (name == "SingleColor") { - auto attribute = child->FirstAttribute(); + auto attributeSingleColor = child->FirstAttribute(); - while (attribute) + while (attributeSingleColor) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeSingleColor->Name(); + std::string value = attributeSingleColor->Value(); if (name == "R") { @@ -246,17 +246,17 @@ namespace cocostudio bgColor.b = atoi(value.c_str()); } - attribute = attribute->Next(); + attributeSingleColor = attributeSingleColor->Next(); } } else if (name == "EndColor") { - auto attribute = child->FirstAttribute(); + auto attributeEndColor = child->FirstAttribute(); - while (attribute) + while (attributeEndColor) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeEndColor->Name(); + std::string value = attributeEndColor->Value(); if (name == "R") { @@ -271,17 +271,17 @@ namespace cocostudio bgEndColor.b = atoi(value.c_str()); } - attribute = attribute->Next(); + attributeEndColor = attributeEndColor->Next(); } } else if (name == "FirstColor") { - auto attribute = child->FirstAttribute(); + auto attributeFirstColor = child->FirstAttribute(); - while (attribute) + while (attributeFirstColor) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeFirstColor->Name(); + std::string value = attributeFirstColor->Value(); if (name == "R") { @@ -296,16 +296,16 @@ namespace cocostudio bgStartColor.b = atoi(value.c_str()); } - attribute = attribute->Next(); + attributeFirstColor = attributeFirstColor->Next(); } } else if (name == "ColorVector") { - auto attribute = child->FirstAttribute(); - while (attribute) + auto attributeColorVector = child->FirstAttribute(); + while (attributeColorVector) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeColorVector->Name(); + std::string value = attributeColorVector->Value(); if (name == "ScaleX") { @@ -316,7 +316,7 @@ namespace cocostudio colorVector.y = atof(value.c_str()); } - attribute = attribute->Next(); + attributeColorVector = attributeColorVector->Next(); } } else if (name == "FileData") @@ -324,12 +324,12 @@ namespace cocostudio std::string texture; std::string texturePng; - auto attribute = child->FirstAttribute(); + auto attributeFileData = child->FirstAttribute(); - while (attribute) + while (attributeFileData) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeFileData->Name(); + std::string value = attributeFileData->Value(); if (name == "Path") { @@ -345,7 +345,7 @@ namespace cocostudio texture = value; } - attribute = attribute->Next(); + attributeFileData = attributeFileData->Next(); } if (resourceType == 1) diff --git a/cocos/editor-support/cocostudio/WidgetReader/NodeReader/NodeReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/NodeReader/NodeReader.cpp index 9353f4f5fb..1ec46e2fc6 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/NodeReader/NodeReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/NodeReader/NodeReader.cpp @@ -519,6 +519,8 @@ namespace cocostudio auto layoutComponentTable = ((WidgetOptions*)nodeOptions)->layoutComponent(); if (!layoutComponentTable) return; + auto layoutComponent = ui::LayoutComponent::bindLayoutComponent(node); + bool positionXPercentEnabled = layoutComponentTable->positionXPercentEnabled(); bool positionYPercentEnabled = layoutComponentTable->positionYPercentEnabled(); float positionXPercent = layoutComponentTable->positionXPercent(); @@ -536,9 +538,6 @@ namespace cocostudio float topMargin = layoutComponentTable->topMargin(); float bottomMargin = layoutComponentTable->bottomMargin(); - auto layoutComponent = ui::LayoutComponent::create(); - node->addComponent(layoutComponent); - layoutComponent->setPositionPercentXEnabled(positionXPercentEnabled); layoutComponent->setPositionPercentYEnabled(positionYPercentEnabled); layoutComponent->setPositionPercentX(positionXPercent); diff --git a/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp index 23ff6f16b5..810f4d1f26 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.cpp @@ -98,12 +98,12 @@ namespace cocostudio if (name == "FileData") { - const tinyxml2::XMLAttribute* attribute = child->FirstAttribute(); + const tinyxml2::XMLAttribute* attributeFileData = child->FirstAttribute(); - while (attribute) + while (attributeFileData) { - name = attribute->Name(); - std::string value = attribute->Value(); + name = attributeFileData->Name(); + std::string value = attributeFileData->Value(); if (name == "Path") { @@ -112,7 +112,7 @@ namespace cocostudio filename = convert; } - attribute = attribute->Next(); + attributeFileData = attributeFileData->Next(); } } diff --git a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp index 1bf4e66b8d..c7502b30e8 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.cpp @@ -106,8 +106,13 @@ namespace cocostudio textField->setFontSize(DICTOOL->getIntValue_json(options, P_FontSize,20)); - - textField->setFontName(DICTOOL->getStringValue_json(options, P_FontName, "")); + std::string jsonPath = GUIReader::getInstance()->getFilePath(); + std::string fontName = DICTOOL->getStringValue_json(options, P_FontName, ""); + std::string fontFilePath = jsonPath.append(fontName); + if (FileUtils::getInstance()->isFileExist(fontFilePath)) + textField->setFontName(fontFilePath); + else + textField->setFontName(fontName); bool tsw = DICTOOL->checkObjectExist_json(options, P_TouchSizeWidth); bool tsh = DICTOOL->checkObjectExist_json(options, P_TouchSizeHeight); diff --git a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp index 7807517b41..c67b8c0ac0 100644 --- a/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp +++ b/cocos/editor-support/cocostudio/WidgetReader/WidgetReader.cpp @@ -771,44 +771,11 @@ namespace cocostudio widget->setCascadeOpacityEnabled(true); widget->setAnchorPoint(Vec2::ZERO); - widget->setUnifySizeEnabled(true); - std::string versionString = CSLoader::getInstance()->getCsdVersion(); - - //assume versionString is like "2.0.6.0" - if (versionString.length() > 0) - { - int p1, p2, p3, v1, v2, v3; - p1 = p2 = p3 = v1 = v2 = v3 = 0; - p1 = versionString.find('.'); - if (p1 > 0) - { - p2 = versionString.find('.', p1 + 1); - v1 = atoi(versionString.substr(0, p1).c_str()); - } - if (p2 > p1) - { - p3 = versionString.find('.', p2 + 1); - v2 = atoi(versionString.substr(p1 + 1, p2 - p1 - 1).c_str()); - } - if (p3 > p2) - { - v3 = atoi(versionString.substr(p2 + 1, p3 - p2 - 1).c_str()); - } - - if (!(v1 <= 2 && v2 == 0 && v3 <= 6)) - { - widget->setUnifySizeEnabled(false); - widget->setLayoutComponentEnabled(true); - } - } - - bool ignoreSize = options->ignoreSize(); - widget->ignoreContentAdaptWithSize(ignoreSize); - - /* + widget->setUnifySizeEnabled(false); + widget->setLayoutComponentEnabled(true); + widget->ignoreContentAdaptWithSize(false); Size contentSize(options->size()->width(), options->size()->height()); widget->setContentSize(contentSize); - */ int tag = options->tag(); widget->setTag(tag); @@ -871,6 +838,8 @@ namespace cocostudio auto layoutComponentTable = ((WidgetOptions*)nodeOptions)->layoutComponent(); if (!layoutComponentTable) return; + auto layoutComponent = ui::LayoutComponent::bindLayoutComponent(node); + bool positionXPercentEnabled = layoutComponentTable->positionXPercentEnabled(); bool positionYPercentEnabled = layoutComponentTable->positionYPercentEnabled(); float positionXPercent = layoutComponentTable->positionXPercent(); @@ -888,9 +857,6 @@ namespace cocostudio float topMargin = layoutComponentTable->topMargin(); float bottomMargin = layoutComponentTable->bottomMargin(); - auto layoutComponent = ui::LayoutComponent::create(); - node->addComponent(layoutComponent); - layoutComponent->setPositionPercentXEnabled(positionXPercentEnabled); layoutComponent->setPositionPercentYEnabled(positionYPercentEnabled); layoutComponent->setPositionPercentX(positionXPercent); diff --git a/cocos/platform/CCCommon.h b/cocos/platform/CCCommon.h index 2b80353da9..3837a16e50 100644 --- a/cocos/platform/CCCommon.h +++ b/cocos/platform/CCCommon.h @@ -64,7 +64,9 @@ enum class LanguageType PORTUGUESE, ARABIC, NORWEGIAN, - POLISH + POLISH, + TURKISH, + UKRAINIAN }; // END of platform group diff --git a/cocos/platform/CCFileUtils.cpp b/cocos/platform/CCFileUtils.cpp index 8d56c85eed..7145e3b3cc 100644 --- a/cocos/platform/CCFileUtils.cpp +++ b/cocos/platform/CCFileUtils.cpp @@ -513,7 +513,16 @@ void FileUtils::destroyInstance() CC_SAFE_DELETE(s_sharedFileUtils); } +void FileUtils::setDelegate(FileUtils *delegate) +{ + if (s_sharedFileUtils) + delete s_sharedFileUtils; + + s_sharedFileUtils = delegate; +} + FileUtils::FileUtils() + : _writablePath("") { } @@ -521,6 +530,8 @@ FileUtils::~FileUtils() { } + + bool FileUtils::init() { _searchPathArray.push_back(_defaultResRootPath); @@ -828,6 +839,16 @@ const std::vector& FileUtils::getSearchPaths() const return _searchPathArray; } +void FileUtils::setWritablePath(const std::string& writablePath) +{ + _writablePath = writablePath; +} + +void FileUtils::setDefaultResourceRootPath(const std::string& path) +{ + _defaultResRootPath = path; +} + void FileUtils::setSearchPaths(const std::vector& searchPaths) { bool existDefaultRootPath = false; diff --git a/cocos/platform/CCFileUtils.h b/cocos/platform/CCFileUtils.h index 2323d222b5..77b8026899 100644 --- a/cocos/platform/CCFileUtils.h +++ b/cocos/platform/CCFileUtils.h @@ -54,6 +54,20 @@ public: * Destroys the instance of FileUtils. */ static void destroyInstance(); + + /** + * You can inherit from platform dependent implementation of FileUtils, such as FileUtilsAndroid, + * and use this function to set delegate, then FileUtils will invoke delegate's implementation. + * Fox example, your resources are encrypted, so you need to decrypt it after reading data from + * resources, then you can implement all getXXX functions, and engine will invoke your own getXX + * functions when reading data of resources. + * + * If you don't want to system default implementation after setting delegate, you can just pass nullptr + * to this function. + * + * @warm It will delete previous delegate + */ + static void setDelegate(FileUtils *delegate); /** @deprecated Use getInstance() instead */ CC_DEPRECATED_ATTRIBUTE static FileUtils* sharedFileUtils() { return getInstance(); } @@ -261,6 +275,11 @@ public: */ virtual void setSearchPaths(const std::vector& searchPaths); + /** + * Set default resource root path. + */ + void setDefaultResourceRootPath(const std::string& path); + /** * Add search path. * @@ -283,6 +302,11 @@ public: */ virtual std::string getWritablePath() const = 0; + /** + * Set writable/cache path. + */ + virtual void setWritablePath(const std::string& writablePath); + /** * Sets/Gets whether to pop-up a message box when failed to load an image. */ @@ -495,6 +519,11 @@ protected: */ std::unordered_map _fullPathCache; + /** + * Writable path. + */ + std::string _writablePath; + /** * The singleton pointer of FileUtils. */ diff --git a/cocos/platform/CCPlatformMacros.h b/cocos/platform/CCPlatformMacros.h index 86c69f6c8c..3e321cdff6 100644 --- a/cocos/platform/CCPlatformMacros.h +++ b/cocos/platform/CCPlatformMacros.h @@ -31,7 +31,6 @@ Copyright (c) 2013-2014 Chukong Technologies #include "base/ccConfig.h" #include "platform/CCPlatformConfig.h" #include "platform/CCPlatformDefine.h" -#include /** * define a create function for a specific type, such as Layer diff --git a/cocos/platform/android/CCApplication-android.cpp b/cocos/platform/android/CCApplication-android.cpp index cf0a0cd362..541dfcd20e 100644 --- a/cocos/platform/android/CCApplication-android.cpp +++ b/cocos/platform/android/CCApplication-android.cpp @@ -115,7 +115,7 @@ LanguageType Application::getCurrentLanguage() std::string languageName = getCurrentLanguageJNI(); const char* pLanguageName = languageName.c_str(); LanguageType ret = LanguageType::ENGLISH; - + if (0 == strcmp("zh", pLanguageName)) { ret = LanguageType::CHINESE; @@ -176,6 +176,14 @@ LanguageType Application::getCurrentLanguage() { ret = LanguageType::POLISH; } + else if (0 == strcmp("tr", pLanguageName)) + { + ret = LanguageType::TURKISH; + } + else if (0 == strcmp("uk", pLanguageName)) + { + ret = LanguageType::UKRAINIAN; + } return ret; } diff --git a/cocos/platform/ios/CCApplication-ios.mm b/cocos/platform/ios/CCApplication-ios.mm index 279b23ceba..53e7d90671 100644 --- a/cocos/platform/ios/CCApplication-ios.mm +++ b/cocos/platform/ios/CCApplication-ios.mm @@ -99,11 +99,11 @@ LanguageType Application::getCurrentLanguage() NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *languages = [defaults objectForKey:@"AppleLanguages"]; NSString *currentLanguage = [languages objectAtIndex:0]; - + // get the current language code.(such as English is "en", Chinese is "zh" and so on) NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage]; NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode]; - + LanguageType ret = LanguageType::ENGLISH; if ([languageCode isEqualToString:@"zh"]) { @@ -152,6 +152,12 @@ LanguageType Application::getCurrentLanguage() else if ([languageCode isEqualToString:@"pl"]){ ret = LanguageType::POLISH; } + else if ([languageCode isEqualToString:@"tr"]){ + ret = LanguageType::TURKISH; + } + else if ([languageCode isEqualToString:@"uk"]){ + ret = LanguageType::UKRAINIAN; + } return ret; } diff --git a/cocos/platform/linux/CCApplication-linux.cpp b/cocos/platform/linux/CCApplication-linux.cpp index d3571aef03..28fcbe5405 100644 --- a/cocos/platform/linux/CCApplication-linux.cpp +++ b/cocos/platform/linux/CCApplication-linux.cpp @@ -173,62 +173,62 @@ const char * Application::getCurrentLanguageCode() LanguageType Application::getCurrentLanguage() { - char *pLanguageName = getenv("LANG"); - LanguageType ret = LanguageType::ENGLISH; - if (!pLanguageName) - { - return LanguageType::ENGLISH; - } - strtok(pLanguageName, "_"); - if (!pLanguageName) - { - return LanguageType::ENGLISH; - } - - if (0 == strcmp("zh", pLanguageName)) - { - ret = LanguageType::CHINESE; - } - else if (0 == strcmp("en", pLanguageName)) - { - ret = LanguageType::ENGLISH; - } - else if (0 == strcmp("fr", pLanguageName)) - { - ret = LanguageType::FRENCH; - } - else if (0 == strcmp("it", pLanguageName)) - { - ret = LanguageType::ITALIAN; - } - else if (0 == strcmp("de", pLanguageName)) - { - ret = LanguageType::GERMAN; - } - else if (0 == strcmp("es", pLanguageName)) - { - ret = LanguageType::SPANISH; - } - else if (0 == strcmp("nl", pLanguageName)) - { - ret = LanguageType::DUTCH; - } - else if (0 == strcmp("ru", pLanguageName)) - { - ret = LanguageType::RUSSIAN; - } - else if (0 == strcmp("ko", pLanguageName)) - { - ret = LanguageType::KOREAN; - } - else if (0 == strcmp("ja", pLanguageName)) - { - ret = LanguageType::JAPANESE; - } - else if (0 == strcmp("hu", pLanguageName)) - { - ret = LanguageType::HUNGARIAN; - } + char *pLanguageName = getenv("LANG"); + LanguageType ret = LanguageType::ENGLISH; + if (!pLanguageName) + { + return LanguageType::ENGLISH; + } + strtok(pLanguageName, "_"); + if (!pLanguageName) + { + return LanguageType::ENGLISH; + } + + if (0 == strcmp("zh", pLanguageName)) + { + ret = LanguageType::CHINESE; + } + else if (0 == strcmp("en", pLanguageName)) + { + ret = LanguageType::ENGLISH; + } + else if (0 == strcmp("fr", pLanguageName)) + { + ret = LanguageType::FRENCH; + } + else if (0 == strcmp("it", pLanguageName)) + { + ret = LanguageType::ITALIAN; + } + else if (0 == strcmp("de", pLanguageName)) + { + ret = LanguageType::GERMAN; + } + else if (0 == strcmp("es", pLanguageName)) + { + ret = LanguageType::SPANISH; + } + else if (0 == strcmp("nl", pLanguageName)) + { + ret = LanguageType::DUTCH; + } + else if (0 == strcmp("ru", pLanguageName)) + { + ret = LanguageType::RUSSIAN; + } + else if (0 == strcmp("ko", pLanguageName)) + { + ret = LanguageType::KOREAN; + } + else if (0 == strcmp("ja", pLanguageName)) + { + ret = LanguageType::JAPANESE; + } + else if (0 == strcmp("hu", pLanguageName)) + { + ret = LanguageType::HUNGARIAN; + } else if (0 == strcmp("pt", pLanguageName)) { ret = LanguageType::PORTUGUESE; @@ -245,6 +245,14 @@ LanguageType Application::getCurrentLanguage() { ret = LanguageType::POLISH; } + else if (0 == strcmp("tr", pLanguageName)) + { + ret = LanguageType::TURKISH; + } + else if (0 == strcmp("uk", pLanguageName)) + { + ret = LanguageType::UKRAINIAN; + } return ret; } diff --git a/cocos/platform/mac/CCApplication-mac.mm b/cocos/platform/mac/CCApplication-mac.mm index 131c6cb0b2..bb8cbbfa27 100644 --- a/cocos/platform/mac/CCApplication-mac.mm +++ b/cocos/platform/mac/CCApplication-mac.mm @@ -155,18 +155,16 @@ LanguageType Application::getCurrentLanguage() NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSArray *languages = [defaults objectForKey:@"AppleLanguages"]; NSString *currentLanguage = [languages objectAtIndex:0]; - + // get the current language code.(such as English is "en", Chinese is "zh" and so on) NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage]; NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode]; - + LanguageType ret = LanguageType::ENGLISH; - if ([languageCode isEqualToString:@"zh"]) - { + if ([languageCode isEqualToString:@"zh"]){ ret = LanguageType::CHINESE; } - else if ([languageCode isEqualToString:@"en"]) - { + else if ([languageCode isEqualToString:@"en"]){ ret = LanguageType::ENGLISH; } else if ([languageCode isEqualToString:@"fr"]){ @@ -196,12 +194,10 @@ LanguageType Application::getCurrentLanguage() else if ([languageCode isEqualToString:@"hu"]){ ret = LanguageType::HUNGARIAN; } - else if ([languageCode isEqualToString:@"pt"]) - { + else if ([languageCode isEqualToString:@"pt"]){ ret = LanguageType::PORTUGUESE; } - else if ([languageCode isEqualToString:@"ar"]) - { + else if ([languageCode isEqualToString:@"ar"]){ ret = LanguageType::ARABIC; } else if ([languageCode isEqualToString:@"nb"]){ @@ -210,6 +206,12 @@ LanguageType Application::getCurrentLanguage() else if ([languageCode isEqualToString:@"pl"]){ ret = LanguageType::POLISH; } + else if ([languageCode isEqualToString:@"tr"]){ + ret = LanguageType::TURKISH; + } + else if ([languageCode isEqualToString:@"uk"]){ + ret = LanguageType::UKRAINIAN; + } return ret; } diff --git a/cocos/platform/win32/CCApplication-win32.cpp b/cocos/platform/win32/CCApplication-win32.cpp index 8910012563..ad540fd5b1 100644 --- a/cocos/platform/win32/CCApplication-win32.cpp +++ b/cocos/platform/win32/CCApplication-win32.cpp @@ -134,7 +134,7 @@ Application* Application::sharedApplication() LanguageType Application::getCurrentLanguage() { LanguageType ret = LanguageType::ENGLISH; - + LCID localeID = GetUserDefaultLCID(); unsigned short primaryLanguageID = localeID & 0xFF; @@ -179,14 +179,20 @@ LanguageType Application::getCurrentLanguage() case LANG_ARABIC: ret = LanguageType::ARABIC; break; - case LANG_NORWEGIAN: + case LANG_NORWEGIAN: ret = LanguageType::NORWEGIAN; break; - case LANG_POLISH: + case LANG_POLISH: ret = LanguageType::POLISH; break; + case LANG_TURKISH: + ret = LanguageType::TURKISH; + break; + case LANG_UKRAINIAN: + ret = LanguageType::UKRAINIAN; + break; } - + return ret; } diff --git a/cocos/platform/winrt/CCApplication.cpp b/cocos/platform/winrt/CCApplication.cpp index addcb471a9..72952607af 100644 --- a/cocos/platform/winrt/CCApplication.cpp +++ b/cocos/platform/winrt/CCApplication.cpp @@ -134,9 +134,9 @@ const char * Application::getCurrentLanguageCode() LanguageType Application::getCurrentLanguage() { LanguageType ret = LanguageType::ENGLISH; - + const char* code = getCurrentLanguageCode(); - + if (strncmp(code, "zh", 2) == 0) { ret = LanguageType::CHINESE; @@ -184,8 +184,23 @@ LanguageType Application::getCurrentLanguage() else if (strncmp(code, "ar", 2) == 0) { ret = LanguageType::ARABIC; - } - + } + else if (strncmp(code, "nb", 2) == 0) + { + ret = LanguageType::NORWEGIAN; + } + else if (strncmp(code, "pl", 2) == 0) + { + ret = LanguageType::POLISH; + } + else if (strncmp(code, "tr", 2) == 0) + { + ret = LanguageType::TURKISH; + } + else if (strncmp(code, "uk", 2) == 0) + { + ret = LanguageType::UKRAINIAN; + } return ret; } diff --git a/cocos/platform/winrt/inet_ntop_winrt.h b/cocos/platform/winrt/inet_ntop_winrt.h index 43ccf25fa9..9b3d42c938 100644 --- a/cocos/platform/winrt/inet_ntop_winrt.h +++ b/cocos/platform/winrt/inet_ntop_winrt.h @@ -1,5 +1,5 @@ -#ifndef HEADER_CURL_INET_NTOP_H -#define HEADER_CURL_INET_NTOP_H +#ifndef HEADER_CURL_INET_NTOP_WINRT_H +#define HEADER_CURL_INET_NTOP_WINRT_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | diff --git a/cocos/platform/winrt/inet_pton_winrt.cpp b/cocos/platform/winrt/inet_pton_winrt.cpp new file mode 100644 index 0000000000..f906b52d0c --- /dev/null +++ b/cocos/platform/winrt/inet_pton_winrt.cpp @@ -0,0 +1,234 @@ +/* This is from the BIND 4.9.4 release, modified to compile by itself */ + +/* Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* Portions Copyright (c) Microsoft Open Technologies, Inc. */ + +/*modifications by Microsoft Open Technologies, Inc. to implement missing inet_pton() from Windows 8 SDK */ + +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) + +#include +#include + +#define ERRNO ((int)GetLastError()) +#define SET_ERRNO(x) (SetLastError((DWORD)(x))) + +#include "inet_pton_winrt.h" + +#define ENABLE_IPV6 + +#define IN6ADDRSZ 16 +#define INADDRSZ 4 +#define INT16SZ 2 + +/* + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static int inet_pton4(const char *src, unsigned char *dst); +#ifdef ENABLE_IPV6 +static int inet_pton6(const char *src, unsigned char *dst); +#endif + +/* int + * inet_pton(af, src, dst) + * convert from presentation format (which usually means ASCII printable) + * to network format (which is usually some kind of binary format). + * return: + * 1 if the address was valid for the specified address family + * 0 if the address wasn't valid (`dst' is untouched in this case) + * -1 if some other error occurred (`dst' is untouched in this case, too) + * notice: + * On Windows we store the error in the thread errno, not + * in the winsock error code. This is to avoid losing the + * actual last winsock error. So use macro ERRNO to fetch the + * errno this function sets when returning (-1), not SOCKERRNO. + * author: + * Paul Vixie, 1996. + */ + +int inet_pton(int af, const char *src, void *dst) +{ + switch (af) { + case AF_INET: + return (inet_pton4(src, (unsigned char *)dst)); +#ifdef ENABLE_IPV6 + case AF_INET6: + return (inet_pton6(src, (unsigned char *)dst)); +#endif + default: + SET_ERRNO(EAFNOSUPPORT); + return (-1); + } + /* NOTREACHED */ +} + +/* int + * inet_pton4(src, dst) + * like inet_aton() but without all the hexadecimal and shorthand. + * return: + * 1 if `src' is a valid dotted quad, else 0. + * notice: + * does not touch `dst' unless it's returning 1. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton4(const char *src, unsigned char *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + tp = tmp; + *tp = 0; + while((ch = *src++) != '\0') { + const char *pch; + + if((pch = strchr(digits, ch)) != NULL) { + unsigned int val = *tp * 10 + (unsigned int)(pch - digits); + + if(saw_digit && *tp == 0) + return (0); + if(val > 255) + return (0); + *tp = (unsigned char)val; + if(! saw_digit) { + if(++octets > 4) + return (0); + saw_digit = 1; + } + } + else if(ch == '.' && saw_digit) { + if(octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } + else + return (0); + } + if(octets < 4) + return (0); + memcpy(dst, tmp, INADDRSZ); + return (1); +} + +#ifdef ENABLE_IPV6 +/* int + * inet_pton6(src, dst) + * convert presentation level address to network order binary form. + * return: + * 1 if `src' is a valid [RFC1884 2.2] address, else 0. + * notice: + * (1) does not touch `dst' unless it's returning 1. + * (2) :: in a full address is silently ignored. + * credit: + * inspired by Mark Andrews. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton6(const char *src, unsigned char *dst) +{ + static const char xdigits_l[] = "0123456789abcdef", + xdigits_u[] = "0123456789ABCDEF"; + unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp; + const char *xdigits, *curtok; + int ch, saw_xdigit; + size_t val; + + memset((tp = tmp), 0, IN6ADDRSZ); + endp = tp + IN6ADDRSZ; + colonp = NULL; + /* Leading :: requires some special handling. */ + if(*src == ':') + if(*++src != ':') + return (0); + curtok = src; + saw_xdigit = 0; + val = 0; + while((ch = *src++) != '\0') { + const char *pch; + + if((pch = strchr((xdigits = xdigits_l), ch)) == NULL) + pch = strchr((xdigits = xdigits_u), ch); + if(pch != NULL) { + val <<= 4; + val |= (pch - xdigits); + if(++saw_xdigit > 4) + return (0); + continue; + } + if(ch == ':') { + curtok = src; + if(!saw_xdigit) { + if(colonp) + return (0); + colonp = tp; + continue; + } + if(tp + INT16SZ > endp) + return (0); + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + if(ch == '.' && ((tp + INADDRSZ) <= endp) && + inet_pton4(curtok, tp) > 0) { + tp += INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + return (0); + } + if(saw_xdigit) { + if(tp + INT16SZ > endp) + return (0); + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + } + if(colonp != NULL) { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const ssize_t n = tp - colonp; + ssize_t i; + + if(tp == endp) + return (0); + for(i = 1; i <= n; i++) { + *(endp - i) = *(colonp + n - i); + *(colonp + n - i) = 0; + } + tp = endp; + } + if(tp != endp) + return (0); + memcpy(dst, tmp, IN6ADDRSZ); + return (1); +} +#endif /* ENABLE_IPV6 */ + +#endif /* HAVE_INET_PTON */ diff --git a/cocos/platform/winrt/inet_pton_winrt.h b/cocos/platform/winrt/inet_pton_winrt.h new file mode 100644 index 0000000000..15a0110b99 --- /dev/null +++ b/cocos/platform/winrt/inet_pton_winrt.h @@ -0,0 +1,32 @@ +#ifndef HEADER_CURL_INET_PTON_WINIRT_H +#define HEADER_CURL_INET_PTON_WINIRT_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2005, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * Portions Copyright (c) Microsoft Open Technologies, Inc. + * + ***************************************************************************/ + +#if (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) +int inet_pton(int af, const char *src, void *dst); +#endif + +#endif /* HEADER_CURL_INET_PTON_WINIRT_H */ + diff --git a/cocos/renderer/CCGLProgramState.cpp b/cocos/renderer/CCGLProgramState.cpp index 3ecf820113..1c3f3b96c4 100644 --- a/cocos/renderer/CCGLProgramState.cpp +++ b/cocos/renderer/CCGLProgramState.cpp @@ -282,7 +282,12 @@ GLProgramState::GLProgramState() #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) /** listen the event that renderer was recreated on Android/WP8 */ CCLOG("create rendererRecreatedListener for GLProgramState"); - _backToForegroundlistener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom*) { _uniformAttributeValueDirty = true; }); + _backToForegroundlistener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, + [this](EventCustom*) + { + CCLOG("Dirty Uniform and Attributes of GLProgramState"); + _uniformAttributeValueDirty = true; + }); Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundlistener, -1); #endif } @@ -335,7 +340,7 @@ void GLProgramState::apply(const Mat4& modelView) applyUniforms(); } -void GLProgramState::applyGLProgram(const Mat4& modelView) +void GLProgramState::updateUniformsAndAttributes() { CCASSERT(_glprogram, "invalid glprogram"); if(_uniformAttributeValueDirty) @@ -356,6 +361,12 @@ void GLProgramState::applyGLProgram(const Mat4& modelView) _uniformAttributeValueDirty = false; } +} + +void GLProgramState::applyGLProgram(const Mat4& modelView) +{ + CCASSERT(_glprogram, "invalid glprogram"); + updateUniformsAndAttributes(); // set shader _glprogram->use(); _glprogram->setUniformsForBuiltins(modelView); @@ -395,6 +406,7 @@ void GLProgramState::setGLProgram(GLProgram *glprogram) UniformValue* GLProgramState::getUniformValue(GLint uniformLocation) { + updateUniformsAndAttributes(); const auto itr = _uniforms.find(uniformLocation); if (itr != _uniforms.end()) return &itr->second; @@ -403,6 +415,7 @@ UniformValue* GLProgramState::getUniformValue(GLint uniformLocation) UniformValue* GLProgramState::getUniformValue(const std::string &name) { + updateUniformsAndAttributes(); const auto itr = _uniformsByName.find(name); if (itr != _uniformsByName.end()) return &_uniforms[itr->second]; @@ -411,6 +424,7 @@ UniformValue* GLProgramState::getUniformValue(const std::string &name) VertexAttribValue* GLProgramState::getVertexAttribValue(const std::string &name) { + updateUniformsAndAttributes(); const auto itr = _attributes.find(name); if( itr != _attributes.end()) return &itr->second; diff --git a/cocos/renderer/CCGLProgramState.h b/cocos/renderer/CCGLProgramState.h index 6c0a637f8a..f361c9f3e0 100644 --- a/cocos/renderer/CCGLProgramState.h +++ b/cocos/renderer/CCGLProgramState.h @@ -204,6 +204,7 @@ protected: ~GLProgramState(); bool init(GLProgram* program); void resetGLProgram(); + void updateUniformsAndAttributes(); VertexAttribValue* getVertexAttribValue(const std::string &attributeName); UniformValue* getUniformValue(const std::string &uniformName); UniformValue* getUniformValue(GLint uniformLocation); diff --git a/cocos/renderer/CCQuadCommand.cpp b/cocos/renderer/CCQuadCommand.cpp index b9549ddcbf..f2b20fff63 100644 --- a/cocos/renderer/CCQuadCommand.cpp +++ b/cocos/renderer/CCQuadCommand.cpp @@ -44,7 +44,7 @@ QuadCommand::QuadCommand() _type = RenderCommand::Type::QUAD_COMMAND; } -void QuadCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, V3F_C4B_T2F_Quad* quad, ssize_t quadCount, const Mat4 &mv) +void QuadCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, const BlendFunc& blendType, V3F_C4B_T2F_Quad* quad, ssize_t quadCount, const Mat4 &mv) { CCASSERT(glProgramState, "Invalid GLProgramState"); CCASSERT(glProgramState->getVertexAttribsFlags() == 0, "No custom attributes are supported in QuadCommand"); diff --git a/cocos/renderer/CCQuadCommand.h b/cocos/renderer/CCQuadCommand.h index d859751c66..b73c1f3b8f 100644 --- a/cocos/renderer/CCQuadCommand.h +++ b/cocos/renderer/CCQuadCommand.h @@ -40,7 +40,7 @@ public: /** Initializes the command with a globalZOrder, a texture ID, a `GLProgram`, a blending function, a pointer to quads, * quantity of quads, and the Model View transform to be used for the quads */ - void init(float globalOrder, GLuint texutreID, GLProgramState* shader, BlendFunc blendType, V3F_C4B_T2F_Quad* quads, ssize_t quadCount, + void init(float globalOrder, GLuint texutreID, GLProgramState* shader, const BlendFunc& blendType, V3F_C4B_T2F_Quad* quads, ssize_t quadCount, const Mat4& mv); void useMaterial() const; diff --git a/cocos/renderer/CCRenderer.cpp b/cocos/renderer/CCRenderer.cpp index 6479b54d08..16b85c6562 100644 --- a/cocos/renderer/CCRenderer.cpp +++ b/cocos/renderer/CCRenderer.cpp @@ -321,10 +321,8 @@ void Renderer::addCommand(RenderCommand* command, int renderQueue) CCASSERT(!_isRendering, "Cannot add command while rendering"); CCASSERT(renderQueue >=0, "Invalid render queue"); CCASSERT(command->getType() != RenderCommand::Type::UNKNOWN_COMMAND, "Invalid Command Type"); - if (command->isTransparent()) - _transparentRenderGroups.push_back(command); - else - _renderGroups[renderQueue].push_back(command); + + _renderGroups[renderQueue].push_back(command); } void Renderer::pushGroup(int renderQueueID) @@ -589,15 +587,12 @@ void Renderer::fillVerticesAndIndices(const TrianglesCommand* cmd) void Renderer::fillQuads(const QuadCommand *cmd) { - memcpy(_quadVerts + _numberQuads * 4, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmd->getQuadCount()); - const Mat4& modelView = cmd->getModelView(); - + const V3F_C4B_T2F* quads = (V3F_C4B_T2F*)cmd->getQuads(); for(ssize_t i=0; i< cmd->getQuadCount() * 4; ++i) { - V3F_C4B_T2F *q = &_quadVerts[i + _numberQuads * 4]; - Vec3 *vec1 = (Vec3*)&q->vertices; - modelView.transformPoint(vec1); + _quadVerts[i + _numberQuads * 4] = quads[i]; + modelView.transformPoint(quads[i].vertices,&(_quadVerts[i + _numberQuads * 4].vertices)); } _numberQuads += cmd->getQuadCount(); @@ -824,10 +819,23 @@ void Renderer::flush() void Renderer::flush2D() { + //Check depth write + GLboolean depthWirte; + glGetBooleanv(GL_DEPTH_WRITEMASK, &depthWirte); + //Turn depth write off if necessary + if(depthWirte) + { + glDepthMask(false); + } drawBatchedQuads(); _lastMaterialID = 0; drawBatchedTriangles(); _lastMaterialID = 0; + //Turn depth write on if necessary + if(depthWirte) + { + glDepthMask(true); + } } void Renderer::flush3D() diff --git a/cocos/renderer/CCTextureAtlas.cpp b/cocos/renderer/CCTextureAtlas.cpp index 4893a11e0a..9238f1eccc 100644 --- a/cocos/renderer/CCTextureAtlas.cpp +++ b/cocos/renderer/CCTextureAtlas.cpp @@ -605,7 +605,16 @@ void TextureAtlas::drawNumberOfQuads(ssize_t numberOfQuads, ssize_t start) if(!numberOfQuads) return; - + + //Check depth write + GLboolean depthWirte; + glGetBooleanv(GL_DEPTH_WRITEMASK, &depthWirte); + //Turn depth write off if necessary + if(depthWirte) + { + glDepthMask(false); + } + GL::bindTexture2D(_texture->getName()); if (Configuration::getInstance()->supportsShareableVAO()) @@ -686,6 +695,12 @@ void TextureAtlas::drawNumberOfQuads(ssize_t numberOfQuads, ssize_t start) CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,numberOfQuads*6); + //Turn depth write on if necessary + if(depthWirte) + { + glDepthMask(true); + } + CHECK_GL_ERROR_DEBUG(); } 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/ActionTimelineNode.lua b/cocos/scripting/lua-bindings/auto/api/ActionTimelineNode.lua new file mode 100644 index 0000000000..dea11fbb00 --- /dev/null +++ b/cocos/scripting/lua-bindings/auto/api/ActionTimelineNode.lua @@ -0,0 +1,53 @@ + +-------------------------------- +-- @module ActionTimelineNode +-- @extend Node +-- @parent_module ccs + +-------------------------------- +-- +-- @function [parent=#ActionTimelineNode] getRoot +-- @param self +-- @return Node#Node ret (return value: cc.Node) + +-------------------------------- +-- +-- @function [parent=#ActionTimelineNode] getActionTimeline +-- @param self +-- @return ActionTimeline#ActionTimeline ret (return value: ccs.ActionTimeline) + +-------------------------------- +-- +-- @function [parent=#ActionTimelineNode] setActionTimeline +-- @param self +-- @param #ccs.ActionTimeline action + +-------------------------------- +-- @overload self, cc.Node, ccs.ActionTimeline +-- @overload self +-- @function [parent=#ActionTimelineNode] init +-- @param self +-- @param #cc.Node root +-- @param #ccs.ActionTimeline action +-- @return bool#bool ret (return value: bool) + +-------------------------------- +-- +-- @function [parent=#ActionTimelineNode] setRoot +-- @param self +-- @param #cc.Node root + +-------------------------------- +-- +-- @function [parent=#ActionTimelineNode] create +-- @param self +-- @param #cc.Node root +-- @param #ccs.ActionTimeline action +-- @return ActionTimelineNode#ActionTimelineNode ret (return value: ccs.ActionTimelineNode) + +-------------------------------- +-- +-- @function [parent=#ActionTimelineNode] ActionTimelineNode +-- @param self + +return nil 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/CSLoader.lua b/cocos/scripting/lua-bindings/auto/api/CSLoader.lua index 271d321227..bd2a5d6945 100644 --- a/cocos/scripting/lua-bindings/auto/api/CSLoader.lua +++ b/cocos/scripting/lua-bindings/auto/api/CSLoader.lua @@ -82,12 +82,6 @@ -- @param #string filename -- @return Node#Node ret (return value: cc.Node) --------------------------------- --- --- @function [parent=#CSLoader] getCsdVersion --- @param self --- @return string#string ret (return value: string) - -------------------------------- -- -- @function [parent=#CSLoader] destroyInstance 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/CheckBox.lua b/cocos/scripting/lua-bindings/auto/api/CheckBox.lua index 0ca3ebc62c..4f66e0c9c4 100644 --- a/cocos/scripting/lua-bindings/auto/api/CheckBox.lua +++ b/cocos/scripting/lua-bindings/auto/api/CheckBox.lua @@ -65,6 +65,13 @@ -- @param #string frontCrossDisabled -- @param #int texType +-------------------------------- +-- brief Return a zoom scale
+-- since v3.3 +-- @function [parent=#CheckBox] getZoomScale +-- @param self +-- @return float#float ret (return value: float) + -------------------------------- -- Load backGround texture for checkbox.
-- param backGround backGround texture.
@@ -74,6 +81,14 @@ -- @param #string backGround -- @param #int type +-------------------------------- +-- When user pressed the button, the button will zoom to a scale.
+-- The final scale of the button equals (button original scale + _zoomScale)
+-- since v3.3 +-- @function [parent=#CheckBox] setZoomScale +-- @param self +-- @param #float scale + -------------------------------- -- Load frontCrossDisabled texture for checkbox.
-- param frontCrossDisabled frontCrossDisabled texture.
@@ -86,6 +101,7 @@ -------------------------------- -- @overload self, string, string, string, string, string, int -- @overload self +-- @overload self, string, string, int -- @function [parent=#CheckBox] create -- @param self -- @param #string backGround 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/api/Director.lua b/cocos/scripting/lua-bindings/auto/api/Director.lua index 738d1a0873..83767d12fb 100644 --- a/cocos/scripting/lua-bindings/auto/api/Director.lua +++ b/cocos/scripting/lua-bindings/auto/api/Director.lua @@ -172,6 +172,13 @@ -- @param self -- @param #cc.Scheduler scheduler +-------------------------------- +-- +-- @function [parent=#Director] getMatrix +-- @param self +-- @param #int type +-- @return mat4_table#mat4_table ret (return value: mat4_table) + -------------------------------- -- The main loop is triggered again.
-- Call this function only if [stopAnimation] was called earlier
@@ -288,11 +295,9 @@ -- @param self -------------------------------- --- --- @function [parent=#Director] getMatrix +-- Restart the director +-- @function [parent=#Director] restart -- @param self --- @param #int type --- @return mat4_table#mat4_table ret (return value: mat4_table) -------------------------------- -- Pops out a scene from the stack.
diff --git a/cocos/scripting/lua-bindings/auto/api/FileUtils.lua b/cocos/scripting/lua-bindings/auto/api/FileUtils.lua index 8f3aa1f787..71ba6a63d0 100644 --- a/cocos/scripting/lua-bindings/auto/api/FileUtils.lua +++ b/cocos/scripting/lua-bindings/auto/api/FileUtils.lua @@ -271,6 +271,12 @@ -- @param #string relativeFile -- @return string#string ret (return value: string) +-------------------------------- +-- Set writable/cache path. +-- @function [parent=#FileUtils] setWritablePath +-- @param self +-- @param #string writablePath + -------------------------------- -- Sets/Gets whether to pop-up a message box when failed to load an image. -- @function [parent=#FileUtils] setPopupNotify @@ -286,6 +292,12 @@ -- @param #string dirPath -- @return bool#bool ret (return value: bool) +-------------------------------- +-- Set default resource root path. +-- @function [parent=#FileUtils] setDefaultResourceRootPath +-- @param self +-- @param #string path + -------------------------------- -- Gets the array that contains the search order of the resources.
-- see setSearchResolutionsOrder(const std::vector&), fullPathForFilename(const char*).
diff --git a/cocos/scripting/lua-bindings/auto/api/Manifest.lua b/cocos/scripting/lua-bindings/auto/api/Manifest.lua index a8db33f8de..5306dea81f 100644 --- a/cocos/scripting/lua-bindings/auto/api/Manifest.lua +++ b/cocos/scripting/lua-bindings/auto/api/Manifest.lua @@ -40,4 +40,10 @@ -- @param self -- @return string#string ret (return value: string) +-------------------------------- +-- @brief Get the search paths list related to the Manifest. +-- @function [parent=#Manifest] getSearchPaths +-- @param self +-- @return array_table#array_table ret (return value: array_table) + return nil diff --git a/cocos/scripting/lua-bindings/auto/api/Node.lua b/cocos/scripting/lua-bindings/auto/api/Node.lua index 98cfbcb1ae..319d9db4f1 100644 --- a/cocos/scripting/lua-bindings/auto/api/Node.lua +++ b/cocos/scripting/lua-bindings/auto/api/Node.lua @@ -525,6 +525,15 @@ -- @param #cc.Action action -- @return Action#Action ret (return value: cc.Action) +-------------------------------- +-- @overload self +-- @overload self, cc.Renderer, mat4_table, unsigned int +-- @function [parent=#Node] visit +-- @param self +-- @param #cc.Renderer renderer +-- @param #mat4_table parentTransform +-- @param #unsigned int parentFlags + -------------------------------- -- -- @function [parent=#Node] isOpacityModifyRGB @@ -548,15 +557,6 @@ -- @param self -- @return vec2_table#vec2_table ret (return value: vec2_table) --------------------------------- --- @overload self --- @overload self, cc.Renderer, mat4_table, unsigned int --- @function [parent=#Node] visit --- @param self --- @param #cc.Renderer renderer --- @param #mat4_table parentTransform --- @param #unsigned int parentFlags - -------------------------------- -- Removes a child from the container by tag value. It will also cleanup all running actions depending on the cleanup parameter
-- param name A string that identifies a child node
diff --git a/cocos/scripting/lua-bindings/auto/api/Scale9Sprite.lua b/cocos/scripting/lua-bindings/auto/api/Scale9Sprite.lua index 428fd4194d..c4f5ae7854 100644 --- a/cocos/scripting/lua-bindings/auto/api/Scale9Sprite.lua +++ b/cocos/scripting/lua-bindings/auto/api/Scale9Sprite.lua @@ -33,6 +33,12 @@ -- @param self -- @return bool#bool ret (return value: bool) +-------------------------------- +-- +-- @function [parent=#Scale9Sprite] setScale9Enabled +-- @param self +-- @param #bool enabled + -------------------------------- -- Sets whether the widget should be flipped vertically or not.
-- param bFlippedY true if the widget should be flipped vertically, flase otherwise. @@ -48,16 +54,27 @@ -- @param #bool flippedX -------------------------------- --- --- @function [parent=#Scale9Sprite] setScale9Enabled +-- Creates and returns a new sprite object with the specified cap insets.
+-- You use this method to add cap insets to a sprite or to change the existing
+-- cap insets of a sprite. In both cases, you get back a new image and the
+-- original sprite remains untouched.
+-- param capInsets The values to use for the cap insets. +-- @function [parent=#Scale9Sprite] resizableSpriteWithCapInsets -- @param self --- @param #bool enabled +-- @param #rect_table capInsets +-- @return Scale9Sprite#Scale9Sprite ret (return value: ccui.Scale9Sprite) -------------------------------- -- -- @function [parent=#Scale9Sprite] disableCascadeOpacity -- @param self +-------------------------------- +-- since v3.4 +-- @function [parent=#Scale9Sprite] setState +-- @param self +-- @param #int state + -------------------------------- -- -- @function [parent=#Scale9Sprite] setInsetBottom @@ -106,12 +123,6 @@ -- @param self -- @param #size_table size --------------------------------- --- --- @function [parent=#Scale9Sprite] getInsetRight --- @param self --- @return float#float ret (return value: float) - -------------------------------- -- -- @function [parent=#Scale9Sprite] setSpriteFrame @@ -126,15 +137,10 @@ -- @return float#float ret (return value: float) -------------------------------- --- Creates and returns a new sprite object with the specified cap insets.
--- You use this method to add cap insets to a sprite or to change the existing
--- cap insets of a sprite. In both cases, you get back a new image and the
--- original sprite remains untouched.
--- param capInsets The values to use for the cap insets. --- @function [parent=#Scale9Sprite] resizableSpriteWithCapInsets +-- +-- @function [parent=#Scale9Sprite] getCapInsets -- @param self --- @param #rect_table capInsets --- @return Scale9Sprite#Scale9Sprite ret (return value: ccui.Scale9Sprite) +-- @return rect_table#rect_table ret (return value: rect_table) -------------------------------- -- @@ -144,9 +150,9 @@ -------------------------------- -- --- @function [parent=#Scale9Sprite] getCapInsets +-- @function [parent=#Scale9Sprite] getInsetRight -- @param self --- @return rect_table#rect_table ret (return value: rect_table) +-- @return float#float ret (return value: float) -------------------------------- -- diff --git a/cocos/scripting/lua-bindings/auto/api/Slider.lua b/cocos/scripting/lua-bindings/auto/api/Slider.lua index 69dc0e637e..837b15ca42 100644 --- a/cocos/scripting/lua-bindings/auto/api/Slider.lua +++ b/cocos/scripting/lua-bindings/auto/api/Slider.lua @@ -18,7 +18,7 @@ -- @function [parent=#Slider] loadSlidBallTextureDisabled -- @param self -- @param #string disabled --- @param #int texType +-- @param #int resType -------------------------------- -- Load normal state texture for slider ball.
@@ -27,7 +27,7 @@ -- @function [parent=#Slider] loadSlidBallTextureNormal -- @param self -- @param #string normal --- @param #int texType +-- @param #int resType -------------------------------- -- Load texture for slider bar.
@@ -36,7 +36,7 @@ -- @function [parent=#Slider] loadBarTexture -- @param self -- @param #string fileName --- @param #int texType +-- @param #int resType -------------------------------- -- Load dark state texture for slider progress bar.
@@ -45,7 +45,7 @@ -- @function [parent=#Slider] loadProgressBarTexture -- @param self -- @param #string fileName --- @param #int texType +-- @param #int resType -------------------------------- -- Load textures for slider ball.
@@ -87,6 +87,14 @@ -- @param self -- @param #bool able +-------------------------------- +-- When user pressed the button, the button will zoom to a scale.
+-- The final scale of the button equals (button original scale + _zoomScale)
+-- since v3.3 +-- @function [parent=#Slider] setZoomScale +-- @param self +-- @param #float scale + -------------------------------- -- Sets capinsets for slider, if slider is using scale9 renderer.
-- param capInsets capinsets for slider @@ -94,6 +102,13 @@ -- @param self -- @param #rect_table capInsets +-------------------------------- +-- brief Return a zoom scale
+-- since v3.3 +-- @function [parent=#Slider] getZoomScale +-- @param self +-- @return float#float ret (return value: float) + -------------------------------- -- -- @function [parent=#Slider] addEventListener @@ -107,7 +122,7 @@ -- @function [parent=#Slider] loadSlidBallTexturePressed -- @param self -- @param #string pressed --- @param #int texType +-- @param #int resType -------------------------------- -- @@ -129,11 +144,15 @@ -- @return int#int ret (return value: int) -------------------------------- --- Allocates and initializes. --- @function [parent=#Slider] create +-- @overload self, string, string, int +-- @overload self +-- @function [parent=#Slider] create -- @param self +-- @param #string barTextureName +-- @param #string normalBallTextureName +-- @param #int resType -- @return Slider#Slider ret (return value: ccui.Slider) - + -------------------------------- -- -- @function [parent=#Slider] createInstance diff --git a/cocos/scripting/lua-bindings/auto/api/Sprite.lua b/cocos/scripting/lua-bindings/auto/api/Sprite.lua index a69416528e..35b3de9ed1 100644 --- a/cocos/scripting/lua-bindings/auto/api/Sprite.lua +++ b/cocos/scripting/lua-bindings/auto/api/Sprite.lua @@ -76,7 +76,7 @@ -- Returns whether or not a SpriteFrame is being displayed -- @function [parent=#Sprite] isFrameDisplayed -- @param self --- @param #cc.SpriteFrame pFrame +-- @param #cc.SpriteFrame frame -- @return bool#bool ret (return value: bool) -------------------------------- @@ -111,7 +111,7 @@ -- Sets the weak reference of the TextureAtlas when the sprite is rendered using via SpriteBatchNode -- @function [parent=#Sprite] setTextureAtlas -- @param self --- @param #cc.TextureAtlas pobTextureAtlas +-- @param #cc.TextureAtlas textureAtlas -------------------------------- -- Returns the current displayed frame. diff --git a/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua b/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua index c4941b8354..2c1a6f7f29 100644 --- a/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua +++ b/cocos/scripting/lua-bindings/auto/api/lua_cocos2dx_studio_auto_api.lua @@ -261,4 +261,9 @@ -- @field [parent=#ccs] ActionTimeline#ActionTimeline ActionTimeline preloaded module +-------------------------------------------------------- +-- the ccs ActionTimelineNode +-- @field [parent=#ccs] ActionTimelineNode#ActionTimelineNode ActionTimelineNode preloaded module + + 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 d8b45c1198..9059f27a3d 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"; @@ -6110,6 +6160,63 @@ int lua_cocos2dx_Node_runAction(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Node_visit(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Node* 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.Node",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_visit'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 0) { + cobj->visit(); + return 0; + } + }while(0); + ok = true; + do{ + if (argc == 3) { + cocos2d::Renderer* arg0; + ok &= luaval_to_object(tolua_S, 2, "cc.Renderer",&arg0); + + if (!ok) { break; } + cocos2d::Mat4 arg1; + ok &= luaval_to_mat4(tolua_S, 3, &arg1, "cc.Node:visit"); + + if (!ok) { break; } + unsigned int arg2; + ok &= luaval_to_uint32(tolua_S, 4,&arg2, "cc.Node:visit"); + + if (!ok) { break; } + cobj->visit(arg0, arg1, arg2); + return 0; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:visit",argc, 3); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_visit'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Node_isOpacityModifyRGB(lua_State* tolua_S) { int argc = 0; @@ -6251,63 +6358,6 @@ int lua_cocos2dx_Node_getAnchorPointInPoints(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Node_visit(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::Node* 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.Node",0,&tolua_err)) goto tolua_lerror; -#endif - cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_visit'", nullptr); - return 0; - } -#endif - argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 0) { - cobj->visit(); - return 0; - } - }while(0); - ok = true; - do{ - if (argc == 3) { - cocos2d::Renderer* arg0; - ok &= luaval_to_object(tolua_S, 2, "cc.Renderer",&arg0); - - if (!ok) { break; } - cocos2d::Mat4 arg1; - ok &= luaval_to_mat4(tolua_S, 3, &arg1, "cc.Node:visit"); - - if (!ok) { break; } - unsigned int arg2; - ok &= luaval_to_uint32(tolua_S, 4,&arg2, "cc.Node:visit"); - - if (!ok) { break; } - cobj->visit(arg0, arg1, arg2); - return 0; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:visit",argc, 3); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_visit'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_Node_removeChildByName(lua_State* tolua_S) { int argc = 0; @@ -9489,10 +9539,10 @@ int lua_register_cocos2dx_Node(lua_State* tolua_S) tolua_function(tolua_S,"convertToNodeSpaceAR",lua_cocos2dx_Node_convertToNodeSpaceAR); tolua_function(tolua_S,"addComponent",lua_cocos2dx_Node_addComponent); tolua_function(tolua_S,"runAction",lua_cocos2dx_Node_runAction); + tolua_function(tolua_S,"visit",lua_cocos2dx_Node_visit); tolua_function(tolua_S,"isOpacityModifyRGB",lua_cocos2dx_Node_isOpacityModifyRGB); tolua_function(tolua_S,"getRotation",lua_cocos2dx_Node_getRotation); tolua_function(tolua_S,"getAnchorPointInPoints",lua_cocos2dx_Node_getAnchorPointInPoints); - tolua_function(tolua_S,"visit",lua_cocos2dx_Node_visit); tolua_function(tolua_S,"removeChildByName",lua_cocos2dx_Node_removeChildByName); tolua_function(tolua_S,"getGLProgramState",lua_cocos2dx_Node_getGLProgramState); tolua_function(tolua_S,"setScheduler",lua_cocos2dx_Node_setScheduler); @@ -12550,6 +12600,56 @@ int lua_cocos2dx_Director_setScheduler(lua_State* tolua_S) return 0; } +int lua_cocos2dx_Director_getMatrix(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Director* 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.Director",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::Director*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Director_getMatrix'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::MATRIX_STACK_TYPE arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.Director:getMatrix"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Director_getMatrix'", nullptr); + return 0; + } + const cocos2d::Mat4& ret = cobj->getMatrix(arg0); + mat4_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Director:getMatrix",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Director_getMatrix'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_Director_startAnimation(lua_State* tolua_S) { int argc = 0; @@ -13355,7 +13455,7 @@ int lua_cocos2dx_Director_drawScene(lua_State* tolua_S) return 0; } -int lua_cocos2dx_Director_getMatrix(lua_State* tolua_S) +int lua_cocos2dx_Director_restart(lua_State* tolua_S) { int argc = 0; cocos2d::Director* cobj = nullptr; @@ -13375,32 +13475,28 @@ int lua_cocos2dx_Director_getMatrix(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Director_getMatrix'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Director_restart'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 0) { - cocos2d::MATRIX_STACK_TYPE arg0; - - ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "cc.Director:getMatrix"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Director_getMatrix'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Director_restart'", nullptr); return 0; } - const cocos2d::Mat4& ret = cobj->getMatrix(arg0); - mat4_to_luaval(tolua_S, ret); - return 1; + cobj->restart(); + return 0; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Director:getMatrix",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Director:restart",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Director_getMatrix'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Director_restart'.",&tolua_err); #endif return 0; @@ -14390,6 +14486,7 @@ int lua_register_cocos2dx_Director(lua_State* tolua_S) tolua_function(tolua_S,"setDefaultValues",lua_cocos2dx_Director_setDefaultValues); tolua_function(tolua_S,"init",lua_cocos2dx_Director_init); tolua_function(tolua_S,"setScheduler",lua_cocos2dx_Director_setScheduler); + tolua_function(tolua_S,"getMatrix",lua_cocos2dx_Director_getMatrix); tolua_function(tolua_S,"startAnimation",lua_cocos2dx_Director_startAnimation); tolua_function(tolua_S,"getOpenGLView",lua_cocos2dx_Director_getOpenGLView); tolua_function(tolua_S,"getRunningScene",lua_cocos2dx_Director_getRunningScene); @@ -14407,7 +14504,7 @@ int lua_register_cocos2dx_Director(lua_State* tolua_S) tolua_function(tolua_S,"runWithScene",lua_cocos2dx_Director_runWithScene); tolua_function(tolua_S,"setNotificationNode",lua_cocos2dx_Director_setNotificationNode); tolua_function(tolua_S,"drawScene",lua_cocos2dx_Director_drawScene); - tolua_function(tolua_S,"getMatrix",lua_cocos2dx_Director_getMatrix); + tolua_function(tolua_S,"restart",lua_cocos2dx_Director_restart); tolua_function(tolua_S,"popScene",lua_cocos2dx_Director_popScene); tolua_function(tolua_S,"loadIdentityMatrix",lua_cocos2dx_Director_loadIdentityMatrix); tolua_function(tolua_S,"isDisplayStats",lua_cocos2dx_Director_isDisplayStats); @@ -16038,6 +16135,55 @@ int lua_cocos2dx_FileUtils_fullPathFromRelativeFile(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_setWritablePath(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_setWritablePath'", 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.FileUtils:setWritablePath"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_setWritablePath'", nullptr); + return 0; + } + cobj->setWritablePath(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:setWritablePath",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_setWritablePath'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_setPopupNotify(lua_State* tolua_S) { int argc = 0; @@ -16137,6 +16283,55 @@ int lua_cocos2dx_FileUtils_isDirectoryExist(lua_State* tolua_S) return 0; } +int lua_cocos2dx_FileUtils_setDefaultResourceRootPath(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::FileUtils* 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.FileUtils",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::FileUtils*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_FileUtils_setDefaultResourceRootPath'", 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.FileUtils:setDefaultResourceRootPath"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_FileUtils_setDefaultResourceRootPath'", nullptr); + return 0; + } + cobj->setDefaultResourceRootPath(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.FileUtils:setDefaultResourceRootPath",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_FileUtils_setDefaultResourceRootPath'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_FileUtils_getSearchResolutionsOrder(lua_State* tolua_S) { int argc = 0; @@ -16382,8 +16577,10 @@ int lua_register_cocos2dx_FileUtils(lua_State* tolua_S) tolua_function(tolua_S,"isFileExist",lua_cocos2dx_FileUtils_isFileExist); tolua_function(tolua_S,"purgeCachedEntries",lua_cocos2dx_FileUtils_purgeCachedEntries); tolua_function(tolua_S,"fullPathFromRelativeFile",lua_cocos2dx_FileUtils_fullPathFromRelativeFile); + tolua_function(tolua_S,"setWritablePath",lua_cocos2dx_FileUtils_setWritablePath); tolua_function(tolua_S,"setPopupNotify",lua_cocos2dx_FileUtils_setPopupNotify); tolua_function(tolua_S,"isDirectoryExist",lua_cocos2dx_FileUtils_isDirectoryExist); + tolua_function(tolua_S,"setDefaultResourceRootPath",lua_cocos2dx_FileUtils_setDefaultResourceRootPath); tolua_function(tolua_S,"getSearchResolutionsOrder",lua_cocos2dx_FileUtils_getSearchResolutionsOrder); tolua_function(tolua_S,"createDirectory",lua_cocos2dx_FileUtils_createDirectory); tolua_function(tolua_S,"getWritablePath",lua_cocos2dx_FileUtils_getWritablePath); @@ -60854,6 +61051,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; @@ -60906,6 +61155,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; @@ -61124,7 +61423,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 1600226305..e78335357a 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.hpp @@ -1616,6 +1616,12 @@ int register_all_cocos2dx(lua_State* tolua_S); + + + + + + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.cpp index 8d83129c8b..524716110b 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.cpp @@ -598,53 +598,6 @@ int lua_cocos2dx_csloader_CSLoader_createNodeWithFlatBuffersForSimulator(lua_Sta return 0; } -int lua_cocos2dx_csloader_CSLoader_getCsdVersion(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::CSLoader* 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.CSLoader",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::CSLoader*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_csloader_CSLoader_getCsdVersion'", 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_csloader_CSLoader_getCsdVersion'", nullptr); - return 0; - } - std::string ret = cobj->getCsdVersion(); - tolua_pushcppstring(tolua_S,ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.CSLoader:getCsdVersion",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_csloader_CSLoader_getCsdVersion'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_csloader_CSLoader_destroyInstance(lua_State* tolua_S) { int argc = 0; @@ -808,7 +761,6 @@ int lua_register_cocos2dx_csloader_CSLoader(lua_State* tolua_S) tolua_function(tolua_S,"getJsonPath",lua_cocos2dx_csloader_CSLoader_getJsonPath); tolua_function(tolua_S,"setRecordJsonPath",lua_cocos2dx_csloader_CSLoader_setRecordJsonPath); tolua_function(tolua_S,"createNodeWithFlatBuffersForSimulator",lua_cocos2dx_csloader_CSLoader_createNodeWithFlatBuffersForSimulator); - tolua_function(tolua_S,"getCsdVersion",lua_cocos2dx_csloader_CSLoader_getCsdVersion); tolua_function(tolua_S,"destroyInstance", lua_cocos2dx_csloader_CSLoader_destroyInstance); tolua_function(tolua_S,"createNode", lua_cocos2dx_csloader_CSLoader_createNode); tolua_function(tolua_S,"getInstance", lua_cocos2dx_csloader_CSLoader_getInstance); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.hpp index 30e076262f..4c4e5bc666 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_csloader_auto.hpp @@ -29,5 +29,4 @@ int register_all_cocos2dx_csloader(lua_State* tolua_S); - #endif // __cocos2dx_csloader_h__ diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp index 82699b3592..7645b195c6 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp @@ -12967,6 +12967,53 @@ int lua_cocos2dx_extension_Manifest_getVersionFileUrl(lua_State* tolua_S) return 0; } +int lua_cocos2dx_extension_Manifest_getSearchPaths(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::extension::Manifest* 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.Manifest",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::extension::Manifest*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_Manifest_getSearchPaths'", 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_extension_Manifest_getSearchPaths'", nullptr); + return 0; + } + std::vector ret = cobj->getSearchPaths(); + ccvector_std_string_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Manifest:getSearchPaths",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_Manifest_getSearchPaths'.",&tolua_err); +#endif + + return 0; +} static int lua_cocos2dx_extension_Manifest_finalize(lua_State* tolua_S) { printf("luabindings: finalizing LUA object (Manifest)"); @@ -12985,6 +13032,7 @@ int lua_register_cocos2dx_extension_Manifest(lua_State* tolua_S) tolua_function(tolua_S,"getPackageUrl",lua_cocos2dx_extension_Manifest_getPackageUrl); tolua_function(tolua_S,"getVersion",lua_cocos2dx_extension_Manifest_getVersion); tolua_function(tolua_S,"getVersionFileUrl",lua_cocos2dx_extension_Manifest_getVersionFileUrl); + tolua_function(tolua_S,"getSearchPaths",lua_cocos2dx_extension_Manifest_getSearchPaths); tolua_endmodule(tolua_S); std::string typeName = typeid(cocos2d::extension::Manifest).name(); g_luaType[typeName] = "cc.Manifest"; diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.hpp index fdeaeb9c57..fead84f846 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.hpp @@ -289,6 +289,7 @@ int register_all_cocos2dx_extension(lua_State* tolua_S); + #endif // __cocos2dx_extension_h__ 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 d92c0e0824..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(); @@ -21341,6 +21495,354 @@ int lua_register_cocos2dx_studio_ActionTimeline(lua_State* tolua_S) g_typeCast["ActionTimeline"] = "ccs.ActionTimeline"; return 1; } + +int lua_cocos2dx_studio_ActionTimelineNode_getRoot(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimelineNode* 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.ActionTimelineNode",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimelineNode*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimelineNode_getRoot'", 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_studio_ActionTimelineNode_getRoot'", nullptr); + return 0; + } + cocos2d::Node* ret = cobj->getRoot(); + object_to_luaval(tolua_S, "cc.Node",(cocos2d::Node*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimelineNode:getRoot",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_getRoot'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_ActionTimelineNode_getActionTimeline(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimelineNode* 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.ActionTimelineNode",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimelineNode*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimelineNode_getActionTimeline'", 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_studio_ActionTimelineNode_getActionTimeline'", nullptr); + return 0; + } + cocostudio::timeline::ActionTimeline* ret = cobj->getActionTimeline(); + object_to_luaval(tolua_S, "ccs.ActionTimeline",(cocostudio::timeline::ActionTimeline*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimelineNode:getActionTimeline",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_getActionTimeline'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_ActionTimelineNode_setActionTimeline(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimelineNode* 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.ActionTimelineNode",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimelineNode*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimelineNode_setActionTimeline'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocostudio::timeline::ActionTimeline* arg0; + + ok &= luaval_to_object(tolua_S, 2, "ccs.ActionTimeline",&arg0); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimelineNode_setActionTimeline'", nullptr); + return 0; + } + cobj->setActionTimeline(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimelineNode:setActionTimeline",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_setActionTimeline'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_ActionTimelineNode_init(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimelineNode* 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.ActionTimelineNode",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocostudio::timeline::ActionTimelineNode*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimelineNode_init'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 2) { + cocos2d::Node* arg0; + ok &= luaval_to_object(tolua_S, 2, "cc.Node",&arg0); + + if (!ok) { break; } + cocostudio::timeline::ActionTimeline* arg1; + ok &= luaval_to_object(tolua_S, 3, "ccs.ActionTimeline",&arg1); + + if (!ok) { break; } + bool ret = cobj->init(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 0) { + bool ret = cobj->init(); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimelineNode:init",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_init'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_ActionTimelineNode_setRoot(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimelineNode* 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.ActionTimelineNode",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::timeline::ActionTimelineNode*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ActionTimelineNode_setRoot'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Node* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.Node",&arg0); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimelineNode_setRoot'", nullptr); + return 0; + } + cobj->setRoot(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimelineNode:setRoot",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_setRoot'.",&tolua_err); +#endif + + return 0; +} +int lua_cocos2dx_studio_ActionTimelineNode_create(lua_State* tolua_S) +{ + int argc = 0; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertable(tolua_S,1,"ccs.ActionTimelineNode",0,&tolua_err)) goto tolua_lerror; +#endif + + argc = lua_gettop(tolua_S) - 1; + + if (argc == 2) + { + cocos2d::Node* arg0; + cocostudio::timeline::ActionTimeline* arg1; + ok &= luaval_to_object(tolua_S, 2, "cc.Node",&arg0); + ok &= luaval_to_object(tolua_S, 3, "ccs.ActionTimeline",&arg1); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimelineNode_create'", nullptr); + return 0; + } + cocostudio::timeline::ActionTimelineNode* ret = cocostudio::timeline::ActionTimelineNode::create(arg0, arg1); + object_to_luaval(tolua_S, "ccs.ActionTimelineNode",(cocostudio::timeline::ActionTimelineNode*)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccs.ActionTimelineNode:create",argc, 2); + return 0; +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_create'.",&tolua_err); +#endif + return 0; +} +int lua_cocos2dx_studio_ActionTimelineNode_constructor(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::timeline::ActionTimelineNode* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ActionTimelineNode_constructor'", nullptr); + return 0; + } + cobj = new cocostudio::timeline::ActionTimelineNode(); + cobj->autorelease(); + int ID = (int)cobj->_ID ; + int* luaID = &cobj->_luaID ; + toluafix_pushusertype_ccobject(tolua_S, ID, luaID, (void*)cobj,"ccs.ActionTimelineNode"); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ActionTimelineNode:ActionTimelineNode",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ActionTimelineNode_constructor'.",&tolua_err); +#endif + + return 0; +} + +static int lua_cocos2dx_studio_ActionTimelineNode_finalize(lua_State* tolua_S) +{ + printf("luabindings: finalizing LUA object (ActionTimelineNode)"); + return 0; +} + +int lua_register_cocos2dx_studio_ActionTimelineNode(lua_State* tolua_S) +{ + tolua_usertype(tolua_S,"ccs.ActionTimelineNode"); + tolua_cclass(tolua_S,"ActionTimelineNode","ccs.ActionTimelineNode","cc.Node",nullptr); + + tolua_beginmodule(tolua_S,"ActionTimelineNode"); + tolua_function(tolua_S,"new",lua_cocos2dx_studio_ActionTimelineNode_constructor); + tolua_function(tolua_S,"getRoot",lua_cocos2dx_studio_ActionTimelineNode_getRoot); + tolua_function(tolua_S,"getActionTimeline",lua_cocos2dx_studio_ActionTimelineNode_getActionTimeline); + tolua_function(tolua_S,"setActionTimeline",lua_cocos2dx_studio_ActionTimelineNode_setActionTimeline); + tolua_function(tolua_S,"init",lua_cocos2dx_studio_ActionTimelineNode_init); + tolua_function(tolua_S,"setRoot",lua_cocos2dx_studio_ActionTimelineNode_setRoot); + tolua_function(tolua_S,"create", lua_cocos2dx_studio_ActionTimelineNode_create); + tolua_endmodule(tolua_S); + std::string typeName = typeid(cocostudio::timeline::ActionTimelineNode).name(); + g_luaType[typeName] = "ccs.ActionTimelineNode"; + g_typeCast["ActionTimelineNode"] = "ccs.ActionTimelineNode"; + return 1; +} TOLUA_API int register_all_cocos2dx_studio(lua_State* tolua_S) { tolua_open(tolua_S); @@ -21348,6 +21850,7 @@ TOLUA_API int register_all_cocos2dx_studio(lua_State* tolua_S) tolua_module(tolua_S,"ccs",0); tolua_beginmodule(tolua_S,"ccs"); + lua_register_cocos2dx_studio_ActionTimelineNode(tolua_S); lua_register_cocos2dx_studio_ActionFrame(tolua_S); lua_register_cocos2dx_studio_ActionRotationFrame(tolua_S); lua_register_cocos2dx_studio_Frame(tolua_S); 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 4d6cac2de3..d32028d033 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.hpp @@ -478,6 +478,17 @@ int register_all_cocos2dx_studio(lua_State* tolua_S); + + + + + + + + + + + diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp index d630b0b075..5169b8f894 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.cpp @@ -7135,7 +7135,7 @@ int lua_cocos2dx_ui_Button_getTitleColor(lua_State* tolua_S) tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Button_getTitleColor'", nullptr); return 0; } - const cocos2d::Color3B& ret = cobj->getTitleColor(); + cocos2d::Color3B ret = cobj->getTitleColor(); color3b_to_luaval(tolua_S, ret); return 1; } @@ -7900,6 +7900,53 @@ int lua_cocos2dx_ui_CheckBox_loadTextures(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_CheckBox_getZoomScale(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::CheckBox* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.CheckBox",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::CheckBox*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_CheckBox_getZoomScale'", 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_ui_CheckBox_getZoomScale'", nullptr); + return 0; + } + double ret = cobj->getZoomScale(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.CheckBox:getZoomScale",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_CheckBox_getZoomScale'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_CheckBox_loadTextureBackGround(lua_State* tolua_S) { int argc = 0; @@ -7965,6 +8012,55 @@ int lua_cocos2dx_ui_CheckBox_loadTextureBackGround(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_CheckBox_setZoomScale(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::CheckBox* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.CheckBox",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::CheckBox*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_CheckBox_setZoomScale'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0, "ccui.CheckBox:setZoomScale"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_CheckBox_setZoomScale'", nullptr); + return 0; + } + cobj->setZoomScale(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.CheckBox:setZoomScale",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_CheckBox_setZoomScale'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_CheckBox_loadTextureFrontCrossDisabled(lua_State* tolua_S) { int argc = 0; @@ -8107,7 +8203,42 @@ int lua_cocos2dx_ui_CheckBox_create(lua_State* tolua_S) } } while (0); ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "ccui.CheckBox:create",argc, 0); + do + { + if (argc == 2) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.CheckBox:create"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.CheckBox:create"); + if (!ok) { break; } + cocos2d::ui::CheckBox* ret = cocos2d::ui::CheckBox::create(arg0, arg1); + object_to_luaval(tolua_S, "ccui.CheckBox",(cocos2d::ui::CheckBox*)ret); + return 1; + } + } while (0); + ok = true; + do + { + if (argc == 3) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.CheckBox:create"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.CheckBox:create"); + if (!ok) { break; } + cocos2d::ui::Widget::TextureResType arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccui.CheckBox:create"); + if (!ok) { break; } + cocos2d::ui::CheckBox* ret = cocos2d::ui::CheckBox::create(arg0, arg1, arg2); + object_to_luaval(tolua_S, "ccui.CheckBox",(cocos2d::ui::CheckBox*)ret); + return 1; + } + } while (0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "ccui.CheckBox:create",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -8206,7 +8337,9 @@ int lua_register_cocos2dx_ui_CheckBox(lua_State* tolua_S) tolua_function(tolua_S,"loadTextureFrontCross",lua_cocos2dx_ui_CheckBox_loadTextureFrontCross); tolua_function(tolua_S,"isSelected",lua_cocos2dx_ui_CheckBox_isSelected); tolua_function(tolua_S,"loadTextures",lua_cocos2dx_ui_CheckBox_loadTextures); + tolua_function(tolua_S,"getZoomScale",lua_cocos2dx_ui_CheckBox_getZoomScale); tolua_function(tolua_S,"loadTextureBackGround",lua_cocos2dx_ui_CheckBox_loadTextureBackGround); + tolua_function(tolua_S,"setZoomScale",lua_cocos2dx_ui_CheckBox_setZoomScale); tolua_function(tolua_S,"loadTextureFrontCrossDisabled",lua_cocos2dx_ui_CheckBox_loadTextureFrontCrossDisabled); tolua_function(tolua_S,"create", lua_cocos2dx_ui_CheckBox_create); tolua_function(tolua_S,"createInstance", lua_cocos2dx_ui_CheckBox_createInstance); @@ -14153,6 +14286,35 @@ int lua_cocos2dx_ui_Slider_loadSlidBallTextures(lua_State* tolua_S) #endif argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.Slider:loadSlidBallTextures"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Slider_loadSlidBallTextures'", nullptr); + return 0; + } + cobj->loadSlidBallTextures(arg0); + return 0; + } + if (argc == 2) + { + std::string arg0; + std::string arg1; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.Slider:loadSlidBallTextures"); + + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.Slider:loadSlidBallTextures"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Slider_loadSlidBallTextures'", nullptr); + return 0; + } + cobj->loadSlidBallTextures(arg0, arg1); + return 0; + } if (argc == 3) { std::string arg0; @@ -14194,7 +14356,7 @@ int lua_cocos2dx_ui_Slider_loadSlidBallTextures(lua_State* tolua_S) cobj->loadSlidBallTextures(arg0, arg1, arg2, arg3); return 0; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Slider:loadSlidBallTextures",argc, 3); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Slider:loadSlidBallTextures",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 @@ -14398,6 +14560,55 @@ int lua_cocos2dx_ui_Slider_setScale9Enabled(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_Slider_setZoomScale(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::Slider* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.Slider",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::Slider*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Slider_setZoomScale'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + double arg0; + + ok &= luaval_to_number(tolua_S, 2,&arg0, "ccui.Slider:setZoomScale"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Slider_setZoomScale'", nullptr); + return 0; + } + cobj->setZoomScale(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Slider:setZoomScale",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Slider_setZoomScale'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_Slider_setCapInsets(lua_State* tolua_S) { int argc = 0; @@ -14447,6 +14658,53 @@ int lua_cocos2dx_ui_Slider_setCapInsets(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_Slider_getZoomScale(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::Slider* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.Slider",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::Slider*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Slider_getZoomScale'", 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_ui_Slider_getZoomScale'", nullptr); + return 0; + } + double ret = cobj->getZoomScale(); + tolua_pushnumber(tolua_S,(lua_Number)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Slider:getZoomScale",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Slider_getZoomScale'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_Slider_addEventListener(lua_State* tolua_S) { int argc = 0; @@ -14710,7 +14968,6 @@ int lua_cocos2dx_ui_Slider_create(lua_State* tolua_S) { int argc = 0; bool ok = true; - #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif @@ -14719,20 +14976,54 @@ int lua_cocos2dx_ui_Slider_create(lua_State* tolua_S) if (!tolua_isusertable(tolua_S,1,"ccui.Slider",0,&tolua_err)) goto tolua_lerror; #endif - argc = lua_gettop(tolua_S) - 1; + argc = lua_gettop(tolua_S)-1; - if (argc == 0) + do { - if(!ok) + if (argc == 2) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Slider_create'", nullptr); - return 0; + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.Slider:create"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.Slider:create"); + if (!ok) { break; } + cocos2d::ui::Slider* ret = cocos2d::ui::Slider::create(arg0, arg1); + object_to_luaval(tolua_S, "ccui.Slider",(cocos2d::ui::Slider*)ret); + return 1; } - cocos2d::ui::Slider* ret = cocos2d::ui::Slider::create(); - object_to_luaval(tolua_S, "ccui.Slider",(cocos2d::ui::Slider*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "ccui.Slider:create",argc, 0); + } while (0); + ok = true; + do + { + if (argc == 3) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.Slider:create"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.Slider:create"); + if (!ok) { break; } + cocos2d::ui::Widget::TextureResType arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "ccui.Slider:create"); + if (!ok) { break; } + cocos2d::ui::Slider* ret = cocos2d::ui::Slider::create(arg0, arg1, arg2); + object_to_luaval(tolua_S, "ccui.Slider",(cocos2d::ui::Slider*)ret); + return 1; + } + } while (0); + ok = true; + do + { + if (argc == 0) + { + cocos2d::ui::Slider* ret = cocos2d::ui::Slider::create(); + object_to_luaval(tolua_S, "ccui.Slider",(cocos2d::ui::Slider*)ret); + return 1; + } + } while (0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "ccui.Slider:create",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -14834,7 +15125,9 @@ int lua_register_cocos2dx_ui_Slider(lua_State* tolua_S) tolua_function(tolua_S,"setCapInsetsBarRenderer",lua_cocos2dx_ui_Slider_setCapInsetsBarRenderer); tolua_function(tolua_S,"getCapInsetsProgressBarRebderer",lua_cocos2dx_ui_Slider_getCapInsetsProgressBarRebderer); tolua_function(tolua_S,"setScale9Enabled",lua_cocos2dx_ui_Slider_setScale9Enabled); + tolua_function(tolua_S,"setZoomScale",lua_cocos2dx_ui_Slider_setZoomScale); tolua_function(tolua_S,"setCapInsets",lua_cocos2dx_ui_Slider_setCapInsets); + tolua_function(tolua_S,"getZoomScale",lua_cocos2dx_ui_Slider_getZoomScale); tolua_function(tolua_S,"addEventListener",lua_cocos2dx_ui_Slider_addEventListener); tolua_function(tolua_S,"loadSlidBallTexturePressed",lua_cocos2dx_ui_Slider_loadSlidBallTexturePressed); tolua_function(tolua_S,"isScale9Enabled",lua_cocos2dx_ui_Slider_isScale9Enabled); @@ -19910,6 +20203,55 @@ int lua_cocos2dx_ui_Scale9Sprite_isFlippedX(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::Scale9Sprite* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.Scale9Sprite",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::Scale9Sprite*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + bool arg0; + + ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.Scale9Sprite:setScale9Enabled"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled'", nullptr); + return 0; + } + cobj->setScale9Enabled(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:setScale9Enabled",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_Scale9Sprite_setFlippedY(lua_State* tolua_S) { int argc = 0; @@ -20008,7 +20350,7 @@ int lua_cocos2dx_ui_Scale9Sprite_setFlippedX(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled(lua_State* tolua_S) +int lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets(lua_State* tolua_S) { int argc = 0; cocos2d::ui::Scale9Sprite* cobj = nullptr; @@ -20028,7 +20370,7 @@ int lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets'", nullptr); return 0; } #endif @@ -20036,23 +20378,24 @@ int lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled(lua_State* tolua_S) argc = lua_gettop(tolua_S)-1; if (argc == 1) { - bool arg0; + cocos2d::Rect arg0; - ok &= luaval_to_boolean(tolua_S, 2,&arg0, "ccui.Scale9Sprite:setScale9Enabled"); + ok &= luaval_to_rect(tolua_S, 2, &arg0, "ccui.Scale9Sprite:resizableSpriteWithCapInsets"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets'", nullptr); return 0; } - cobj->setScale9Enabled(arg0); - return 0; + cocos2d::ui::Scale9Sprite* ret = cobj->resizableSpriteWithCapInsets(arg0); + object_to_luaval(tolua_S, "ccui.Scale9Sprite",(cocos2d::ui::Scale9Sprite*)ret); + return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:setScale9Enabled",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:resizableSpriteWithCapInsets",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets'.",&tolua_err); #endif return 0; @@ -20103,6 +20446,55 @@ int lua_cocos2dx_ui_Scale9Sprite_disableCascadeOpacity(lua_State* tolua_S) return 0; } +int lua_cocos2dx_ui_Scale9Sprite_setState(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::ui::Scale9Sprite* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccui.Scale9Sprite",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::ui::Scale9Sprite*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_setState'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::ui::Scale9Sprite::State arg0; + + ok &= luaval_to_int32(tolua_S, 2,(int *)&arg0, "ccui.Scale9Sprite:setState"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_setState'", nullptr); + return 0; + } + cobj->setState(arg0); + return 0; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:setState",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_setState'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_ui_Scale9Sprite_setInsetBottom(lua_State* tolua_S) { int argc = 0; @@ -20471,53 +20863,6 @@ int lua_cocos2dx_ui_Scale9Sprite_setPreferredSize(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Scale9Sprite_getInsetRight(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::ui::Scale9Sprite* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccui.Scale9Sprite",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::ui::Scale9Sprite*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_getInsetRight'", 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_ui_Scale9Sprite_getInsetRight'", nullptr); - return 0; - } - double ret = cobj->getInsetRight(); - tolua_pushnumber(tolua_S,(lua_Number)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:getInsetRight",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_getInsetRight'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_ui_Scale9Sprite_setSpriteFrame(lua_State* tolua_S) { int argc = 0; @@ -20630,7 +20975,7 @@ int lua_cocos2dx_ui_Scale9Sprite_getInsetBottom(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets(lua_State* tolua_S) +int lua_cocos2dx_ui_Scale9Sprite_getCapInsets(lua_State* tolua_S) { int argc = 0; cocos2d::ui::Scale9Sprite* cobj = nullptr; @@ -20650,32 +20995,29 @@ int lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets(lua_State* tolua_S #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_getCapInsets'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 0) { - cocos2d::Rect arg0; - - ok &= luaval_to_rect(tolua_S, 2, &arg0, "ccui.Scale9Sprite:resizableSpriteWithCapInsets"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_getCapInsets'", nullptr); return 0; } - cocos2d::ui::Scale9Sprite* ret = cobj->resizableSpriteWithCapInsets(arg0); - object_to_luaval(tolua_S, "ccui.Scale9Sprite",(cocos2d::ui::Scale9Sprite*)ret); + cocos2d::Rect ret = cobj->getCapInsets(); + rect_to_luaval(tolua_S, ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:resizableSpriteWithCapInsets",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:getCapInsets",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_getCapInsets'.",&tolua_err); #endif return 0; @@ -20727,7 +21069,7 @@ int lua_cocos2dx_ui_Scale9Sprite_isScale9Enabled(lua_State* tolua_S) return 0; } -int lua_cocos2dx_ui_Scale9Sprite_getCapInsets(lua_State* tolua_S) +int lua_cocos2dx_ui_Scale9Sprite_getInsetRight(lua_State* tolua_S) { int argc = 0; cocos2d::ui::Scale9Sprite* cobj = nullptr; @@ -20747,7 +21089,7 @@ int lua_cocos2dx_ui_Scale9Sprite_getCapInsets(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_getCapInsets'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_Scale9Sprite_getInsetRight'", nullptr); return 0; } #endif @@ -20757,19 +21099,19 @@ int lua_cocos2dx_ui_Scale9Sprite_getCapInsets(lua_State* tolua_S) { if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_getCapInsets'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_Scale9Sprite_getInsetRight'", nullptr); return 0; } - cocos2d::Rect ret = cobj->getCapInsets(); - rect_to_luaval(tolua_S, ret); + double ret = cobj->getInsetRight(); + tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:getCapInsets",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Scale9Sprite:getInsetRight",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_getCapInsets'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_Scale9Sprite_getInsetRight'.",&tolua_err); #endif return 0; @@ -21561,22 +21903,23 @@ int lua_register_cocos2dx_ui_Scale9Sprite(lua_State* tolua_S) tolua_function(tolua_S,"disableCascadeColor",lua_cocos2dx_ui_Scale9Sprite_disableCascadeColor); tolua_function(tolua_S,"updateWithSprite",lua_cocos2dx_ui_Scale9Sprite_updateWithSprite); tolua_function(tolua_S,"isFlippedX",lua_cocos2dx_ui_Scale9Sprite_isFlippedX); + tolua_function(tolua_S,"setScale9Enabled",lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled); tolua_function(tolua_S,"setFlippedY",lua_cocos2dx_ui_Scale9Sprite_setFlippedY); tolua_function(tolua_S,"setFlippedX",lua_cocos2dx_ui_Scale9Sprite_setFlippedX); - tolua_function(tolua_S,"setScale9Enabled",lua_cocos2dx_ui_Scale9Sprite_setScale9Enabled); + tolua_function(tolua_S,"resizableSpriteWithCapInsets",lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets); tolua_function(tolua_S,"disableCascadeOpacity",lua_cocos2dx_ui_Scale9Sprite_disableCascadeOpacity); + tolua_function(tolua_S,"setState",lua_cocos2dx_ui_Scale9Sprite_setState); tolua_function(tolua_S,"setInsetBottom",lua_cocos2dx_ui_Scale9Sprite_setInsetBottom); tolua_function(tolua_S,"initWithSpriteFrameName",lua_cocos2dx_ui_Scale9Sprite_initWithSpriteFrameName); tolua_function(tolua_S,"getSprite",lua_cocos2dx_ui_Scale9Sprite_getSprite); tolua_function(tolua_S,"setInsetTop",lua_cocos2dx_ui_Scale9Sprite_setInsetTop); tolua_function(tolua_S,"init",lua_cocos2dx_ui_Scale9Sprite_init); tolua_function(tolua_S,"setPreferredSize",lua_cocos2dx_ui_Scale9Sprite_setPreferredSize); - tolua_function(tolua_S,"getInsetRight",lua_cocos2dx_ui_Scale9Sprite_getInsetRight); tolua_function(tolua_S,"setSpriteFrame",lua_cocos2dx_ui_Scale9Sprite_setSpriteFrame); tolua_function(tolua_S,"getInsetBottom",lua_cocos2dx_ui_Scale9Sprite_getInsetBottom); - tolua_function(tolua_S,"resizableSpriteWithCapInsets",lua_cocos2dx_ui_Scale9Sprite_resizableSpriteWithCapInsets); - tolua_function(tolua_S,"isScale9Enabled",lua_cocos2dx_ui_Scale9Sprite_isScale9Enabled); tolua_function(tolua_S,"getCapInsets",lua_cocos2dx_ui_Scale9Sprite_getCapInsets); + tolua_function(tolua_S,"isScale9Enabled",lua_cocos2dx_ui_Scale9Sprite_isScale9Enabled); + tolua_function(tolua_S,"getInsetRight",lua_cocos2dx_ui_Scale9Sprite_getInsetRight); tolua_function(tolua_S,"getOriginalSize",lua_cocos2dx_ui_Scale9Sprite_getOriginalSize); tolua_function(tolua_S,"initWithFile",lua_cocos2dx_ui_Scale9Sprite_initWithFile); tolua_function(tolua_S,"getInsetTop",lua_cocos2dx_ui_Scale9Sprite_getInsetTop); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp index e9f6ed54cb..aab8aef2b8 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_ui_auto.hpp @@ -486,6 +486,11 @@ int register_all_cocos2dx_ui(lua_State* tolua_S); + + + + + diff --git a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp index b46c5cf137..47dab09de1 100644 --- a/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp +++ b/cocos/scripting/lua-bindings/manual/cocos2d/lua_cocos2dx_manual.cpp @@ -2328,6 +2328,49 @@ tolua_lerror: return 0; } +int lua_cocos2dx_Node_setRotationQuat(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::Node* 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.Node",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::Node*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Node_setRotationQuat'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 1) { + cocos2d::Quaternion arg0; + ok &= luaval_to_quaternion(tolua_S, 2, &arg0, "cc.Node:setRotationQuat"); + + if (!ok) { break; } + cobj->setRotationQuat(arg0); + return 0; + } + }while(0); + + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Node:setRotationQuat",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 +tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Node_setRotationQuat'.",&tolua_err); +#endif + + return 0; +} + static int tolua_cocos2d_Spawn_create(lua_State* tolua_S) { if (NULL == tolua_S) @@ -4403,6 +4446,9 @@ static void extendNode(lua_State* tolua_S) lua_pushstring(tolua_S, "setAdditionalTransform"); lua_pushcfunction(tolua_S, lua_cocos2dx_Node_setAdditionalTransform); lua_rawset(tolua_S, -3); + lua_pushstring(tolua_S, "setRotationQuat"); + lua_pushcfunction(tolua_S, lua_cocos2dx_Node_setRotationQuat); + lua_rawset(tolua_S, -3); } lua_pop(tolua_S, 1); } diff --git a/cocos/scripting/lua-bindings/script/cocos2d/Cocos2d.lua b/cocos/scripting/lua-bindings/script/cocos2d/Cocos2d.lua index 386e19067a..40b721ebab 100644 --- a/cocos/scripting/lua-bindings/script/cocos2d/Cocos2d.lua +++ b/cocos/scripting/lua-bindings/script/cocos2d/Cocos2d.lua @@ -289,6 +289,55 @@ function cc.c4f( _r,_g,_b,_a ) return { r = _r, g = _g, b = _b, a = _a } end +local function isFloatColor(c) + return (c.r <= 1 and c.g <= 1 and c.b <= 1) and (math.ceil(c.r) ~= c.r or math.ceil(c.g) ~= c.g or math.ceil(c.b) ~= c.b) +end + +function cc.convertColor(input, typ) + assert(type(input) == "table" and input.r and input.g and input.b, "cc.convertColor() - invalid input color") + local ret + if typ == "3b" then + if isFloatColor(input) then + ret = {r = math.ceil(input.r * 255), g = math.ceil(input.g * 255), b = math.ceil(input.b * 255)} + else + ret = {r = input.r, g = input.g, b = input.b} + end + elseif typ == "4b" then + if isFloatColor(input) then + ret = {r = math.ceil(input.r * 255), g = math.ceil(input.g * 255), b = math.ceil(input.b * 255)} + else + ret = {r = input.r, g = input.g, b = input.b} + end + if input.a then + if math.ceil(input.a) ~= input.a or input.a >= 1 then + ret.a = input.a * 255 + else + ret.a = input.a + end + else + ret.a = 255 + end + elseif typ == "4f" then + if isFloatColor(input) then + ret = {r = input.r, g = input.g, b = input.b} + else + ret = {r = input.r / 255, g = input.g / 255, b = input.b / 255} + end + if input.a then + if math.ceil(input.a) ~= input.a or input.a >= 1 then + ret.a = input.a + else + ret.a = input.a / 255 + end + else + ret.a = 255 + end + else + error(string.format("cc.convertColor() - invalid type %s", typ), 0) + end + return ret +end + --Vertex2F function cc.vertex2F(_x,_y) return { x = _x, y = _y } diff --git a/cocos/scripting/lua-bindings/script/cocos2d/deprecated.lua b/cocos/scripting/lua-bindings/script/cocos2d/deprecated.lua new file mode 100644 index 0000000000..9c82fa8111 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/cocos2d/deprecated.lua @@ -0,0 +1,15 @@ + +function schedule(node, callback, delay) + local delay = cc.DelayTime:create(delay) + local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback)) + local action = cc.RepeatForever:create(sequence) + node:runAction(action) + return action +end + +function performWithDelay(node, callback, delay) + local delay = cc.DelayTime:create(delay) + local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback)) + node:runAction(sequence) + return sequence +end diff --git a/cocos/scripting/lua-bindings/script/cocos2d/extern.lua b/cocos/scripting/lua-bindings/script/cocos2d/extern.lua deleted file mode 100644 index 2c6687c55e..0000000000 --- a/cocos/scripting/lua-bindings/script/cocos2d/extern.lua +++ /dev/null @@ -1,93 +0,0 @@ - -function clone(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for key, value in pairs(object) do - new_table[_copy(key)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - return _copy(object) -end - ---Create an class. -function class(classname, super) - local superType = type(super) - local cls - - if superType ~= "function" and superType ~= "table" then - superType = nil - super = nil - end - - if superType == "function" or (super and super.__ctype == 1) then - -- inherited from native C++ Object - cls = {} - - if superType == "table" then - -- copy fields from super - for k,v in pairs(super) do cls[k] = v end - cls.__create = super.__create - cls.super = super - else - cls.__create = super - end - - cls.ctor = function() end - cls.__cname = classname - cls.__ctype = 1 - - function cls.new(...) - local instance = cls.__create(...) - -- copy fields from class to native object - for k,v in pairs(cls) do instance[k] = v end - instance.class = cls - instance:ctor(...) - return instance - end - - else - -- inherited from Lua Object - if super then - cls = clone(super) - cls.super = super - else - cls = {ctor = function() end} - end - - cls.__cname = classname - cls.__ctype = 2 -- lua - cls.__index = cls - - function cls.new(...) - local instance = setmetatable({}, cls) - instance.class = cls - instance:ctor(...) - return instance - end - end - - return cls -end - -function schedule(node, callback, delay) - local delay = cc.DelayTime:create(delay) - local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback)) - local action = cc.RepeatForever:create(sequence) - node:runAction(action) - return action -end - -function performWithDelay(node, callback, delay) - local delay = cc.DelayTime:create(delay) - local sequence = cc.Sequence:create(delay, cc.CallFunc:create(callback)) - node:runAction(sequence) - return sequence -end diff --git a/cocos/scripting/lua-bindings/script/cocos2d/functions.lua b/cocos/scripting/lua-bindings/script/cocos2d/functions.lua new file mode 100644 index 0000000000..24a54f26fc --- /dev/null +++ b/cocos/scripting/lua-bindings/script/cocos2d/functions.lua @@ -0,0 +1,633 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +function printLog(tag, fmt, ...) + local t = { + "[", + string.upper(tostring(tag)), + "] ", + string.format(tostring(fmt), ...) + } + print(table.concat(t)) +end + +function printError(fmt, ...) + printLog("ERR", fmt, ...) + print(debug.traceback("", 2)) +end + +function printInfo(fmt, ...) + if type(DEBUG) ~= "number" or DEBUG < 2 then return end + printLog("INFO", fmt, ...) +end + +local function dump_value_(v) + if type(v) == "string" then + v = "\"" .. v .. "\"" + end + return tostring(v) +end + +function dump(value, desciption, nesting) + if type(nesting) ~= "number" then nesting = 3 end + + local lookupTable = {} + local result = {} + + local traceback = string.split(debug.traceback("", 2), "\n") + print("dump from: " .. string.trim(traceback[3])) + + local function dump_(value, desciption, indent, nest, keylen) + desciption = desciption or "" + local spc = "" + if type(keylen) == "number" then + spc = string.rep(" ", keylen - string.len(dump_value_(desciption))) + end + if type(value) ~= "table" then + result[#result +1 ] = string.format("%s%s%s = %s", indent, dump_value_(desciption), spc, dump_value_(value)) + elseif lookupTable[tostring(value)] then + result[#result +1 ] = string.format("%s%s%s = *REF*", indent, dump_value_(desciption), spc) + else + lookupTable[tostring(value)] = true + if nest > nesting then + result[#result +1 ] = string.format("%s%s = *MAX NESTING*", indent, dump_value_(desciption)) + else + result[#result +1 ] = string.format("%s%s = {", indent, dump_value_(desciption)) + local indent2 = indent.." " + local keys = {} + local keylen = 0 + local values = {} + for k, v in pairs(value) do + keys[#keys + 1] = k + local vk = dump_value_(k) + local vkl = string.len(vk) + if vkl > keylen then keylen = vkl end + values[k] = v + end + table.sort(keys, function(a, b) + if type(a) == "number" and type(b) == "number" then + return a < b + else + return tostring(a) < tostring(b) + end + end) + for i, k in ipairs(keys) do + dump_(values[k], k, indent2, nest + 1, keylen) + end + result[#result +1] = string.format("%s}", indent) + end + end + end + dump_(value, desciption, "- ", 1) + + for i, line in ipairs(result) do + print(line) + end +end + +function printf(fmt, ...) + print(string.format(tostring(fmt), ...)) +end + +function checknumber(value, base) + return tonumber(value, base) or 0 +end + +function checkint(value) + return math.round(checknumber(value)) +end + +function checkbool(value) + return (value ~= nil and value ~= false) +end + +function checktable(value) + if type(value) ~= "table" then value = {} end + return value +end + +function isset(hashtable, key) + local t = type(hashtable) + return (t == "table" or t == "userdata") and hashtable[key] ~= nil +end + +local setmetatableindex_ +setmetatableindex_ = function(t, index) + if type(t) == "userdata" then + local peer = tolua.getpeer(t) + if not peer then + peer = {} + tolua.setpeer(t, peer) + end + setmetatableindex_(peer, index) + else + local mt = getmetatable(t) + if not mt then mt = {} end + if not mt.__index then + mt.__index = index + setmetatable(t, mt) + elseif mt.__index ~= index then + setmetatableindex_(mt, index) + end + end +end +setmetatableindex = setmetatableindex_ + +function clone(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local newObject = {} + lookup_table[object] = newObject + for key, value in pairs(object) do + newObject[_copy(key)] = _copy(value) + end + return setmetatable(newObject, getmetatable(object)) + end + return _copy(object) +end + +function class(classname, ...) + local cls = {__cname = classname} + + local supers = {...} + for _, super in ipairs(supers) do + local superType = type(super) + assert(superType == "nil" or superType == "table" or superType == "function", + string.format("class() - create class \"%s\" with invalid super class type \"%s\"", + classname, superType)) + + if superType == "function" then + assert(cls.__create == nil, + string.format("class() - create class \"%s\" with more than one creating function", + classname)); + -- if super is function, set it to __create + cls.__create = super + elseif superType == "table" then + if super[".isclass"] then + -- super is native class + assert(cls.__create == nil, + string.format("class() - create class \"%s\" with more than one creating function or native class", + classname)); + cls.__create = function() return super:create() end + else + -- super is pure lua class + cls.__supers = cls.__supers or {} + cls.__supers[#cls.__supers + 1] = super + if not cls.super then + -- set first super pure lua class as class.super + cls.super = super + end + end + else + error(string.format("class() - create class \"%s\" with invalid super type", + classname), 0) + end + end + + cls.__index = cls + if not cls.__supers or #cls.__supers == 1 then + setmetatable(cls, {__index = cls.super}) + else + setmetatable(cls, {__index = function(_, key) + local supers = cls.__supers + for i = 1, #supers do + local super = supers[i] + if super[key] then return super[key] end + end + end}) + end + + if not cls.ctor then + -- add default constructor + cls.ctor = function() end + end + cls.new = function(...) + local instance + if cls.__create then + instance = cls.__create(...) + else + instance = {} + end + setmetatableindex(instance, cls) + instance.class = cls + instance:ctor(...) + return instance + end + cls.create = function(_, ...) + return cls.new(...) + end + + return cls +end + +local iskindof_ +iskindof_ = function(cls, name) + local __index = rawget(cls, "__index") + if type(__index) == "table" and rawget(__index, "__cname") == name then return true end + + if rawget(cls, "__cname") == name then return true end + local __supers = rawget(cls, "__supers") + if not __supers then return false end + for _, super in ipairs(__supers) do + if iskindof_(super, name) then return true end + end + return false +end + +function iskindof(obj, classname) + local t = type(obj) + if t ~= "table" and t ~= "userdata" then return false end + + local mt + if t == "userdata" then + if tolua.iskindof(obj, classname) then return true end + mt = tolua.getpeer(obj) + else + mt = getmetatable(obj) + end + if mt then + return iskindof_(mt, classname) + end + return false +end + +function import(moduleName, currentModuleName) + local currentModuleNameParts + local moduleFullName = moduleName + local offset = 1 + + while true do + if string.byte(moduleName, offset) ~= 46 then -- . + moduleFullName = string.sub(moduleName, offset) + if currentModuleNameParts and #currentModuleNameParts > 0 then + moduleFullName = table.concat(currentModuleNameParts, ".") .. "." .. moduleFullName + end + break + end + offset = offset + 1 + + if not currentModuleNameParts then + if not currentModuleName then + local n,v = debug.getlocal(3, 1) + currentModuleName = v + end + + currentModuleNameParts = string.split(currentModuleName, ".") + end + table.remove(currentModuleNameParts, #currentModuleNameParts) + end + + return require(moduleFullName) +end + +function handler(obj, method) + return function(...) + return method(obj, ...) + end +end + +function math.newrandomseed() + local ok, socket = pcall(function() + return require("socket") + end) + + if ok then + math.randomseed(socket.gettime() * 1000) + else + math.randomseed(os.time()) + end + math.random() + math.random() + math.random() + math.random() +end + +function math.round(value) + value = checknumber(value) + return math.floor(value + 0.5) +end + +local pi_div_180 = math.pi / 180 +function math.angle2radian(angle) + return angle * pi_div_180 +end + +local pi_mul_180 = math.pi * 180 +function math.radian2angle(radian) + return radian / pi_mul_180 +end + +function io.exists(path) + local file = io.open(path, "r") + if file then + io.close(file) + return true + end + return false +end + +function io.readfile(path) + local file = io.open(path, "r") + if file then + local content = file:read("*a") + io.close(file) + return content + end + return nil +end + +function io.writefile(path, content, mode) + mode = mode or "w+b" + local file = io.open(path, mode) + if file then + if file:write(content) == nil then return false end + io.close(file) + return true + else + return false + end +end + +function io.pathinfo(path) + local pos = string.len(path) + local extpos = pos + 1 + while pos > 0 do + local b = string.byte(path, pos) + if b == 46 then -- 46 = char "." + extpos = pos + elseif b == 47 then -- 47 = char "/" + break + end + pos = pos - 1 + end + + local dirname = string.sub(path, 1, pos) + local filename = string.sub(path, pos + 1) + extpos = extpos - pos + local basename = string.sub(filename, 1, extpos - 1) + local extname = string.sub(filename, extpos) + return { + dirname = dirname, + filename = filename, + basename = basename, + extname = extname + } +end + +function io.filesize(path) + local size = false + local file = io.open(path, "r") + if file then + local current = file:seek() + size = file:seek("end") + file:seek("set", current) + io.close(file) + end + return size +end + +function table.nums(t) + local count = 0 + for k, v in pairs(t) do + count = count + 1 + end + return count +end + +function table.keys(hashtable) + local keys = {} + for k, v in pairs(hashtable) do + keys[#keys + 1] = k + end + return keys +end + +function table.values(hashtable) + local values = {} + for k, v in pairs(hashtable) do + values[#values + 1] = v + end + return values +end + +function table.merge(dest, src) + for k, v in pairs(src) do + dest[k] = v + end +end + +function table.insertto(dest, src, begin) + begin = checkint(begin) + if begin <= 0 then + begin = #dest + 1 + end + + local len = #src + for i = 0, len - 1 do + dest[i + begin] = src[i + 1] + end +end + +function table.indexof(array, value, begin) + for i = begin or 1, #array do + if array[i] == value then return i end + end + return false +end + +function table.keyof(hashtable, value) + for k, v in pairs(hashtable) do + if v == value then return k end + end + return nil +end + +function table.removebyvalue(array, value, removeall) + local c, i, max = 0, 1, #array + while i <= max do + if array[i] == value then + table.remove(array, i) + c = c + 1 + i = i - 1 + max = max - 1 + if not removeall then break end + end + i = i + 1 + end + return c +end + +function table.map(t, fn) + for k, v in pairs(t) do + t[k] = fn(v, k) + end +end + +function table.walk(t, fn) + for k,v in pairs(t) do + fn(v, k) + end +end + +function table.filter(t, fn) + for k, v in pairs(t) do + if not fn(v, k) then t[k] = nil end + end +end + +function table.unique(t, bArray) + local check = {} + local n = {} + local idx = 1 + for k, v in pairs(t) do + if not check[v] then + if bArray then + n[idx] = v + idx = idx + 1 + else + n[k] = v + end + check[v] = true + end + end + return n +end + +string._htmlspecialchars_set = {} +string._htmlspecialchars_set["&"] = "&" +string._htmlspecialchars_set["\""] = """ +string._htmlspecialchars_set["'"] = "'" +string._htmlspecialchars_set["<"] = "<" +string._htmlspecialchars_set[">"] = ">" + +function string.htmlspecialchars(input) + for k, v in pairs(string._htmlspecialchars_set) do + input = string.gsub(input, k, v) + end + return input +end + +function string.restorehtmlspecialchars(input) + for k, v in pairs(string._htmlspecialchars_set) do + input = string.gsub(input, v, k) + end + return input +end + +function string.nl2br(input) + return string.gsub(input, "\n", "
") +end + +function string.text2html(input) + input = string.gsub(input, "\t", " ") + input = string.htmlspecialchars(input) + input = string.gsub(input, " ", " ") + input = string.nl2br(input) + return input +end + +function string.split(input, delimiter) + input = tostring(input) + delimiter = tostring(delimiter) + if (delimiter=='') then return false end + local pos,arr = 0, {} + -- for each divider found + for st,sp in function() return string.find(input, delimiter, pos, true) end do + table.insert(arr, string.sub(input, pos, st - 1)) + pos = sp + 1 + end + table.insert(arr, string.sub(input, pos)) + return arr +end + +function string.ltrim(input) + return string.gsub(input, "^[ \t\n\r]+", "") +end + +function string.rtrim(input) + return string.gsub(input, "[ \t\n\r]+$", "") +end + +function string.trim(input) + input = string.gsub(input, "^[ \t\n\r]+", "") + return string.gsub(input, "[ \t\n\r]+$", "") +end + +function string.ucfirst(input) + return string.upper(string.sub(input, 1, 1)) .. string.sub(input, 2) +end + +local function urlencodechar(char) + return "%" .. string.format("%02X", string.byte(char)) +end +function string.urlencode(input) + -- convert line endings + input = string.gsub(tostring(input), "\n", "\r\n") + -- escape all characters but alphanumeric, '.' and '-' + input = string.gsub(input, "([^%w%.%- ])", urlencodechar) + -- convert spaces to "+" symbols + return string.gsub(input, " ", "+") +end + +function string.urldecode(input) + input = string.gsub (input, "+", " ") + input = string.gsub (input, "%%(%x%x)", function(h) return string.char(checknumber(h,16)) end) + input = string.gsub (input, "\r\n", "\n") + return input +end + +function string.utf8len(input) + local len = string.len(input) + local left = len + local cnt = 0 + local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc} + while left ~= 0 do + local tmp = string.byte(input, -left) + local i = #arr + while arr[i] do + if tmp >= arr[i] then + left = left - i + break + end + i = i - 1 + end + cnt = cnt + 1 + end + return cnt +end + +function string.formatnumberthousands(num) + local formatted = tostring(checknumber(num)) + local k + while true do + formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') + if k == 0 then break end + end + return formatted +end diff --git a/cocos/scripting/lua-bindings/script/framework/audio.lua b/cocos/scripting/lua-bindings/script/framework/audio.lua new file mode 100644 index 0000000000..59eb5663b7 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/audio.lua @@ -0,0 +1,206 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local audio = {} + +local engine = cc.SimpleAudioEngine:getInstance() + +function audio.getMusicVolume() + local volume = engine:getMusicVolume() + if DEBUG > 1 then + printf("[audio] getMusicVolume() - volume: %0.2f", volume) + end + return volume +end + +function audio.setMusicVolume(volume) + volume = checknumber(volume) + if DEBUG > 1 then + printf("[audio] setMusicVolume() - volume: %0.2f", volume) + end + engine:setMusicVolume(volume) +end + +function audio.preloadMusic(filename) + assert(filename, "audio.preloadMusic() - invalid filename") + if DEBUG > 1 then + printf("[audio] preloadMusic() - filename: %s", tostring(filename)) + end + engine:preloadMusic(filename) +end + +function audio.playMusic(filename, isLoop) + assert(filename, "audio.playMusic() - invalid filename") + if type(isLoop) ~= "boolean" then isLoop = true end + + audio.stopMusic() + if DEBUG > 1 then + printf("[audio] playMusic() - filename: %s, isLoop: %s", tostring(filename), tostring(isLoop)) + end + engine:playMusic(filename, isLoop) +end + +function audio.stopMusic(isReleaseData) + isReleaseData = checkbool(isReleaseData) + if DEBUG > 1 then + printf("[audio] stopMusic() - isReleaseData: %s", tostring(isReleaseData)) + end + engine:stopMusic(isReleaseData) +end + +function audio.pauseMusic() + if DEBUG > 1 then + printf("[audio] pauseMusic()") + end + engine:pauseMusic() +end + +function audio.resumeMusic() + if DEBUG > 1 then + printf("[audio] resumeMusic()") + end + engine:resumeMusic() +end + +function audio.rewindMusic() + if DEBUG > 1 then + printf("[audio] rewindMusic()") + end + engine:rewindMusic() +end + +function audio.isMusicPlaying() + local ret = engine:isMusicPlaying() + if DEBUG > 1 then + printf("[audio] isMusicPlaying() - ret: %s", tostring(ret)) + end + return ret +end + +function audio.getSoundsVolume() + local volume = engine:getEffectsVolume() + if DEBUG > 1 then + printf("[audio] getSoundsVolume() - volume: %0.1f", volume) + end + return volume +end + +function audio.setSoundsVolume(volume) + volume = checknumber(volume) + if DEBUG > 1 then + printf("[audio] setSoundsVolume() - volume: %0.1f", volume) + end + engine:setEffectsVolume(volume) +end + +function audio.playSound(filename, isLoop) + if not filename then + printError("audio.playSound() - invalid filename") + return + end + if type(isLoop) ~= "boolean" then isLoop = false end + if DEBUG > 1 then + printf("[audio] playSound() - filename: %s, isLoop: %s", tostring(filename), tostring(isLoop)) + end + return engine:playEffect(filename, isLoop) +end + +function audio.pauseSound(handle) + if not handle then + printError("audio.pauseSound() - invalid handle") + return + end + if DEBUG > 1 then + printf("[audio] pauseSound() - handle: %s", tostring(handle)) + end + engine:pauseEffect(handle) +end + +function audio.pauseAllSounds() + if DEBUG > 1 then + printf("[audio] pauseAllSounds()") + end + engine:pauseAllEffects() +end + +function audio.resumeSound(handle) + if not handle then + printError("audio.resumeSound() - invalid handle") + return + end + if DEBUG > 1 then + printf("[audio] resumeSound() - handle: %s", tostring(handle)) + end + engine:resumeEffect(handle) +end + +function audio.resumeAllSounds() + if DEBUG > 1 then + printf("[audio] resumeAllSounds()") + end + engine:resumeAllEffects() +end + +function audio.stopSound(handle) + if not handle then + printError("audio.stopSound() - invalid handle") + return + end + if DEBUG > 1 then + printf("[audio] stopSound() - handle: %s", tostring(handle)) + end + engine:stopEffect(handle) +end + +function audio.stopAllSounds() + if DEBUG > 1 then + printf("[audio] stopAllSounds()") + end + engine:stopAllEffects() +end +audio.stopAllEffects = audio.stopAllSounds + +function audio.preloadSound(filename) + if not filename then + printError("audio.preloadSound() - invalid filename") + return + end + if DEBUG > 1 then + printf("[audio] preloadSound() - filename: %s", tostring(filename)) + end + engine:preloadEffect(filename) +end + +function audio.unloadSound(filename) + if not filename then + printError("audio.unloadSound() - invalid filename") + return + end + if DEBUG > 1 then + printf("[audio] unloadSound() - filename: %s", tostring(filename)) + end + engine:unloadEffect(filename) +end + +return audio diff --git a/cocos/scripting/lua-bindings/script/framework/components/event.lua b/cocos/scripting/lua-bindings/script/framework/components/event.lua new file mode 100644 index 0000000000..9fc7f13693 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/components/event.lua @@ -0,0 +1,155 @@ + +local Event = class("Event") + +local EXPORTED_METHODS = { + "addEventListener", + "dispatchEvent", + "removeEventListener", + "removeEventListenersByTag", + "removeEventListenersByEvent", + "removeAllEventListeners", + "hasEventListener", + "dumpAllEventListeners", +} + +function Event:init_() + self.target_ = nil + self.listeners_ = {} + self.nextListenerHandleIndex_ = 0 +end + +function Event:bind(target) + self:init_() + cc.setmethods(target, self, EXPORTED_METHODS) + self.target_ = target +end + +function Event:unbind(target) + cc.unsetmethods(target, EXPORTED_METHODS) + self:init_() +end + +function Event:addEventListener(eventName, listener, tag) + assert(type(eventName) == "string" and eventName ~= "", + "Event:addEventListener() - invalid eventName") + eventName = string.upper(eventName) + if self.listeners_[eventName] == nil then + self.listeners_[eventName] = {} + end + + self.nextListenerHandleIndex_ = self.nextListenerHandleIndex_ + 1 + local handle = tostring(self.nextListenerHandleIndex_) + tag = tag or "" + self.listeners_[eventName][handle] = {listener, tag} + + if DEBUG > 1 then + printInfo("%s [Event] addEventListener() - event: %s, handle: %s, tag: \"%s\"", + tostring(self.target_), eventName, handle, tostring(tag)) + end + + return self.target_, handle +end + +function Event:dispatchEvent(event) + event.name = string.upper(tostring(event.name)) + local eventName = event.name + if DEBUG > 1 then + printInfo("%s [Event] dispatchEvent() - event %s", tostring(self.target_), eventName) + end + + if self.listeners_[eventName] == nil then return end + event.target = self.target_ + event.stop_ = false + event.stop = function(self) + self.stop_ = true + end + + for handle, listener in pairs(self.listeners_[eventName]) do + if DEBUG > 1 then + printInfo("%s [Event] dispatchEvent() - dispatching event %s to listener %s", tostring(self.target_), eventName, handle) + end + -- listener[1] = listener + -- listener[2] = tag + event.tag = listener[2] + listener[1](event) + if event.stop_ then + if DEBUG > 1 then + printInfo("%s [Event] dispatchEvent() - break dispatching for event %s", tostring(self.target_), eventName) + end + break + end + end + + return self.target_ +end + +function Event:removeEventListener(handleToRemove) + for eventName, listenersForEvent in pairs(self.listeners_) do + for handle, _ in pairs(listenersForEvent) do + if handle == handleToRemove then + listenersForEvent[handle] = nil + if DEBUG > 1 then + printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName) + end + return self.target_ + end + end + end + + return self.target_ +end + +function Event:removeEventListenersByTag(tagToRemove) + for eventName, listenersForEvent in pairs(self.listeners_) do + for handle, listener in pairs(listenersForEvent) do + -- listener[1] = listener + -- listener[2] = tag + if listener[2] == tagToRemove then + listenersForEvent[handle] = nil + if DEBUG > 1 then + printInfo("%s [Event] removeEventListener() - remove listener [%s] for event %s", tostring(self.target_), handle, eventName) + end + end + end + end + + return self.target_ +end + +function Event:removeEventListenersByEvent(eventName) + self.listeners_[string.upper(eventName)] = nil + if DEBUG > 1 then + printInfo("%s [Event] removeAllEventListenersForEvent() - remove all listeners for event %s", tostring(self.target_), eventName) + end + return self.target_ +end + +function Event:removeAllEventListeners() + self.listeners_ = {} + if DEBUG > 1 then + printInfo("%s [Event] removeAllEventListeners() - remove all listeners", tostring(self.target_)) + end + return self.target_ +end + +function Event:hasEventListener(eventName) + eventName = string.upper(tostring(eventName)) + local t = self.listeners_[eventName] + for _, __ in pairs(t) do + return true + end + return false +end + +function Event:dumpAllEventListeners() + print("---- Event:dumpAllEventListeners() ----") + for name, listeners in pairs(self.listeners_) do + printf("-- event: %s", name) + for handle, listener in pairs(listeners) do + printf("-- listener: %s, handle: %s", tostring(listener[1]), tostring(handle)) + end + end + return self.target_ +end + +return Event diff --git a/cocos/scripting/lua-bindings/script/framework/device.lua b/cocos/scripting/lua-bindings/script/framework/device.lua new file mode 100644 index 0000000000..ea73f08812 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/device.lua @@ -0,0 +1,104 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local device = {} + +device.platform = "unknown" +device.model = "unknown" + +local app = cc.Application:getInstance() +local target = app:getTargetPlatform() +if target == cc.PLATFORM_OS_WINDOWS then + device.platform = "windows" +elseif target == cc.PLATFORM_OS_MAC then + device.platform = "mac" +elseif target == cc.PLATFORM_OS_ANDROID then + device.platform = "android" +elseif target == cc.PLATFORM_OS_IPHONE or target == cc.PLATFORM_OS_IPAD then + device.platform = "ios" + local w, h = framesize.width, framesize.height + if w == 640 and h == 960 then + device.model = "iphone 4" + elseif w == 640 and h == 1136 then + device.model = "iphone 5" + elseif w == 750 and h == 1334 then + device.model = "iphone 6" + elseif w == 1242 and h == 2208 then + device.model = "iphone 6 plus" + elseif w == 768 and h == 1024 then + device.model = "ipad" + elseif w == 1536 and h == 2048 then + device.model = "ipad retina" + end +elseif target == cc.PLATFORM_OS_WINRT then + device.platform = "winrt" +elseif target == cc.PLATFORM_OS_WP8 then + device.platform = "wp8" +end + +local language_ = app:getCurrentLanguage() +if language_ == cc.LANGUAGE_CHINESE then + language_ = "cn" +elseif language_ == cc.LANGUAGE_FRENCH then + language_ = "fr" +elseif language_ == cc.LANGUAGE_ITALIAN then + language_ = "it" +elseif language_ == cc.LANGUAGE_GERMAN then + language_ = "gr" +elseif language_ == cc.LANGUAGE_SPANISH then + language_ = "sp" +elseif language_ == cc.LANGUAGE_RUSSIAN then + language_ = "ru" +elseif language_ == cc.LANGUAGE_KOREAN then + language_ = "kr" +elseif language_ == cc.LANGUAGE_JAPANESE then + language_ = "jp" +elseif language_ == cc.LANGUAGE_HUNGARIAN then + language_ = "hu" +elseif language_ == cc.LANGUAGE_PORTUGUESE then + language_ = "pt" +elseif language_ == cc.LANGUAGE_ARABIC then + language_ = "ar" +else + language_ = "en" +end + +device.language = language_ +device.writablePath = cc.FileUtils:getInstance():getWritablePath() +device.directorySeparator = "/" +device.pathSeparator = ":" +if device.platform == "windows" then + device.directorySeparator = "\\" + device.pathSeparator = ";" +end + +printInfo("# device.platform = " .. device.platform) +printInfo("# device.model = " .. device.model) +printInfo("# device.language = " .. device.language) +printInfo("# device.writablePath = " .. device.writablePath) +printInfo("# device.directorySeparator = " .. device.directorySeparator) +printInfo("# device.pathSeparator = " .. device.pathSeparator) +printInfo("#") + +return device diff --git a/cocos/scripting/lua-bindings/script/framework/display.lua b/cocos/scripting/lua-bindings/script/framework/display.lua new file mode 100644 index 0000000000..c32ed4a948 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/display.lua @@ -0,0 +1,534 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local display = {} + +local director = cc.Director:getInstance() +local view = director:getOpenGLView() + +if not view then + local width = 960 + local height = 640 + if CC_DESIGN_RESOLUTION then + if CC_DESIGN_RESOLUTION.width then + width = CC_DESIGN_RESOLUTION.width + end + if CC_DESIGN_RESOLUTION.height then + height = CC_DESIGN_RESOLUTION.height + end + end + view = cc.GLViewImpl:createWithRect("Cocos2d-Lua", cc.rect(0, 0, width, height)) + director:setOpenGLView(view) +end + +local framesize = view:getFrameSize() +local textureCache = director:getTextureCache() +local spriteFrameCache = cc.SpriteFrameCache:getInstance() +local animationCache = cc.AnimationCache:getInstance() + +-- auto scale +local function checkResolution(r) + r.width = checknumber(r.width) + r.height = checknumber(r.height) + r.autoscale = string.upper(r.autoscale) + assert(r.width > 0 and r.height > 0, + string.format("display - invalid design resolution size %d, %d", r.width, r.height)) +end + +local function setDesignResolution(r, framesize) + if r.autoscale == "FILL_ALL" then + view:setDesignResolutionSize(framesize.width, framesize.height, cc.ResolutionPolicy.FILL_ALL) + else + local scaleX, scaleY = framesize.width / r.width, framesize.height / r.height + local width, height = framesize.width, framesize.height + if r.autoscale == "FIXED_WIDTH" then + width = framesize.width / scaleX + height = framesize.height / scaleX + elseif r.autoscale == "FIXED_HEIGHT" then + width = framesize.width / scaleY + height = framesize.height / scaleY + else + printError(string.format("display - invalid r.autoscale \"%s\"", r.autoscale)) + end + view:setDesignResolutionSize(width, height, cc.ResolutionPolicy.NO_BORDER) + end +end + +local function setConstants() + local sizeInPixels = view:getFrameSize() + display.sizeInPixels = {width = sizeInPixels.width, height = sizeInPixels.height} + + local viewsize = director:getWinSize() + display.contentScaleFactor = director:getContentScaleFactor() + display.size = {width = viewsize.width, height = viewsize.height} + display.width = display.size.width + display.height = display.size.height + display.cx = display.width / 2 + display.cy = display.height / 2 + display.c_left = -display.width / 2 + display.c_right = display.width / 2 + display.c_top = display.height / 2 + display.c_bottom = -display.height / 2 + display.left = 0 + display.right = display.width + display.top = display.height + display.bottom = 0 + display.center = cc.p(display.cx, display.cy) + display.left_top = cc.p(display.left, display.top) + display.left_bottom = cc.p(display.left, display.bottom) + display.left_center = cc.p(display.left, display.cy) + display.right_top = cc.p(display.right, display.top) + display.right_bottom = cc.p(display.right, display.bottom) + display.right_center = cc.p(display.right, display.cy) + display.top_center = cc.p(display.cx, display.top) + display.top_bottom = cc.p(display.cx, display.bottom) + + printInfo(string.format("# display.sizeInPixels = {width = %0.2f, height = %0.2f}", display.sizeInPixels.width, display.sizeInPixels.height)) + printInfo(string.format("# display.size = {width = %0.2f, height = %0.2f}", display.size.width, display.size.height)) + printInfo(string.format("# display.contentScaleFactor = %0.2f", display.contentScaleFactor)) + printInfo(string.format("# display.width = %0.2f", display.width)) + printInfo(string.format("# display.height = %0.2f", display.height)) + printInfo(string.format("# display.cx = %0.2f", display.cx)) + printInfo(string.format("# display.cy = %0.2f", display.cy)) + printInfo(string.format("# display.left = %0.2f", display.left)) + printInfo(string.format("# display.right = %0.2f", display.right)) + printInfo(string.format("# display.top = %0.2f", display.top)) + printInfo(string.format("# display.bottom = %0.2f", display.bottom)) + printInfo(string.format("# display.c_left = %0.2f", display.c_left)) + printInfo(string.format("# display.c_right = %0.2f", display.c_right)) + printInfo(string.format("# display.c_top = %0.2f", display.c_top)) + printInfo(string.format("# display.c_bottom = %0.2f", display.c_bottom)) + printInfo(string.format("# display.center = {x = %0.2f, y = %0.2f}", display.center.x, display.center.y)) + printInfo(string.format("# display.left_top = {x = %0.2f, y = %0.2f}", display.left_top.x, display.left_top.y)) + printInfo(string.format("# display.left_bottom = {x = %0.2f, y = %0.2f}", display.left_bottom.x, display.left_bottom.y)) + printInfo(string.format("# display.left_center = {x = %0.2f, y = %0.2f}", display.left_center.x, display.left_center.y)) + printInfo(string.format("# display.right_top = {x = %0.2f, y = %0.2f}", display.right_top.x, display.right_top.y)) + printInfo(string.format("# display.right_bottom = {x = %0.2f, y = %0.2f}", display.right_bottom.x, display.right_bottom.y)) + printInfo(string.format("# display.right_center = {x = %0.2f, y = %0.2f}", display.right_center.x, display.right_center.y)) + printInfo(string.format("# display.top_center = {x = %0.2f, y = %0.2f}", display.top_center.x, display.top_center.y)) + printInfo(string.format("# display.top_bottom = {x = %0.2f, y = %0.2f}", display.top_bottom.x, display.top_bottom.y)) + printInfo("#") +end + +function display.setAutoScale(configs) + if type(configs) ~= "table" then return end + + checkResolution(configs) + if type(configs.callback) == "function" then + local c = configs.callback(framesize) + for k, v in pairs(c or {}) do + configs[k] = v + end + checkResolution(configs) + end + + setDesignResolution(configs, framesize) + + printInfo(string.format("# design resolution size = {width = %0.2f, height = %0.2f}", configs.width, configs.height)) + printInfo(string.format("# design resolution autoscale = %s", configs.autoscale)) + setConstants() +end + +if type(CC_DESIGN_RESOLUTION) == "table" then + display.setAutoScale(CC_DESIGN_RESOLUTION) +end + +display.COLOR_WHITE = cc.c3b(255, 255, 255) +display.COLOR_BLACK = cc.c3b(0, 0, 0) +display.COLOR_RED = cc.c3b(255, 0, 0) +display.COLOR_GREEN = cc.c3b(0, 255, 0) +display.COLOR_BLUE = cc.c3b(0, 0, 255) + +display.AUTO_SIZE = 0 +display.FIXED_SIZE = 1 +display.LEFT_TO_RIGHT = 0 +display.RIGHT_TO_LEFT = 1 +display.TOP_TO_BOTTOM = 2 +display.BOTTOM_TO_TOP = 3 + +display.CENTER = cc.p(0.5, 0.5) +display.LEFT_TOP = cc.p(0, 1) +display.LEFT_BOTTOM = cc.p(0, 0) +display.LEFT_CENTER = cc.p(0, 0.5) +display.RIGHT_TOP = cc.p(1, 1) +display.RIGHT_BOTTOM = cc.p(1, 0) +display.RIGHT_CENTER = cc.p(1, 0.5) +display.CENTER_TOP = cc.p(0.5, 1) +display.CENTER_BOTTOM = cc.p(0.5, 0) + +display.SCENE_TRANSITIONS = { + CROSSFADE = cc.TransitionCrossFade, + FADE = {cc.TransitionFade, cc.c3b(0, 0, 0)}, + FADEBL = cc.TransitionFadeBL, + FADEDOWN = cc.TransitionFadeDown, + FADETR = cc.TransitionFadeTR, + FADEUP = cc.TransitionFadeUp, + FLIPANGULAR = {cc.TransitionFlipAngular, cc.TRANSITION_ORIENTATION_LEFT_OVER}, + FLIPX = {cc.TransitionFlipX, cc.TRANSITION_ORIENTATION_LEFT_OVER}, + FLIPY = {cc.TransitionFlipY, cc.TRANSITION_ORIENTATION_UP_OVER}, + JUMPZOOM = cc.TransitionJumpZoom, + MOVEINB = cc.TransitionMoveInB, + MOVEINL = cc.TransitionMoveInL, + MOVEINR = cc.TransitionMoveInR, + MOVEINT = cc.TransitionMoveInT, + PAGETURN = {cc.TransitionPageTurn, false}, + ROTOZOOM = cc.TransitionRotoZoom, + SHRINKGROW = cc.TransitionShrinkGrow, + SLIDEINB = cc.TransitionSlideInB, + SLIDEINL = cc.TransitionSlideInL, + SLIDEINR = cc.TransitionSlideInR, + SLIDEINT = cc.TransitionSlideInT, + SPLITCOLS = cc.TransitionSplitCols, + SPLITROWS = cc.TransitionSplitRows, + TURNOFFTILES = cc.TransitionTurnOffTiles, + ZOOMFLIPANGULAR = cc.TransitionZoomFlipAngular, + ZOOMFLIPX = {cc.TransitionZoomFlipX, cc.TRANSITION_ORIENTATION_LEFT_OVER}, + ZOOMFLIPY = {cc.TransitionZoomFlipY, cc.TRANSITION_ORIENTATION_UP_OVER}, +} + +display.TEXTURES_PIXEL_FORMAT = {} + +display.DEFAULT_TTF_FONT = "Arial" +display.DEFAULT_TTF_FONT_SIZE = 32 + + +local PARAMS_EMPTY = {} +local RECT_ZERO = cc.rect(0, 0, 0, 0) + +local sceneIndex = 0 +function display.newScene(name, params) + params = params or PARAMS_EMPTY + sceneIndex = sceneIndex + 1 + local scene + if not params.physics then + scene = cc.Scene:create() + else + scene = cc.Scene:createWithPhysics() + end + scene.name_ = string.format("%s:%d", name or "", sceneIndex) + + if params.transition then + scene = display.wrapSceneWithTransition(scene, params.transition, params.time, params.more) + end + + return scene +end + +function display.wrapScene(scene, transition, time, more) + local key = string.upper(tostring(transition)) + + if key == "RANDOM" then + local keys = table.keys(display.SCENE_TRANSITIONS) + key = keys[math.random(1, #keys)] + end + + if display.SCENE_TRANSITIONS[key] then + local t = display.SCENE_TRANSITIONS[key] + time = time or 0.2 + more = more or t[2] + if type(t) == "table" then + scene = t[1]:create(time, scene, more) + else + scene = t:create(time, scene) + end + else + error(string.format("display.wrapScene() - invalid transition %s", tostring(transition))) + end + return scene +end + +function display.runScene(newScene, transition, time, more) + if director:getRunningScene() then + if transition then + newScene = display.wrapScene(newScene, transition, time, more) + end + director:replaceScene(newScene) + else + director:runWithScene(newScene) + end +end + +function display.getRunningScene() + return director:getRunningScene() +end + +function display.newNode() + return cc.Node:create() +end + +function display.newLayer(...) + local params = {...} + local c = #params + local layer + if c == 0 then + -- /** creates a fullscreen black layer */ + -- static Layer *create(); + layer = cc.Layer:create() + elseif c == 1 then + -- /** creates a Layer with color. Width and height are the window size. */ + -- static LayerColor * create(const Color4B& color); + layer = cc.LayerColor:create(cc.convertColor(params[1], "4b")) + elseif c == 2 then + -- /** creates a Layer with color, width and height in Points */ + -- static LayerColor * create(const Color4B& color, const Size& size); + -- + -- /** Creates a full-screen Layer with a gradient between start and end. */ + -- static LayerGradient* create(const Color4B& start, const Color4B& end); + local color1 = cc.convertColor(params[1], "4b") + local p2 = params[2] + assert(type(p2) == "table" and (p2.width or p2.r), "display.newLayer() - invalid paramerter 2") + if p2.r then + layer = cc.LayerGradient:create(color1, cc.convertColor(p2, "4b")) + else + layer = cc.LayerColor:create(color1, p2.width, p2.height) + end + elseif c == 3 then + -- /** creates a Layer with color, width and height in Points */ + -- static LayerColor * create(const Color4B& color, GLfloat width, GLfloat height); + -- + -- /** Creates a full-screen Layer with a gradient between start and end in the direction of v. */ + -- static LayerGradient* create(const Color4B& start, const Color4B& end, const Vec2& v); + local color1 = cc.convertColor(params[1], "4b") + local p2 = params[2] + local p2type = type(p2) + if p2type == "table" then + layer = cc.LayerGradient:create(color1, cc.convertColor(p2, "4b"), params[3]) + else + layer = cc.LayerColor:create(color1, p2, params[3]) + end + end + return layer +end + +function display.newSprite(source, x, y, params) + local spriteClass = cc.Sprite + local scale9 = false + + if type(x) == "table" and not x.x then + -- x is params + params = x + x = nil + y = nil + end + + local params = params or PARAMS_EMPTY + if params.scale9 or params.capInsets then + spriteClass = ccui.Scale9Sprite + scale9 = true + params.capInsets = params.capInsets or RECT_ZERO + params.rect = params.rect or RECT_ZERO + end + + local sprite + while true do + -- create sprite + if not source then + sprite = spriteClass:create() + break + end + + local sourceType = type(source) + if sourceType == "string" then + if string.byte(source) == 35 then -- first char is # + -- create sprite from spriteFrame + if not scale9 then + sprite = spriteClass:createWithSpriteFrameName(string.sub(source, 2)) + else + sprite = spriteClass:createWithSpriteFrameName(string.sub(source, 2), params.capInsets) + end + break + end + + -- create sprite from image file + if display.TEXTURES_PIXEL_FORMAT[source] then + cc.Texture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[source]) + end + if not scale9 then + sprite = spriteClass:create(source) + else + sprite = spriteClass:create(source, params.rect, params.capInsets) + end + if display.TEXTURES_PIXEL_FORMAT[source] then + cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2D_PIXEL_FORMAT_RGBA8888) + end + break + elseif sourceType ~= "userdata" then + error(string.format("display.newSprite() - invalid source type \"%s\"", sourceType), 0) + else + sourceType = tolua.type(source) + if sourceType == "cc.SpriteFrame" then + if not scale9 then + sprite = spriteClass:createWithSpriteFrame(source) + else + sprite = spriteClass:createWithSpriteFrame(source, params.capInsets) + end + elseif sourceType == "cc.Texture2D" then + sprite = spriteClass:createWithTexture(source) + else + error(string.format("display.newSprite() - invalid source type \"%s\"", sourceType), 0) + end + end + break + end + + if sprite then + if x and y then sprite:setPosition(x, y) end + if params.size then sprite:setContentSize(params.size) end + else + error(string.format("display.newSprite() - create sprite failure, source \"%s\"", tostring(source)), 0) + end + + return sprite +end + +function display.newSpriteFrame(source, ...) + local frame + if type(source) == "string" then + if string.byte(souce) == 35 then -- first char is # + souce = string.sub(souce, 2) + end + frame = spriteFrameCache:getSpriteFrame(souce) + if not frame then + error(string.format("display.newSpriteFrame() - invalid frame name \"%s\"", tostring(souce)), 0) + end + elseif tolua.type(source) == "cc.Texture2D" then + frame = cc.SpriteFrame:createWithTexture(source, ...) + else + error("display.newSpriteFrame() - invalid parameters", 0) + end + return frame +end + +function display.newFrames(pattern, begin, length, isReversed) + local frames = {} + local step = 1 + local last = begin + length - 1 + if isReversed then + last, begin = begin, last + step = -1 + end + + for index = begin, last, step do + local frameName = string.format(pattern, index) + local frame = spriteFrameCache:getSpriteFrame(frameName) + if not frame then + error(string.format("display.newFrames() - invalid frame name %s", tostring(frameName)), 0) + end + frames[#frames + 1] = frame + end + return frames +end + +local function newAnimation(frames, time) + local count = #frames + assert(count > 0, "display.newAnimation() - invalid frames") + time = time or 1.0 / count + return cc.Animation:createWithSpriteFrames(frames, time), + cc.Sprite:createWithSpriteFrame(frames[1]) +end + +function display.newAnimation(...) + local params = {...} + local c = #params + if c == 2 then + -- frames, time + return newAnimation(params[1], params[2]) + elseif c == 4 then + -- pattern, begin, length, time + local frames = display.newFrames(params[1], params[2], params[3]) + return newAnimation(frames, params[4]) + elseif c == 5 then + -- pattern, begin, length, isReversed, time + local frames = display.newFrames(params[1], params[2], params[3], params[4]) + return newAnimation(frames, params[5]) + else + error("display.newAnimation() - invalid parameters") + end +end + +function display.loadImage(imageFilename, callback) + if not callback then + return textureCache:addImage(imageFilename) + else + textureCache:addImageAsync(imageFilename, callback) + end +end + +local fileUtils = cc.FileUtils:getInstance() +function display.getImage(imageFilename) + local fullpath = fileUtils:fullPathForFilename(imageFilename) + return textureCache:getTextureForKey(fullpath) +end + +function display.removeImage(imageFilename) + textureCache:removeTextureForKey(imageFilename) +end + +function display.loadSpriteFrames(dataFilename, imageFilename, callback) + if display.TEXTURES_PIXEL_FORMAT[imageFilename] then + cc.Texture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[imageFilename]) + end + if not callback then + spriteFrameCache:addSpriteFrames(dataFilename, imageFilename) + else + spriteFrameCache:addSpriteFramesAsync(dataFilename, imageFilename, callback) + end + if display.TEXTURES_PIXEL_FORMAT[imageFilename] then + cc.Texture2D:setDefaultAlphaPixelFormat(cc.TEXTURE2D_PIXEL_FORMAT_RGBA8888) + end +end + +function display.removeSpriteFrames(dataFilename, imageFilename) + spriteFrameCache:removeSpriteFramesFromFile(dataFilename) + if imageFilename then + display.removeImage(imageFilename) + end +end + +function display.removeSpriteFrame(imageFilename) + spriteFrameCache:removeSpriteFrameByName(imageFilename) +end + +function display.setTexturePixelFormat(imageFilename, format) + display.TEXTURES_PIXEL_FORMAT[imageFilename] = format +end + +function display.setAnimationCache(name, animation) + animationCache:addAnimation(animation, name) +end + +function display.getAnimationCache(name) + return animationCache:getAnimation(name) +end + +function display.removeAnimationCache(name) + animationCache:removeAnimation(name) +end + +function display.removeUnusedSpriteFrames() + spriteFrameCache:removeUnusedSpriteFrames() + textureCache:removeUnusedTextures() +end + +return display diff --git a/cocos/scripting/lua-bindings/script/framework/extends/LayerEx.lua b/cocos/scripting/lua-bindings/script/framework/extends/LayerEx.lua new file mode 100644 index 0000000000..1ab2e76e8a --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/LayerEx.lua @@ -0,0 +1,80 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local Layer = cc.Layer + +function Layer:onTouch(callback, isMultiTouches, swallowTouches) + if type(isMultiTouches) ~= "boolean" then isMultiTouches = false end + if type(swallowTouches) ~= "boolean" then swallowTouches = false end + + self:registerScriptTouchHandler(function(state, ...) + local args = {...} + local event = {name = state} + if isMultiTouches then + args = args[1] + local points = {} + for i = 1, #args, 3 do + local x, y, id = args[i], args[i + 1], args[i + 2] + points[id] = {x = x, y = y, id = id} + end + event.points = points + else + event.x = args[1] + event.y = args[2] + end + callback(event) + end, isMultiTouches, 0, swallowTouches) + self:setTouchEnabled(true) + return self +end + +function Layer:removeTouch() + self:unregisterScriptTouchHandler() + self:setTouchEnabled(false) + return self +end + +function Layer:onKeypad(callback) + self:registerScriptKeypadHandler(callback) + self:setKeyboardEnabled(true) + return self +end + +function Layer:removeKeypad() + self:unregisterScriptKeypadHandler() + self:setKeyboardEnabled(false) + return self +end + +function Layer:onAccelerate(callback) + self:registerScriptAccelerateHandler(callback) + self:setAccelerometerEnabled(true) + return self +end + +function Layer:removeAccelerate() + self:unregisterScriptAccelerateHandler() + self:setAccelerometerEnabled(false) + return self +end diff --git a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.h b/cocos/scripting/lua-bindings/script/framework/extends/MenuEx.lua similarity index 66% rename from templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.h rename to cocos/scripting/lua-bindings/script/framework/extends/MenuEx.lua index abb12ab69d..16393271e6 100644 --- a/templates/lua-template-runtime/frameworks/runtime-src/proj.win32/SimulatorWindow.h +++ b/cocos/scripting/lua-bindings/script/framework/extends/MenuEx.lua @@ -1,7 +1,6 @@ -/**************************************************************************** -Copyright (c) 2013 cocos2d-x.org +--[[ -http://www.cocos2d-x.org +Copyright (c) 2011-2014 chukong-inc.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -20,14 +19,13 @@ 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); +local Menu = cc.Menu +local MenuItem = cc.MenuItem -#endif /* __PROJECT_CONFIG_H_ */ +function MenuItem:onClicked(callback) + self:registerScriptTapHandler(callback) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/NodeEx.lua b/cocos/scripting/lua-bindings/script/framework/extends/NodeEx.lua new file mode 100644 index 0000000000..edd31adb50 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/NodeEx.lua @@ -0,0 +1,163 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local Node = cc.Node + +function Node:add(child, zorder, tag) + if tag then + self:addChild(child, zorder, tag) + elseif zorder then + self:addChild(child, zorder) + else + self:addChild(child) + end + return self +end + +function Node:addTo(parent, zorder, tag) + if tag then + parent:addChild(self, zorder, tag) + elseif zorder then + parent:addChild(self, zorder) + else + parent:addChild(self) + end + return self +end + +function Node:removeSelf() + self:removeFromParent() + return self +end + +function Node:align(anchorPoint, x, y) + self:setAnchorPoint(anchorPoint) + return self:move(x, y) +end + +function Node:show() + self:setVisible(true) + return self +end + +function Node:hide() + self:setVisible(false) + return self +end + +function Node:move(x, y) + if y then + self:setPosition(x, y) + else + self:setPosition(x) + end + return self +end + +function Node:moveTo(args) + transition.moveTo(self, args) + return self +end + +function Node:moveBy(args) + transition.moveBy(self, args) + return self +end + +function Node:fadeIn(args) + transition.fadeIn(self, args) + return self +end + +function Node:fadeOut(args) + transition.fadeOut(self, args) + return self +end + +function Node:fadeTo(args) + transition.fadeTo(self, args) + return self +end + +function Node:rotate(rotation) + self:setRotation(rotation) + return self +end + +function Node:rotateTo(args) + transition.rotateTo(self, args) + return self +end + +function Node:rotateBy(args) + transition.rotateBy(self, args) + return self +end + +function Node:scaleTo(args) + transition.scaleTo(self, args) + return self +end + +function Node:scheduleUpdate(callback) + self:scheduleUpdateWithPriorityLua(callback, 0) + return self +end + +function Node:enableNodeEvents() + self:registerScriptHandler(function(state) + if state == "enter" then + self:onEnter() + elseif state == "exit" then + self:onExit() + elseif state == "enterTransitionFinish" then + self:onEnterTransitionFinish() + elseif state == "exitTransitionStart" then + self:onExitTransitionStart() + elseif state == "cleanup" then + self:onCleanup() + end + end) + return self +end + +function Node:disableNodeEvents() + self:unregisterScriptHandler() + return self +end + +function Node:onEnter() +end + +function Node:onExit() +end + +function Node:onEnterTransitionFinish() +end + +function Node:onExitTransitionStart() +end + +function Node:onCleanup() +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/SpriteEx.lua b/cocos/scripting/lua-bindings/script/framework/extends/SpriteEx.lua new file mode 100644 index 0000000000..642c8d97e7 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/SpriteEx.lua @@ -0,0 +1,67 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local Sprite = cc.Sprite + +function Sprite:playAnimationOnce(animation, args) + local actions = {} + + local showDelay = args.showDelay or 0 + if showDelay then + self:setVisible(false) + actions[#actions + 1] = cc.DelayTime:create(showDelay) + actions[#actions + 1] = cc.Show:create() + end + + local delay = args.delay or 0 + if delay > 0 then + actions[#actions + 1] = cc.DelayTime:create(delay) + end + + actions[#actions + 1] = cc.Animate:create(animation) + + if args.removeSelf then + actions[#actions + 1] = cc.RemoveSelf:create() + end + + if onComplete then + actions[#actions + 1] = cc.CallFunc:create(onComplete) + end + + local action + if #actions > 1 then + action = cc.Sequence:create(actions) + else + action = actions[1] + end + self:runAction(action) + return action +end + +function Sprite:playAnimationForever(animation) + local animate = cc.Animate:create(animation) + local action = cc.RepeatForever:create(animate) + self:runAction(action) + return action +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UICheckBox.lua b/cocos/scripting/lua-bindings/script/framework/extends/UICheckBox.lua new file mode 100644 index 0000000000..0707f826f0 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UICheckBox.lua @@ -0,0 +1,40 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local CheckBox = ccui.CheckBox + +function CheckBox:onEvent(callback) + self:addEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "selected" + else + event.name = "unselected" + end + event.target = sender + callback(event) + end) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIEditBox.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIEditBox.lua new file mode 100644 index 0000000000..11b39baf0b --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIEditBox.lua @@ -0,0 +1,41 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local EditBox = ccui.EditBox + +function EditBox:onEditHandler(callback) + self:registerScriptEditBoxHandler(function(name, sender) + local event = {} + event.name = name + event.target = sender + callback(event) + end) + return self +end + +function EditBox:removeEditHandler() + self:unregisterScriptEditBoxHandler() + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua new file mode 100644 index 0000000000..cab47a935c --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua @@ -0,0 +1,68 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local ListView = ccui.ListView + +function ListView:onEvent(callback) + self:addEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "ON_SELECTED_ITEM_START" + else + event.name = "ON_SELECTED_ITEM_END" + end + event.target = sender + callback(event) + end) + return self +end + +function ListView:onScroll(callback) + self:addScrollViewEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "SCROLL_TO_TOP" + elseif eventType == 1 then + event.name = "SCROLL_TO_BOTTOM" + elseif eventType == 2 then + event.name = "SCROLL_TO_LEFT" + elseif eventType == 3 then + event.name = "SCROLL_TO_RIGHT" + elseif eventType == 4 then + event.name = "SCROLLING" + elseif eventType == 5 then + event.name = "BOUNCE_TOP" + elseif eventType == 6 then + event.name = "BOUNCE_BOTTOM" + elseif eventType == 7 then + event.name = "BOUNCE_LEFT" + elseif eventType == 8 then + event.name = "BOUNCE_RIGHT" + end + event.target = sender + callback(event) + end) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIPageView.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIPageView.lua new file mode 100644 index 0000000000..42c0c9f0a6 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIPageView.lua @@ -0,0 +1,38 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local PageView = ccui.PageView + +function PageView:onEvent(callback) + self:addEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "TURNING" + end + event.target = sender + callback(event) + end) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua new file mode 100644 index 0000000000..601faf936b --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua @@ -0,0 +1,56 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local ScrollView = ccui.ScrollView + +function ScrollView:onEvent(callback) + self:addEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "SCROLL_TO_TOP" + elseif eventType == 1 then + event.name = "SCROLL_TO_BOTTOM" + elseif eventType == 2 then + event.name = "SCROLL_TO_LEFT" + elseif eventType == 3 then + event.name = "SCROLL_TO_RIGHT" + elseif eventType == 4 then + event.name = "SCROLLING" + elseif eventType == 5 then + event.name = "BOUNCE_TOP" + elseif eventType == 6 then + event.name = "BOUNCE_BOTTOM" + elseif eventType == 7 then + event.name = "BOUNCE_LEFT" + elseif eventType == 8 then + event.name = "BOUNCE_RIGHT" + end + event.target = sender + callback(event) + end) + return self +end + +ScrollView.onScroll = ScrollView.onEvent diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UISlider.lua b/cocos/scripting/lua-bindings/script/framework/extends/UISlider.lua new file mode 100644 index 0000000000..68109b52b3 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UISlider.lua @@ -0,0 +1,38 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local Slider = ccui.Slider + +function Slider:onEvent(callback) + self:addEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "ON_PERCENTAGE_CHANGED" + end + event.target = sender + callback(event) + end) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UITextField.lua b/cocos/scripting/lua-bindings/script/framework/extends/UITextField.lua new file mode 100644 index 0000000000..2574333f33 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UITextField.lua @@ -0,0 +1,44 @@ + +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local TextField = ccui.TextField + +function TextField:onEvent(callback) + self:addEventListener(function(sender, eventType) + local event = {} + if eventType == 0 then + event.name = "ATTACH_WITH_IME" + elseif eventType == 1 then + event.name = "DETACH_WITH_IME" + elseif eventType == 2 then + event.name = "INSERT_TEXT" + elseif eventType == 3 then + event.name = "DELETE_BACKWARD" + end + event.target = sender + callback(event) + end) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/extends/UIWidget.lua b/cocos/scripting/lua-bindings/script/framework/extends/UIWidget.lua new file mode 100644 index 0000000000..59754d6f54 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/extends/UIWidget.lua @@ -0,0 +1,43 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local Widget = ccui.Widget + +function Widget:onTouch(callback) + self:addTouchEventListener(function(sender, state) + local event = {x = 0, y = 0} + if state == 0 then + event.name = "began" + elseif state == 1 then + event.name = "moved" + elseif state == 2 then + event.name = "ended" + else + event.name = "cancelled" + end + event.target = sender + callback(event) + end) + return self +end diff --git a/cocos/scripting/lua-bindings/script/framework/init.lua b/cocos/scripting/lua-bindings/script/framework/init.lua new file mode 100644 index 0000000000..a33ec0995f --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/init.lua @@ -0,0 +1,85 @@ +--[[ + +Copyright (c) 2011-2015 chukong-incc.com + +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. + +]] + +__G__TRACKBACK__ = function(msg) + local msg = debug.traceback(msg, 3) + print(msg) + return msg +end + +if type(DEBUG) ~= "number" then DEBUG = 0 end + +-- load framework +printInfo("") +printInfo("# DEBUG = " .. DEBUG) +printInfo("#") + +device = require("cocos.framework.device") +display = require("cocos.framework.display") +audio = require("cocos.framework.audio") +transition = require("cocos.framework.transition") + +require("cocos.framework.extends.NodeEx") +require("cocos.framework.extends.SpriteEx") +require("cocos.framework.extends.LayerEx") +require("cocos.framework.extends.MenuEx") +require("cocos.framework.extends.UIWidget") +require("cocos.framework.extends.UICheckBox") +require("cocos.framework.extends.UIEditBox") +require("cocos.framework.extends.UIListView") +require("cocos.framework.extends.UIPageView") +require("cocos.framework.extends.UIScrollView") +require("cocos.framework.extends.UISlider") +require("cocos.framework.extends.UITextField") + +require("cocos.framework.package_support") + +-- register the build-in packages +cc.register("event", require("cocos.framework.components.event")) + +-- export global variable +local __g = _G +cc.exports = {} +setmetatable(cc.exports, { + __newindex = function(_, name, value) + rawset(__g, name, value) + end, + + __index = function(_, name) + return rawget(__g, name) + end +}) + +-- disable create unexpected global variable +function cc.disable_global() + setmetatable(__g, { + __newindex = function(_, name, value) + error(string.format("USE \" cc.exports.%s = value \" INSTEAD OF SET GLOBAL VARIABLE", name), 0) + end + }) +end + +if CC_DISABLE_GLOBAL then + cc.disable_global() +end diff --git a/cocos/scripting/lua-bindings/script/framework/package_support.lua b/cocos/scripting/lua-bindings/script/framework/package_support.lua new file mode 100644 index 0000000000..e5c5e14de2 --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/package_support.lua @@ -0,0 +1,113 @@ +--[[ + +Copyright (c) 2011-2015 chukong-incc.com + +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. + +]] + +-- Cocos2d-Lua core functions +cc.loaded_packages = {} +local loaded_packages = cc.loaded_packages + +function cc.register(name, package) + cc.loaded_packages[name] = package +end + +function cc.load(...) + local names = {...} + assert(#names > 0, "cc.load() - invalid package names") + + local packages = {} + for _, name in ipairs(names) do + assert(type(name) == "string", string.format("cc.load() - invalid package name \"%s\"", tostring(name))) + if not loaded_packages[name] then + local packageName = string.format("packages.%s.init", name) + local cls = require(packageName) + assert(cls, string.format("cc.load() - package class \"%s\" load failed", packageName)) + loaded_packages[name] = cls + + if DEBUG > 1 then + printInfo("cc.load() - load module \"packages.%s.init\"", name) + end + end + packages[#packages + 1] = loaded_packages[name] + end + return unpack(packages) +end + +local load_ = cc.load +local bind_ +bind_ = function(target, ...) + local t = type(target) + assert(t == "table" or t == "userdata", string.format("cc.bind() - invalid target, expected is object, actual is %s", t)) + local names = {...} + assert(#names > 0, "cc.bind() - package names expected") + + load_(...) + if not target.components_ then target.components_ = {} end + for _, name in ipairs(names) do + assert(type(name) == "string" and name ~= "", string.format("cc.bind() - invalid package name \"%s\"", name)) + if not target.components_[name] then + local cls = loaded_packages[name] + for __, depend in ipairs(cls.depends or {}) do + if not target.components_[depend] then + bind_(target, depend) + end + end + local component = cls:create() + target.components_[name] = component + component:bind(target) + end + end + + return target +end +cc.bind = bind_ + +function cc.unbind(target, ...) + if not target.components_ then return end + + local names = {...} + assert(#names > 0, "cc.unbind() - invalid package names") + + for _, name in ipairs(names) do + assert(type(name) == "string" and name ~= "", string.format("cc.unbind() - invalid package name \"%s\"", name)) + local component = target.components_[name] + assert(component, string.format("cc.unbind() - component \"%s\" not found", tostring(name))) + component:unbind(target) + target.components_[name] = nil + end + return target +end + +function cc.setmethods(target, component, methods) + for _, name in ipairs(methods) do + local method = component[name] + target[name] = function(__, ...) + return method(component, ...) + end + end +end + +function cc.unsetmethods(target, methods) + for _, name in ipairs(methods) do + target[name] = nil + end +end diff --git a/cocos/scripting/lua-bindings/script/framework/transition.lua b/cocos/scripting/lua-bindings/script/framework/transition.lua new file mode 100644 index 0000000000..78c441266d --- /dev/null +++ b/cocos/scripting/lua-bindings/script/framework/transition.lua @@ -0,0 +1,213 @@ +--[[ + +Copyright (c) 2011-2014 chukong-inc.com + +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. + +]] + +local transition = {} + +local ACTION_EASING = {} +ACTION_EASING["BACKIN"] = {cc.EaseBackIn, 1} +ACTION_EASING["BACKINOUT"] = {cc.EaseBackInOut, 1} +ACTION_EASING["BACKOUT"] = {cc.EaseBackOut, 1} +ACTION_EASING["BOUNCE"] = {cc.EaseBounce, 1} +ACTION_EASING["BOUNCEIN"] = {cc.EaseBounceIn, 1} +ACTION_EASING["BOUNCEINOUT"] = {cc.EaseBounceInOut, 1} +ACTION_EASING["BOUNCEOUT"] = {cc.EaseBounceOut, 1} +ACTION_EASING["ELASTIC"] = {cc.EaseElastic, 2, 0.3} +ACTION_EASING["ELASTICIN"] = {cc.EaseElasticIn, 2, 0.3} +ACTION_EASING["ELASTICINOUT"] = {cc.EaseElasticInOut, 2, 0.3} +ACTION_EASING["ELASTICOUT"] = {cc.EaseElasticOut, 2, 0.3} +ACTION_EASING["EXPONENTIALIN"] = {cc.EaseExponentialIn, 1} +ACTION_EASING["EXPONENTIALINOUT"] = {cc.EaseExponentialInOut, 1} +ACTION_EASING["EXPONENTIALOUT"] = {cc.EaseExponentialOut, 1} +ACTION_EASING["IN"] = {cc.EaseIn, 2, 1} +ACTION_EASING["INOUT"] = {cc.EaseInOut, 2, 1} +ACTION_EASING["OUT"] = {cc.EaseOut, 2, 1} +ACTION_EASING["RATEACTION"] = {cc.EaseRateAction, 2, 1} +ACTION_EASING["SINEIN"] = {cc.EaseSineIn, 1} +ACTION_EASING["SINEINOUT"] = {cc.EaseSineInOut, 1} +ACTION_EASING["SINEOUT"] = {cc.EaseSineOut, 1} + +local actionManager = cc.Director:getInstance():getActionManager() + +function transition.newEasing(action, easingName, more) + local key = string.upper(tostring(easingName)) + local easing + if ACTION_EASING[key] then + local cls, count, default = unpack(ACTION_EASING[key]) + if count == 2 then + easing = cls:create(action, more or default) + else + easing = cls:create(action) + end + end + return easing or action +end + +function transition.create(action, args) + args = checktable(args) + if args.easing then + if type(args.easing) == "table" then + action = transition.newEasing(action, unpack(args.easing)) + else + action = transition.newEasing(action, args.easing) + end + end + + local actions = {} + local delay = checknumber(args.delay) + if delay > 0 then + actions[#actions + 1] = cc.DelayTime:create(delay) + end + actions[#actions + 1] = action + + local onComplete = args.onComplete + if type(onComplete) ~= "function" then onComplete = nil end + if onComplete then + actions[#actions + 1] = cc.CallFunc:create(onComplete) + end + + if args.removeSelf then + actions[#actions + 1] = cc.RemoveSelf:create() + end + + if #actions > 1 then + return transition.sequence(actions) + else + return actions[1] + end +end + +function transition.execute(target, action, args) + assert(not tolua.isnull(target), "transition.execute() - target is not cc.Node") + local action = transition.create(action, args) + target:runAction(action) + return action +end + +function transition.moveTo(target, args) + assert(not tolua.isnull(target), "transition.moveTo() - target is not cc.Node") + local x = args.x or target:getPositionX() + local y = args.y or target:getPositionY() + local action = cc.MoveTo:create(args.time, cc.p(x, y)) + return transition.execute(target, action, args) +end + +function transition.moveBy(target, args) + assert(not tolua.isnull(target), "transition.moveBy() - target is not cc.Node") + local x = args.x or 0 + local y = args.y or 0 + local action = cc.MoveBy:create(args.time, cc.p(x, y)) + return transition.execute(target, action, args) +end + +function transition.fadeIn(target, args) + assert(not tolua.isnull(target), "transition.fadeIn() - target is not cc.Node") + local action = cc.FadeIn:create(args.time) + return transition.execute(target, action, args) +end + +function transition.fadeOut(target, args) + assert(not tolua.isnull(target), "transition.fadeOut() - target is not cc.Node") + local action = cc.FadeOut:create(args.time) + return transition.execute(target, action, args) +end + +function transition.fadeTo(target, args) + assert(not tolua.isnull(target), "transition.fadeTo() - target is not cc.Node") + local opacity = checkint(args.opacity) + if opacity < 0 then + opacity = 0 + elseif opacity > 255 then + opacity = 255 + end + local action = cc.FadeTo:create(args.time, opacity) + return transition.execute(target, action, args) +end + +function transition.scaleTo(target, args) + assert(not tolua.isnull(target), "transition.scaleTo() - target is not cc.Node") + local action + if args.scale then + action = cc.ScaleTo:create(checknumber(args.time), checknumber(args.scale)) + elseif args.scaleX or args.scaleY then + local scaleX, scaleY + if args.scaleX then + scaleX = checknumber(args.scaleX) + else + scaleX = target:getScaleX() + end + if args.scaleY then + scaleY = checknumber(args.scaleY) + else + scaleY = target:getScaleY() + end + action = cc.ScaleTo:create(checknumber(args.time), scaleX, scaleY) + end + return transition.execute(target, action, args) +end + +function transition.rotateTo(target, args) + assert(not tolua.isnull(target), "transition.rotateTo() - target is not cc.Node") + local rotation = args.rotation or target:getRotation() + local action = cc.RotateTo:create(args.time, rotation) + return transition.execute(target, action, args) +end + +function transition.rotateBy(target, args) + assert(not tolua.isnull(target), "transition.rotateTo() - target is not cc.Node") + local rotation = args.rotation or 0 + local action = cc.RotateBy:create(args.time, rotation) + return transition.execute(target, action, args) +end + +function transition.sequence(actions) + if #actions < 1 then return end + if #actions < 2 then return actions[1] end + return cc.Sequence:create(actions) +end + +function transition.removeAction(action) + if not tolua.isnull(action) then + actionManager:removeAction(action) + end +end + +function transition.stopTarget(target) + if not tolua.isnull(target) then + actionManager:removeAllActionsFromTarget(target) + end +end + +function transition.pauseTarget(target) + if not tolua.isnull(target) then + actionManager:pauseTarget(target) + end +end + +function transition.resumeTarget(target) + if not tolua.isnull(target) then + actionManager:resumeTarget(target) + end +end + +return transition diff --git a/cocos/scripting/lua-bindings/script/init.lua b/cocos/scripting/lua-bindings/script/init.lua index 3307f40bc0..81a44fa38b 100644 --- a/cocos/scripting/lua-bindings/script/init.lua +++ b/cocos/scripting/lua-bindings/script/init.lua @@ -1,37 +1,57 @@ +--[[ + +Copyright (c) 2011-2015 chukong-incc.com + +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. + +]] require "cocos.cocos2d.Cocos2d" require "cocos.cocos2d.Cocos2dConstants" -require "cocos.cocos2d.extern" -require "cocos.cocos2d.bitExtend" -require "cocos.cocos2d.DrawPrimitives" +require "cocos.cocos2d.functions" --- opengl -require "cocos.cocos2d.Opengl" -require "cocos.cocos2d.OpenglConstants" +if CC_USE_FRAMEWORK then + require "cocos.framework.init" +else + -- opengl + require "cocos.cocos2d.Opengl" + require "cocos.cocos2d.OpenglConstants" + -- audio + require "cocos.cocosdenshion.AudioEngine" + -- cocosstudio + require "cocos.cocostudio.CocoStudio" + -- ui + require "cocos.ui.GuiConstants" + require "cocos.ui.experimentalUIConstants" + -- extensions + require "cocos.extension.ExtensionConstants" + -- network + require "cocos.network.NetworkConstants" + -- Spine + require "cocos.spine.SpineConstants" --- cocosbuilder -require "cocos.cocosbuilder.CCBReaderLoad" + require "cocos.deprecated" + require "cocos.cocos2d.DrawPrimitives" --- cocosdenshion -require "cocos.cocosdenshion.AudioEngine" + -- Lua extensions + require "cocos.cocos2d.bitExtend" --- cocosstudio -require "cocos.cocostudio.CocoStudio" - --- ui -require "cocos.ui.GuiConstants" -require "cocos.ui.experimentalUIConstants" - --- extensions -require "cocos.extension.ExtensionConstants" - --- network -require "cocos.network.NetworkConstants" - --- Spine -require "cocos.spine.SpineConstants" - -if CC_USE_DEPRECATED_API then -- CCLuaEngine require "cocos.cocos2d.DeprecatedCocos2dClass" require "cocos.cocos2d.DeprecatedCocos2dEnum" @@ -62,4 +82,7 @@ if CC_USE_DEPRECATED_API then -- register_ui_moudle require "cocos.ui.DeprecatedUIEnum" require "cocos.ui.DeprecatedUIFunc" + + -- cocosbuilder + require "cocos.cocosbuilder.CCBReaderLoad" end diff --git a/cocos/ui/Android.mk b/cocos/ui/Android.mk index 316d8a51d1..68ec53d8d7 100644 --- a/cocos/ui/Android.mk +++ b/cocos/ui/Android.mk @@ -36,6 +36,7 @@ UIWebViewImpl-android.cpp \ UIEditBox/UIEditBox.cpp \ UIEditBox/UIEditBoxImpl-android.cpp \ UILayoutComponent.cpp \ +shaders/UIShaders.cpp \ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../editor-support diff --git a/cocos/ui/CMakeLists.txt b/cocos/ui/CMakeLists.txt index 42f2cde9a8..f5d43a4198 100644 --- a/cocos/ui/CMakeLists.txt +++ b/cocos/ui/CMakeLists.txt @@ -49,6 +49,7 @@ set(COCOS_UI_SRC ui/UIWidget.cpp ui/UIEditBox/UIEditBox.cpp ui/UILayoutComponent.cpp + ui/shaders/UIShaders.cpp ${COCOS_UI_SPECIFIC_SRC} ) diff --git a/cocos/ui/UIButton.cpp b/cocos/ui/UIButton.cpp index 5b08712d60..4b781ddca7 100644 --- a/cocos/ui/UIButton.cpp +++ b/cocos/ui/UIButton.cpp @@ -382,12 +382,15 @@ void Button::onPressStateChangedToNormal() _buttonNormalRenderer->setVisible(true); _buttonClickedRenderer->setVisible(false); _buttonDisableRenderer->setVisible(false); + _buttonNormalRenderer->setState(Scale9Sprite::State::NORMAL); + if (_pressedTextureLoaded) { if (_pressedActionEnabled) { _buttonNormalRenderer->stopAllActions(); _buttonClickedRenderer->stopAllActions(); + Action *zoomAction = ScaleTo::create(ZOOM_ACTION_TIME_STEP, _normalTextureScaleXInSize, _normalTextureScaleYInSize); _buttonNormalRenderer->runAction(zoomAction); _buttonClickedRenderer->setScale(_pressedTextureScaleXInSize, _pressedTextureScaleYInSize); @@ -406,32 +409,27 @@ void Button::onPressStateChangedToNormal() } else { - if (_scale9Enabled) + _buttonNormalRenderer->stopAllActions(); + _buttonNormalRenderer->setScale(_normalTextureScaleXInSize, _normalTextureScaleYInSize); + + _titleRenderer->stopAllActions(); + if (_unifySize) { - _buttonNormalRenderer->setColor(Color3B::WHITE); + _titleRenderer->setScaleX(1.0f); + _titleRenderer->setScaleY(1.0f); } else { - _buttonNormalRenderer->stopAllActions(); - _buttonNormalRenderer->setScale(_normalTextureScaleXInSize, _normalTextureScaleYInSize); - - _titleRenderer->stopAllActions(); - if (_unifySize) - { - _titleRenderer->setScaleX(1.0f); - _titleRenderer->setScaleY(1.0f); - } - else - { - _titleRenderer->setScaleX(_normalTextureScaleXInSize); - _titleRenderer->setScaleY(_normalTextureScaleYInSize); - } + _titleRenderer->setScaleX(_normalTextureScaleXInSize); + _titleRenderer->setScaleY(_normalTextureScaleYInSize); } } } void Button::onPressStateChangedToPressed() { + _buttonNormalRenderer->setState(Scale9Sprite::State::NORMAL); + if (_pressedTextureLoaded) { _buttonNormalRenderer->setVisible(false); @@ -442,13 +440,15 @@ void Button::onPressStateChangedToPressed() { _buttonNormalRenderer->stopAllActions(); _buttonClickedRenderer->stopAllActions(); - Action *zoomAction = ScaleTo::create(ZOOM_ACTION_TIME_STEP, _pressedTextureScaleXInSize + _zoomScale, _pressedTextureScaleYInSize + _zoomScale); + + Action *zoomAction = ScaleTo::create(ZOOM_ACTION_TIME_STEP, + _pressedTextureScaleXInSize + _zoomScale, + _pressedTextureScaleYInSize + _zoomScale); _buttonClickedRenderer->runAction(zoomAction); + _buttonNormalRenderer->setScale(_pressedTextureScaleXInSize + _zoomScale, _pressedTextureScaleYInSize + _zoomScale); _titleRenderer->stopAllActions(); - //we must call zoomAction->clone here - _titleRenderer->runAction(zoomAction->clone()); if (_unifySize) { Action *zoomTitleAction = ScaleTo::create(ZOOM_ACTION_TIME_STEP, 1 + _zoomScale, 1 + _zoomScale); @@ -465,35 +465,41 @@ void Button::onPressStateChangedToPressed() _buttonNormalRenderer->setVisible(true); _buttonClickedRenderer->setVisible(true); _buttonDisableRenderer->setVisible(false); - if (_scale9Enabled) + + _buttonNormalRenderer->stopAllActions(); + _buttonNormalRenderer->setScale(_normalTextureScaleXInSize +_zoomScale, _normalTextureScaleYInSize + _zoomScale); + + _titleRenderer->stopAllActions(); + if (_unifySize) { - _buttonNormalRenderer->setColor(Color3B::GRAY); + _titleRenderer->setScaleX(1.0f + _zoomScale); + _titleRenderer->setScaleY(1.0f + _zoomScale); } else { - _buttonNormalRenderer->stopAllActions(); - _buttonNormalRenderer->setScale(_normalTextureScaleXInSize +_zoomScale, _normalTextureScaleYInSize + _zoomScale); - - _titleRenderer->stopAllActions(); - if (_unifySize) - { - _titleRenderer->setScaleX(1.0f + _zoomScale); - _titleRenderer->setScaleY(1.0f + _zoomScale); - } - else - { - _titleRenderer->setScaleX(_normalTextureScaleXInSize + _zoomScale); - _titleRenderer->setScaleY(_normalTextureScaleYInSize + _zoomScale); - } + _titleRenderer->setScaleX(_normalTextureScaleXInSize + _zoomScale); + _titleRenderer->setScaleY(_normalTextureScaleYInSize + _zoomScale); } } } void Button::onPressStateChangedToDisabled() { - _buttonNormalRenderer->setVisible(false); + //if disable resource is null + if (!_disabledTextureLoaded) + { + if (_normalTextureLoaded) + { + _buttonNormalRenderer->setState(Scale9Sprite::State::GRAY); + } + } + else + { + _buttonNormalRenderer->setVisible(false); + _buttonDisableRenderer->setVisible(true); + } + _buttonClickedRenderer->setVisible(false); - _buttonDisableRenderer->setVisible(true); _buttonNormalRenderer->setScale(_normalTextureScaleXInSize, _normalTextureScaleYInSize); _buttonClickedRenderer->setScale(_pressedTextureScaleXInSize, _pressedTextureScaleYInSize); } @@ -724,12 +730,12 @@ const std::string& Button::getTitleText() const void Button::setTitleColor(const Color3B& color) { - _titleRenderer->setColor(color); + _titleRenderer->setTextColor(Color4B(color)); } -const Color3B& Button::getTitleColor() const +Color3B Button::getTitleColor() const { - return _titleRenderer->getColor(); + return Color3B(_titleRenderer->getTextColor()); } void Button::setTitleFontSize(float size) diff --git a/cocos/ui/UIButton.h b/cocos/ui/UIButton.h index 847f17dd1a..10c9ef0a79 100644 --- a/cocos/ui/UIButton.h +++ b/cocos/ui/UIButton.h @@ -189,7 +189,7 @@ public: void setTitleText(const std::string& text); const std::string& getTitleText() const; void setTitleColor(const Color3B& color); - const Color3B& getTitleColor() const; + Color3B getTitleColor() const; void setTitleFontSize(float size); float getTitleFontSize() const; void setTitleFontName(const std::string& fontName); diff --git a/cocos/ui/UICheckBox.cpp b/cocos/ui/UICheckBox.cpp index 9f13684cc8..18e101ecb2 100644 --- a/cocos/ui/UICheckBox.cpp +++ b/cocos/ui/UICheckBox.cpp @@ -51,6 +51,9 @@ _backGroundSelectedTexType(TextureResType::LOCAL), _frontCrossTexType(TextureResType::LOCAL), _backGroundDisabledTexType(TextureResType::LOCAL), _frontCrossDisabledTexType(TextureResType::LOCAL), +_zoomScale(0.1f), +_backgroundTextureScaleX(1.0), +_backgroundTextureScaleY(1.0), _backGroundFileName(""), _backGroundSelectedFileName(""), _frontCrossFileName(""), @@ -104,6 +107,25 @@ CheckBox* CheckBox::create(const std::string& backGround, return nullptr; } +CheckBox* CheckBox::create(const std::string& backGround, + const std::string& cross, + TextureResType texType) +{ + CheckBox *pWidget = new (std::nothrow) CheckBox; + if (pWidget && pWidget->init(backGround, + "", + cross, + "", + "", + texType)) + { + pWidget->autorelease(); + return pWidget; + } + CC_SAFE_DELETE(pWidget); + return nullptr; +} + bool CheckBox::init(const std::string& backGround, const std::string& backGroundSeleted, const std::string& cross, @@ -320,6 +342,14 @@ void CheckBox::onPressStateChangedToNormal() _backGroundBoxDisabledRenderer->setVisible(false); _frontCrossDisabledRenderer->setVisible(false); + _backGroundBoxRenderer->setGLProgramState(this->getNormalGLProgramState()); + _frontCrossRenderer->setGLProgramState(this->getNormalGLProgramState()); + + + _backGroundBoxRenderer->setScale(_backgroundTextureScaleX, _backgroundTextureScaleY); + _frontCrossRenderer->setScale(_backgroundTextureScaleX, _backgroundTextureScaleY); + + if (_isSelected) { _frontCrossRenderer->setVisible(true); @@ -328,23 +358,59 @@ void CheckBox::onPressStateChangedToNormal() void CheckBox::onPressStateChangedToPressed() { - _backGroundBoxRenderer->setVisible(false); - _backGroundSelectedBoxRenderer->setVisible(true); - _backGroundBoxDisabledRenderer->setVisible(false); - _frontCrossDisabledRenderer->setVisible(false); + _backGroundBoxRenderer->setGLProgramState(this->getNormalGLProgramState()); + _frontCrossRenderer->setGLProgramState(this->getNormalGLProgramState()); + + if (_backGroundSelectedFileName.empty()) + { + _backGroundBoxRenderer->setScale(_backgroundTextureScaleX + _zoomScale, + _backgroundTextureScaleY + _zoomScale); + _frontCrossRenderer->setScale(_backgroundTextureScaleX + _zoomScale, + _backgroundTextureScaleY + _zoomScale); + } + else + { + _backGroundBoxRenderer->setVisible(false); + _backGroundSelectedBoxRenderer->setVisible(true); + _backGroundBoxDisabledRenderer->setVisible(false); + _frontCrossDisabledRenderer->setVisible(false); + } } void CheckBox::onPressStateChangedToDisabled() { - _backGroundBoxRenderer->setVisible(false); + if (_backGroundDisabledFileName.empty() || _frontCrossDisabledFileName.empty()) + { + _backGroundBoxRenderer->setGLProgramState(this->getGrayGLProgramState()); + _frontCrossRenderer->setGLProgramState(this->getGrayGLProgramState()); + } + else + { + _backGroundBoxRenderer->setVisible(false); + _backGroundBoxDisabledRenderer->setVisible(true); + + } + _backGroundSelectedBoxRenderer->setVisible(false); - _backGroundBoxDisabledRenderer->setVisible(true); _frontCrossRenderer->setVisible(false); + _backGroundBoxRenderer->setScale(_backgroundTextureScaleX, _backgroundTextureScaleY); + _frontCrossRenderer->setScale(_backgroundTextureScaleX, _backgroundTextureScaleY); + if (_isSelected) { _frontCrossDisabledRenderer->setVisible(true); } } + +void CheckBox::setZoomScale(float scale) +{ + _zoomScale = scale; +} + +float CheckBox::getZoomScale()const +{ + return _zoomScale; +} void CheckBox::setSelected(bool selected) { @@ -463,6 +529,7 @@ void CheckBox::backGroundTextureScaleChangedWithSize() if (_ignoreSize) { _backGroundBoxRenderer->setScale(1.0f); + _backgroundTextureScaleX = _backgroundTextureScaleY = 1.0f; } else { @@ -470,10 +537,13 @@ void CheckBox::backGroundTextureScaleChangedWithSize() if (textureSize.width <= 0.0f || textureSize.height <= 0.0f) { _backGroundBoxRenderer->setScale(1.0f); + _backgroundTextureScaleX = _backgroundTextureScaleY = 1.0f; return; } float scaleX = _contentSize.width / textureSize.width; float scaleY = _contentSize.height / textureSize.height; + _backgroundTextureScaleX = scaleX; + _backgroundTextureScaleY = scaleY; _backGroundBoxRenderer->setScaleX(scaleX); _backGroundBoxRenderer->setScaleY(scaleY); } @@ -593,6 +663,9 @@ void CheckBox::copySpecialProperties(Widget *widget) _checkBoxEventSelector = checkBox->_checkBoxEventSelector; _checkBoxEventCallback = checkBox->_checkBoxEventCallback; _ccEventCallback = checkBox->_ccEventCallback; + _zoomScale = checkBox->_zoomScale; + _backgroundTextureScaleX = checkBox->_backgroundTextureScaleX; + _backgroundTextureScaleY = checkBox->_backgroundTextureScaleY; } } diff --git a/cocos/ui/UICheckBox.h b/cocos/ui/UICheckBox.h index ce1cb19e81..a2ac4e96d1 100644 --- a/cocos/ui/UICheckBox.h +++ b/cocos/ui/UICheckBox.h @@ -95,6 +95,13 @@ public: const std::string& backGroundDisabled, const std::string& frontCrossDisabled, TextureResType texType = TextureResType::LOCAL); + + /** + * use less resource to create a CheckBox + */ + static CheckBox* create(const std::string& backGround, + const std::string& cross, + TextureResType texType = TextureResType::LOCAL); /** * Load textures for checkbox. @@ -194,6 +201,17 @@ public: */ virtual std::string getDescription() const override; + /** When user pressed the button, the button will zoom to a scale. + * The final scale of the button equals (button original scale + _zoomScale) + * @since v3.3 + */ + void setZoomScale(float scale); + /** + * @brief Return a zoom scale + * @since v3.3 + */ + float getZoomScale()const; + CC_CONSTRUCTOR_ACCESS: virtual bool init() override; virtual bool init(const std::string& backGround, @@ -256,6 +274,9 @@ protected: TextureResType _backGroundDisabledTexType; TextureResType _frontCrossDisabledTexType; + float _zoomScale; + float _backgroundTextureScaleX; + float _backgroundTextureScaleY; std::string _backGroundFileName; std::string _backGroundSelectedFileName; std::string _frontCrossFileName; diff --git a/cocos/ui/UILayoutComponent.cpp b/cocos/ui/UILayoutComponent.cpp index 907cafc029..2498630aeb 100644 --- a/cocos/ui/UILayoutComponent.cpp +++ b/cocos/ui/UILayoutComponent.cpp @@ -57,7 +57,7 @@ namespace ui { } - LayoutComponent* LayoutComponent::boundingLayoutComponent(Node* node) + LayoutComponent* LayoutComponent::bindLayoutComponent(Node* node) { LayoutComponent * layout = (LayoutComponent*)node->getComponent(__LAYOUT_COMPONENT_NAME); if (layout != nullptr) diff --git a/cocos/ui/UILayoutComponent.h b/cocos/ui/UILayoutComponent.h index a824e7e190..6021d37fb3 100644 --- a/cocos/ui/UILayoutComponent.h +++ b/cocos/ui/UILayoutComponent.h @@ -38,7 +38,7 @@ namespace ui { virtual bool init()override; CREATE_FUNC(LayoutComponent); - static LayoutComponent* boundingLayoutComponent(Node* node); + static LayoutComponent* bindLayoutComponent(Node* node); enum class HorizontalEdge { diff --git a/cocos/ui/UIScale9Sprite.cpp b/cocos/ui/UIScale9Sprite.cpp index 0fe1510e6b..fd21afebdc 100644 --- a/cocos/ui/UIScale9Sprite.cpp +++ b/cocos/ui/UIScale9Sprite.cpp @@ -27,6 +27,9 @@ #include "2d/CCSpriteFrameCache.h" #include "base/CCVector.h" #include "base/CCDirector.h" +#include "renderer/CCGLProgram.h" +#include "ui/shaders/UIShaders.h" +#include "renderer/ccShaders.h" NS_CC_BEGIN namespace ui { @@ -804,6 +807,40 @@ y+=ytranslate; \ return NULL; } + void Scale9Sprite::setState(cocos2d::ui::Scale9Sprite::State state) + { + GLProgramState *glState = nullptr; + switch (state) + { + case State::NORMAL: + { + glState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP); + } + break; + case State::GRAY: + { + auto program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, + ccUIGrayScale_frag); + glState = GLProgramState::getOrCreateWithGLProgram(program); + } + default: + break; + } + + if (nullptr != _scale9Image) + { + _scale9Image->setGLProgramState(glState); + } + + if (_scale9Enabled) + { + for (auto& sp : _protectedChildren) + { + sp->setGLProgramState(glState); + } + } + } + /** sets the opacity. @warning If the the texture has premultiplied alpha then, the R, G and B channels will be modifed. Values goes from 0 to 255, where 255 means fully opaque. diff --git a/cocos/ui/UIScale9Sprite.h b/cocos/ui/UIScale9Sprite.h index 0923fab540..f775434888 100644 --- a/cocos/ui/UIScale9Sprite.h +++ b/cocos/ui/UIScale9Sprite.h @@ -58,6 +58,13 @@ namespace ui { */ virtual ~Scale9Sprite(); + + enum class State + { + NORMAL, + GRAY + }; + public: static Scale9Sprite* create(); @@ -257,6 +264,11 @@ namespace ui { virtual void setContentSize(const Size & size) override; virtual void setAnchorPoint(const Vec2& anchorPoint) override; + /** + *@since v3.4 + */ + void setState(State state); + Size getOriginalSize() const; void setPreferredSize(const Size& size); Size getPreferredSize() const; diff --git a/cocos/ui/UISlider.cpp b/cocos/ui/UISlider.cpp index 9bb26854ef..5ed1308f86 100644 --- a/cocos/ui/UISlider.cpp +++ b/cocos/ui/UISlider.cpp @@ -49,6 +49,9 @@ _barLength(0.0), _percent(0), _scale9Enabled(false), _prevIgnoreSize(true), +_zoomScale(0.1f), +_sliderBallNormalTextureScaleX(1.0), +_sliderBallNormalTextureScaleY(1.0), _textureFile(""), _progressBarTextureFile(""), _slidBallNormalTextureFile(""), @@ -87,6 +90,22 @@ Slider* Slider::create() CC_SAFE_DELETE(widget); return nullptr; } + +Slider* Slider::create(const std::string& barTextureName, + const std::string& normalBallTextureName, + TextureResType resType) +{ + Slider* widget = new (std::nothrow) Slider(); + if (widget && widget->init()) + { + widget->loadBarTexture(barTextureName); + widget->loadSlidBallTextureNormal(normalBallTextureName); + widget->autorelease(); + return widget; + } + CC_SAFE_DELETE(widget); + return nullptr; +} bool Slider::init() { @@ -555,21 +574,57 @@ void Slider::onPressStateChangedToNormal() _slidBallNormalRenderer->setVisible(true); _slidBallPressedRenderer->setVisible(false); _slidBallDisabledRenderer->setVisible(false); + + _slidBallNormalRenderer->setGLProgramState(this->getNormalGLProgramState()); + _slidBallNormalRenderer->setScale(_sliderBallNormalTextureScaleX, _sliderBallNormalTextureScaleY); } void Slider::onPressStateChangedToPressed() { - _slidBallNormalRenderer->setVisible(false); - _slidBallPressedRenderer->setVisible(true); - _slidBallDisabledRenderer->setVisible(false); + _slidBallNormalRenderer->setGLProgramState(this->getNormalGLProgramState()); + + + if (_slidBallPressedTextureFile.empty()) + { + _slidBallNormalRenderer->setScale(_sliderBallNormalTextureScaleX + _zoomScale, + _sliderBallNormalTextureScaleY + _zoomScale); + } + else + { + _slidBallNormalRenderer->setVisible(false); + _slidBallPressedRenderer->setVisible(true); + _slidBallDisabledRenderer->setVisible(false); + } } void Slider::onPressStateChangedToDisabled() { - _slidBallNormalRenderer->setVisible(false); + if (_slidBallDisabledTextureFile.empty()) + { + _slidBallNormalRenderer->setGLProgramState(this->getGrayGLProgramState()); + } + else + { + _slidBallNormalRenderer->setVisible(false); + _slidBallDisabledRenderer->setVisible(true); + } + + _slidBallNormalRenderer->setScale(_sliderBallNormalTextureScaleX, _sliderBallNormalTextureScaleY); + _slidBallPressedRenderer->setVisible(false); - _slidBallDisabledRenderer->setVisible(true); } + + +void Slider::setZoomScale(float scale) +{ + _zoomScale = scale; +} + +float Slider::getZoomScale()const +{ + return _zoomScale; +} + std::string Slider::getDescription() const { diff --git a/cocos/ui/UISlider.h b/cocos/ui/UISlider.h index 1f0056cdaa..1a57245fad 100644 --- a/cocos/ui/UISlider.h +++ b/cocos/ui/UISlider.h @@ -73,6 +73,10 @@ public: */ static Slider* create(); + static Slider* create(const std::string& barTextureName, + const std::string& normalBallTextureName, + TextureResType resType = TextureResType::LOCAL); + /** * Load texture for slider bar. * @@ -80,7 +84,7 @@ public: * * @param texType @see TextureResType */ - void loadBarTexture(const std::string& fileName,TextureResType texType = TextureResType::LOCAL); + void loadBarTexture(const std::string& fileName,TextureResType resType = TextureResType::LOCAL); /** * Sets if slider is using scale9 renderer. @@ -128,8 +132,8 @@ public: * @param texType @see TextureResType */ void loadSlidBallTextures(const std::string& normal, - const std::string& pressed, - const std::string& disabled, + const std::string& pressed = "", + const std::string& disabled = "", TextureResType texType = TextureResType::LOCAL); /** @@ -139,7 +143,7 @@ public: * * @param texType @see TextureResType */ - void loadSlidBallTextureNormal(const std::string& normal,TextureResType texType = TextureResType::LOCAL); + void loadSlidBallTextureNormal(const std::string& normal,TextureResType resType = TextureResType::LOCAL); /** * Load selected state texture for slider ball. @@ -148,7 +152,7 @@ public: * * @param texType @see TextureResType */ - void loadSlidBallTexturePressed(const std::string& pressed,TextureResType texType = TextureResType::LOCAL); + void loadSlidBallTexturePressed(const std::string& pressed,TextureResType resType = TextureResType::LOCAL); /** * Load dark state texture for slider ball. @@ -157,7 +161,7 @@ public: * * @param texType @see TextureResType */ - void loadSlidBallTextureDisabled(const std::string& disabled,TextureResType texType = TextureResType::LOCAL); + void loadSlidBallTextureDisabled(const std::string& disabled,TextureResType resType = TextureResType::LOCAL); /** * Load dark state texture for slider progress bar. @@ -166,7 +170,7 @@ public: * * @param texType @see TextureResType */ - void loadProgressBarTexture(const std::string& fileName, TextureResType texType = TextureResType::LOCAL); + void loadProgressBarTexture(const std::string& fileName, TextureResType resType = TextureResType::LOCAL); /** * Changes the progress direction of slider. @@ -209,6 +213,18 @@ public: */ virtual std::string getDescription() const override; + /** When user pressed the button, the button will zoom to a scale. + * The final scale of the button equals (button original scale + _zoomScale) + * @since v3.3 + */ + void setZoomScale(float scale); + /** + * @brief Return a zoom scale + * @since v3.3 + */ + float getZoomScale()const; + + CC_CONSTRUCTOR_ACCESS: virtual bool init() override; @@ -241,6 +257,11 @@ protected: bool _scale9Enabled; bool _prevIgnoreSize; + + float _zoomScale; + float _sliderBallNormalTextureScaleX; + float _sliderBallNormalTextureScaleY; + std::string _textureFile; std::string _progressBarTextureFile; std::string _slidBallNormalTextureFile; diff --git a/cocos/ui/UIWidget.cpp b/cocos/ui/UIWidget.cpp index af681f1c87..1dca852496 100644 --- a/cocos/ui/UIWidget.cpp +++ b/cocos/ui/UIWidget.cpp @@ -31,6 +31,10 @@ THE SOFTWARE. #include "base/CCEventFocus.h" #include "base/CCEventDispatcher.h" #include "ui/UILayoutComponent.h" +#include "renderer/CCGLProgram.h" +#include "renderer/CCGLProgramState.h" +#include "renderer/ccShaders.h" +#include "ui/shaders/UIShaders.h" NS_CC_BEGIN @@ -1160,6 +1164,21 @@ void Widget::copyClonedWidgetChildren(Widget* model) } } } + +GLProgramState* Widget::getNormalGLProgramState()const +{ + GLProgramState *glState = nullptr; + glState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP); + return glState; +} + +GLProgramState* Widget::getGrayGLProgramState()const +{ + auto program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, + ccUIGrayScale_frag); + GLProgramState *glState = GLProgramState::getOrCreateWithGLProgram(program); + return glState; +} void Widget::copySpecialProperties(Widget* model) { diff --git a/cocos/ui/UIWidget.h b/cocos/ui/UIWidget.h index bab5e8c35d..5300326e67 100644 --- a/cocos/ui/UIWidget.h +++ b/cocos/ui/UIWidget.h @@ -682,6 +682,20 @@ CC_CONSTRUCTOR_ACCESS: void dispatchFocusEvent(Widget* widgetLoseFocus, Widget* widgetGetFocus); protected: + /** + * Get a normal state GLProgramState + *@since v3.4 + */ + + GLProgramState* getNormalGLProgramState()const; + + /** + * Get a disabled state GLProgramState + *@since v3.4 + */ + GLProgramState* getGrayGLProgramState()const; + + //call back function called when size changed. virtual void onSizeChanged(); diff --git a/cocos/ui/shaders/UIShaders.cpp b/cocos/ui/shaders/UIShaders.cpp new file mode 100644 index 0000000000..40d9459dad --- /dev/null +++ b/cocos/ui/shaders/UIShaders.cpp @@ -0,0 +1,34 @@ +/**************************************************************************** + Copyright (c) 2013-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 "UIShaders.h" + +#define STRINGIFY(A) #A + +NS_CC_BEGIN + +//include the gray scale shader +#include "ccShader_grayscale.frag" + +NS_CC_END \ No newline at end of file diff --git a/cocos/ui/shaders/UIShaders.h b/cocos/ui/shaders/UIShaders.h new file mode 100644 index 0000000000..821e26313d --- /dev/null +++ b/cocos/ui/shaders/UIShaders.h @@ -0,0 +1,37 @@ +/**************************************************************************** + Copyright (c) 2013-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 __UISHADERS_H__ +#define __UISHADERS_H__ + +#include "platform/CCGL.h" +#include "platform/CCPlatformMacros.h" + +NS_CC_BEGIN + +extern CC_DLL const GLchar * ccUIGrayScale_frag; + +NS_CC_END + +#endif /* __UISHADERS_H__ */ \ No newline at end of file diff --git a/cocos/ui/shaders/ccShader_grayscale.frag b/cocos/ui/shaders/ccShader_grayscale.frag new file mode 100644 index 0000000000..32092e3f83 --- /dev/null +++ b/cocos/ui/shaders/ccShader_grayscale.frag @@ -0,0 +1,16 @@ +const char* ccUIGrayScale_frag = STRINGIFY( + +\n#ifdef GL_ES\n +\nprecision mediump float;\n +\n#endif\n +\n\n +\nvarying vec4 v_fragmentColor;\n +\nvarying vec2 v_texCoord;\n +\n\n +\nvoid main(void)\n +\n{\n + \nvec4 c = texture2D(CC_Texture0, v_texCoord);\n + \ngl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);\n + \ngl_FragColor.w = c.w;\n +\n}\n +); diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index dea0f3ae40..ed20b55cb7 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -114,4 +114,38 @@ Please refer to this document: [ReadMe](../README.md) ## Features in detail +### Create Sprite3D asynchronously +It allows to load Sprite3D in another thread so that you can process more logic in the main thread. And it notifies you using a custom callback after creating is finished. + +`modelPath` is the file to be loaded, `AsyncLoadSprite3DTest::asyncLoad_Callback` is the user's callback function, `userParam` is the parameter that the callback function is wanted. + +```c++ +Sprite3D::createAsync(modelPath, CC_CALLBACK_2(AsyncLoadSprite3DTest::asyncLoad_Callback, this), (void*)userParam); +``` + +The callback function is called after loading Sprite3D, the callback function can be something like this, + +```c++ +void AsyncLoadSprite3DTest::asyncLoad_Callback(Sprite3D* sprite, void* param) +{ + //sprite is the loaded sprite + sprite->setPosition(point); + addChild(sprite); +} +``` + +### Frustum culling + +Frustum culling means only the stuff that is inside the frustum is sent to the graphics hardware. It can potentially improve the performance of the application since only the vertices that are part of the visible part of the 3D world are kept on the graphics card memory. + +Frustum culling is a property of camera, it is enabled by default. And you can use the following to enable or disable the frustum culling, + +```c++ +//the first parameter is enable frustum culling or not, the second means that frustum culling using near and far plan or not. +camera->enableFrustumCulling(true, true); +``` + +Note that when you can make sure that all the stuff is inside the frustum you can turn off the frustum culling. + +For more infomation please reffer to the cpptests/CameraTest \ No newline at end of file diff --git a/extensions/assets-manager/Manifest.cpp b/extensions/assets-manager/Manifest.cpp index b4cd96c211..90f57327d5 100644 --- a/extensions/assets-manager/Manifest.cpp +++ b/extensions/assets-manager/Manifest.cpp @@ -234,6 +234,21 @@ void Manifest::genResumeAssetsList(Downloader::DownloadUnits *units) const } } +std::vector Manifest::getSearchPaths() const +{ + std::vector searchPaths; + searchPaths.push_back(_manifestRoot); + + for (int i = (int)_searchPaths.size()-1; i >= 0; i--) + { + std::string path = _searchPaths[i]; + if (path.size() > 0 && path[path.size() - 1] != '/') + path.append("/"); + path = _manifestRoot + path; + searchPaths.push_back(path); + } + return searchPaths; +} void Manifest::prependSearchPaths() { diff --git a/extensions/assets-manager/Manifest.h b/extensions/assets-manager/Manifest.h index 8a2bcfbcf6..34700040a2 100644 --- a/extensions/assets-manager/Manifest.h +++ b/extensions/assets-manager/Manifest.h @@ -95,6 +95,10 @@ public: */ const std::string& getVersion() const; + /** @brief Get the search paths list related to the Manifest. + */ + std::vector getSearchPaths() const; + protected: /** @brief Constructor for Manifest class diff --git a/templates/cocos2dx_files.json b/templates/cocos2dx_files.json index 5b84c0b9b0..8fd8d6bf0c 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", @@ -1016,6 +1020,8 @@ "cocos/platform/winrt/Keyboard-winrt.h", "cocos/platform/winrt/inet_ntop_winrt.cpp", "cocos/platform/winrt/inet_ntop_winrt.h", + "cocos/platform/winrt/inet_pton_winrt.cpp", + "cocos/platform/winrt/inet_pton_winrt.h", "cocos/platform/winrt/pch.cpp", "cocos/platform/winrt/pch.h", "cocos/platform/winrt/sha1.cpp", @@ -1210,6 +1216,9 @@ "cocos/ui/UIWidget.h", "cocos/ui/proj.win32/libui.vcxproj", "cocos/ui/proj.win32/libui.vcxproj.filters", + "cocos/ui/shaders/UIShaders.cpp", + "cocos/ui/shaders/UIShaders.h", + "cocos/ui/shaders/ccShader_grayscale.frag", "docs/CODING_STYLE.md", "docs/CONTRIBUTE.md", "docs/Groups.h", @@ -4650,6 +4659,7 @@ "cocos/scripting/lua-bindings/auto/api/ActionTimeline.lua", "cocos/scripting/lua-bindings/auto/api/ActionTimelineCache.lua", "cocos/scripting/lua-bindings/auto/api/ActionTimelineData.lua", + "cocos/scripting/lua-bindings/auto/api/ActionTimelineNode.lua", "cocos/scripting/lua-bindings/auto/api/ActionTintFrame.lua", "cocos/scripting/lua-bindings/auto/api/ActionTween.lua", "cocos/scripting/lua-bindings/auto/api/AmbientLight.lua", @@ -5154,7 +5164,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", @@ -5172,6 +5183,25 @@ "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/extends/UICheckBox.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UIEditBox.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UIListView.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UIPageView.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UIScrollView.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UISlider.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UITextField.lua", + "cocos/scripting/lua-bindings/script/framework/extends/UIWidget.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/res/BugAnt.png b/templates/lua-template-default/res/BugAnt.png new file mode 100644 index 0000000000..287664ba0f Binary files /dev/null and b/templates/lua-template-default/res/BugAnt.png differ diff --git a/templates/lua-template-default/res/BugDead.wav b/templates/lua-template-default/res/BugDead.wav new file mode 100644 index 0000000000..af7eb87612 Binary files /dev/null and b/templates/lua-template-default/res/BugDead.wav differ diff --git a/templates/lua-template-default/res/BugEnterHole.wav b/templates/lua-template-default/res/BugEnterHole.wav new file mode 100644 index 0000000000..e372b489f8 Binary files /dev/null and b/templates/lua-template-default/res/BugEnterHole.wav differ diff --git a/templates/lua-template-default/res/BugSpider.png b/templates/lua-template-default/res/BugSpider.png new file mode 100644 index 0000000000..4958179ece Binary files /dev/null and b/templates/lua-template-default/res/BugSpider.png differ diff --git a/templates/lua-template-default/res/ExitButton.png b/templates/lua-template-default/res/ExitButton.png new file mode 100644 index 0000000000..d56605f12b Binary files /dev/null and b/templates/lua-template-default/res/ExitButton.png differ diff --git a/templates/lua-template-default/res/MainSceneBg.jpg b/templates/lua-template-default/res/MainSceneBg.jpg new file mode 100644 index 0000000000..e5fb700564 Binary files /dev/null and b/templates/lua-template-default/res/MainSceneBg.jpg differ diff --git a/templates/lua-template-default/res/PlayButton.png b/templates/lua-template-default/res/PlayButton.png new file mode 100644 index 0000000000..72dc35ac47 Binary files /dev/null and b/templates/lua-template-default/res/PlayButton.png differ diff --git a/templates/lua-template-default/res/PlaySceneBg.jpg b/templates/lua-template-default/res/PlaySceneBg.jpg new file mode 100644 index 0000000000..15b112b868 Binary files /dev/null and b/templates/lua-template-default/res/PlaySceneBg.jpg differ diff --git a/templates/lua-template-default/res/Star.png b/templates/lua-template-default/res/Star.png new file mode 100644 index 0000000000..397e59bceb Binary files /dev/null and b/templates/lua-template-default/res/Star.png differ diff --git a/templates/lua-template-default/res/background.caf b/templates/lua-template-default/res/background.caf deleted file mode 100644 index 5d7d0b8ce9..0000000000 Binary files a/templates/lua-template-default/res/background.caf and /dev/null differ diff --git a/templates/lua-template-default/res/background.mp3 b/templates/lua-template-default/res/background.mp3 deleted file mode 100644 index aec1c0a8c8..0000000000 Binary files a/templates/lua-template-default/res/background.mp3 and /dev/null differ diff --git a/templates/lua-template-default/res/background.ogg b/templates/lua-template-default/res/background.ogg deleted file mode 100644 index e5af704a05..0000000000 Binary files a/templates/lua-template-default/res/background.ogg and /dev/null differ diff --git a/templates/lua-template-default/res/crop.png b/templates/lua-template-default/res/crop.png deleted file mode 100644 index 9ea84bc93f..0000000000 Binary files a/templates/lua-template-default/res/crop.png and /dev/null differ diff --git a/templates/lua-template-default/res/dog.png b/templates/lua-template-default/res/dog.png deleted file mode 100644 index 76bdca07a1..0000000000 Binary files a/templates/lua-template-default/res/dog.png and /dev/null differ diff --git a/templates/lua-template-default/res/effect1.wav b/templates/lua-template-default/res/effect1.wav deleted file mode 100644 index f8d4292d0f..0000000000 Binary files a/templates/lua-template-default/res/effect1.wav and /dev/null differ diff --git a/templates/lua-template-default/res/farm.jpg b/templates/lua-template-default/res/farm.jpg deleted file mode 100644 index d7290c3470..0000000000 Binary files a/templates/lua-template-default/res/farm.jpg and /dev/null differ diff --git a/templates/lua-template-default/res/fonts/Marker Felt.ttf b/templates/lua-template-default/res/fonts/Marker Felt.ttf deleted file mode 100644 index 3752ef3110..0000000000 Binary files a/templates/lua-template-default/res/fonts/Marker Felt.ttf and /dev/null differ diff --git a/templates/lua-template-default/res/land.png b/templates/lua-template-default/res/land.png deleted file mode 100644 index 6e0785b545..0000000000 Binary files a/templates/lua-template-default/res/land.png and /dev/null differ diff --git a/templates/lua-template-default/res/menu1.png b/templates/lua-template-default/res/menu1.png deleted file mode 100644 index eeb327a4cb..0000000000 Binary files a/templates/lua-template-default/res/menu1.png and /dev/null differ diff --git a/templates/lua-template-default/res/menu2.png b/templates/lua-template-default/res/menu2.png deleted file mode 100644 index 04763ea1a4..0000000000 Binary files a/templates/lua-template-default/res/menu2.png and /dev/null differ diff --git a/templates/lua-template-default/src/app/MyApp.lua b/templates/lua-template-default/src/app/MyApp.lua new file mode 100644 index 0000000000..e8d1a9f35b --- /dev/null +++ b/templates/lua-template-default/src/app/MyApp.lua @@ -0,0 +1,8 @@ + +local MyApp = class("MyApp", cc.load("mvc").AppBase) + +function MyApp:onCreate() + math.randomseed(os.time()) +end + +return MyApp diff --git a/templates/lua-template-default/src/app/models/BugAnt.lua b/templates/lua-template-default/src/app/models/BugAnt.lua new file mode 100644 index 0000000000..07c75ec44f --- /dev/null +++ b/templates/lua-template-default/src/app/models/BugAnt.lua @@ -0,0 +1,13 @@ + +local BugBase = import(".BugBase") + +local BugAnt = class("BugAnt", BugBase) + +function BugAnt:ctor() + BugAnt.super.ctor(self) + self.type_ = BugBase.BUG_TYPE_ANT + self.speed_ = 1.0 + self.touchRange_ = 70 +end + +return BugAnt diff --git a/templates/lua-template-default/src/app/models/BugBase.lua b/templates/lua-template-default/src/app/models/BugBase.lua new file mode 100644 index 0000000000..40d27bb463 --- /dev/null +++ b/templates/lua-template-default/src/app/models/BugBase.lua @@ -0,0 +1,62 @@ + +local BugBase = class("BugBase") + +BugBase.BUG_TYPE_ANT = "ANT" +BugBase.BUG_TYPE_SPIDER = "SPIDER" + +function BugBase:ctor() + self.position_ = cc.p(0, 0) + self.rotation_ = 0 + self.type_ = nil + self.dist_ = 0 + self.destination_ = cc.p(0, 0) + self.speed_ = 1 + self.touchRange_ = 0 +end + +function BugBase:getType() + return self.type_ +end + +function BugBase:getPosition() + return self.position_ +end + +function BugBase:getRotation() + return self.rotation_ +end + +function BugBase:getDist() + return self.dist_ +end + +function BugBase:setDestination(destination) + self.destination_ = clone(destination) + self.dist_ = math.random(display.width / 2 + 100, display.width / 2 + 200) + + local rotation = math.random(0, 360) + self.position_ = self:calcPosition(rotation, self.dist_, destination) + self.rotation_ = rotation - 180 + return self +end + +local fixedDeltaTime = 1.0 / 60.0 +function BugBase:step(dt) + self.dist_ = self.dist_ - self.speed_ * (dt / fixedDeltaTime) + self.position_ = self:calcPosition(self.rotation_ + 180, self.dist_, self.destination_) + return self +end + +function BugBase:calcPosition(rotation, dist, destination) + local radians = rotation * math.pi / 180 + return cc.p(destination.x + math.cos(radians) * dist, + destination.y - math.sin(radians) * dist) +end + +function BugBase:checkTouch(x, y) + local dx, dy = x - self.position_.x, y - self.position_.y + local offset = math.sqrt(dx * dx + dy * dy) + return offset <= self.touchRange_ +end + +return BugBase diff --git a/templates/lua-template-default/src/app/models/BugSpider.lua b/templates/lua-template-default/src/app/models/BugSpider.lua new file mode 100644 index 0000000000..29e26bbbd9 --- /dev/null +++ b/templates/lua-template-default/src/app/models/BugSpider.lua @@ -0,0 +1,13 @@ + +local BugBase = import(".BugBase") + +local BugSpider = class("BugSpider", BugBase) + +function BugSpider:ctor() + BugSpider.super.ctor(self) + self.type_ = BugBase.BUG_TYPE_SPIDER + self.speed_ = 1.5 + self.touchRange_ = 50 +end + +return BugSpider diff --git a/templates/lua-template-default/src/app/views/BugSprite.lua b/templates/lua-template-default/src/app/views/BugSprite.lua new file mode 100644 index 0000000000..2053f80763 --- /dev/null +++ b/templates/lua-template-default/src/app/views/BugSprite.lua @@ -0,0 +1,41 @@ + +local BugSprite = class("BugSprite", function(imageFilename) + local texture = display.getImage(imageFilename) + local frameWidth = texture:getPixelsWide() / 3 + local frameHeight = texture:getPixelsHigh() + + local spriteFrame = display.newSpriteFrame(texture, cc.rect(0, 0, frameWidth, frameHeight)) + local sprite = display.newSprite(spriteFrame) + sprite.animationName_ = imageFilename + sprite.frameWidth_ = frameWidth + sprite.frameHeight_ = frameHeight + return sprite +end) + +function BugSprite:ctor(imageFilename, bugModel) + self.model_ = bugModel +end + +function BugSprite:getModel() + return self.model_ +end + +function BugSprite:start(destination) + self.model_:setDestination(destination) + self:updatePosition() + self:playAnimationForever(display.getAnimationCache(self.animationName_)) + return self +end + +function BugSprite:step(dt) + self.model_:step(dt) + self:updatePosition() + return self +end + +function BugSprite:updatePosition() + self:move(self.model_:getPosition()) + :rotate(self.model_:getRotation()) +end + +return BugSprite diff --git a/templates/lua-template-default/src/app/views/DeadBugSprite.lua b/templates/lua-template-default/src/app/views/DeadBugSprite.lua new file mode 100644 index 0000000000..896199d97c --- /dev/null +++ b/templates/lua-template-default/src/app/views/DeadBugSprite.lua @@ -0,0 +1,10 @@ + +local DeadBugSprite = class("DeadBugSprite", function(imageFilename) + local texture = display.getImage(imageFilename) + local frameWidth = texture:getPixelsWide() / 3 + local frameHeight = texture:getPixelsHigh() + local spriteFrame = display.newSpriteFrame(texture, cc.rect(frameWidth * 2, 0, frameWidth, frameHeight)) + return display.newSprite(spriteFrame) +end) + +return DeadBugSprite diff --git a/templates/lua-template-default/src/app/views/GameView.lua b/templates/lua-template-default/src/app/views/GameView.lua new file mode 100644 index 0000000000..5858454744 --- /dev/null +++ b/templates/lua-template-default/src/app/views/GameView.lua @@ -0,0 +1,190 @@ + +-- GameView is a combination of view and controller +local GameView = class("GameView", cc.load("mvc").ViewBase) + +local BugBase = import("..models.BugBase") +local BugAnt = import("..models.BugAnt") +local BugSpider = import("..models.BugSpider") + +local BugSprite = import(".BugSprite") +local DeadBugSprite = import(".DeadBugSprite") + +GameView.HOLE_POSITION = cc.p(display.cx - 30, display.cy - 75) +GameView.INIT_LIVES = 5 +GameView.ADD_BUG_INTERVAL_MIN = 1 +GameView.ADD_BUG_INTERVAL_MAX = 3 + +GameView.IMAGE_FILENAMES = {} +GameView.IMAGE_FILENAMES[BugBase.BUG_TYPE_ANT] = "BugAnt.png" +GameView.IMAGE_FILENAMES[BugBase.BUG_TYPE_SPIDER] = "BugSpider.png" + +GameView.BUG_ANIMATION_TIMES = {} +GameView.BUG_ANIMATION_TIMES[BugBase.BUG_TYPE_ANT] = 0.15 +GameView.BUG_ANIMATION_TIMES[BugBase.BUG_TYPE_SPIDER] = 0.1 + +GameView.ZORDER_BUG = 100 +GameView.ZORDER_DEAD_BUG = 50 + +GameView.events = { + PLAYER_DEAD_EVENT = "PLAYER_DEAD_EVENT", +} + +function GameView:start() + self:scheduleUpdate(handler(self, self.step)) + return self +end + +function GameView:stop() + self:unscheduleUpdate() + return self +end + +function GameView:step(dt) + if self.lives_ <= 0 then return end + + self.addBugInterval_ = self.addBugInterval_ - dt + if self.addBugInterval_ <= 0 then + self.addBugInterval_ = math.random(GameView.ADD_BUG_INTERVAL_MIN, GameView.ADD_BUG_INTERVAL_MAX) + self:addBug() + end + + for _, bug in pairs(self.bugs_) do + bug:step(dt) + if bug:getModel():getDist() <= 0 then + self:bugEnterHole(bug) + end + end + + return self +end + +function GameView:getLives() + return self.lives_ +end + +function GameView:getKills() + return self.kills_ +end + +function GameView:addBug() + local bugType = BugBase.BUG_TYPE_ANT + if math.random(1, 2) % 2 == 0 then + bugType = BugBase.BUG_TYPE_SPIDER + end + + local bugModel + if bugType == BugBase.BUG_TYPE_ANT then + bugModel = BugAnt:create() + else + bugModel = BugSpider:create() + end + + local bug = BugSprite:create(GameView.IMAGE_FILENAMES[bugType], bugModel) + :start(GameView.HOLE_POSITION) + :addTo(self.bugsNode_, GameView.ZORDER_BUG) + + self.bugs_[bug] = bug + return self +end + +function GameView:bugEnterHole(bug) + self.bugs_[bug] = nil + + bug:fadeOut({time = 0.5, removeSelf = true}) + :scaleTo({time = 0.5, scale = 0.3}) + :rotateTo({time = 0.5, rotation = math.random(360, 720)}) + + self.lives_ = self.lives_ - 1 + self.livesLabel_:setString(self.lives_) + audio.playSound("BugEnterHole.wav") + + if self.lives_ <= 0 then + self:dispatchEvent({name = GameView.events.PLAYER_DEAD_EVENT}) + end + + return self +end + +function GameView:bugDead(bug) + local imageFilename = GameView.IMAGE_FILENAMES[bug:getModel():getType()] + DeadBugSprite:create(imageFilename) + :fadeOut({time = 2.0, delay = 0.5, removeSelf = true}) + :move(bug:getPosition()) + :rotate(bug:getRotation() + 120) + :addTo(self.bugsNode_, GameView.ZORDER_DEAD_BUG) + + self.bugs_[bug] = nil + bug:removeSelf() + + self.kills_ = self.kills_ + 1 + audio.playSound("BugDead.wav") + + return self +end + +function GameView:onCreate() + self.lives_ = GameView.INIT_LIVES + self.kills_ = 0 + self.bugs_ = {} + self.addBugInterval_ = 0 + + -- add touch layer + display.newLayer() + :onTouch(handler(self, self.onTouch)) + :addTo(self) + + -- add background image + display.newSprite("PlaySceneBg.jpg") + :move(display.center) + :addTo(self) + + -- add bugs node + self.bugsNode_ = display.newNode():addTo(self) + + -- add lives icon and label + display.newSprite("Star.png") + :move(display.left + 50, display.top - 50) + :addTo(self) + self.livesLabel_ = cc.Label:createWithSystemFont(self.lives_, "Arial", 32) + :move(display.left + 90, display.top - 50) + :addTo(self) + + -- create animation for bugs + for bugType, filename in pairs(GameView.IMAGE_FILENAMES) do + -- load image + local texture = display.loadImage(filename) + local frameWidth = texture:getPixelsWide() / 3 + local frameHeight = texture:getPixelsHigh() + + -- create sprite frame based on image + local frames = {} + for i = 0, 1 do + local frame = display.newSpriteFrame(texture, cc.rect(frameWidth * i, 0, frameWidth, frameHeight)) + frames[#frames + 1] = frame + end + + -- create animation + local animation = display.newAnimation(frames, GameView.BUG_ANIMATION_TIMES[bugType]) + -- caching animation + display.setAnimationCache(filename, animation) + end + + -- bind the "event" component + cc.bind(self, "event") +end + +function GameView:onTouch(event) + if event.name ~= "began" then return end + local x, y = event.x, event.y + for _, bug in pairs(self.bugs_) do + if bug:getModel():checkTouch(x, y) then + self:bugDead(bug) + end + end +end + +function GameView:onCleanup() + self:removeAllEventListeners() +end + +return GameView diff --git a/templates/lua-template-default/src/app/views/MainScene.lua b/templates/lua-template-default/src/app/views/MainScene.lua new file mode 100644 index 0000000000..8536034706 --- /dev/null +++ b/templates/lua-template-default/src/app/views/MainScene.lua @@ -0,0 +1,20 @@ + +local MainScene = class("MainScene", cc.load("mvc").ViewBase) + +function MainScene:onCreate() + -- add background image + display.newSprite("MainSceneBg.jpg") + :move(display.center) + :addTo(self) + + -- add play button + local playButton = cc.MenuItemImage:create("PlayButton.png", "PlayButton.png") + :onClicked(function() + self:getApp():enterScene("PlayScene") + end) + cc.Menu:create(playButton) + :move(display.cx, display.cy - 200) + :addTo(self) +end + +return MainScene diff --git a/templates/lua-template-default/src/app/views/PlayScene.lua b/templates/lua-template-default/src/app/views/PlayScene.lua new file mode 100644 index 0000000000..38af38597f --- /dev/null +++ b/templates/lua-template-default/src/app/views/PlayScene.lua @@ -0,0 +1,31 @@ + +local PlayScene = class("PlayScene", cc.load("mvc").ViewBase) + +local GameView = import(".GameView") + +function PlayScene:onCreate() + -- create game view and add it to stage + self.gameView_ = GameView:create() + :addEventListener(GameView.events.PLAYER_DEAD_EVENT, handler(self, self.onPlayerDead)) + :start() + :addTo(self) +end + +function PlayScene:onPlayerDead(event) + -- add game over text + local text = string.format("You killed %d bugs", self.gameView_:getKills()) + cc.Label:createWithSystemFont(text, "Arial", 96) + :align(display.CENTER, display.center) + :addTo(self) + + -- add exit button + local exitButton = cc.MenuItemImage:create("ExitButton.png", "ExitButton.png") + :onClicked(function() + self:getApp():enterScene("MainScene") + end) + cc.Menu:create(exitButton) + :move(display.cx, display.cy - 200) + :addTo(self) +end + +return PlayScene diff --git a/templates/lua-template-default/src/config.lua b/templates/lua-template-default/src/config.lua new file mode 100644 index 0000000000..3ccae42ec6 --- /dev/null +++ b/templates/lua-template-default/src/config.lua @@ -0,0 +1,26 @@ + +-- 0 - disable debug info, 1 - less debug info, 2 - verbose debug info +DEBUG = 2 + +-- use framework, will disable all deprecated API, false - use legacy API +CC_USE_FRAMEWORK = true + +-- show FPS on screen +CC_SHOW_FPS = true + +-- disable create unexpected global variable +CC_DISABLE_GLOBAL = true + +-- for module display +CC_DESIGN_RESOLUTION = { + width = 960, + height = 640, + autoscale = "FIXED_HEIGHT", + callback = function(framesize) + local ratio = framesize.width / framesize.height + if ratio <= 1.34 then + -- iPad 768*1024(1536*2048) is 4:3 screen + return {autoscale = "FIXED_WIDTH"} + end + end +} diff --git a/templates/lua-template-default/src/hello2.lua b/templates/lua-template-default/src/hello2.lua deleted file mode 100644 index 27158aa788..0000000000 --- a/templates/lua-template-default/src/hello2.lua +++ /dev/null @@ -1,3 +0,0 @@ -function myadd(x, y) - return x + y -end \ No newline at end of file diff --git a/templates/lua-template-default/src/main.lua b/templates/lua-template-default/src/main.lua index 87bfbb5dac..7b0a513537 100644 --- a/templates/lua-template-default/src/main.lua +++ b/templates/lua-template-default/src/main.lua @@ -1,249 +1,16 @@ -cc.FileUtils:getInstance():addSearchPath("src") -cc.FileUtils:getInstance():addSearchPath("res") +cc.FileUtils:getInstance():setPopupNotify(false) +cc.FileUtils:getInstance():addSearchPath("src/") +cc.FileUtils:getInstance():addSearchPath("res/") --- CC_USE_DEPRECATED_API = true +require "config" require "cocos.init" --- cclog -cclog = function(...) - print(string.format(...)) -end - --- for CCLuaEngine traceback -function __G__TRACKBACK__(msg) - cclog("----------------------------------------") - cclog("LUA ERROR: " .. tostring(msg) .. "\n") - cclog(debug.traceback()) - cclog("----------------------------------------") - return msg -end - local function main() - collectgarbage("collect") - -- avoid memory leak - collectgarbage("setpause", 100) - collectgarbage("setstepmul", 5000) - - -- initialize director - local director = cc.Director:getInstance() - local glview = director:getOpenGLView() - if nil == glview then - glview = cc.GLViewImpl:createWithRect("HelloLua", cc.rect(0,0,900,640)) - director:setOpenGLView(glview) - end - - glview:setDesignResolutionSize(480, 320, cc.ResolutionPolicy.NO_BORDER) - - --turn on display FPS - director:setDisplayStats(true) - - --set FPS. the default value is 1.0/60 if you don't call this - director:setAnimationInterval(1.0 / 60) - - local schedulerID = 0 - --support debug - local targetPlatform = cc.Application:getInstance():getTargetPlatform() - if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or - (cc.PLATFORM_OS_ANDROID == targetPlatform) or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or - (cc.PLATFORM_OS_MAC == targetPlatform) then - cclog("result is ") - --require('debugger')() - - end - require "hello2" - cclog("result is " .. myadd(1, 1)) - - --------------- - - local visibleSize = cc.Director:getInstance():getVisibleSize() - local origin = cc.Director:getInstance():getVisibleOrigin() - - -- add the moving dog - local function createDog() - local frameWidth = 105 - local frameHeight = 95 - - -- create dog animate - local textureDog = cc.Director:getInstance():getTextureCache():addImage("dog.png") - local rect = cc.rect(0, 0, frameWidth, frameHeight) - local frame0 = cc.SpriteFrame:createWithTexture(textureDog, rect) - rect = cc.rect(frameWidth, 0, frameWidth, frameHeight) - local frame1 = cc.SpriteFrame:createWithTexture(textureDog, rect) - - local spriteDog = cc.Sprite:createWithSpriteFrame(frame0) - spriteDog.isPaused = false - spriteDog:setPosition(origin.x, origin.y + visibleSize.height / 4 * 3) ---[[ - local animFrames = CCArray:create() - - animFrames:addObject(frame0) - animFrames:addObject(frame1) -]]-- - - local animation = cc.Animation:createWithSpriteFrames({frame0,frame1}, 0.5) - local animate = cc.Animate:create(animation); - spriteDog:runAction(cc.RepeatForever:create(animate)) - - -- moving dog at every frame - local function tick() - if spriteDog.isPaused then return end - local x, y = spriteDog:getPosition() - if x > origin.x + visibleSize.width then - x = origin.x - else - x = x + 1 - end - - spriteDog:setPositionX(x) - end - - schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tick, 0, false) - - return spriteDog - end - - -- create farm - local function createLayerFarm() - local layerFarm = cc.Layer:create() - - -- add in farm background - local bg = cc.Sprite:create("farm.jpg") - bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2) - layerFarm:addChild(bg) - - -- add land sprite - for i = 0, 3 do - for j = 0, 1 do - local spriteLand = cc.Sprite:create("land.png") - spriteLand:setPosition(200 + j * 180 - i % 2 * 90, 10 + i * 95 / 2) - layerFarm:addChild(spriteLand) - end - end - - -- add crop - local frameCrop = cc.SpriteFrame:create("crop.png", cc.rect(0, 0, 105, 95)) - for i = 0, 3 do - for j = 0, 1 do - local spriteCrop = cc.Sprite:createWithSpriteFrame(frameCrop); - spriteCrop:setPosition(10 + 200 + j * 180 - i % 2 * 90, 30 + 10 + i * 95 / 2) - layerFarm:addChild(spriteCrop) - end - end - - -- add moving dog - local spriteDog = createDog() - layerFarm:addChild(spriteDog) - - -- handing touch events - local touchBeginPoint = nil - local function onTouchBegan(touch, event) - local location = touch:getLocation() - cclog("onTouchBegan: %0.2f, %0.2f", location.x, location.y) - touchBeginPoint = {x = location.x, y = location.y} - spriteDog.isPaused = true - -- CCTOUCHBEGAN event must return true - return true - end - - local function onTouchMoved(touch, event) - local location = touch:getLocation() - cclog("onTouchMoved: %0.2f, %0.2f", location.x, location.y) - if touchBeginPoint then - local cx, cy = layerFarm:getPosition() - layerFarm:setPosition(cx + location.x - touchBeginPoint.x, - cy + location.y - touchBeginPoint.y) - touchBeginPoint = {x = location.x, y = location.y} - end - end - - local function onTouchEnded(touch, event) - local location = touch:getLocation() - cclog("onTouchEnded: %0.2f, %0.2f", location.x, location.y) - touchBeginPoint = nil - spriteDog.isPaused = false - end - - local listener = cc.EventListenerTouchOneByOne:create() - listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN ) - listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED ) - listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED ) - local eventDispatcher = layerFarm:getEventDispatcher() - eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layerFarm) - - local function onNodeEvent(event) - if "exit" == event then - cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID) - end - end - layerFarm:registerScriptHandler(onNodeEvent) - - return layerFarm - end - - - -- create menu - local function createLayerMenu() - local layerMenu = cc.Layer:create() - - local menuPopup, menuTools, effectID - - local function menuCallbackClosePopup() - -- stop test sound effect - cc.SimpleAudioEngine:getInstance():stopEffect(effectID) - menuPopup:setVisible(false) - end - - local function menuCallbackOpenPopup() - -- loop test sound effect - local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav") - effectID = cc.SimpleAudioEngine:getInstance():playEffect(effectPath) - menuPopup:setVisible(true) - end - - -- add a popup menu - local menuPopupItem = cc.MenuItemImage:create("menu2.png", "menu2.png") - menuPopupItem:setPosition(0, 0) - menuPopupItem:registerScriptTapHandler(menuCallbackClosePopup) - menuPopup = cc.Menu:create(menuPopupItem) - menuPopup:setPosition(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2) - menuPopup:setVisible(false) - layerMenu:addChild(menuPopup) - - -- add the left-bottom "tools" menu to invoke menuPopup - local menuToolsItem = cc.MenuItemImage:create("menu1.png", "menu1.png") - menuToolsItem:setPosition(0, 0) - menuToolsItem:registerScriptTapHandler(menuCallbackOpenPopup) - menuTools = cc.Menu:create(menuToolsItem) - local itemWidth = menuToolsItem:getContentSize().width - local itemHeight = menuToolsItem:getContentSize().height - menuTools:setPosition(origin.x + itemWidth/2, origin.y + itemHeight/2) - layerMenu:addChild(menuTools) - - return layerMenu - end - - -- play background music, preload effect - local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3") - cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true) - local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav") - cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath) - - -- run - local sceneGame = cc.Scene:create() - sceneGame:addChild(createLayerFarm()) - sceneGame:addChild(createLayerMenu()) - - if cc.Director:getInstance():getRunningScene() then - cc.Director:getInstance():replaceScene(sceneGame) - else - cc.Director:getInstance():runWithScene(sceneGame) - end - + require("app.MyApp"):create():run() end - local status, msg = xpcall(main, __G__TRACKBACK__) if not status then - error(msg) + print(msg) end diff --git a/templates/lua-template-default/src/packages/mvc/AppBase.lua b/templates/lua-template-default/src/packages/mvc/AppBase.lua new file mode 100644 index 0000000000..ccf9f579bd --- /dev/null +++ b/templates/lua-template-default/src/packages/mvc/AppBase.lua @@ -0,0 +1,67 @@ + +local AppBase = class("AppBase") + +function AppBase:ctor(configs) + self.configs_ = { + viewsRoot = "app.views", + modelsRoot = "app.models", + defaultSceneName = "MainScene", + } + + for k, v in pairs(configs or {}) do + self.configs_[k] = v + end + + if type(self.configs_.viewsRoot) ~= "table" then + self.configs_.viewsRoot = {self.configs_.viewsRoot} + end + if type(self.configs_.modelsRoot) ~= "table" then + self.configs_.modelsRoot = {self.configs_.modelsRoot} + end + + if DEBUG > 1 then + dump(self.configs_, "AppBase configs") + end + + if CC_SHOW_FPS then + cc.Director:getInstance():setDisplayStats(true) + end + + -- event + self:onCreate() +end + +function AppBase:run(initSceneName) + initSceneName = initSceneName or self.configs_.defaultSceneName + self:enterScene(initSceneName) +end + +function AppBase:enterScene(sceneName, transition, time, more) + local view = self:createView(sceneName) + view:showWithScene(transition, time, more) + return view +end + +function AppBase:createView(name) + for _, root in ipairs(self.configs_.viewsRoot) do + local packageName = string.format("%s.%s", root, name) + local status, view = xpcall(function() + return require(packageName) + end, function(msg) + if not string.find(msg, string.format("'%s' not found:", packageName)) then + print("load view error: ", msg) + end + end) + local t = type(view) + if status and (t == "table" or t == "userdata") then + return view:create(self, name) + end + end + error(string.format("AppBase:createView() - not found view \"%s\" in search paths \"%s\"", + name, table.concat(self.configs_.viewsRoot, ",")), 0) +end + +function AppBase:onCreate() +end + +return AppBase diff --git a/templates/lua-template-default/src/packages/mvc/ViewBase.lua b/templates/lua-template-default/src/packages/mvc/ViewBase.lua new file mode 100644 index 0000000000..64a26bd72f --- /dev/null +++ b/templates/lua-template-default/src/packages/mvc/ViewBase.lua @@ -0,0 +1,68 @@ + +local ViewBase = class("ViewBase", cc.Node) + +function ViewBase:ctor(app, name) + self:enableNodeEvents() + self.app_ = app + self.name_ = name + + -- check CSB resource file + local res = rawget(self.class, "RESOURCE_FILENAME") + if res then + self:createResoueceNode(res) + end + + local binding = rawget(self.class, "RESOURCE_BINDING") + if res and binding then + self:createResoueceBinding(binding) + end + + if self.onCreate then self:onCreate() end +end + +function ViewBase:getApp() + return self.app_ +end + +function ViewBase:getName() + return self.name_ +end + +function ViewBase:getResourceNode() + return self.resourceNode_ +end + +function ViewBase:createResoueceNode(resourceFilename) + if self.resourceNode_ then + self.resourceNode_:removeSelf() + self.resourceNode_ = nil + end + self.resourceNode_ = cc.CSLoader:createNode(resourceFilename) + assert(self.resourceNode_, string.format("ViewBase:createResoueceNode() - load resouce node from file \"%s\" failed", resourceFilename)) + self:addChild(self.resourceNode_) +end + +function ViewBase:createResoueceBinding(binding) + assert(self.resourceNode_, "ViewBase:createResoueceBinding() - not load resource node") + for nodeName, nodeBinding in pairs(binding) do + local node = self.resourceNode_:getChildByName(nodeName) + if nodeBinding.varname then + self[nodeBinding.varname] = node + end + for _, event in ipairs(nodeBinding.events or {}) do + if event.event == "touch" then + node:onTouch(handler(self, self[event.method])) + end + end + end +end + +function ViewBase:showWithScene(transition, time, more) + self:setVisible(true) + local scene = display.newScene(self.name_) + scene:addChild(self) + display.runScene(scene, transition, time, more) + return self +end + +return ViewBase diff --git a/templates/lua-template-default/src/packages/mvc/init.lua b/templates/lua-template-default/src/packages/mvc/init.lua new file mode 100644 index 0000000000..3eb980ca94 --- /dev/null +++ b/templates/lua-template-default/src/packages/mvc/init.lua @@ -0,0 +1,7 @@ + +local _M = {} + +_M.AppBase = import(".AppBase") +_M.ViewBase = import(".ViewBase") + +return _M diff --git a/templates/lua-template-runtime/cocos-project-template.json b/templates/lua-template-runtime/cocos-project-template.json index 4ffc160a0f..1a9e36fe77 100644 --- a/templates/lua-template-runtime/cocos-project-template.json +++ b/templates/lua-template-runtime/cocos-project-template.json @@ -18,6 +18,16 @@ "to": "src/cocos", "exclude": [] }, + { + "from": "templates/lua-template-default/src", + "to": "src", + "exclude": [] + }, + { + "from": "templates/lua-template-default/res", + "to": "res", + "exclude": [] + }, { "from": "external/win32-specific/gles/prebuilt", "to": "runtime/win32", 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..ad3ccbe940 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; @@ -14,16 +21,21 @@ using namespace std; AppDelegate::AppDelegate() { +#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) && (CC_TARGET_PLATFORM != CC_PLATFORM_MAC) + auto config = ConfigParser::getInstance(); + _project.setScriptFile(config->getEntryFile()); +#endif } AppDelegate::~AppDelegate() { SimpleAudioEngine::end(); -#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 - endRuntime(); -#endif + if (_project.getDebuggerType() != kCCRuntimeDebuggerNone) + { + // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE + endRuntime(); + } ConfigParser::purge(); } @@ -41,27 +53,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 +77,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 +99,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..b1476681c2 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,24 @@ 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 (address.length() > 0) + { + if (res->ai_family == AF_INET) + { + struct sockaddr_in *sin = (struct sockaddr_in*) res->ai_addr; + inet_pton(res->ai_family, address.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, address.c_str(), (void*)&sin->sin6_addr); + } + } + 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..8004770a09 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,33 @@ #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..ef2858d90b 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,271 +94,515 @@ 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) launch:(NSArray*)args +- (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); + } +} + +- (bool) launch:(NSArray*)args { NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; NSMutableDictionary *configuration = [NSMutableDictionary dictionaryWithObject:args forKey:NSWorkspaceLaunchConfigurationArguments]; NSError *error = [[[NSError alloc] init] autorelease]; [[NSWorkspace sharedWorkspace] launchApplicationAtURL:url options:NSWorkspaceLaunchNewInstance - configuration:configuration error:&error]; + configuration:configuration + error:&error]; + + if (error.code != 0) + { + NSLog(@"Failed to launch app: %@", [error localizedDescription]); + } + return (error.code==0); } - (void) relaunch:(NSArray*)args { - [self launch:args]; - [[NSApplication sharedApplication] terminate:self]; -} - -- (IBAction) onRelaunch:(id)sender -{ - NSArray* args=[[NSArray alloc] initWithObjects:@" ", nil]; - [self relaunch:args]; -} - - -- (IBAction) onViewChangeFrameSize:(id)sender -{ - NSInteger index = [sender tag]; - if (index >= 0 && index < ConfigParser::getInstance()->getScreenSizeCount()) + if ([self launch:args]) { - SimulatorScreenSize size = ConfigParser::getInstance()->getScreenSize(index); - g_screenSize.width = size.width; - g_screenSize.height = size.height; - [self updateView]; + [[NSApplication sharedApplication] terminate:self]; + } + else + { + NSLog(@"RELAUNCH: %@", args); } } - -- (IBAction) onScreenZoomOut:(id)sender +- (void) relaunch { - if ([sender state] == NSOnState) return; - float scale = (float)[sender tag] / 100.0f; - g_eglView->setFrameZoomFactor(scale); - [self updateView]; + [self relaunch:[self makeCommandLineArgsFromProjectConfig]]; } +- (void) createWindowAndGLView +{ + GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8}; + GLView::setGLContextAttrs(glContextAttrs); + + // create console window **MUST** before create opengl view + if (_project.isShowConsole()) + { + [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] ; + } +} + +- (bool) writeDebugLogToFile:(const string)path +{ + 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..1feb536ed7 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerEditBoxServiceMac.h @@ -0,0 +1,62 @@ +// +// EditBoxServiceMac.h +// player +// + +#ifndef __player__EditBoxServiceMac__ +#define __player__EditBoxServiceMac__ + +#include "PlayerEditBoxServiceProtocol.h" + + +@interface EditBoxServiceImplMac : NSObject +{ + NSTextField* textField_; + 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..49ed2c2a94 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerFileDialogServiceMac.h @@ -0,0 +1,29 @@ +#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: + 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..3697c5258f --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.h @@ -0,0 +1,82 @@ + +#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 +{ + int scriptHandler; + player::PlayerMenuItemMac *macMenuItem; +} +@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..fb8be96593 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerMenuServiceMac.mm @@ -0,0 +1,371 @@ + +#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 +@synthesize scriptHandler; +@synthesize macMenuItem; + ++(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..0b9d49eda6 --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.h @@ -0,0 +1,80 @@ + +#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; + + NSTask *_buildTask; + BOOL _isRunning; + int _exitCode; + NSString *_output; +} + +@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..d4e79635db --- /dev/null +++ b/templates/lua-template-runtime/frameworks/runtime-src/proj.ios_mac/mac/service/PlayerTaskServiceMac.mm @@ -0,0 +1,246 @@ + +#include "PlayerTaskServiceMac.h" + +@implementation PlayerTaskPrivate + +@synthesize buildTask = _buildTask; +@synthesize isRunning = _isRunning; +@synthesize exitCode = _exitCode; +@synthesize output = _output; + +-(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/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/templates/lua-template-runtime/res/background.caf b/templates/lua-template-runtime/res/background.caf deleted file mode 100644 index 5d7d0b8ce9..0000000000 Binary files a/templates/lua-template-runtime/res/background.caf and /dev/null differ diff --git a/templates/lua-template-runtime/res/background.mp3 b/templates/lua-template-runtime/res/background.mp3 deleted file mode 100644 index aec1c0a8c8..0000000000 Binary files a/templates/lua-template-runtime/res/background.mp3 and /dev/null differ diff --git a/templates/lua-template-runtime/res/background.ogg b/templates/lua-template-runtime/res/background.ogg deleted file mode 100644 index e5af704a05..0000000000 Binary files a/templates/lua-template-runtime/res/background.ogg and /dev/null differ diff --git a/templates/lua-template-runtime/res/crop.png b/templates/lua-template-runtime/res/crop.png deleted file mode 100644 index 9ea84bc93f..0000000000 Binary files a/templates/lua-template-runtime/res/crop.png and /dev/null differ diff --git a/templates/lua-template-runtime/res/dog.png b/templates/lua-template-runtime/res/dog.png deleted file mode 100644 index 76bdca07a1..0000000000 Binary files a/templates/lua-template-runtime/res/dog.png and /dev/null differ diff --git a/templates/lua-template-runtime/res/effect1.wav b/templates/lua-template-runtime/res/effect1.wav deleted file mode 100644 index f8d4292d0f..0000000000 Binary files a/templates/lua-template-runtime/res/effect1.wav and /dev/null differ diff --git a/templates/lua-template-runtime/res/farm.jpg b/templates/lua-template-runtime/res/farm.jpg deleted file mode 100644 index d7290c3470..0000000000 Binary files a/templates/lua-template-runtime/res/farm.jpg and /dev/null differ diff --git a/templates/lua-template-runtime/res/fonts/Marker Felt.ttf b/templates/lua-template-runtime/res/fonts/Marker Felt.ttf deleted file mode 100644 index 3752ef3110..0000000000 Binary files a/templates/lua-template-runtime/res/fonts/Marker Felt.ttf and /dev/null differ diff --git a/templates/lua-template-runtime/res/land.png b/templates/lua-template-runtime/res/land.png deleted file mode 100644 index 6e0785b545..0000000000 Binary files a/templates/lua-template-runtime/res/land.png and /dev/null differ diff --git a/templates/lua-template-runtime/res/menu1.png b/templates/lua-template-runtime/res/menu1.png deleted file mode 100644 index eeb327a4cb..0000000000 Binary files a/templates/lua-template-runtime/res/menu1.png and /dev/null differ diff --git a/templates/lua-template-runtime/res/menu2.png b/templates/lua-template-runtime/res/menu2.png deleted file mode 100644 index 04763ea1a4..0000000000 Binary files a/templates/lua-template-runtime/res/menu2.png and /dev/null differ diff --git a/templates/lua-template-runtime/src/GameScene.lua b/templates/lua-template-runtime/src/GameScene.lua deleted file mode 100644 index 45c6bdbe06..0000000000 --- a/templates/lua-template-runtime/src/GameScene.lua +++ /dev/null @@ -1,182 +0,0 @@ - -local GameScene = class("GameScene",function() - return cc.Scene:create() -end) - -function GameScene.create() - local scene = GameScene.new() - scene:addChild(scene:createLayerFarm()) - scene:addChild(scene:createLayerMenu()) - return scene -end - - -function GameScene:ctor() - self.visibleSize = cc.Director:getInstance():getVisibleSize() - self.origin = cc.Director:getInstance():getVisibleOrigin() - self.schedulerID = nil -end - -function GameScene:playBgMusic() - local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3") - cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true) - local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav") - cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath) -end - -function GameScene:creatDog() - local frameWidth = 105 - local frameHeight = 95 - - -- create dog animate - local textureDog = cc.Director:getInstance():getTextureCache():addImage("dog.png") - local rect = cc.rect(0, 0, frameWidth, frameHeight) - local frame0 = cc.SpriteFrame:createWithTexture(textureDog, rect) - rect = cc.rect(frameWidth, 0, frameWidth, frameHeight) - local frame1 = cc.SpriteFrame:createWithTexture(textureDog, rect) - - local spriteDog = cc.Sprite:createWithSpriteFrame(frame0) - spriteDog:setPosition(self.origin.x, self.origin.y + self.visibleSize.height / 4 * 3) - spriteDog.isPaused = false - - local animation = cc.Animation:createWithSpriteFrames({frame0,frame1}, 0.5) - local animate = cc.Animate:create(animation); - spriteDog:runAction(cc.RepeatForever:create(animate)) - - -- moving dog at every frame - local function tick() - if spriteDog.isPaused then return end - local x, y = spriteDog:getPosition() - if x > self.origin.x + self.visibleSize.width then - x = self.origin.x - else - x = x + 1 - end - - spriteDog:setPositionX(x) - end - - self.schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tick, 0, false) - - return spriteDog -end - --- create farm -function GameScene:createLayerFarm() - local layerFarm = cc.Layer:create() - -- add in farm background - local bg = cc.Sprite:create("farm.jpg") - bg:setPosition(self.origin.x + self.visibleSize.width / 2 + 80, self.origin.y + self.visibleSize.height / 2) - layerFarm:addChild(bg) - - -- add land sprite - for i = 0, 3 do - for j = 0, 1 do - local spriteLand = cc.Sprite:create("land.png") - spriteLand:setPosition(200 + j * 180 - i % 2 * 90, 10 + i * 95 / 2) - layerFarm:addChild(spriteLand) - end - end - - -- add crop - local frameCrop = cc.SpriteFrame:create("crop.png", cc.rect(0, 0, 105, 95)) - for i = 0, 3 do - for j = 0, 1 do - local spriteCrop = cc.Sprite:createWithSpriteFrame(frameCrop); - spriteCrop:setPosition(210 + j * 180 - i % 2 * 90, 40 + i * 95 / 2) - layerFarm:addChild(spriteCrop) - end - end - - -- add moving dog - local spriteDog = self:creatDog() - layerFarm:addChild(spriteDog) - - -- handing touch events - local touchBeginPoint = nil - local function onTouchBegan(touch, event) - local location = touch:getLocation() - --cclog("onTouchBegan: %0.2f, %0.2f", location.x, location.y) - touchBeginPoint = {x = location.x, y = location.y} - spriteDog.isPaused = true - -- CCTOUCHBEGAN event must return true - return true - end - - local function onTouchMoved(touch, event) - local location = touch:getLocation() - --cclog("onTouchMoved: %0.2f, %0.2f", location.x, location.y) - if touchBeginPoint then - local cx, cy = layerFarm:getPosition() - layerFarm:setPosition(cx + location.x - touchBeginPoint.x, - cy + location.y - touchBeginPoint.y) - touchBeginPoint = {x = location.x, y = location.y} - end - end - - local function onTouchEnded(touch, event) - local location = touch:getLocation() - --cclog("onTouchEnded: %0.2f, %0.2f", location.x, location.y) - touchBeginPoint = nil - spriteDog.isPaused = false - end - - local listener = cc.EventListenerTouchOneByOne:create() - listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN ) - listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED ) - listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED ) - local eventDispatcher = layerFarm:getEventDispatcher() - eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layerFarm) - - local function onNodeEvent(event) - if "exit" == event then - cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.schedulerID) - end - end - layerFarm:registerScriptHandler(onNodeEvent) - - return layerFarm -end - --- create menu -function GameScene:createLayerMenu() - - local layerMenu = cc.Layer:create() - local menuPopup, menuTools, effectID - - local function menuCallbackClosePopup() - -- stop test sound effect - cc.SimpleAudioEngine:getInstance():stopEffect(effectID) - menuPopup:setVisible(false) - end - - local function menuCallbackOpenPopup() - -- loop test sound effect - local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav") - effectID = cc.SimpleAudioEngine:getInstance():playEffect(effectPath) - menuPopup:setVisible(true) - end - - -- add a popup menu - local menuPopupItem = cc.MenuItemImage:create("menu2.png", "menu2.png") - menuPopupItem:setPosition(0, 0) - menuPopupItem:registerScriptTapHandler(menuCallbackClosePopup) - menuPopup = cc.Menu:create(menuPopupItem) - menuPopup:setPosition(self.origin.x + self.visibleSize.width / 2, self.origin.y + self.visibleSize.height / 2) - menuPopup:setVisible(false) - layerMenu:addChild(menuPopup) - - -- add the left-bottom "tools" menu to invoke menuPopup - local menuToolsItem = cc.MenuItemImage:create("menu1.png", "menu1.png") - menuToolsItem:setPosition(0, 0) - menuToolsItem:registerScriptTapHandler(menuCallbackOpenPopup) - menuTools = cc.Menu:create(menuToolsItem) - local itemWidth = menuToolsItem:getContentSize().width - local itemHeight = menuToolsItem:getContentSize().height - menuTools:setPosition(self.origin.x + itemWidth/2, self.origin.y + itemHeight/2) - layerMenu:addChild(menuTools) - - return layerMenu -end - -return GameScene diff --git a/templates/lua-template-runtime/src/main.lua b/templates/lua-template-runtime/src/main.lua deleted file mode 100644 index 2c6c6b7f12..0000000000 --- a/templates/lua-template-runtime/src/main.lua +++ /dev/null @@ -1,56 +0,0 @@ - -cc.FileUtils:getInstance():addSearchPath("src") -cc.FileUtils:getInstance():addSearchPath("res") - --- CC_USE_DEPRECATED_API = true -require "cocos.init" - --- cclog -local cclog = function(...) - print(string.format(...)) -end - --- for CCLuaEngine traceback -function __G__TRACKBACK__(msg) - cclog("----------------------------------------") - cclog("LUA ERROR: " .. tostring(msg) .. "\n") - cclog(debug.traceback()) - cclog("----------------------------------------") - return msg -end - -local function main() - collectgarbage("collect") - -- avoid memory leak - collectgarbage("setpause", 100) - collectgarbage("setstepmul", 5000) - - -- initialize director - local director = cc.Director:getInstance() - - --turn on display FPS - director:setDisplayStats(true) - - --set FPS. the default value is 1.0/60 if you don't call this - director:setAnimationInterval(1.0 / 60) - - director:getOpenGLView():setDesignResolutionSize(480, 320, 1) - - --create scene - local scene = require("GameScene") - local gameScene = scene.create() - gameScene:playBgMusic() - - if director:getRunningScene() then - director:replaceScene(gameScene) - else - director:runWithScene(gameScene) - end - -end - - -local status, msg = xpcall(main, __G__TRACKBACK__) -if not status then - error(msg) -end 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 18bcb89f26..444a4d0f13 100644 --- a/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp +++ b/tests/cpp-tests/Classes/Camera3DTest/Camera3DTest.cpp @@ -667,7 +667,7 @@ CameraClippingDemo::CameraClippingDemo(void) , _moveAction(nullptr) , _drawAABB(nullptr) , _drawFrustum(nullptr) -, _row(0) +, _row(3) { } CameraClippingDemo::~CameraClippingDemo(void) @@ -791,7 +791,7 @@ void CameraClippingDemo::update(float dt) for (const auto& iter: children) { const AABB& aabb = static_cast(iter)->getAABB(); - if (_cameraFirst->visibleInFrustum(aabb)) + if (_cameraFirst->isVisibleInFrustum(&aabb)) { aabb.getCorners(corners); _drawAABB->drawCube(corners, Color4F(0, 1, 0, 1)); @@ -843,14 +843,14 @@ void CameraClippingDemo::switchViewCallback(Ref* sender) { _cameraType = CameraType::ThirdCamera; _cameraThird->setCameraFlag(CameraFlag::USER1); - _cameraThird->enableFrustumCull(false, false); + _cameraThird->enableFrustumCulling(false, false); _cameraFirst->setCameraFlag(CameraFlag::USER8); } else if(_cameraType == CameraType::ThirdCamera) { _cameraType = CameraType::FirstCamera; _cameraFirst->setCameraFlag(CameraFlag::USER1); - _cameraFirst->enableFrustumCull(true, true); + _cameraFirst->enableFrustumCulling(true, true); _cameraThird->setCameraFlag(CameraFlag::USER8); _drawFrustum->clear(); } diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp index 5181534696..f02b4f8b2c 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.cpp @@ -67,7 +67,8 @@ static std::function createFunctions[] = CL(AttachmentTest), CL(Sprite3DReskinTest), CL(Sprite3DWithOBBPerfromanceTest), - CL(Sprite3DMirrorTest) + CL(Sprite3DMirrorTest), + CL(QuaternionTest) }; #define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0])) @@ -294,6 +295,27 @@ Sprite3DUVAnimationTest::Sprite3DUVAnimationTest() //the callback function update cylinder's texcoord schedule(schedule_selector(Sprite3DUVAnimationTest::cylinderUpdate)); + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, + [this](EventCustom*) + { + auto glProgram = _state->getGLProgram(); + glProgram->reset(); + glProgram->initWithFilenames("Sprite3DTest/cylinder.vert", "Sprite3DTest/cylinder.frag"); + glProgram->link(); + glProgram->updateUniforms(); + } + ); + Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); +#endif +} + +Sprite3DUVAnimationTest::~Sprite3DUVAnimationTest() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundListener); +#endif } std::string Sprite3DUVAnimationTest::title() const @@ -357,15 +379,15 @@ Sprite3DFakeShadowTest::Sprite3DFakeShadowTest() // use custom shader auto shader =GLProgram::createWithFilenames("Sprite3DTest/simple_shadow.vert","Sprite3DTest/simple_shadow.frag"); - auto state = GLProgramState::create(shader); - _plane->setGLProgramState(state); + _state = GLProgramState::create(shader); + _plane->setGLProgramState(_state); //pass mesh's attribute to shader long offset = 0; auto attributeCount = _plane->getMesh()->getMeshVertexAttribCount(); for (auto i = 0; i < attributeCount; i++) { auto meshattribute = _plane->getMesh()->getMeshVertexAttribute(i); - state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], + _state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, @@ -373,7 +395,7 @@ Sprite3DFakeShadowTest::Sprite3DFakeShadowTest() (GLvoid*)offset); offset += meshattribute.attribSizeBytes; } - state->setUniformMat4("u_model_matrix",_plane->getNodeToWorldTransform()); + _state->setUniformMat4("u_model_matrix",_plane->getNodeToWorldTransform()); //create shadow texture auto shadowTexture = Director::getInstance()->getTextureCache()->addImage("Sprite3DTest/shadowCircle.png"); @@ -383,7 +405,7 @@ Sprite3DFakeShadowTest::Sprite3DFakeShadowTest() tRepeatParams.wrapS = GL_CLAMP_TO_EDGE; tRepeatParams.wrapT = GL_CLAMP_TO_EDGE; shadowTexture->setTexParameters(tRepeatParams); - state->setUniformTexture("u_shadowTexture",shadowTexture); + _state->setUniformTexture("u_shadowTexture",shadowTexture); layer->addChild(_plane); //create the orc @@ -398,6 +420,39 @@ Sprite3DFakeShadowTest::Sprite3DFakeShadowTest() layer->setCameraMask(2); schedule(CC_SCHEDULE_SELECTOR(Sprite3DFakeShadowTest::updateCamera), 0.0f); + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, + [this](EventCustom*) + { + auto glProgram = _state->getGLProgram(); + glProgram->reset(); + glProgram->initWithFilenames("Sprite3DTest/simple_shadow.vert","Sprite3DTest/simple_shadow.frag"); + glProgram->link(); + glProgram->updateUniforms(); + + _state->setUniformMat4("u_model_matrix",_plane->getNodeToWorldTransform()); + + //create shadow texture + auto shadowTexture = Director::getInstance()->getTextureCache()->addImage("Sprite3DTest/shadowCircle.png"); + Texture2D::TexParams tRepeatParams;//set texture parameters + tRepeatParams.magFilter = GL_LINEAR; + tRepeatParams.minFilter = GL_LINEAR; + tRepeatParams.wrapS = GL_CLAMP_TO_EDGE; + tRepeatParams.wrapT = GL_CLAMP_TO_EDGE; + shadowTexture->setTexParameters(tRepeatParams); + _state->setUniformTexture("u_shadowTexture",shadowTexture); + } + ); + Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); +#endif +} + +Sprite3DFakeShadowTest::~Sprite3DFakeShadowTest() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundListener); +#endif } std::string Sprite3DFakeShadowTest::title() const @@ -572,8 +627,8 @@ Sprite3DBasicToonShaderTest::Sprite3DBasicToonShaderTest() auto teapot = Sprite3D::create("Sprite3DTest/teapot.c3b"); //create and set our custom shader auto shader =GLProgram::createWithFilenames("Sprite3DTest/toon.vert","Sprite3DTest/toon.frag"); - auto state = GLProgramState::create(shader); - teapot->setGLProgramState(state); + _state = GLProgramState::create(shader); + teapot->setGLProgramState(_state); teapot->setPosition3D(Vec3(0,-5,-20)); teapot->setRotation3D(Vec3(-90,180,0)); auto rotate_action = RotateBy::create(1.5,Vec3(0,30,0)); @@ -583,7 +638,7 @@ Sprite3DBasicToonShaderTest::Sprite3DBasicToonShaderTest() auto attributeCount = teapot->getMesh()->getMeshVertexAttribCount(); for (auto i = 0; i < attributeCount; i++) { auto meshattribute = teapot->getMesh()->getMeshVertexAttribute(i); - state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], + _state->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, @@ -594,6 +649,27 @@ Sprite3DBasicToonShaderTest::Sprite3DBasicToonShaderTest() addChild(teapot); addChild(_camera); setCameraMask(2); + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + _backToForegroundListener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, + [this](EventCustom*) + { + auto glProgram = _state->getGLProgram(); + glProgram->reset(); + glProgram->initWithFilenames("Sprite3DTest/toon.vert","Sprite3DTest/toon.frag"); + glProgram->link(); + glProgram->updateUniforms(); + } + ); + Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); +#endif +} + +Sprite3DBasicToonShaderTest::~Sprite3DBasicToonShaderTest() +{ +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + Director::getInstance()->getEventDispatcher()->removeEventListener(_backToForegroundListener); +#endif } std::string Sprite3DBasicToonShaderTest::title() const @@ -638,8 +714,11 @@ Sprite3DLightMapTest::Sprite3DLightMapTest() listener->onTouchesMoved = CC_CALLBACK_2(Sprite3DLightMapTest::onTouchesMoved, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); } - -std::string Sprite3DLightMapTest::title() const +Sprite3DLightMapTest::~Sprite3DLightMapTest() +{ + +} +std::string Sprite3DLightMapTest::title() const { return "light map test"; } @@ -1951,3 +2030,53 @@ void Sprite3DMirrorTest::addNewSpriteWithCoords(Vec2 p) } _mirrorSprite = sprite; } + +QuaternionTest::QuaternionTest() +: _arcSpeed(CC_DEGREES_TO_RADIANS(90)) +, _radius(100.f) +, _accAngle(0.f) +{ + auto s = Director::getInstance()->getWinSize(); + addNewSpriteWithCoords(Vec2(s.width / 2.f, s.height / 2.f)); + scheduleUpdate(); +} +std::string QuaternionTest::title() const +{ + return "Test Rotation With Quaternion"; +} +std::string QuaternionTest::subtitle() const +{ + return ""; +} + +void QuaternionTest::addNewSpriteWithCoords(Vec2 p) +{ + std::string fileName = "Sprite3DTest/tortoise.c3b"; + auto sprite = Sprite3D::create(fileName); + sprite->setScale(0.1f); + auto s = Director::getInstance()->getWinSize(); + sprite->setPosition(Vec2(s.width / 2.f + _radius * cosf(_accAngle), s.height / 2.f + _radius * sinf(_accAngle))); + addChild(sprite); + _sprite = sprite; + auto animation = Animation3D::create(fileName); + if (animation) + { + auto animate = Animate3D::create(animation, 0.f, 1.933f); + sprite->runAction(RepeatForever::create(animate)); + } +} + +void QuaternionTest::update(float delta) +{ + _accAngle += delta * _arcSpeed; + const float pi = M_PI; + if (_accAngle >= 2 * pi) + _accAngle -= 2 * pi; + + auto s = Director::getInstance()->getWinSize(); + _sprite->setPosition(Vec2(s.width / 2.f + _radius * cosf(_accAngle), s.height / 2.f + _radius * sinf(_accAngle))); + + Quaternion quat; + Quaternion::createFromAxisAngle(Vec3(0.f, 0.f, 1.f), _accAngle - pi * 0.5f, &quat); + _sprite->setRotationQuat(quat); +} diff --git a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h index 234066fa81..6271a3b50d 100644 --- a/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h +++ b/tests/cpp-tests/Classes/Sprite3DTest/Sprite3DTest.h @@ -71,6 +71,7 @@ class Sprite3DUVAnimationTest : public Sprite3DTestDemo public: CREATE_FUNC(Sprite3DUVAnimationTest); Sprite3DUVAnimationTest(); + virtual ~Sprite3DUVAnimationTest(); virtual std::string title() const override; virtual std::string subtitle() const override; @@ -80,6 +81,10 @@ protected: float _cylinder_texture_offset; float _shining_duraion; GLProgramState * _state; + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + EventListenerCustom* _backToForegroundListener; +#endif }; class Sprite3DFakeShadowTest : public Sprite3DTestDemo @@ -94,6 +99,7 @@ public: }; CREATE_FUNC(Sprite3DFakeShadowTest); Sprite3DFakeShadowTest(); + virtual ~Sprite3DFakeShadowTest(); virtual std::string title() const override; virtual std::string subtitle() const override; void Move(cocos2d::Ref* sender,int value); @@ -110,6 +116,11 @@ private: unsigned int _curState; cocos2d::Sprite3D * _plane; cocos2d::Sprite3D * _orc; + GLProgramState * _state; + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + EventListenerCustom* _backToForegroundListener; +#endif }; class Sprite3DLightMapTest : public Sprite3DTestDemo @@ -117,6 +128,7 @@ class Sprite3DLightMapTest : public Sprite3DTestDemo public: CREATE_FUNC(Sprite3DLightMapTest); Sprite3DLightMapTest(); + virtual ~Sprite3DLightMapTest(); virtual std::string title() const override; virtual std::string subtitle() const override; void onTouchesMoved(const std::vector& touches, cocos2d::Event* event); @@ -129,8 +141,16 @@ class Sprite3DBasicToonShaderTest : public Sprite3DTestDemo public: CREATE_FUNC(Sprite3DBasicToonShaderTest); Sprite3DBasicToonShaderTest(); + virtual ~Sprite3DBasicToonShaderTest(); virtual std::string title() const override; virtual std::string subtitle() const override; + +protected: + GLProgramState * _state; + +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WP8 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) + EventListenerCustom* _backToForegroundListener; +#endif }; class EffectSprite3D; @@ -408,6 +428,24 @@ protected: cocos2d::Sprite3D* _mirrorSprite; }; +class QuaternionTest : public Sprite3DTestDemo +{ +public: + CREATE_FUNC(QuaternionTest); + QuaternionTest(); + virtual std::string title() const override; + virtual std::string subtitle() const override; + + void addNewSpriteWithCoords(Vec2 p); + virtual void update(float delta) override; + +protected: + cocos2d::Sprite3D* _sprite; + float _arcSpeed; + float _radius; + float _accAngle; +}; + class Sprite3DTestScene : public TestScene { public: diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp index 42209c0ebb..0a63ebbf5f 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/CocosGUIScene.cpp @@ -91,7 +91,7 @@ g_guisTests[] = UISceneManager* sceneManager = UISceneManager::sharedUISceneManager(); sceneManager->setCurrentUISceneId(kUIButtonTest); sceneManager->setMinUISceneId(kUIButtonTest); - sceneManager->setMaxUISceneId(kUIButtonFlipTest); + sceneManager->setMaxUISceneId(kUIButtonDisableDefaultTest); Scene* scene = sceneManager->currentUIScene(); Director::getInstance()->replaceScene(scene); } @@ -103,7 +103,7 @@ g_guisTests[] = UISceneManager* sceneManager = UISceneManager::sharedUISceneManager(); sceneManager->setCurrentUISceneId(kUICheckBoxTest); sceneManager->setMinUISceneId(kUICheckBoxTest); - sceneManager->setMaxUISceneId(kUICheckBoxTest); + sceneManager->setMaxUISceneId(kUICheckBoxDefaultBehaviorTest); Scene* scene = sceneManager->currentUIScene(); Director::getInstance()->replaceScene(scene); } @@ -115,7 +115,7 @@ g_guisTests[] = UISceneManager* sceneManager = UISceneManager::sharedUISceneManager(); sceneManager->setCurrentUISceneId(kUISliderTest); sceneManager->setMinUISceneId(kUISliderTest); - sceneManager->setMaxUISceneId(kUISliderTest_Scale9); + sceneManager->setMaxUISceneId(kUISliderDisabledDefaultTest); Scene* scene = sceneManager->currentUIScene(); Director::getInstance()->replaceScene(scene); } diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp index a74cb121a3..a1a39a1c0a 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.cpp @@ -36,7 +36,8 @@ bool UIButtonTest::init() _uiLayer->addChild(alert); // Create the button - Button* button = Button::create("cocosui/animationbuttonnormal.png"); + Button* button = Button::create("cocosui/animationbuttonnormal.png", + "cocosui/animationbuttonpressed.png"); CCLOG("content size should be greater than 0: width = %f, height = %f", button->getContentSize().width, button->getContentSize().height); button->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); @@ -790,6 +791,125 @@ bool UIButtonFlipTest::init() titleLabel->setNormalizedPosition(Vec2(0.8, 0.7)); this->addChild(titleLabel); + return true; + } + return false; +} + +// UIButtonNormalDefaultTest +UIButtonNormalDefaultTest::UIButtonNormalDefaultTest() +: _displayValueLabel(nullptr) +{ + +} + +UIButtonNormalDefaultTest::~UIButtonNormalDefaultTest() +{ +} + +bool UIButtonNormalDefaultTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize(); + + // Add a label in which the button events will be displayed + _displayValueLabel = Text::create("", "fonts/Marker Felt.ttf",32); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); + _uiLayer->addChild(_displayValueLabel); + + // Add the alert + Text* alert = Text::create("Button should scale when clicked","fonts/Marker Felt.ttf",20); + alert->setColor(Color3B(159, 168, 176)); + + alert->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); + + _uiLayer->addChild(alert); + + // Create the button + Button* button = Button::create("cocosui/animationbuttonnormal.png"); + button->setPosition(Vec2(widgetSize.width / 2.0f - 80, widgetSize.height / 2.0f + 40)); + button->setZoomScale(0.4f); + button->setPressedActionEnabled(true); + _uiLayer->addChild(button); + + // Create the button + Button* buttonScale9 = Button::create("cocosui/button.png"); + // open scale9 render + buttonScale9->setScale9Enabled(true); + buttonScale9->setPosition(Vec2(widgetSize.width / 2.0f + 50, widgetSize.height / 2.0f + 40)); + buttonScale9->setContentSize(Size(150, 70)); + buttonScale9->setPressedActionEnabled(true); + _uiLayer->addChild(buttonScale9); + + + + + return true; + } + return false; +} + + +// UIButtonDisableDefaultTest +UIButtonDisableDefaultTest::UIButtonDisableDefaultTest() +: _displayValueLabel(nullptr) +{ + +} + +UIButtonDisableDefaultTest::~UIButtonDisableDefaultTest() +{ +} + +bool UIButtonDisableDefaultTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize(); + + // Add a label in which the button events will be displayed + _displayValueLabel = Text::create("", "fonts/Marker Felt.ttf",32); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1.0f)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); + _uiLayer->addChild(_displayValueLabel); + + // Add the alert + Text* alert = Text::create("Left button will turn normal when clicked","fonts/Marker Felt.ttf",20); + alert->setColor(Color3B(159, 168, 176)); + + alert->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); + + _uiLayer->addChild(alert); + + // Create the button + Button* button = Button::create("cocosui/animationbuttonnormal.png"); + button->setPosition(Vec2(widgetSize.width / 2.0f - 80, widgetSize.height / 2.0f + 40)); + button->setZoomScale(0.4f); + button->setPressedActionEnabled(true); + button->setBright(false); + button->addClickEventListener([=](Ref*){ + button->setBright(true); + }); + _uiLayer->addChild(button); + + // Create the button + Button* buttonScale9 = Button::create("cocosui/button.png"); + // open scale9 render + buttonScale9->setScale9Enabled(true); + buttonScale9->setPosition(Vec2(widgetSize.width / 2.0f + 50, widgetSize.height / 2.0f + 40)); + buttonScale9->setContentSize(Size(150, 70)); + buttonScale9->setPressedActionEnabled(true); + buttonScale9->setEnabled(false); + buttonScale9->setBright(false); + _uiLayer->addChild(buttonScale9); + + + + return true; } return false; diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.h index a920a5e855..54951fe366 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UIButtonTest/UIButtonTest.h @@ -165,4 +165,28 @@ protected: UI_SCENE_CREATE_FUNC(UIButtonFlipTest) Text* _displayValueLabel; }; + +class UIButtonNormalDefaultTest : public UIScene +{ +public: + UIButtonNormalDefaultTest(); + ~UIButtonNormalDefaultTest(); + bool init(); + +protected: + UI_SCENE_CREATE_FUNC(UIButtonNormalDefaultTest) + Text* _displayValueLabel; +}; + +class UIButtonDisableDefaultTest : public UIScene +{ +public: + UIButtonDisableDefaultTest(); + ~UIButtonDisableDefaultTest(); + bool init(); + +protected: + UI_SCENE_CREATE_FUNC(UIButtonDisableDefaultTest) + Text* _displayValueLabel; +}; #endif /* defined(__TestCpp__UIButtonTest__) */ diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp index bb08a28141..00a7b2aa48 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.cpp @@ -65,3 +65,73 @@ void UICheckBoxTest::selectedEvent(Ref* pSender,CheckBox::EventType type) } } + + +// UICheckBoxDefaultBehaviorTest +UICheckBoxDefaultBehaviorTest::UICheckBoxDefaultBehaviorTest() +: _displayValueLabel(nullptr) +{ + +} + +UICheckBoxDefaultBehaviorTest::~UICheckBoxDefaultBehaviorTest() +{ +} + +bool UICheckBoxDefaultBehaviorTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize();; + + // Add a label in which the checkbox events will be displayed + _displayValueLabel = Text::create("No Event", "fonts/Marker Felt.ttf", 32); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f)); + _uiLayer->addChild(_displayValueLabel); + + // Add the alert + Text* alert = Text::create("Only left two and the last checkbox can be cliked!","fonts/Marker Felt.ttf",20 ); + alert->setColor(Color3B(159, 168, 176)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f - alert->getContentSize().height * 1.75f)); + _uiLayer->addChild(alert); + + // Create the checkbox + CheckBox* checkBox = CheckBox::create("cocosui/check_box_normal.png", + "cocosui/check_box_active.png"); + checkBox->setPosition(Vec2(widgetSize.width / 2.0f - 50, widgetSize.height / 2.0f)); + + _uiLayer->addChild(checkBox); + + + // Create the checkbox + CheckBox* checkBox2 = CheckBox::create("cocosui/check_box_normal.png", + "cocosui/check_box_active.png"); + checkBox2->setPosition(Vec2(widgetSize.width / 2.0f - 150, widgetSize.height / 2.0f)); + checkBox2->ignoreContentAdaptWithSize(false); + checkBox2->setZoomScale(0.5); + checkBox2->setContentSize(Size(80,80)); + checkBox2->setName("bigCheckBox"); + _uiLayer->addChild(checkBox2); + + + // Create the checkbox + CheckBox* checkBoxDisabled = CheckBox::create("cocosui/check_box_normal.png", + "cocosui/check_box_active.png"); + checkBoxDisabled->setPosition(Vec2(widgetSize.width / 2.0f + 20, widgetSize.height / 2.0f)); + checkBoxDisabled->setEnabled(false); + checkBoxDisabled->setBright(false); + _uiLayer->addChild(checkBoxDisabled); + + CheckBox* checkBoxDisabled2 = CheckBox::create("cocosui/check_box_normal.png", + "cocosui/check_box_active.png"); + checkBoxDisabled2->setPosition(Vec2(widgetSize.width / 2.0f + 70, widgetSize.height / 2.0f)); + checkBoxDisabled2->setBright(false); + checkBoxDisabled2->setSelected(true); + _uiLayer->addChild(checkBoxDisabled2); + return true; + } + return false; +} + diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.h index 7ebcec8b5d..b64374cbf9 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UICheckBoxTest/UICheckBoxTest.h @@ -40,4 +40,16 @@ protected: Text* _displayValueLabel; }; +class UICheckBoxDefaultBehaviorTest : public UIScene +{ +public: + UICheckBoxDefaultBehaviorTest(); + ~UICheckBoxDefaultBehaviorTest(); + bool init(); + +protected: + UI_SCENE_CREATE_FUNC(UICheckBoxDefaultBehaviorTest) + Text* _displayValueLabel; +}; + #endif /* defined(__TestCpp__UICheckBoxTest__) */ diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp index bbb8e31605..67ab74a09c 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest.cpp @@ -755,25 +755,25 @@ bool UILayoutComponent_Berth_Test::init() if (UILayoutComponentTest::init()) { Sprite* leftTopSprite = Sprite::create("cocosui/CloseSelected.png"); - LayoutComponent* leftTop = LayoutComponent::boundingLayoutComponent(leftTopSprite); + LayoutComponent* leftTop = LayoutComponent::bindLayoutComponent(leftTopSprite); leftTop->setHorizontalEdge(LayoutComponent::HorizontalEdge::Left); leftTop->setVerticalEdge(LayoutComponent::VerticalEdge::Top); _baseLayer->addChild(leftTopSprite); Sprite* leftBottomSprite = Sprite::create("cocosui/CloseSelected.png"); - LayoutComponent* leftBottom = LayoutComponent::boundingLayoutComponent(leftBottomSprite); + LayoutComponent* leftBottom = LayoutComponent::bindLayoutComponent(leftBottomSprite); leftBottom->setHorizontalEdge(LayoutComponent::HorizontalEdge::Left); leftBottom->setVerticalEdge(LayoutComponent::VerticalEdge::Bottom); _baseLayer->addChild(leftBottomSprite); Sprite* rightTopSprite = Sprite::create("cocosui/CloseSelected.png"); - LayoutComponent* rightTop = LayoutComponent::boundingLayoutComponent(rightTopSprite); + LayoutComponent* rightTop = LayoutComponent::bindLayoutComponent(rightTopSprite); rightTop->setHorizontalEdge(LayoutComponent::HorizontalEdge::Right); rightTop->setVerticalEdge(LayoutComponent::VerticalEdge::Top); _baseLayer->addChild(rightTopSprite); Sprite* rightBottomSprite = Sprite::create("cocosui/CloseSelected.png"); - LayoutComponent* rightBottom = LayoutComponent::boundingLayoutComponent(rightBottomSprite); + LayoutComponent* rightBottom = LayoutComponent::bindLayoutComponent(rightBottomSprite); rightBottom->setHorizontalEdge(LayoutComponent::HorizontalEdge::Right); rightBottom->setVerticalEdge(LayoutComponent::VerticalEdge::Bottom); _baseLayer->addChild(rightBottomSprite); @@ -791,7 +791,7 @@ bool UILayoutComponent_Berth_Stretch_Test::init() { ImageView* leftTopSprite = ImageView::create("cocosui/CloseSelected.png"); leftTopSprite->ignoreContentAdaptWithSize(false); - LayoutComponent* leftTop = LayoutComponent::boundingLayoutComponent(leftTopSprite); + LayoutComponent* leftTop = LayoutComponent::bindLayoutComponent(leftTopSprite); leftTop->setHorizontalEdge(LayoutComponent::HorizontalEdge::Left); leftTop->setVerticalEdge(LayoutComponent::VerticalEdge::Top); leftTop->setStretchWidthEnabled(true); @@ -803,7 +803,7 @@ bool UILayoutComponent_Berth_Stretch_Test::init() ImageView* leftBottomSprite = ImageView::create("cocosui/CloseSelected.png"); leftBottomSprite->ignoreContentAdaptWithSize(false); - LayoutComponent* leftBottom = LayoutComponent::boundingLayoutComponent(leftBottomSprite); + LayoutComponent* leftBottom = LayoutComponent::bindLayoutComponent(leftBottomSprite); leftBottom->setHorizontalEdge(LayoutComponent::HorizontalEdge::Left); leftBottom->setVerticalEdge(LayoutComponent::VerticalEdge::Bottom); leftBottom->setStretchWidthEnabled(true); @@ -815,7 +815,7 @@ bool UILayoutComponent_Berth_Stretch_Test::init() ImageView* rightTopSprite = ImageView::create("cocosui/CloseSelected.png"); rightTopSprite->ignoreContentAdaptWithSize(false); - LayoutComponent* rightTop = LayoutComponent::boundingLayoutComponent(rightTopSprite); + LayoutComponent* rightTop = LayoutComponent::bindLayoutComponent(rightTopSprite); rightTop->setHorizontalEdge(LayoutComponent::HorizontalEdge::Right); rightTop->setVerticalEdge(LayoutComponent::VerticalEdge::Top); rightTop->setStretchWidthEnabled(true); @@ -827,7 +827,7 @@ bool UILayoutComponent_Berth_Stretch_Test::init() ImageView* rightBottomSprite = ImageView::create("cocosui/CloseSelected.png"); rightBottomSprite->ignoreContentAdaptWithSize(false); - LayoutComponent* rightBottom = LayoutComponent::boundingLayoutComponent(rightBottomSprite); + LayoutComponent* rightBottom = LayoutComponent::bindLayoutComponent(rightBottomSprite); rightBottom->setHorizontalEdge(LayoutComponent::HorizontalEdge::Right); rightBottom->setVerticalEdge(LayoutComponent::VerticalEdge::Bottom); rightBottom->setStretchWidthEnabled(true); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp index cc2e483b32..4e8be76776 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UILayoutTest/UILayoutTest_Editor.cpp @@ -1235,7 +1235,7 @@ void UILayoutComponentTest_Editor::configureGUIScene() Text* back_label = Text::create("Back", "", 20); back_label->setTouchEnabled(true); - auto labelLayout = LayoutComponent::boundingLayoutComponent(back_label); + auto labelLayout = LayoutComponent::bindLayoutComponent(back_label); labelLayout->setHorizontalEdge(LayoutComponent::HorizontalEdge::Right); labelLayout->setVerticalEdge(LayoutComponent::VerticalEdge::Bottom); back_label->addTouchEventListener(CC_CALLBACK_2(UIScene_Editor::toGUIEditorTestScene, this)); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.cpp index 871c626e9b..1eea8a741a 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.cpp @@ -45,13 +45,18 @@ static const char* s_testArray[] = "UIButtonIgnoreContentSizeTest", "UIButtonTitleEffectTest", "UIButtonFlipTest", + "UIButtonNormalDefaultTest", + "UIButtonDisableDefaultTest", #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) "UIEditBoxTest", #endif "UICheckBoxTest", + "UICheckBoxDefaultBehaviorTest", "UISliderTest", "UISliderTest_Scale9", + "UISliderNormalDefaultTest", + "UISliderDisabledDefaultTest", "UIImageViewTest", "UIImageViewTest_Scale9", @@ -225,14 +230,25 @@ Scene *UISceneManager::currentUIScene() return UIButtonTitleEffectTest::sceneWithTitle(s_testArray[_currentUISceneId]); case kUIButtonFlipTest: return UIButtonFlipTest::sceneWithTitle(s_testArray[_currentUISceneId]); + case kUIButtonNormalDefaultTest: + return UIButtonNormalDefaultTest::sceneWithTitle(s_testArray[_currentUISceneId]); + case kUIButtonDisableDefaultTest: + return UIButtonDisableDefaultTest::sceneWithTitle(s_testArray[_currentUISceneId]); + case kUICheckBoxTest: return UICheckBoxTest::sceneWithTitle(s_testArray[_currentUISceneId]); + case kUICheckBoxDefaultBehaviorTest: + return UICheckBoxDefaultBehaviorTest::sceneWithTitle(s_testArray[_currentUISceneId]); case kUISliderTest: return UISliderTest::sceneWithTitle(s_testArray[_currentUISceneId]); case kUISliderTest_Scale9: return UISliderTest_Scale9::sceneWithTitle(s_testArray[_currentUISceneId]); + case kUISliderNormalDefaultTest: + return UISliderNormalDefaultTest::sceneWithTitle(s_testArray[_currentUISceneId]); + case kUISliderDisabledDefaultTest: + return UISliderDisabledDefaultTest::sceneWithTitle(s_testArray[_currentUISceneId]); case kUIImageViewTest: return UIImageViewTest::sceneWithTitle(s_testArray[_currentUISceneId]); diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.h index 7b7dd1edd8..d50545ff7d 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISceneManager.h @@ -42,12 +42,17 @@ enum kUIButtonIgnoreContentSizeTest, kUIButtonTitleEffectTest, kUIButtonFlipTest, + kUIButtonNormalDefaultTest, + kUIButtonDisableDefaultTest, #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_TIZEN) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) kUIEditBoxTest, #endif kUICheckBoxTest, + kUICheckBoxDefaultBehaviorTest, kUISliderTest, kUISliderTest_Scale9, + kUISliderNormalDefaultTest, + kUISliderDisabledDefaultTest, kUIImageViewTest, kUIImageViewTest_Scale9, kUIImageViewTest_ContentSize, diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp index b44118c57d..708f1719da 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.cpp @@ -115,3 +115,115 @@ void UISliderTest_Scale9::sliderEvent(Ref *pSender, Slider::EventType type) _displayValueLabel->setString(String::createWithFormat("Percent %d", percent)->getCString()); } } + + +// UISliderNormalDefaultTest + +UISliderNormalDefaultTest::UISliderNormalDefaultTest() +: _displayValueLabel(nullptr) +{ + +} + +UISliderNormalDefaultTest::~UISliderNormalDefaultTest() +{ +} + +bool UISliderNormalDefaultTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize(); + + // Add a label in which the slider alert will be displayed + _displayValueLabel = Text::create("","Arial",32); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 100)); + _uiLayer->addChild(_displayValueLabel); + + // Add the alert + Text* alert = Text::create("when pressed, the slider ball should scale","fonts/Marker Felt.ttf",20); + alert->setColor(Color3B(159, 168, 176)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f - alert->getContentSize().height * 3.75f)); + _uiLayer->addChild(alert); + + // Create the slider + Slider* slider = Slider::create(); + slider->loadBarTexture("cocosui/sliderTrack.png"); + slider->loadSlidBallTextures("cocosui/sliderThumb.png"); + slider->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f + 50)); + _uiLayer->addChild(slider); + + Slider* sliderScale9 = Slider::create("cocosui/sliderTrack2.png", "cocosui/sliderThumb.png"); + sliderScale9->setScale9Enabled(true); + sliderScale9->setCapInsets(Rect(0, 0, 0, 0)); + sliderScale9->setZoomScale(1.0); + sliderScale9->setContentSize(Size(250.0f, 19)); + sliderScale9->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - 20)); + _uiLayer->addChild(sliderScale9); + + + return true; + } + return false; +} + +// UISliderDisabledDefaultTest + +UISliderDisabledDefaultTest::UISliderDisabledDefaultTest() +: _displayValueLabel(nullptr) +{ + +} + +UISliderDisabledDefaultTest::~UISliderDisabledDefaultTest() +{ +} + +bool UISliderDisabledDefaultTest::init() +{ + if (UIScene::init()) + { + Size widgetSize = _widget->getContentSize(); + + // Add a label in which the slider alert will be displayed + _displayValueLabel = Text::create("","Arial",32); + _displayValueLabel->setAnchorPoint(Vec2(0.5f, -1)); + _displayValueLabel->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f + 100)); + _uiLayer->addChild(_displayValueLabel); + + // Add the alert + Text* alert = Text::create("slider ball should be gray.","fonts/Marker Felt.ttf",20); + alert->setColor(Color3B(159, 168, 176)); + alert->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f - alert->getContentSize().height * 3.75f)); + _uiLayer->addChild(alert); + + // Create the slider + Slider* slider = Slider::create(); + slider->loadBarTexture("cocosui/slidbar.png"); + slider->loadSlidBallTextureNormal("cocosui/sliderballnormal.png"); + slider->setEnabled(false); + slider->setBright(false); + slider->setPosition(Vec2(widgetSize.width / 2.0f, + widgetSize.height / 2.0f + 50)); + _uiLayer->addChild(slider); + + Slider* sliderScale9 = Slider::create("cocosui/slidbar.png", "cocosui/sliderballnormal.png"); + sliderScale9->setScale9Enabled(true); + sliderScale9->setEnabled(false); + sliderScale9->setBright(false); + sliderScale9->setCapInsets(Rect(0, 0, 0, 0)); + sliderScale9->setContentSize(Size(250.0f, 10)); + sliderScale9->setPosition(Vec2(widgetSize.width / 2.0f, widgetSize.height / 2.0f - 20)); + _uiLayer->addChild(sliderScale9); + + + return true; + } + return false; +} + + diff --git a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.h b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.h index d18fec7822..6395f63339 100644 --- a/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.h +++ b/tests/cpp-tests/Classes/UITest/CocoStudioGUITest/UISliderTest/UISliderTest.h @@ -53,4 +53,29 @@ protected: Text* _displayValueLabel; }; + +class UISliderNormalDefaultTest : public UIScene +{ +public: + UISliderNormalDefaultTest(); + ~UISliderNormalDefaultTest(); + bool init(); + +protected: + UI_SCENE_CREATE_FUNC(UISliderNormalDefaultTest) + Text* _displayValueLabel; +}; + +class UISliderDisabledDefaultTest : public UIScene +{ +public: + UISliderDisabledDefaultTest(); + ~UISliderDisabledDefaultTest(); + bool init(); + +protected: + UI_SCENE_CREATE_FUNC(UISliderDisabledDefaultTest) + Text* _displayValueLabel; +}; + #endif /* defined(__TestCpp__UISliderTest__) */ 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/Sprite3DTest/toon.frag b/tests/cpp-tests/Resources/Sprite3DTest/toon.frag index 1c95b8fbfd..aa412d1adf 100644 --- a/tests/cpp-tests/Resources/Sprite3DTest/toon.frag +++ b/tests/cpp-tests/Resources/Sprite3DTest/toon.frag @@ -7,7 +7,7 @@ uniform vec4 u_color; varying vec3 v_normal; void main(void) { - vec3 light_direction = vec3(1,-1,0); + vec3 light_direction = vec3(1,-1,-1); light_direction = normalize(light_direction); vec3 light_color = vec3(1,1,1); vec3 normal = normalize(v_normal); 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 diff --git a/tools/cocos2d-console b/tools/cocos2d-console index 9e918bb278..26b4f825e2 160000 --- a/tools/cocos2d-console +++ b/tools/cocos2d-console @@ -1 +1 @@ -Subproject commit 9e918bb2785d470b1a661b889b8c1715220c9561 +Subproject commit 26b4f825e2d56f8de83e784216f3da8e7cd96c63 diff --git a/tools/tolua/cocos2dx.ini b/tools/tolua/cocos2dx.ini index a612f8cc65..ea95ce748a 100644 --- a/tools/tolua/cocos2dx.ini +++ b/tools/tolua/cocos2dx.ini @@ -35,7 +35,7 @@ classes = New.* Sprite.* Scene Node.* Director Layer.* Menu.* Touch .*Action.* M # will apply to all class names. This is a convenience wildcard to be able to skip similar named # functions from all classes. -skip = Node::[setGLServerState description getUserObject .*UserData getGLServerState .*schedule getPosition$ setContentSize setAnchorPoint enumerateChildren getonEnterTransitionDidFinishCallback getOnEnterCallback getOnExitCallback getonExitTransitionDidStartCallback setAdditionalTransform], +skip = Node::[setGLServerState description getUserObject .*UserData getGLServerState .*schedule getPosition$ setContentSize setAnchorPoint enumerateChildren getonEnterTransitionDidFinishCallback getOnEnterCallback getOnExitCallback getonExitTransitionDidStartCallback setAdditionalTransform setRotationQuat getRotationQuat], Sprite::[getQuad getBlendFunc ^setPosition$ setBlendFunc], SpriteBatchNode::[getBlendFunc setBlendFunc getDescendants], MotionStreak::[getBlendFunc setBlendFunc draw update],