diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..1eca8dcbd --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [SirLynix] +custom: ['https://paypal.me/sirlynixvanfrietjes'] diff --git a/.gitignore b/.gitignore index 5d64539e6..651d85e02 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,9 @@ build/**/*.nativecodeanalysis.all.xml build/**/*.nativecodeanalysis.xml build/**/*.VC.opendb build/**/*.VC.db* +build/**/*.json +build/**/*.sqlite +build/**/*.FileListAbsolute.txt # Compiled Object files build/**/*.slo diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..24e079909 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +Nazara Engine was originally created in early 2012. +It follows a complete overhaul of a previous project in order to offer more features and modularity. + +Jérôme "Lynix" Leclercq - main developper (lynix680@gmail.com) +Full Cycle Games - sponsor and contributor since January 2017. diff --git a/ChangeLog.md b/ChangeLog.md index 410312517..829e42437 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -20,6 +20,8 @@ Miscellaneous: - Fixed .dll copy when building Nazara occuring on Linux when targeting Windows (MinGW) - ⚠ Appveyor nightlies are now compiled with VS2017 - Set libraries' rpath to current folder (.) +- Add ReleaseWithDebug target +- ⚠ **Default font has been changed from Cabin to OpenSans** Nazara Engine: - VertexMapper:GetComponentPtr no longer throw an error if component is disabled or incompatible with template type, instead a null pointer is returned. @@ -55,7 +57,7 @@ Nazara Engine: - Fix RigidBody3D copy constructor not copying all physics states (angular/linear damping/velocity, mass center, position and rotation) - Add RigidBody3D simulation control (via EnableSimulation and IsSimulationEnabled), which allows to disable physics and collisions at will. - Fix some uninitialized values (found by Valgrind) in Network module -- Fix possible infinite recursion when outputting a Thread::Id object +- Fix possible infinite recursion when outputting a Thread::Id object - ⚠️ Replaced implicit conversion from a Nz::String to a std::string by an explicit method ToStdString() - Fix LuaInstance movement constructor/assignment operator which was corrupting Lua memory - Fix potential bug on SocketImpl::Connect (used by TcpClient::Connect) on POSIX platforms @@ -112,7 +114,7 @@ Nazara Engine: - Fixed SocketPoller not be able to recover from some errors (like invalid sockets and such) - Add LuaImplQuery implementation for std::vector - Fixed LuaState::PushGlobal & LuaState::PushField to copy the object before moving it -- ⚠️ Replaced currentBitPos and currentByte fields by [read|write][BitPos][Byte] to handle properly bit reading/writing. +- ⚠️ Replaced currentBitPos and currentByte fields by [read|write][BitPos][Byte] to handle properly bit reading/writing. - InstancedRenderable::SetMaterial methods are now public. - Fixed Model copy constructor not copying materials - ⚠️ Added InstancedRenderable::Clone() method @@ -148,8 +150,8 @@ Nazara Engine: - ⚠️ CullingList now handles full and partial visibility testing - Added math class Angle, capable of handling both degrees and radians angles and converting them to euler angles/quaternions to improve 2D interface. - ⚠️ AbstractSocket::OnStateChange has been replaced by OnStateChanged, which is now called after state has been changed (with oldState and newState as parameters). -- ⚠️ TcpClient::WaitForconnected now returns the new socket state. -- Added TcpClient::PollForConnected +- ⚠️ TcpClient::WaitForconnected now returns the new socket state. +- Added TcpClient::PollForConnected - ⚠️ Use of the new Angle class instead of floating point angle - It is now possible to set elasticity/friction/surface bodies of 2D colliders and change it at runtime on RigidBody2D - ObjectHandle were remade and should be way more optimized now @@ -169,11 +171,57 @@ Nazara Engine: - Fixed TileMap not rendering the right materials if it had no tile using some materials in-between - Added Vector[2|3|4](u)i64 typedefs - Fixed missing static Vector4::DotProduct implementation -- ⚠ **By default, Nazara computes the mass center of all 2D physics object when calling SetGeom** +- ⚠ **By default, Nazara now computes the mass center of all 2D physics object when calling SetGeom** - ⚠ Added Collider2D::ComputeCenterOfMass - Signal now implement a copy constructor and copy assignation operator for convenience - Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception) - ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) +- ⚠ Collider3D::ForEachPolygon now takes a void(Vector3f\*, std::size_t) callback (instead of void(float\*, std::size_t)) +- Added Collider2D::ForEachPolygon method +- Added RigidBody::[Get|Set]PositionOffset allowing set an offset between body logic position and body physics position (center of mass position) +- ⚠ Default TextureSampler WrapMode is now Clamp (instead of Repeat) +- Fixed StateMachine ignoring transitions made in Enter/Leave events of states +- Fixed Material::Configure resetting textures +- ⚠ Renamed TextStyleFlags enum to TextStyle, introduced Flags specialization of TextStyle as TextStyleFlags +- ⚠ Font, FontData and SimpleTextDrawer now use a proper TextStyleFlags instead of a UInt32 +- Almost all Math algorithms are now constexpr +- PhysWorld2D: Fixed callbacks not properly replacing each others when registering twice with the same collisionId (pair) +- ⚠ **Font, FontData and SimpleTextDrawer now supports text outlining.** +- Fixed TextSprite not handling multiple textures well +- ⚠ TextSprite will now use multiple render layers by itself (the current one and the one right before, ex: [-1, 0] if base layer is 0) if you use text outlines. +- ⚠ SimpleTextDrawer no longer supports faux bold rendering +- Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback +- Added x and y mouse position to MouseWheelEvent +- Added SimpleTextDrawer::[Get|Set]MaxLineWidth (which does line wrap) +- TypeTag helper struct now includes a Type using +- GuillotineBinPack::Insert overload taking multiple rectangles no longer does a heap allocation +- StackArray and StackVector now have a default constructor initializing them with no size/capacity +- StackArray and StackVector are now movable +- Fixed RigidBody2D::Copy not copying kinematic/dynamic/static status +- Fixed out-of-bounds access in LuaInstance::LoadLibraries +- Add Flags::Clear(Flags) helper method, to clear one or more flags. +- Add Flags::Clear() helper method, to reset flags +- Add Flags::Set(Flags) helper method, to enable flags +- ⚠ Constraint2D are no longer managed by references and are now handled objects +- ⚠ Removed all Set methods from math classes taking their own type (e.g. Box::Set(Box)) +- Added Matrix4::Decompose +- ⚠ Node::Get[Position|Rotation|Scale] now defaults to local space +- Fixed Node rotation when using a negative scale +- Added HandledObject::OnHandledObjectDestruction signal +- Added physics function to control sleeping behavior +- String::Number is now locale-independent +- Added ENetPeer::GetTotalByte[Received|Sent] +- Added ENetPeer::GetTotalPacketSent +- ⚠ ENetHost::GetTotalReceivedPackets now returns the number of commands received (instead of the number of UDP packets received) +- Added EmptyStream class, useful to measure how many bytes some writing operations will take +- SegmentCollider2D: Add support for neighbors (aka "ghost vertices"), allowing to prevent seams collisions +- ⚠ OBJLoader flips UV by default, fixing a lot of models UV +- On Windows, Thread::Set(Current)Name now uses `SetThreadDescription` Win32 function if possible instead of triggering a debugger exception. MinGW builds will use this if available too. +- ⚠ Removed Texture(const Image\*) constructor, use Texture::LoadFromImage instead +- ⚠ TextDrawers now use floating-point internally and to exposes their Bounds (AbstractTextDrawer::GetBounds() now returns a Rectf) +- Added [SimpleTextDrawer|RichTextDrawer] character and line spacing offset properties +- Added ENetHost::AllowsIncomingConnections(bool) to disable/re-enable server peers connection +- Added ByteArrayPool and PoolByteStream classes Nazara Development Kit: - Added ImageWidget (#139) @@ -217,7 +265,7 @@ Nazara Development Kit: - Fix GraphicsComponent bounding volume not taking local matrix in account - ⚠️ Rewrote all render queue system, which should be more efficient, take scissor box into account - ⚠️ All widgets are now bound to a scissor box when rendering -- Add DebugComponent (a component able to show aabb/obb/collision mesh) +- Add DebugComponent (a component able to show aabb/obb/collision mesh 2D and 3D) - ⚠️ TextAreaWidget now support text selection (WIP) - ⚠️ TextAreaWidget::GetHoveredGlyph now returns a two-dimensional position instead of a single glyph position - Fixed Entity::OnEntityDestruction signal not being properly moved and thus not being called. @@ -246,6 +294,36 @@ Nazara Development Kit: - Add missing `recomputeMoment` parameter to PhysicsComponent2D::SetMass - Added possibility of disabling synchronization between PhysicsComponent2D and NodeComponent - Fixed GraphicsComponent not invalidating render queue on material change (causing crashes or visual errors) +- Added CollisionComponent2D::SetGeomOffset and CollisionComponent2D::Recenter +- Added LifetimeComponent and LifetimeSystem +- Fixed a subtle bug regarding entities invalidation and kill (ex: if an entity #2 kills entity #1 during Entity::Destroy callbacks, entity #1 will survive destruction). +- Added PhysicsSystem2D::[RaycastQuery, RegionQuery] overloads taking a callback +- Added TextAreaWidget support for outline +- Fixed possible crash when disabling BaseWidget background +- Added BaseWidget::OnMouseWheelMoved +- Added Entity::OnEntity[Disabled|Enabled] signals +- Added BaseWidget::SetParent +- BaseWidget::Show will no longer show entities disabled by the widget +- BaseWidget now has a rendering rect property (allowing to tell a widget what part of it will be rendered) +- Added ScrollAreaWidget +- Console has been remade with widgets (allowing to scroll back history, select text, etc.) +- Added TextAreaWidget line wrap option +- TextAreaWidget will now shift the text to the left/right in order to keep the cursor visible +- Added TextAreaWidget::[Get|Set]TextFont +- ⚠️ TextAreaWidget::OnTextAreaCursorMove signal now uses a Vector2ui* position as its second argument (instead of a std::size_t*) +- Added TextAreaWidget::OnTextAreaSelection +- ⚠️ Console class is no longer bound to a LuaState and now has a OnCommand signal +- ⚠️ Made AbstractTextAreaWidget which is inherited by TextAreaWidget +- ⚠️ Added RichTextAreaWidget +- ⚠️ Console now supports text color in history +- Added World::CloneEntity overload taking an EntityHandle const reference, allowing to copy entities from other worlds +- Fixed PhysicsComponent2D copy not copying physics attributes +- Added Entity::DropComponent which detaches a component without necessarily destroying it +- ⚠ ConstraintComponent2D has been reworked to handle entity destruction and remove constraints at will +- Fixed crash when pressing up/down key with no history in the console +- (Rich)TextAreaWidget text style is now alterable +- Added CameraComponent::SetProjectionScale +- Added (Rich)TextAreaWidget character and line spacing offset properties # 0.4: @@ -333,8 +411,8 @@ Nazara Engine: - Added [Nz::TcpClient::SendMultiple](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_tcp_client.html#a495c32beb46ed9192699a3b82d358035) method, allowing to send multiple buffers at once. - Added [Nz::PlacementDestroy](https://nazara.digitalpulsesoftware.net/doc/namespace_nz.html#a27c8667def991fc896c5beff3e62668a). (ea985fa76586762f008e4054938db3234eeaf0cb) - Added [Nz::String::Format](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_string.html#a4b699982e7f9ea38f6d44b43ac1e2040) and [Nz::String::FormatVA](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_string.html#abe0fcbce11224b157ac756b60e8dee92) static methods. (cc6e4127dc6c61799a64404770992cef0804ad34). -- Added [Nz::ParticleGroup::GetBuffer](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_particle_mapper.html#aefe1b251efc8c9b8668842275561be0c) method. (4dc85789b59e50d964c83321dbd4b6485c04bef6) -- Added Nz::ParticleMapper::GetPointer method. (1f4e6c2d1594b7bb9dd6f4ea5480fdd16cf5f208) +- Added [Nz::ParticleGroup::GetBuffer](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_particle_mapper.html#aefe1b251efc8c9b8668842275561be0c) method. (4dc85789b59e50d964c83321dbd4b6485c04bef6) +- Added Nz::ParticleMapper::GetPointer method. (1f4e6c2d1594b7bb9dd6f4ea5480fdd16cf5f208) - ⚠️ Structures provied by ParticleStruct header now have a float life. (472d964d587d906764ad1e05bfcc9ab1bf979483) - Fixed scale property of Nz::TextSprite not affecting its bounding volume. (52b29bac775823294c4ad7de70f4dc3f4adfa743) - ⚠️ Nz:MeshParams::flipUVs has been replaced by texCoordOffset and texCoordScale. (a1a7d908adc060fd7a43491c903dfe3b501d98e5) @@ -361,7 +439,7 @@ Nazara Engine: - All noises classes now uses std::mt19937 as a random number generator, to ensure the same results on every machine. (1f5ea9839016964c173d919263827dee69ecb65d) Nazara Development Kit: -- **Added basic widgets**. (c8a12083b3133e946bf60dd060331a4b4631f8d8) +- **Added basic widgets**. (c8a12083b3133e946bf60dd060331a4b4631f8d8) - VelocitySystem will no longer affect entities with PhysicsComponent2D. (a6853234412c744cdcb28344f02f7b0c92704d77) - Fixed EulerAngles constructor in Lua. (d55149a0a70f6230b6f1c3fb50e37dc82a2feb9f) - Fixed Component::OnDetached not being called on entity destruction. (5b777eb4853639d7aeb232ca46d17f0d432f47ca) @@ -372,7 +450,7 @@ Nazara Engine: Nazara Engine: - Nazara binaries are now compiled with Run-Time Type-Information. (a70acdc8f44010627a65282fd3099202116d3e13) -- Nazara demos are now compiled with relative dependencies on Linux. +- Nazara demos are now compiled with relative dependencies on Linux. (d6fbb4c408d48c4a768fad7b43460c76a0df1777) - Added [**Nz::BitCount**](https://nazara.digitalpulsesoftware.net/doc/group__core.html#ga6bfbcff78eb6cfbe3ddaedcfc8c04196) function. (82e31a3ec8449da6618f41690164c2e1d883edb4) - Added [**Nz::Bitset::AppendBits**](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_bitset.html#a5ca8f365006c86d6d699d02471904f7e) method. (b018a400499a2356c4455a40d9f6a6c12b3cb36b) diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 000000000..05c162982 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,53 @@ +# Installation + +> **Notice**: For french speakers, a more detailed explanation of the instructions is provided here: [Instructions pour compiler](wiki/(FR)-Compiler-le-moteur). + +The first step to using the engine is to recover it. This can currently be done in two ways: +1) This can be don either from the original github (only the development is continuously evolving): +```git clone https://github.com/DigitalPulseSoftware/NazaraEngine.git``` +2) Or by downloading a [zip file](https://github.com/DigitalPulseSoftware/NazaraEngine/archive/master.zip) containing the entire source code of the engine. + +All you have to do is go to the "build/" folder. The compilation system uses [premake](https://premake.github.io/) to generate build systems. + +## Windows +For Windows users, they can directly use ".bat" files such as: "Build_VS2017.bat". It will generate a solution "NazaraEngine.sln" ready to use that you can directly build to produce the libs or execute the samples. + +## Linux + +Linux users, can type: "./premake5-linux64 gmake" or with the additional argument "--cc=clang" to configure the C++ compiler used. + +Some additional libraries will be required for compilation depending on the modules used: + +#### Audio module (OpenAL and libsndfile) + +- with apt: `sudo apt-get install libopenal-dev libsndfile1-dev` +- with pacman: `sudo pacman -S openal libsndfile` + +#### Platform module (Freetype): + +- with apt: `sudo apt-get install libfreetype6-dev` +- with pacman: `sudo pacman -S freetype2` + +#### Utility module (XCB + X11): + +- with apt: `sudo apt-get install libxcb-cursor-dev libxcb-ewmh-dev libxcb-randr0-dev libxcb-icccm4-dev libxcb-keysyms1-dev libx11-dev` +- with pacman: `sudo pacman -S libxcb libx11` + +#### OpenGL renderer module: + +- with apt: `sudo apt-get install mesa-common-dev libgl1-mesa-dev` +- with pacman: `sudo pacman -S mesa` + +#### Plugin Assimp: + +- with apt: `sudo apt-get install libassimp-dev` +- with pacman: `sudo pacman -S assimp` + +#### The one line command to install everything is: + +- with apt: `sudo apt-get install libopenal-dev libsndfile1-dev libfreetype6-dev libxcb-cursor-dev libxcb-ewmh-dev libxcb-randr0-dev libxcb-icccm4-dev libxcb-keysyms1-dev libx11-dev mesa-common-dev libgl1-mesa-dev libassimp-dev` +- with pacman: `sudo pacman -S openal libsndfile freetype2 libxcb libx11 mesa assimp` + +## Test + +One should now be able to execute the samples provided in the folder "NazaraEngine/examples/bin/" or the unit tests within "NazaraEngine/tests/". \ No newline at end of file diff --git a/License-Cabin.txt b/License-Cabin.txt deleted file mode 100644 index ce98ff4b5..000000000 --- a/License-Cabin.txt +++ /dev/null @@ -1,95 +0,0 @@ -Copyright (c) 2011, Pablo Impallari (www.impallari.com|impallari@gmail.com), -Copyright (c) 2011, Igino Marini. (www.ikern.com|mail@iginomarini.com), -with Reserved Font Name Cabin. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/License-OpenSans.txt b/License-OpenSans.txt new file mode 100644 index 000000000..989e2c59e --- /dev/null +++ b/License-OpenSans.txt @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/SDK/include/NDK/Application.hpp b/SDK/include/NDK/Application.hpp index 401f80228..69e97bdce 100644 --- a/SDK/include/NDK/Application.hpp +++ b/SDK/include/NDK/Application.hpp @@ -15,6 +15,7 @@ #include #ifndef NDK_SERVER +#include #include #include #include @@ -81,7 +82,7 @@ namespace Ndk #ifndef NDK_SERVER struct ConsoleOverlay { - std::unique_ptr console; + Console* console; Nz::LuaInstance lua; NazaraSlot(Nz::EventHandler, OnEvent, eventSlot); @@ -114,10 +115,11 @@ namespace Ndk Nz::RenderTarget* renderTarget; std::unique_ptr window; std::unique_ptr console; + std::unique_ptr canvas; std::unique_ptr fpsCounter; std::unique_ptr overlayWorld; }; - + void SetupConsole(WindowInfo& info); void SetupFPSCounter(WindowInfo& info); void SetupOverlay(WindowInfo& info); diff --git a/SDK/include/NDK/Application.inl b/SDK/include/NDK/Application.inl index e01fb2ce4..42139db0c 100644 --- a/SDK/include/NDK/Application.inl +++ b/SDK/include/NDK/Application.inl @@ -112,7 +112,6 @@ namespace Ndk } m_overlayFlags |= OverlayFlags_Console; - } else { diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 0b3bdecb7..f0061aded 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -26,8 +26,6 @@ namespace Ndk friend Canvas; public: - struct Padding; - BaseWidget(BaseWidget* parent); BaseWidget(const BaseWidget&) = delete; BaseWidget(BaseWidget&&) = delete; @@ -41,6 +39,7 @@ namespace Ndk inline void CenterVertical(); void ClearFocus(); + inline void ClearRenderingRect(); void Destroy(); @@ -68,12 +67,15 @@ namespace Ndk inline Nz::Vector2f GetPreferredSize() const; inline float GetPreferredWidth() const; + inline const Nz::Rectf& GetRenderingRect() const; + inline Nz::Vector2f GetSize() const; inline float GetWidth() const; inline std::size_t GetWidgetChildCount() const; bool HasFocus() const; + inline void Hide(); inline bool IsVisible() const; void Resize(const Nz::Vector2f& size); @@ -81,6 +83,7 @@ namespace Ndk void SetBackgroundColor(const Nz::Color& color); void SetCursor(Nz::SystemCursor systemCursor); void SetFocus(); + void SetParent(BaseWidget* widget); inline void SetFixedHeight(float fixedHeight); inline void SetFixedSize(const Nz::Vector2f& fixedSize); @@ -94,6 +97,8 @@ namespace Ndk inline void SetMinimumSize(const Nz::Vector2f& minimumSize); inline void SetMinimumWidth(float minimumWidth); + virtual void SetRenderingRect(const Nz::Rectf& renderingRect); + void Show(bool show = true); BaseWidget& operator=(const BaseWidget&) = delete; @@ -106,6 +111,8 @@ namespace Ndk void InvalidateNode() override; + Nz::Rectf GetScissorRect() const; + virtual bool IsFocusable() const; virtual void OnFocusLost(); virtual void OnFocusReceived(); @@ -115,6 +122,7 @@ namespace Ndk virtual void OnMouseMoved(int x, int y, int deltaX, int deltaY); virtual void OnMouseButtonPress(int x, int y, Nz::Mouse::Button button); virtual void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button); + virtual void OnMouseWheelMoved(int x, int y, float delta); virtual void OnMouseExit(); virtual void OnParentResized(const Nz::Vector2f& newSize); virtual void OnTextEntered(char32_t character, bool repeated); @@ -122,6 +130,8 @@ namespace Ndk inline void SetPreferredSize(const Nz::Vector2f& preferredSize); + virtual void ShowChildren(bool show); + private: inline BaseWidget(); @@ -137,6 +147,10 @@ namespace Ndk struct WidgetEntity { EntityOwner handle; + bool isEnabled = true; + + NazaraSlot(Ndk::Entity, OnEntityDisabled, onDisabledSlot); + NazaraSlot(Ndk::Entity, OnEntityEnabled, onEnabledSlot); }; static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits::max(); @@ -148,6 +162,7 @@ namespace Ndk EntityOwner m_backgroundEntity; WorldHandle m_world; Nz::Color m_backgroundColor; + Nz::Rectf m_renderingRect; Nz::SpriteRef m_backgroundSprite; Nz::SystemCursor m_cursor; Nz::Vector2f m_maximumSize; diff --git a/SDK/include/NDK/BaseWidget.inl b/SDK/include/NDK/BaseWidget.inl index e24b89285..fc8e1f710 100644 --- a/SDK/include/NDK/BaseWidget.inl +++ b/SDK/include/NDK/BaseWidget.inl @@ -5,6 +5,7 @@ #include #include #include +#include namespace Ndk { @@ -12,11 +13,12 @@ namespace Ndk m_canvasIndex(InvalidCanvasIndex), m_canvas(nullptr), m_backgroundColor(Nz::Color(230, 230, 230, 255)), + m_renderingRect(-std::numeric_limits::infinity(), -std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()), m_cursor(Nz::SystemCursor_Default), - m_size(50.f, 50.f), m_maximumSize(std::numeric_limits::infinity()), m_minimumSize(0.f), m_preferredSize(-1), + m_size(50.f, 50.f), m_widgetParent(nullptr), m_visible(true) { @@ -66,6 +68,11 @@ namespace Ndk SetPosition(GetPosition(Nz::CoordSys_Local).x, (parentSize.y - mySize.y) / 2.f); } + inline void BaseWidget::ClearRenderingRect() + { + SetRenderingRect(Nz::Rectf(-std::numeric_limits::infinity(), -std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity())); + } + template inline void BaseWidget::ForEachWidgetChild(F iterator) { @@ -145,6 +152,11 @@ namespace Ndk return m_preferredSize.x; } + inline const Nz::Rectf& BaseWidget::GetRenderingRect() const + { + return m_renderingRect; + } + inline Nz::Vector2f BaseWidget::GetSize() const { return Nz::Vector2f(GetWidth(), GetHeight()); @@ -160,6 +172,11 @@ namespace Ndk return m_children.size(); } + inline void BaseWidget::Hide() + { + return Show(false); + } + inline bool BaseWidget::IsVisible() const { return m_visible; @@ -237,7 +254,7 @@ namespace Ndk { m_preferredSize = preferredSize; - Resize(m_preferredSize); + //Resize(m_preferredSize); } inline bool BaseWidget::IsRegisteredToCanvas() const diff --git a/SDK/include/NDK/Canvas.hpp b/SDK/include/NDK/Canvas.hpp index 4d9e9d05a..e3f381b34 100644 --- a/SDK/include/NDK/Canvas.hpp +++ b/SDK/include/NDK/Canvas.hpp @@ -31,6 +31,9 @@ namespace Ndk Canvas& operator=(const Canvas&) = delete; Canvas& operator=(Canvas&&) = delete; + NazaraSignal(OnUnhandledKeyPressed, const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& /*event*/); + NazaraSignal(OnUnhandledKeyReleased, const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& /*event*/); + protected: inline void ClearKeyboardOwner(std::size_t canvasIndex); @@ -48,8 +51,9 @@ namespace Ndk private: void OnEventMouseButtonPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event); void OnEventMouseButtonRelease(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event); - void OnEventMouseMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseMoveEvent& event); void OnEventMouseLeft(const Nz::EventHandler* eventHandler); + void OnEventMouseMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseMoveEvent& event); + void OnEventMouseWheelMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseWheelEvent& event); void OnEventKeyPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event); void OnEventKeyReleased(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event); void OnEventTextEntered(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::TextEvent& event); @@ -66,8 +70,9 @@ namespace Ndk NazaraSlot(Nz::EventHandler, OnKeyReleased, m_keyReleasedSlot); NazaraSlot(Nz::EventHandler, OnMouseButtonPressed, m_mouseButtonPressedSlot); NazaraSlot(Nz::EventHandler, OnMouseButtonReleased, m_mouseButtonReleasedSlot); - NazaraSlot(Nz::EventHandler, OnMouseMoved, m_mouseMovedSlot); NazaraSlot(Nz::EventHandler, OnMouseLeft, m_mouseLeftSlot); + NazaraSlot(Nz::EventHandler, OnMouseMoved, m_mouseMovedSlot); + NazaraSlot(Nz::EventHandler, OnMouseWheelMoved, m_mouseWheelMovedSlot); NazaraSlot(Nz::EventHandler, OnTextEntered, m_textEnteredSlot); NazaraSlot(Nz::EventHandler, OnTextEdited, m_textEditedSlot); diff --git a/SDK/include/NDK/Canvas.inl b/SDK/include/NDK/Canvas.inl index 8abe9c748..d36acbf0e 100644 --- a/SDK/include/NDK/Canvas.inl +++ b/SDK/include/NDK/Canvas.inl @@ -24,8 +24,9 @@ namespace Ndk m_keyReleasedSlot.Connect(eventHandler.OnKeyReleased, this, &Canvas::OnEventKeyReleased); m_mouseButtonPressedSlot.Connect(eventHandler.OnMouseButtonPressed, this, &Canvas::OnEventMouseButtonPressed); m_mouseButtonReleasedSlot.Connect(eventHandler.OnMouseButtonReleased, this, &Canvas::OnEventMouseButtonRelease); - m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnEventMouseMoved); m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, this, &Canvas::OnEventMouseLeft); + m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnEventMouseMoved); + m_mouseWheelMovedSlot.Connect(eventHandler.OnMouseWheelMoved, this, &Canvas::OnEventMouseWheelMoved); m_textEnteredSlot.Connect(eventHandler.OnTextEntered, this, &Canvas::OnEventTextEntered); m_textEditedSlot.Connect(eventHandler.OnTextEdited, this, &Canvas::OnEventTextEdited); } @@ -59,7 +60,7 @@ namespace Ndk { WidgetEntry& entry = m_widgetEntries[index]; - Nz::Vector3f pos = entry.widget->GetPosition(); + Nz::Vector3f pos = entry.widget->GetPosition(Nz::CoordSys_Global); Nz::Vector2f size = entry.widget->GetSize(); entry.box.Set(pos.x, pos.y, pos.z, size.x, size.y, 1.f); diff --git a/SDK/include/NDK/Components.hpp b/SDK/include/NDK/Components.hpp index 97c15fc7c..cc8c37d93 100644 --- a/SDK/include/NDK/Components.hpp +++ b/SDK/include/NDK/Components.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include diff --git a/SDK/include/NDK/Components/CameraComponent.hpp b/SDK/include/NDK/Components/CameraComponent.hpp index 92fab2e0e..cf835704a 100644 --- a/SDK/include/NDK/Components/CameraComponent.hpp +++ b/SDK/include/NDK/Components/CameraComponent.hpp @@ -43,6 +43,7 @@ namespace Ndk const Nz::Frustumf& GetFrustum() const override; inline unsigned int GetLayer() const; const Nz::Matrix4f& GetProjectionMatrix() const override; + inline const Nz::Vector3f& GetProjectionScale() const; Nz::ProjectionType GetProjectionType() const override; inline const Nz::Vector2f& GetSize() const; const Nz::RenderTarget* GetTarget() const override; @@ -54,6 +55,7 @@ namespace Ndk inline void SetFOV(float fov); void SetLayer(unsigned int layer); + inline void SetProjectionScale(const Nz::Vector3f& scale); inline void SetProjectionType(Nz::ProjectionType projection); inline void SetSize(const Nz::Vector2f& size); inline void SetSize(float width, float height); @@ -99,6 +101,7 @@ namespace Ndk mutable Nz::Recti m_viewport; const Nz::RenderTarget* m_target; Nz::Vector2f m_size; + Nz::Vector3f m_projectionScale; mutable bool m_frustumUpdated; mutable bool m_projectionMatrixUpdated; mutable bool m_viewMatrixUpdated; diff --git a/SDK/include/NDK/Components/CameraComponent.inl b/SDK/include/NDK/Components/CameraComponent.inl index df6d5a2b3..e059a68b1 100644 --- a/SDK/include/NDK/Components/CameraComponent.inl +++ b/SDK/include/NDK/Components/CameraComponent.inl @@ -17,6 +17,7 @@ namespace Ndk m_targetRegion(0.f, 0.f, 1.f, 1.f), m_target(nullptr), m_size(0.f), + m_projectionScale(1.f, 1.f, 1.f), m_frustumUpdated(false), m_projectionMatrixUpdated(false), m_viewMatrixUpdated(false), @@ -43,6 +44,7 @@ namespace Ndk m_targetRegion(camera.m_targetRegion), m_target(nullptr), m_size(camera.m_size), + m_projectionScale(camera.m_projectionScale), m_frustumUpdated(false), m_projectionMatrixUpdated(false), m_viewMatrixUpdated(false), @@ -115,11 +117,19 @@ namespace Ndk return m_layer; } + /*! + * \brief Gets the projection scale of the camera + * \return Projection scale + */ + const Nz::Vector3f& CameraComponent::GetProjectionScale() const + { + return m_projectionScale; + } + /*! * \brief Gets the size of the camera * \return Size of the camera */ - inline const Nz::Vector2f & CameraComponent::GetSize() const { return m_size; @@ -151,12 +161,23 @@ namespace Ndk InvalidateProjectionMatrix(); } + /*! + * \brief Sets the camera projection scale + * + * \param scale New projection scale + */ + inline void CameraComponent::SetProjectionScale(const Nz::Vector3f& scale) + { + m_projectionScale = scale; + + InvalidateProjectionMatrix(); + } + /*! * \brief Sets the projection type of the camera * * \param projectionType Projection type of the camera */ - inline void CameraComponent::SetProjectionType(Nz::ProjectionType projectionType) { m_projectionType = projectionType; diff --git a/SDK/include/NDK/Components/CollisionComponent2D.hpp b/SDK/include/NDK/Components/CollisionComponent2D.hpp index aecdc5197..a5da3b8c2 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.hpp +++ b/SDK/include/NDK/Components/CollisionComponent2D.hpp @@ -20,8 +20,9 @@ namespace Ndk class NDK_API CollisionComponent2D : public Component { - friend class PhysicsSystem2D; friend class ConstraintComponent2D; + friend class PhysicsComponent2D; + friend class PhysicsSystem2D; public: CollisionComponent2D(Nz::Collider2DRef geom = Nz::Collider2DRef()); @@ -30,8 +31,12 @@ namespace Ndk Nz::Rectf GetAABB() const; const Nz::Collider2DRef& GetGeom() const; + const Nz::Vector2f& GetGeomOffset() const; + + void Recenter(const Nz::Vector2f& origin); void SetGeom(Nz::Collider2DRef geom); + void SetGeomOffset(const Nz::Vector2f& geomOffset); CollisionComponent2D& operator=(Nz::Collider2DRef geom); CollisionComponent2D& operator=(CollisionComponent2D&& collision) = default; @@ -40,7 +45,10 @@ namespace Ndk private: void InitializeStaticBody(); + Nz::RigidBody2D* GetRigidBody(); + const Nz::RigidBody2D* GetRigidBody() const; Nz::RigidBody2D* GetStaticBody(); + const Nz::RigidBody2D* GetStaticBody() const; void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; diff --git a/SDK/include/NDK/Components/CollisionComponent2D.inl b/SDK/include/NDK/Components/CollisionComponent2D.inl index b85fe3017..1bc9f0978 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.inl +++ b/SDK/include/NDK/Components/CollisionComponent2D.inl @@ -28,16 +28,6 @@ namespace Ndk { } - /*! - * \brief Gets the collision box representing the entity - * \return The physics collision box - */ - - inline Nz::Rectf CollisionComponent2D::GetAABB() const - { - return m_staticBody->GetAABB(); - } - /*! * \brief Gets the geometry representing the entity * \return A constant reference to the physics geometry @@ -62,13 +52,13 @@ namespace Ndk return *this; } - /*! - * \brief Gets the static body used by the entity - * \return A pointer to the entity - */ - inline Nz::RigidBody2D* CollisionComponent2D::GetStaticBody() { return m_staticBody.get(); } + + inline const Nz::RigidBody2D* CollisionComponent2D::GetStaticBody() const + { + return m_staticBody.get(); + } } diff --git a/SDK/include/NDK/Components/ConstraintComponent2D.hpp b/SDK/include/NDK/Components/ConstraintComponent2D.hpp index 23fcfe4c8..652559481 100644 --- a/SDK/include/NDK/Components/ConstraintComponent2D.hpp +++ b/SDK/include/NDK/Components/ConstraintComponent2D.hpp @@ -1,13 +1,18 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + #pragma once #ifndef NDK_COMPONENTS_CONSTRAINTCOMPONENT2D_HPP #define NDK_COMPONENTS_CONSTRAINTCOMPONENT2D_HPP -#include #include #include -#include +#include +#include #include +#include namespace Ndk { @@ -19,16 +24,24 @@ namespace Ndk { public: ConstraintComponent2D() = default; - ConstraintComponent2D(const ConstraintComponent2D& joint) = default; + ConstraintComponent2D(const ConstraintComponent2D& joint); ConstraintComponent2D(ConstraintComponent2D&& joint) = default; - template inline Nz::ObjectRef CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args&&... args); - + template T* CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args&&... args); + bool RemoveConstraint(Nz::Constraint2D* constraint); + static ComponentIndex componentIndex; private: + struct ConstraintData + { + std::unique_ptr constraint; - std::vector m_constraints; + NazaraSlot(Ndk::Entity, OnEntityDestruction, onBodyADestruction); + NazaraSlot(Ndk::Entity, OnEntityDestruction, onBodyBDestruction); + }; + + std::vector m_constraints; }; } diff --git a/SDK/include/NDK/Components/ConstraintComponent2D.inl b/SDK/include/NDK/Components/ConstraintComponent2D.inl index 51e64ba6e..5db943439 100644 --- a/SDK/include/NDK/Components/ConstraintComponent2D.inl +++ b/SDK/include/NDK/Components/ConstraintComponent2D.inl @@ -1,3 +1,7 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + #include #include #include @@ -5,7 +9,7 @@ namespace Ndk { template - Nz::ObjectRef ConstraintComponent2D::CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args && ...args) + T* ConstraintComponent2D::CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args&& ...args) { auto FetchBody = [](const Ndk::EntityHandle& entity) -> Nz::RigidBody2D* { @@ -23,9 +27,20 @@ namespace Ndk Nz::RigidBody2D* secondBody = FetchBody(second); NazaraAssert(secondBody, "Second entity has no CollisionComponent2D nor PhysicsComponent2D component"); - Nz::ObjectRef constraint = T::New(*firstBody, *secondBody, std::forward(args)...); - m_constraints.push_back(constraint); + m_constraints.emplace_back(); + auto& constraintData = m_constraints.back(); + constraintData.constraint = std::make_unique(*firstBody, *secondBody, std::forward(args)...); - return constraint; + constraintData.onBodyADestruction.Connect(first->OnEntityDestruction, [this, constraint = constraintData.constraint.get()](const Ndk::Entity* /*entity*/) + { + RemoveConstraint(constraint); + }); + + constraintData.onBodyBDestruction.Connect(second->OnEntityDestruction, [this, constraint = constraintData.constraint.get()](const Ndk::Entity* /*entity*/) + { + RemoveConstraint(constraint); + }); + + return static_cast(constraintData.constraint.get()); } } diff --git a/SDK/include/NDK/Components/DebugComponent.hpp b/SDK/include/NDK/Components/DebugComponent.hpp index 206f85724..e0993d26d 100644 --- a/SDK/include/NDK/Components/DebugComponent.hpp +++ b/SDK/include/NDK/Components/DebugComponent.hpp @@ -16,7 +16,7 @@ namespace Ndk { enum class DebugDraw { - //TODO: Collider2D + Collider2D, Collider3D, GraphicsAABB, GraphicsOBB, @@ -41,6 +41,7 @@ namespace Ndk constexpr DebugDrawFlags DebugDraw_None = 0; class DebugComponent; + class GraphicsComponent; using DebugComponentHandle = Nz::ObjectHandle; @@ -65,8 +66,14 @@ namespace Ndk static ComponentIndex componentIndex; private: + void DetachDebugRenderables(GraphicsComponent& gfxComponent); + inline const Nz::InstancedRenderableRef& GetDebugRenderable(DebugDraw option) const; inline DebugDrawFlags GetEnabledFlags() const; + + void OnComponentDetached(BaseComponent& component) override; + void OnDetached() override; + inline void UpdateDebugRenderable(DebugDraw option, Nz::InstancedRenderableRef renderable); inline void UpdateEnabledFlags(DebugDrawFlags flags); diff --git a/SDK/include/NDK/Components/LifetimeComponent.hpp b/SDK/include/NDK/Components/LifetimeComponent.hpp new file mode 100644 index 000000000..72004a90d --- /dev/null +++ b/SDK/include/NDK/Components/LifetimeComponent.hpp @@ -0,0 +1,40 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_COMPONENTS_LIFETIMECOMPONENT_HPP +#define NDK_COMPONENTS_LIFETIMECOMPONENT_HPP + +#include + +namespace Ndk +{ + class LifetimeComponent; + + using LifetimeComponentHandle = Nz::ObjectHandle; + + class NDK_API LifetimeComponent : public Component + { + friend class LifetimeSystem; + + public: + inline LifetimeComponent(float lifetime); + LifetimeComponent(const LifetimeComponent&) = default; + ~LifetimeComponent() = default; + + inline float GetRemainingTime() const; + + static ComponentIndex componentIndex; + + private: + inline bool UpdateLifetime(float elapsedTime); + + float m_lifetime; + }; +} + +#include + +#endif // NDK_COMPONENTS_LIFETIMECOMPONENT_HPP diff --git a/SDK/include/NDK/Components/LifetimeComponent.inl b/SDK/include/NDK/Components/LifetimeComponent.inl new file mode 100644 index 000000000..145e160ba --- /dev/null +++ b/SDK/include/NDK/Components/LifetimeComponent.inl @@ -0,0 +1,24 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline LifetimeComponent::LifetimeComponent(float lifetime) : + m_lifetime(lifetime) + { + } + + inline float Ndk::LifetimeComponent::GetRemainingTime() const + { + return m_lifetime; + } + + inline bool LifetimeComponent::UpdateLifetime(float elapsedTime) + { + m_lifetime -= elapsedTime; + return m_lifetime < 0.f; + } +} diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 93383d707..3983c26a5 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -40,6 +40,7 @@ namespace Ndk inline void EnableNodeSynchronization(bool nodeSynchronization); + inline void ForceSleep(); inline void ForEachArbiter(const std::function& callback); inline Nz::Rectf GetAABB() const; @@ -83,10 +84,15 @@ namespace Ndk inline void UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime); + inline void Wakeup(); + static ComponentIndex componentIndex; private: + inline void ApplyPhysicsState(Nz::RigidBody2D& rigidBody) const; + inline void CopyPhysicsState(const Nz::RigidBody2D& rigidBody); Nz::RigidBody2D* GetRigidBody(); + const Nz::RigidBody2D* GetRigidBody() const; void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; @@ -94,7 +100,27 @@ namespace Ndk void OnDetached() override; void OnEntityDestruction() override; + struct PendingPhysObjectStates + { + struct ShapeStates + { + Nz::Vector2f surfaceVelocity; + float elasticity; + float friction; + }; + + VelocityFunc velocityFunc; + std::vector shapes; + Nz::RadianAnglef angularVelocity; + Nz::Vector2f massCenter; + Nz::Vector2f velocity; + bool valid = false; + float mass; + float momentOfInertia; + }; + std::unique_ptr m_object; + PendingPhysObjectStates m_pendingStates; bool m_nodeSynchronizationEnabled; }; } diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index f30dd8618..53e01480e 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -20,10 +20,10 @@ namespace Ndk * * \param physics PhysicsComponent2D to copy */ - inline PhysicsComponent2D::PhysicsComponent2D(const PhysicsComponent2D& physics) + inline PhysicsComponent2D::PhysicsComponent2D(const PhysicsComponent2D& physics) : + m_nodeSynchronizationEnabled(physics.m_nodeSynchronizationEnabled) { - // No copy of physical object (because we only create it when attached to an entity) - NazaraUnused(physics); + CopyPhysicsState(*physics.GetRigidBody()); } /*! @@ -138,6 +138,16 @@ namespace Ndk m_entity->Invalidate(); } + /*! + TODO + */ + inline void PhysicsComponent2D::ForceSleep() + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->ForceSleep(); + } + /*! TODO */ @@ -649,6 +659,57 @@ namespace Ndk m_object->UpdateVelocity(gravity, damping, deltaTime); } + /*! + TODO + */ + inline void PhysicsComponent2D::Wakeup() + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->Wakeup(); + } + + inline void PhysicsComponent2D::ApplyPhysicsState(Nz::RigidBody2D& rigidBody) const + { + assert(m_pendingStates.valid); + + rigidBody.SetAngularVelocity(m_pendingStates.angularVelocity); + rigidBody.SetMass(m_pendingStates.mass); + rigidBody.SetMassCenter(m_pendingStates.massCenter); + rigidBody.SetMomentOfInertia(m_pendingStates.momentOfInertia); + rigidBody.SetVelocity(m_pendingStates.velocity); + rigidBody.SetVelocityFunction(m_pendingStates.velocityFunc); + + for (std::size_t i = 0; i < m_pendingStates.shapes.size(); ++i) + { + auto& shapeData = m_pendingStates.shapes[i]; + rigidBody.SetElasticity(i, shapeData.elasticity); + rigidBody.SetFriction(i, shapeData.friction); + rigidBody.SetSurfaceVelocity(i, shapeData.surfaceVelocity); + } + } + + inline void PhysicsComponent2D::CopyPhysicsState(const Nz::RigidBody2D& rigidBody) + { + m_pendingStates.valid = true; + + m_pendingStates.angularVelocity = rigidBody.GetAngularVelocity(); + m_pendingStates.mass = rigidBody.GetMass(); + m_pendingStates.massCenter = rigidBody.GetMassCenter(); + m_pendingStates.momentOfInertia = rigidBody.GetMomentOfInertia(); + m_pendingStates.velocity = rigidBody.GetVelocity(); + m_pendingStates.velocityFunc = rigidBody.GetVelocityFunction(); + + m_pendingStates.shapes.resize(rigidBody.GetShapeCount()); + for (std::size_t i = 0; i < m_pendingStates.shapes.size(); ++i) + { + auto& shapeData = m_pendingStates.shapes[i]; + shapeData.elasticity = rigidBody.GetElasticity(i); + shapeData.friction = rigidBody.GetFriction(i); + shapeData.surfaceVelocity = rigidBody.GetSurfaceVelocity(i); + } + } + /*! * \brief Gets the underlying physics object * \return A reference to the physics object @@ -657,4 +718,9 @@ namespace Ndk { return m_object.get(); } + + inline const Nz::RigidBody2D* PhysicsComponent2D::GetRigidBody() const + { + return m_object.get(); + } } diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 728cbcbb0..3b4dbbe39 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -14,24 +14,29 @@ #include #include #include +#include #include namespace Nz { - class LuaState; struct WindowEvent; } namespace Ndk { + class AbstractTextAreaWidget; class Console; + class Entity; + class RichTextAreaWidget; + class ScrollAreaWidget; + class TextAreaWidget; using ConsoleHandle = Nz::ObjectHandle; - class NDK_API Console : public Nz::Node, public Nz::HandledObject + class NDK_API Console : public BaseWidget, public Nz::HandledObject { public: - Console(World& world, const Nz::Vector2f& size, Nz::LuaState& state); + Console(BaseWidget* parent); Console(const Console& console) = delete; Console(Console&& console) = default; ~Console() = default; @@ -39,34 +44,25 @@ namespace Ndk void AddLine(const Nz::String& text, const Nz::Color& color = Nz::Color::White); void Clear(); + void ClearFocus(); inline unsigned int GetCharacterSize() const; - inline const EntityHandle& GetHistory() const; - inline const EntityHandle& GetHistoryBackground() const; - inline const EntityHandle& GetInput() const; - inline const EntityHandle& GetInputBackground() const; - inline const Nz::Vector2f& GetSize() const; + inline const RichTextAreaWidget* GetHistory() const; + inline const TextAreaWidget* GetInput() const; inline const Nz::FontRef& GetTextFont() const; - inline bool IsVisible() const; - - void SendCharacter(char32_t character); - void SendEvent(const Nz::WindowEvent& event); - void SetCharacterSize(unsigned int size); - void SetSize(const Nz::Vector2f& size); + void SetFocus(); void SetTextFont(Nz::FontRef font); - void Show(bool show = true); - Console& operator=(const Console& console) = delete; Console& operator=(Console&& console) = default; + NazaraSignal(OnCommand, Console* /*console*/, const Nz::String& /*command*/); + private: - void AddLineInternal(const Nz::String& text, const Nz::Color& color = Nz::Color::White); - void ExecuteInput(); - void Layout(); - void RefreshHistory(); + void ExecuteInput(const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction); + void Layout() override; struct Line { @@ -77,20 +73,10 @@ namespace Ndk std::size_t m_historyPosition; std::vector m_commandHistory; std::vector m_historyLines; - EntityOwner m_historyBackground; - EntityOwner m_history; - EntityOwner m_input; - EntityOwner m_inputBackground; + ScrollAreaWidget* m_historyArea; + RichTextAreaWidget* m_history; + TextAreaWidget* m_input; Nz::FontRef m_defaultFont; - Nz::LuaState& m_state; - Nz::SpriteRef m_historyBackgroundSprite; - Nz::SpriteRef m_inputBackgroundSprite; - Nz::SimpleTextDrawer m_historyDrawer; - Nz::SimpleTextDrawer m_inputDrawer; - Nz::TextSpriteRef m_historyTextSprite; - Nz::TextSpriteRef m_inputTextSprite; - Nz::Vector2f m_size; - bool m_opened; unsigned int m_characterSize; unsigned int m_maxHistoryLines; }; diff --git a/SDK/include/NDK/Console.inl b/SDK/include/NDK/Console.inl index 746616ffd..3cd318ae3 100644 --- a/SDK/include/NDK/Console.inl +++ b/SDK/include/NDK/Console.inl @@ -19,51 +19,21 @@ namespace Ndk * \return History of the console */ - inline const EntityHandle& Console::GetHistory() const + inline const RichTextAreaWidget* Console::GetHistory() const { return m_history; } - /*! - * \brief Gets the entity representing the background of the console's history - * \return Background history of the console - */ - - inline const EntityHandle& Console::GetHistoryBackground() const - { - return m_historyBackground; - } - /*! * \brief Gets the entity representing the input of the console * \return Input of the console */ - inline const EntityHandle& Console::GetInput() const + inline const TextAreaWidget* Console::GetInput() const { return m_input; } - /*! - * \brief Gets the entity representing the background of the console's input - * \return Background input of the console - */ - - inline const EntityHandle& Console::GetInputBackground() const - { - return m_inputBackground; - } - - /*! - * \brief Gets the size of the console - * \return Size (Width, Height) of the console - */ - - inline const Nz::Vector2f& Console::GetSize() const - { - return m_size; - } - /*! * \brief Gets the font used by the console * \return A reference to the font currenty used @@ -73,14 +43,4 @@ namespace Ndk { return m_defaultFont; } - - /*! - * \brief Checks whether the console is visible - * \return true If it is the case - */ - - inline bool Console::IsVisible() const - { - return m_opened; - } } diff --git a/SDK/include/NDK/Entity.hpp b/SDK/include/NDK/Entity.hpp index 43a4a43c7..85e43da19 100644 --- a/SDK/include/NDK/Entity.hpp +++ b/SDK/include/NDK/Entity.hpp @@ -43,6 +43,10 @@ namespace Ndk const EntityHandle& Clone() const; inline void Disable(); + + std::unique_ptr DropComponent(ComponentIndex index); + template std::unique_ptr DropComponent(); + void Enable(bool enable = true); inline BaseComponent& GetComponent(ComponentIndex index); @@ -74,6 +78,8 @@ namespace Ndk Entity& operator=(Entity&&) = delete; NazaraSignal(OnEntityDestruction, Entity* /*entity*/); + NazaraSignal(OnEntityDisabled, Entity* /*entity*/); + NazaraSignal(OnEntityEnabled, Entity* /*entity*/); private: Entity(World* world, EntityId id); @@ -81,8 +87,6 @@ namespace Ndk void Create(); void Destroy(); - void DestroyComponent(ComponentIndex index); - inline Nz::Bitset<>& GetRemovedComponentBits(); inline void RegisterEntityList(EntityList* list); diff --git a/SDK/include/NDK/Entity.inl b/SDK/include/NDK/Entity.inl index 7b8fa5736..799384182 100644 --- a/SDK/include/NDK/Entity.inl +++ b/SDK/include/NDK/Entity.inl @@ -64,6 +64,15 @@ namespace Ndk * \remark Produces a NazaraAssert if component is not available in this entity */ + template + std::unique_ptr Entity::DropComponent() + { + static_assert(std::is_base_of::value, "ComponentType is not a component"); + + ComponentIndex index = GetComponentIndex(); + return DropComponent(index); + } + template ComponentType& Entity::GetComponent() { diff --git a/SDK/include/NDK/EntityList.hpp b/SDK/include/NDK/EntityList.hpp index 0f89d0cad..3b4f1580a 100644 --- a/SDK/include/NDK/EntityList.hpp +++ b/SDK/include/NDK/EntityList.hpp @@ -55,7 +55,7 @@ namespace Ndk World* m_world; }; - class NDK_API EntityList::iterator : public std::iterator + class NDK_API EntityList::iterator { friend EntityList; @@ -73,6 +73,12 @@ namespace Ndk friend inline void swap(iterator& lhs, iterator& rhs); + using difference_type = std::ptrdiff_t; + using iterator_category = std::forward_iterator_tag; + using pointer = EntityHandle*; + using reference = EntityHandle&; + using value_type = EntityHandle; + private: inline iterator(const EntityList* world, std::size_t nextId); diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index e2b1095dc..01c797e89 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -125,14 +125,14 @@ namespace Nz state.Pop(); } - mat->Set(values); + *mat = Matrix4d(values); return 1; } default: { if (state.IsOfType(index, "Matrix4")) - mat->Set(*static_cast(state.ToUserdata(index))); + *mat = *static_cast(state.ToUserdata(index)); return 1; } diff --git a/SDK/include/NDK/StateMachine.inl b/SDK/include/NDK/StateMachine.inl index 1b2a625ab..ba2a74928 100644 --- a/SDK/include/NDK/StateMachine.inl +++ b/SDK/include/NDK/StateMachine.inl @@ -159,8 +159,13 @@ namespace Ndk */ inline bool StateMachine::Update(float elapsedTime) { - for (StateTransition& transition : m_transitions) + // Use a classic for instead of a range-for because some state may push/pop on enter/leave, adding new transitions as we iterate + // (range-for is a problem here because it doesn't handle mutable containers) + + for (std::size_t i = 0; i < m_transitions.size(); ++i) { + StateTransition& transition = m_transitions[i]; + switch (transition.type) { case TransitionType::Pop: diff --git a/SDK/include/NDK/Systems.hpp b/SDK/include/NDK/Systems.hpp index 80571ef45..e9a60f0c3 100644 --- a/SDK/include/NDK/Systems.hpp +++ b/SDK/include/NDK/Systems.hpp @@ -6,6 +6,7 @@ #define NDK_SYSTEMS_GLOBAL_HPP #include +#include #include #include #include diff --git a/SDK/include/NDK/Systems/DebugSystem.hpp b/SDK/include/NDK/Systems/DebugSystem.hpp index 3dd186f36..1d468ea41 100644 --- a/SDK/include/NDK/Systems/DebugSystem.hpp +++ b/SDK/include/NDK/Systems/DebugSystem.hpp @@ -22,20 +22,24 @@ namespace Ndk DebugSystem(); ~DebugSystem() = default; + void EnableDepthBuffer(bool enable); + + inline bool IsDepthBufferEnabled() const; + static SystemIndex systemIndex; private: Nz::InstancedRenderableRef GenerateBox(Nz::Boxf box); + Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset); Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity); + std::pair GetBoxMesh(); Nz::MaterialRef GetCollisionMaterial(); Nz::MaterialRef GetGlobalAABBMaterial(); Nz::MaterialRef GetLocalAABBMaterial(); Nz::MaterialRef GetOBBMaterial(); - std::pair GetBoxMesh(); void OnEntityValidation(Entity* entity, bool justAdded) override; - void OnUpdate(float elapsedTime) override; Nz::MaterialRef m_globalAabbMaterial; @@ -44,6 +48,7 @@ namespace Ndk Nz::MaterialRef m_obbMaterial; Nz::IndexBufferRef m_boxMeshIndexBuffer; Nz::VertexBufferRef m_boxMeshVertexBuffer; + bool m_isDepthBufferEnabled; }; } diff --git a/SDK/include/NDK/Systems/DebugSystem.inl b/SDK/include/NDK/Systems/DebugSystem.inl index b7439fc12..b72b87f3f 100644 --- a/SDK/include/NDK/Systems/DebugSystem.inl +++ b/SDK/include/NDK/Systems/DebugSystem.inl @@ -4,3 +4,10 @@ #include +namespace Ndk +{ + inline bool DebugSystem::IsDepthBufferEnabled() const + { + return m_isDepthBufferEnabled; + } +} diff --git a/SDK/include/NDK/Systems/LifetimeSystem.hpp b/SDK/include/NDK/Systems/LifetimeSystem.hpp new file mode 100644 index 000000000..9957c1b53 --- /dev/null +++ b/SDK/include/NDK/Systems/LifetimeSystem.hpp @@ -0,0 +1,29 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_SYSTEMS_LIFETIMESYSTEM_HPP +#define NDK_SYSTEMS_LIFETIMESYSTEM_HPP + +#include + +namespace Ndk +{ + class NDK_API LifetimeSystem : public System + { + public: + LifetimeSystem(); + ~LifetimeSystem() = default; + + static SystemIndex systemIndex; + + private: + void OnUpdate(float elapsedTime) override; + }; +} + +#include + +#endif // NDK_SYSTEMS_LIFETIMESYSTEM_HPP diff --git a/SDK/include/NDK/Systems/LifetimeSystem.inl b/SDK/include/NDK/Systems/LifetimeSystem.inl new file mode 100644 index 000000000..5302ce8d0 --- /dev/null +++ b/SDK/include/NDK/Systems/LifetimeSystem.inl @@ -0,0 +1,3 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index a919abbd5..dd10fcd57 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -51,9 +51,11 @@ namespace Ndk bool NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, EntityHandle* nearestBody = nullptr); bool NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, NearestQueryResult* result); + void RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); bool RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos); bool RaycastQueryFirst(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RaycastHit* hitInfo = nullptr); + void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies); void RegisterCallbacks(unsigned int collisionId, Callback callbacks); @@ -63,6 +65,7 @@ namespace Ndk inline void SetGravity(const Nz::Vector2f& gravity); inline void SetIterationCount(std::size_t iterationCount); inline void SetMaxStepCount(std::size_t maxStepCount); + inline void SetSleepTime(float sleepTime); inline void SetStepSize(float stepSize); inline void UseSpatialHash(float cellSize, std::size_t entityCount); diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.inl b/SDK/include/NDK/Systems/PhysicsSystem2D.inl index b8e7c61a2..64870c092 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.inl +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.inl @@ -2,6 +2,8 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp +#include + namespace Ndk { inline float PhysicsSystem2D::GetDamping() const @@ -49,6 +51,11 @@ namespace Ndk GetPhysWorld().SetMaxStepCount(maxStepCount); } + inline void PhysicsSystem2D::SetSleepTime(float sleepTime) + { + GetPhysWorld().SetSleepTime(sleepTime); + } + inline void PhysicsSystem2D::SetStepSize(float stepSize) { GetPhysWorld().SetStepSize(stepSize); diff --git a/SDK/include/NDK/Widgets.hpp b/SDK/include/NDK/Widgets.hpp index 26917a4c9..9a36e37a2 100644 --- a/SDK/include/NDK/Widgets.hpp +++ b/SDK/include/NDK/Widgets.hpp @@ -5,12 +5,16 @@ #ifndef NDK_WIDGETS_GLOBAL_HPP #define NDK_WIDGETS_GLOBAL_HPP +#include +#include #include #include #include #include #include #include +#include +#include #include #endif // NDK_WIDGETS_GLOBAL_HPP diff --git a/SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp new file mode 100644 index 000000000..b05f65bce --- /dev/null +++ b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp @@ -0,0 +1,135 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_WIDGETS_ABSTRACTTEXTAREAWIDGET_HPP +#define NDK_WIDGETS_ABSTRACTTEXTAREAWIDGET_HPP + +#include +#include +#include +#include +#include +#include + +namespace Ndk +{ + class NDK_API AbstractTextAreaWidget : public BaseWidget + { + public: + using CharacterFilter = std::function; + + AbstractTextAreaWidget(BaseWidget* parent); + AbstractTextAreaWidget(const AbstractTextAreaWidget&) = delete; + AbstractTextAreaWidget(AbstractTextAreaWidget&&) = default; + ~AbstractTextAreaWidget() = default; + + virtual void Clear(); + + //virtual TextAreaWidget* Clone() const = 0; + + void EnableLineWrap(bool enable = true); + inline void EnableMultiline(bool enable = true); + inline void EnableTabWriting(bool enable = true); + + inline void Erase(std::size_t glyphPosition); + virtual void Erase(std::size_t firstGlyph, std::size_t lastGlyph) = 0; + inline void EraseSelection(); + + inline const CharacterFilter& GetCharacterFilter() const; + inline const Nz::Vector2ui& GetCursorPosition() const; + inline Nz::Vector2ui GetCursorPosition(std::size_t glyphIndex) const; + inline EchoMode GetEchoMode() const; + inline std::size_t GetGlyphIndex() const; + inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const; + inline const Nz::String& GetText() const; + + Nz::Vector2ui GetHoveredGlyph(float x, float y) const; + + inline bool HasSelection() const; + + inline bool IsLineWrapEnabled() const; + inline bool IsMultilineEnabled() const; + inline bool IsReadOnly() const; + inline bool IsTabWritingEnabled() const; + + inline void MoveCursor(int offset); + inline void MoveCursor(const Nz::Vector2i& offset); + + inline Nz::Vector2ui NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const; + + inline void SetCharacterFilter(CharacterFilter filter); + inline void SetCursorPosition(std::size_t glyphIndex); + inline void SetCursorPosition(Nz::Vector2ui cursorPosition); + inline void SetEchoMode(EchoMode echoMode); + inline void SetReadOnly(bool readOnly = true); + inline void SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition); + + inline void Write(const Nz::String& text); + inline void Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition); + virtual void Write(const Nz::String& text, std::size_t glyphPosition) = 0; + + AbstractTextAreaWidget& operator=(const AbstractTextAreaWidget&) = delete; + AbstractTextAreaWidget& operator=(AbstractTextAreaWidget&&) = default; + + NazaraSignal(OnTextAreaCursorMove, const AbstractTextAreaWidget* /*textArea*/, Nz::Vector2ui* /*newCursorPosition*/); + NazaraSignal(OnTextAreaKeyBackspace, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyDown, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyEnd, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyHome, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyLeft, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyReturn, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyRight, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyUp, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaSelection, const AbstractTextAreaWidget* /*textArea*/, Nz::Vector2ui* /*start*/, Nz::Vector2ui* /*end*/); + + protected: + virtual Nz::AbstractTextDrawer& GetTextDrawer() = 0; + virtual const Nz::AbstractTextDrawer& GetTextDrawer() const = 0; + + void Layout() override; + + virtual void HandleIndentation(bool add) = 0; + virtual void HandleSelectionIndentation(bool add) = 0; + virtual void HandleWordCursorMove(bool left) = 0; + + bool IsFocusable() const override; + void OnFocusLost() override; + void OnFocusReceived() override; + bool OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) override; + void OnKeyReleased(const Nz::WindowEvent::KeyEvent& key) override; + void OnMouseButtonPress(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; + void OnMouseButtonRelease(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; + void OnMouseEnter() override; + void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; + void OnTextEntered(char32_t character, bool repeated) override; + + inline void SetCursorPositionInternal(std::size_t glyphIndex); + inline void SetCursorPositionInternal(Nz::Vector2ui cursorPosition); + + void RefreshCursor(); + virtual void UpdateDisplayText() = 0; + void UpdateTextSprite(); + + CharacterFilter m_characterFilter; + EchoMode m_echoMode; + EntityHandle m_cursorEntity; + EntityHandle m_textEntity; + Nz::TextSpriteRef m_textSprite; + Nz::Vector2ui m_cursorPositionBegin; + Nz::Vector2ui m_cursorPositionEnd; + Nz::Vector2ui m_selectionCursor; + std::vector m_cursorSprites; + bool m_isLineWrapEnabled; + bool m_isMouseButtonDown; + bool m_multiLineEnabled; + bool m_readOnly; + bool m_tabEnabled; // writes (Shift+)Tab character if set to true + }; +} + +#include + +#endif // NDK_WIDGETS_ABSTRACTTEXTAREAWIDGET_HPP diff --git a/SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl new file mode 100644 index 000000000..ca40d278b --- /dev/null +++ b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl @@ -0,0 +1,252 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline void AbstractTextAreaWidget::EnableMultiline(bool enable) + { + m_multiLineEnabled = enable; + } + + inline void AbstractTextAreaWidget::EnableTabWriting(bool enable) + { + m_tabEnabled = enable; + } + + inline void AbstractTextAreaWidget::Erase(std::size_t glyphPosition) + { + Erase(glyphPosition, glyphPosition + 1U); + } + + inline void AbstractTextAreaWidget::EraseSelection() + { + if (!HasSelection()) + return; + + Erase(GetGlyphIndex(m_cursorPositionBegin), GetGlyphIndex(m_cursorPositionEnd)); + } + + inline const AbstractTextAreaWidget::CharacterFilter& AbstractTextAreaWidget::GetCharacterFilter() const + { + return m_characterFilter; + } + + inline const Nz::Vector2ui& AbstractTextAreaWidget::GetCursorPosition() const + { + return m_cursorPositionBegin; + } + + Nz::Vector2ui AbstractTextAreaWidget::GetCursorPosition(std::size_t glyphIndex) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + glyphIndex = std::min(glyphIndex, GetTextDrawer().GetGlyphCount()); + + std::size_t lineCount = textDrawer.GetLineCount(); + std::size_t line = 0U; + for (std::size_t i = line + 1; i < lineCount; ++i) + { + if (textDrawer.GetLine(i).glyphIndex > glyphIndex) + break; + + line = i; + } + + const auto& lineInfo = textDrawer.GetLine(line); + + Nz::Vector2ui cursorPos; + cursorPos.y = static_cast(line); + cursorPos.x = static_cast(glyphIndex - lineInfo.glyphIndex); + + return cursorPos; + } + + inline EchoMode AbstractTextAreaWidget::GetEchoMode() const + { + return m_echoMode; + } + + inline std::size_t AbstractTextAreaWidget::GetGlyphIndex() const + { + return GetGlyphIndex(m_cursorPositionBegin); + } + + inline std::size_t AbstractTextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + std::size_t glyphIndex = textDrawer.GetLine(cursorPosition.y).glyphIndex + cursorPosition.x; + if (textDrawer.GetLineCount() > cursorPosition.y + 1) + glyphIndex = std::min(glyphIndex, textDrawer.GetLine(cursorPosition.y + 1).glyphIndex - 1); + else + glyphIndex = std::min(glyphIndex, textDrawer.GetGlyphCount()); + + return glyphIndex; + } + + inline bool AbstractTextAreaWidget::HasSelection() const + { + return m_cursorPositionBegin != m_cursorPositionEnd; + } + + inline bool AbstractTextAreaWidget::IsLineWrapEnabled() const + { + return m_isLineWrapEnabled; + } + + inline bool AbstractTextAreaWidget::IsMultilineEnabled() const + { + return m_multiLineEnabled; + } + + inline bool AbstractTextAreaWidget::IsTabWritingEnabled() const + { + return m_tabEnabled; + } + + inline bool AbstractTextAreaWidget::IsReadOnly() const + { + return m_readOnly; + } + + inline void AbstractTextAreaWidget::MoveCursor(int offset) + { + std::size_t cursorGlyph = GetGlyphIndex(m_cursorPositionBegin); + if (offset >= 0) + SetCursorPosition(cursorGlyph + static_cast(offset)); + else + { + std::size_t nOffset = static_cast(-offset); + if (nOffset >= cursorGlyph) + SetCursorPosition(0); + else + SetCursorPosition(cursorGlyph - nOffset); + } + } + + inline void AbstractTextAreaWidget::MoveCursor(const Nz::Vector2i& offset) + { + auto ClampOffset = [] (unsigned int cursorPosition, int cursorOffset) -> unsigned int + { + if (cursorOffset >= 0) + return cursorPosition + cursorOffset; + else + { + unsigned int nOffset = static_cast(-cursorOffset); + if (nOffset >= cursorPosition) + return 0; + else + return cursorPosition - nOffset; + } + }; + + Nz::Vector2ui cursorPosition = m_cursorPositionBegin; + cursorPosition.x = ClampOffset(static_cast(cursorPosition.x), offset.x); + cursorPosition.y = ClampOffset(static_cast(cursorPosition.y), offset.y); + + SetCursorPosition(cursorPosition); + } + + inline Nz::Vector2ui AbstractTextAreaWidget::NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + std::size_t lineCount = textDrawer.GetLineCount(); + if (cursorPosition.y >= lineCount) + cursorPosition.y = static_cast(lineCount - 1); + + const auto& lineInfo = textDrawer.GetLine(cursorPosition.y); + if (cursorPosition.y + 1 < lineCount) + { + const auto& nextLineInfo = textDrawer.GetLine(cursorPosition.y + 1); + cursorPosition.x = std::min(cursorPosition.x, static_cast(nextLineInfo.glyphIndex - lineInfo.glyphIndex - 1)); + } + + return cursorPosition; + } + + inline void AbstractTextAreaWidget::SetCharacterFilter(CharacterFilter filter) + { + m_characterFilter = std::move(filter); + } + + inline void AbstractTextAreaWidget::SetCursorPosition(std::size_t glyphIndex) + { + Nz::Vector2ui position = GetCursorPosition(glyphIndex); + Nz::Vector2ui newPosition = position; + + OnTextAreaCursorMove(this, &newPosition); + + if (position == newPosition) + SetCursorPositionInternal(position); + else + SetCursorPositionInternal(GetGlyphIndex(newPosition)); + } + + inline void AbstractTextAreaWidget::SetCursorPosition(Nz::Vector2ui cursorPosition) + { + OnTextAreaCursorMove(this, &cursorPosition); + + return SetCursorPositionInternal(NormalizeCursorPosition(cursorPosition)); + } + + inline void AbstractTextAreaWidget::SetEchoMode(EchoMode echoMode) + { + m_echoMode = echoMode; + + UpdateDisplayText(); + } + + inline void AbstractTextAreaWidget::SetReadOnly(bool readOnly) + { + m_readOnly = readOnly; + m_cursorEntity->Enable(!m_readOnly && HasFocus()); + } + + inline void AbstractTextAreaWidget::SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition) + { + // Ensure begin is before end + if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) + std::swap(fromPosition, toPosition); + + if (m_cursorPositionBegin != fromPosition || m_cursorPositionEnd != toPosition) + { + OnTextAreaSelection(this, &fromPosition, &toPosition); + + // Ensure begin is before end a second time (in case signal changed it) + if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) + std::swap(fromPosition, toPosition); + + m_cursorPositionBegin = NormalizeCursorPosition(fromPosition); + m_cursorPositionEnd = NormalizeCursorPosition(toPosition); + + RefreshCursor(); + } + } + + inline void AbstractTextAreaWidget::Write(const Nz::String& text) + { + Write(text, GetGlyphIndex(m_cursorPositionBegin)); + } + + inline void AbstractTextAreaWidget::Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition) + { + Write(text, GetGlyphIndex(glyphPosition)); + } + + void AbstractTextAreaWidget::SetCursorPositionInternal(std::size_t glyphIndex) + { + return SetCursorPositionInternal(GetCursorPosition(glyphIndex)); + } + + inline void AbstractTextAreaWidget::SetCursorPositionInternal(Nz::Vector2ui cursorPosition) + { + m_cursorPositionBegin = cursorPosition; + m_cursorPositionEnd = m_cursorPositionBegin; + + RefreshCursor(); + } +} diff --git a/SDK/include/NDK/Widgets/LabelWidget.inl b/SDK/include/NDK/Widgets/LabelWidget.inl index db3d10a52..cf14ea7d0 100644 --- a/SDK/include/NDK/Widgets/LabelWidget.inl +++ b/SDK/include/NDK/Widgets/LabelWidget.inl @@ -10,7 +10,8 @@ namespace Ndk { m_textSprite->Update(drawer); - SetMinimumSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); - SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + Nz::Vector2f size = Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths()); + SetMinimumSize(size); + SetPreferredSize(size); } } diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp new file mode 100644 index 000000000..a21a233d2 --- /dev/null +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp @@ -0,0 +1,68 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_WIDGETS_RICHTEXTAREAWIDGET_HPP +#define NDK_WIDGETS_RICHTEXTAREAWIDGET_HPP + +#include +#include + +namespace Ndk +{ + class NDK_API RichTextAreaWidget : public AbstractTextAreaWidget + { + public: + RichTextAreaWidget(BaseWidget* parent); + RichTextAreaWidget(const RichTextAreaWidget&) = delete; + RichTextAreaWidget(RichTextAreaWidget&&) = default; + ~RichTextAreaWidget() = default; + + void AppendText(const Nz::String& text); + + void Clear() override; + + void Erase(std::size_t firstGlyph, std::size_t lastGlyph) override; + + inline unsigned int GetCharacterSize() const; + inline float GetCharacterSpacingOffset() const; + inline float GetLineSpacingOffset() const; + inline const Nz::Color& GetTextColor() const; + inline Nz::Font* GetTextFont() const; + inline const Nz::Color& GetTextOutlineColor() const; + inline float GetTextOutlineThickness() const; + inline Nz::TextStyleFlags GetTextStyle() const; + + inline void SetCharacterSize(unsigned int characterSize); + inline void SetCharacterSpacingOffset(float offset); + inline void SetLineSpacingOffset(float offset); + inline void SetTextColor(const Nz::Color& color); + inline void SetTextFont(Nz::FontRef font); + inline void SetTextOutlineColor(const Nz::Color& color); + inline void SetTextOutlineThickness(float thickness); + inline void SetTextStyle(Nz::TextStyleFlags style); + + void Write(const Nz::String& text, std::size_t glyphPosition) override; + + RichTextAreaWidget& operator=(const RichTextAreaWidget&) = delete; + RichTextAreaWidget& operator=(RichTextAreaWidget&&) = default; + + private: + Nz::AbstractTextDrawer& GetTextDrawer() override; + const Nz::AbstractTextDrawer& GetTextDrawer() const override; + + void HandleIndentation(bool add) override; + void HandleSelectionIndentation(bool add) override; + void HandleWordCursorMove(bool left) override; + + void UpdateDisplayText() override; + + Nz::RichTextDrawer m_drawer; + }; +} + +#include + +#endif // NDK_WIDGETS_TEXTAREAWIDGET_HPP diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl new file mode 100644 index 000000000..4fd7faa10 --- /dev/null +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl @@ -0,0 +1,88 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline unsigned int RichTextAreaWidget::GetCharacterSize() const + { + return m_drawer.GetDefaultCharacterSize(); + } + + inline float RichTextAreaWidget::GetCharacterSpacingOffset() const + { + return m_drawer.GetDefaultCharacterSpacingOffset(); + } + + inline float RichTextAreaWidget::GetLineSpacingOffset() const + { + return m_drawer.GetDefaultLineSpacingOffset(); + } + + inline const Nz::Color& RichTextAreaWidget::GetTextColor() const + { + return m_drawer.GetDefaultColor(); + } + + inline Nz::Font* RichTextAreaWidget::GetTextFont() const + { + return m_drawer.GetDefaultFont(); + } + + inline const Nz::Color& RichTextAreaWidget::GetTextOutlineColor() const + { + return m_drawer.GetDefaultOutlineColor(); + } + + inline float RichTextAreaWidget::GetTextOutlineThickness() const + { + return m_drawer.GetDefaultOutlineThickness(); + } + + inline Nz::TextStyleFlags RichTextAreaWidget::GetTextStyle() const + { + return m_drawer.GetDefaultStyle(); + } + + inline void RichTextAreaWidget::SetCharacterSize(unsigned int characterSize) + { + m_drawer.SetDefaultCharacterSize(characterSize); + } + + inline void RichTextAreaWidget::SetCharacterSpacingOffset(float offset) + { + m_drawer.SetDefaultCharacterSpacingOffset(offset); + } + + inline void RichTextAreaWidget::SetLineSpacingOffset(float offset) + { + m_drawer.SetDefaultLineSpacingOffset(offset); + } + + inline void RichTextAreaWidget::SetTextColor(const Nz::Color& color) + { + m_drawer.SetDefaultColor(color); + } + + inline void RichTextAreaWidget::SetTextFont(Nz::FontRef font) + { + m_drawer.SetDefaultFont(std::move(font)); + } + + inline void RichTextAreaWidget::SetTextOutlineColor(const Nz::Color& color) + { + m_drawer.SetDefaultOutlineColor(color); + } + + inline void RichTextAreaWidget::SetTextOutlineThickness(float thickness) + { + m_drawer.SetDefaultOutlineThickness(thickness); + } + + inline void RichTextAreaWidget::SetTextStyle(Nz::TextStyleFlags style) + { + m_drawer.SetDefaultStyle(style); + } +} diff --git a/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp b/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp new file mode 100644 index 000000000..17ada16ef --- /dev/null +++ b/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp @@ -0,0 +1,74 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_WIDGETS_SCROLLAREAWIDGET_HPP +#define NDK_WIDGETS_SCROLLAREAWIDGET_HPP + +#include +#include +#include + +namespace Ndk +{ + class NDK_API ScrollAreaWidget : public BaseWidget + { + public: + ScrollAreaWidget(BaseWidget* parent, BaseWidget* content); + ScrollAreaWidget(const ScrollAreaWidget&) = delete; + ScrollAreaWidget(ScrollAreaWidget&&) = default; + ~ScrollAreaWidget() = default; + + void EnableScrollbar(bool enable); + + inline float GetScrollHeight() const; + inline float GetScrollRatio() const; + + inline bool HasScrollbar() const; + inline bool IsScrollbarEnabled() const; + inline bool IsScrollbarVisible() const; + + inline void ScrollToHeight(float height); + void ScrollToRatio(float ratio); + + ScrollAreaWidget& operator=(const ScrollAreaWidget&) = delete; + ScrollAreaWidget& operator=(ScrollAreaWidget&&) = default; + + private: + enum class ScrollBarStatus + { + Grabbed, + Hovered, + None + }; + + Nz::Rectf GetScrollbarRect() const; + + void Layout() override; + + void OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) override; + void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) override; + void OnMouseExit() override; + void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; + void OnMouseWheelMoved(int x, int y, float delta) override; + + void UpdateScrollbarStatus(ScrollBarStatus status); + + BaseWidget* m_content; + EntityHandle m_scrollbarBackgroundEntity; + EntityHandle m_scrollbarEntity; + Nz::SpriteRef m_scrollbarBackgroundSprite; + Nz::SpriteRef m_scrollbarSprite; + Nz::Vector2i m_grabbedDelta; + ScrollBarStatus m_scrollbarStatus; + bool m_isScrollbarEnabled; + bool m_hasScrollbar; + float m_scrollRatio; + }; +} + +#include + +#endif // NDK_WIDGETS_SCROLLAREAWIDGET_HPP diff --git a/SDK/include/NDK/Widgets/ScrollAreaWidget.inl b/SDK/include/NDK/Widgets/ScrollAreaWidget.inl new file mode 100644 index 000000000..89bea6d47 --- /dev/null +++ b/SDK/include/NDK/Widgets/ScrollAreaWidget.inl @@ -0,0 +1,39 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline float ScrollAreaWidget::GetScrollHeight() const + { + return m_scrollRatio * m_content->GetHeight(); + } + + inline float ScrollAreaWidget::GetScrollRatio() const + { + return m_scrollRatio; + } + + inline bool ScrollAreaWidget::HasScrollbar() const + { + return m_hasScrollbar; + } + + inline bool ScrollAreaWidget::IsScrollbarEnabled() const + { + return m_isScrollbarEnabled; + } + + inline bool ScrollAreaWidget::IsScrollbarVisible() const + { + return HasScrollbar() && IsScrollbarEnabled(); + } + + inline void ScrollAreaWidget::ScrollToHeight(float height) + { + float contentHeight = m_content->GetHeight(); + ScrollToRatio(height / contentHeight); + } +} diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 9a5d33335..8b06e7579 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -7,20 +7,14 @@ #ifndef NDK_WIDGETS_TEXTAREAWIDGET_HPP #define NDK_WIDGETS_TEXTAREAWIDGET_HPP -#include #include -#include -#include -#include -#include +#include namespace Ndk { - class NDK_API TextAreaWidget : public BaseWidget + class NDK_API TextAreaWidget : public AbstractTextAreaWidget { public: - using CharacterFilter = std::function; - TextAreaWidget(BaseWidget* parent); TextAreaWidget(const TextAreaWidget&) = delete; TextAreaWidget(TextAreaWidget&&) = default; @@ -28,99 +22,53 @@ namespace Ndk void AppendText(const Nz::String& text); - inline void Clear(); + void Clear() override; - //virtual TextAreaWidget* Clone() const = 0; + using AbstractTextAreaWidget::Erase; + void Erase(std::size_t firstGlyph, std::size_t lastGlyph) override; - - inline void EnableMultiline(bool enable = true); - inline void EnableTabWriting(bool enable = true); - - inline void Erase(std::size_t glyphPosition); - void Erase(std::size_t firstGlyph, std::size_t lastGlyph); - void EraseSelection(); - - inline const CharacterFilter& GetCharacterFilter() const; inline unsigned int GetCharacterSize() const; - inline const Nz::Vector2ui& GetCursorPosition() const; - inline Nz::Vector2ui GetCursorPosition(std::size_t glyphIndex) const; inline const Nz::String& GetDisplayText() const; - inline EchoMode GetEchoMode() const; - inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition); + inline float GetCharacterSpacingOffset() const; + inline float GetLineSpacingOffset() const; inline const Nz::String& GetText() const; inline const Nz::Color& GetTextColor() const; + inline Nz::Font* GetTextFont() const; + inline const Nz::Color& GetTextOulineColor() const; + inline float GetTextOulineThickness() const; + inline Nz::TextStyleFlags GetTextStyle() const; - Nz::Vector2ui GetHoveredGlyph(float x, float y) const; - - inline bool HasSelection() const; - - inline bool IsMultilineEnabled() const; - inline bool IsReadOnly() const; - inline bool IsTabWritingEnabled() const; - - inline void MoveCursor(int offset); - inline void MoveCursor(const Nz::Vector2i& offset); - - inline void SetCharacterFilter(CharacterFilter filter); - void SetCharacterSize(unsigned int characterSize); - inline void SetCursorPosition(std::size_t glyphIndex); - inline void SetCursorPosition(Nz::Vector2ui cursorPosition); - inline void SetEchoMode(EchoMode echoMode); - inline void SetReadOnly(bool readOnly = true); - inline void SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition); + inline void SetCharacterSize(unsigned int characterSize); + inline void SetCharacterSpacingOffset(float offset); + inline void SetLineSpacingOffset(float offset); inline void SetText(const Nz::String& text); inline void SetTextColor(const Nz::Color& text); + inline void SetTextFont(Nz::FontRef font); + inline void SetTextOutlineColor(const Nz::Color& color); + inline void SetTextOutlineThickness(float thickness); + inline void SetTextStyle(Nz::TextStyleFlags style); - inline void Write(const Nz::String& text); - inline void Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition); - void Write(const Nz::String& text, std::size_t glyphPosition); + using AbstractTextAreaWidget::Write; + void Write(const Nz::String& text, std::size_t glyphPosition) override; TextAreaWidget& operator=(const TextAreaWidget&) = delete; TextAreaWidget& operator=(TextAreaWidget&&) = default; - NazaraSignal(OnTextAreaCursorMove, const TextAreaWidget* /*textArea*/, std::size_t* /*newCursorPosition*/); - NazaraSignal(OnTextAreaKeyBackspace, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyDown, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyEnd, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyHome, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyLeft, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyReturn, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyRight, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyUp, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextChanged, const TextAreaWidget* /*textArea*/, const Nz::String& /*text*/); + NazaraSignal(OnTextChanged, const AbstractTextAreaWidget* /*textArea*/, const Nz::String& /*text*/); private: - void Layout() override; + Nz::AbstractTextDrawer& GetTextDrawer() override; + const Nz::AbstractTextDrawer& GetTextDrawer() const override; - bool IsFocusable() const override; - void OnFocusLost() override; - void OnFocusReceived() override; - bool OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) override; - void OnKeyReleased(const Nz::WindowEvent::KeyEvent& key) override; - void OnMouseButtonPress(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; - void OnMouseButtonRelease(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; - void OnMouseEnter() override; - void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; - void OnTextEntered(char32_t character, bool repeated) override; + void HandleIndentation(bool add) override; + void HandleSelectionIndentation(bool add) override; + void HandleWordCursorMove(bool left) override; - void RefreshCursor(); - void UpdateDisplayText(); + void UpdateDisplayText() override; + void UpdateMinimumSize(); - CharacterFilter m_characterFilter; - EchoMode m_echoMode; - EntityHandle m_cursorEntity; - EntityHandle m_textEntity; Nz::SimpleTextDrawer m_drawer; Nz::String m_text; - Nz::TextSpriteRef m_textSprite; - Nz::Vector2ui m_cursorPositionBegin; - Nz::Vector2ui m_cursorPositionEnd; - Nz::Vector2ui m_selectionCursor; - std::vector m_cursorSprites; - bool m_isMouseButtonDown; - bool m_multiLineEnabled; - bool m_readOnly; - bool m_tabEnabled; // writes (Shift+)Tab character if set to true }; } diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index e4c9f2c30..f63897420 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -6,90 +6,24 @@ namespace Ndk { - inline void TextAreaWidget::Clear() - { - m_cursorPositionBegin.MakeZero(); - m_cursorPositionEnd.MakeZero(); - m_drawer.Clear(); - m_text.Clear(); - m_textSprite->Update(m_drawer); - - RefreshCursor(); - OnTextChanged(this, m_text); - } - - inline void TextAreaWidget::EnableMultiline(bool enable) - { - m_multiLineEnabled = enable; - } - - inline void TextAreaWidget::EnableTabWriting(bool enable) - { - m_tabEnabled = enable; - } - - inline void TextAreaWidget::Erase(std::size_t glyphPosition) - { - Erase(glyphPosition, glyphPosition + 1U); - } - - inline const TextAreaWidget::CharacterFilter& TextAreaWidget::GetCharacterFilter() const - { - return m_characterFilter; - } - inline unsigned int TextAreaWidget::GetCharacterSize() const { return m_drawer.GetCharacterSize(); } - inline const Nz::Vector2ui& TextAreaWidget::GetCursorPosition() const - { - return m_cursorPositionBegin; - } - - Nz::Vector2ui TextAreaWidget::GetCursorPosition(std::size_t glyphIndex) const - { - glyphIndex = std::min(glyphIndex, m_drawer.GetGlyphCount()); - - std::size_t lineCount = m_drawer.GetLineCount(); - std::size_t line = 0U; - for (std::size_t i = line + 1; i < lineCount; ++i) - { - if (m_drawer.GetLine(i).glyphIndex > glyphIndex) - break; - - line = i; - } - - const auto& lineInfo = m_drawer.GetLine(line); - - Nz::Vector2ui cursorPos; - cursorPos.y = static_cast(line); - cursorPos.x = static_cast(glyphIndex - lineInfo.glyphIndex); - - return cursorPos; - } - inline const Nz::String& TextAreaWidget::GetDisplayText() const { return m_drawer.GetText(); } - inline std::size_t TextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) + inline float TextAreaWidget::GetCharacterSpacingOffset() const { - std::size_t glyphIndex = m_drawer.GetLine(cursorPosition.y).glyphIndex + cursorPosition.x; - if (m_drawer.GetLineCount() > cursorPosition.y + 1) - glyphIndex = std::min(glyphIndex, m_drawer.GetLine(cursorPosition.y + 1).glyphIndex - 1); - else - glyphIndex = std::min(glyphIndex, m_drawer.GetGlyphCount()); - - return glyphIndex; + return m_drawer.GetCharacterSpacingOffset(); } - inline EchoMode TextAreaWidget::GetEchoMode() const + inline float TextAreaWidget::GetLineSpacingOffset() const { - return m_echoMode; + return m_drawer.GetLineSpacingOffset(); } inline const Nz::String& TextAreaWidget::GetText() const @@ -102,131 +36,47 @@ namespace Ndk return m_drawer.GetColor(); } - inline bool TextAreaWidget::HasSelection() const + inline Nz::Font* TextAreaWidget::GetTextFont() const { - return m_cursorPositionBegin != m_cursorPositionEnd; + return m_drawer.GetFont(); } - inline bool TextAreaWidget::IsMultilineEnabled() const + inline const Nz::Color& TextAreaWidget::GetTextOulineColor() const { - return m_multiLineEnabled; + return m_drawer.GetOutlineColor(); } - inline bool TextAreaWidget::IsTabWritingEnabled() const + inline float TextAreaWidget::GetTextOulineThickness() const { - return m_tabEnabled; + return m_drawer.GetOutlineThickness(); } - inline bool TextAreaWidget::IsReadOnly() const + inline Nz::TextStyleFlags TextAreaWidget::GetTextStyle() const { - return m_readOnly; + return m_drawer.GetStyle(); } - inline void TextAreaWidget::MoveCursor(int offset) + inline void TextAreaWidget::SetCharacterSize(unsigned int characterSize) { - std::size_t cursorGlyph = GetGlyphIndex(m_cursorPositionBegin); - if (offset >= 0) - SetCursorPosition(cursorGlyph + static_cast(offset)); - else - { - std::size_t nOffset = static_cast(-offset); - if (nOffset >= cursorGlyph) - SetCursorPosition(0); - else - SetCursorPosition(cursorGlyph - nOffset); - } - } - - inline void TextAreaWidget::MoveCursor(const Nz::Vector2i& offset) - { - auto ClampOffset = [] (unsigned int cursorPosition, int cursorOffset) -> unsigned int - { - if (cursorOffset >= 0) - return cursorPosition + cursorOffset; - else - { - unsigned int nOffset = static_cast(-cursorOffset); - if (nOffset >= cursorPosition) - return 0; - else - return cursorPosition - nOffset; - } - }; - - Nz::Vector2ui cursorPosition = m_cursorPositionBegin; - cursorPosition.x = ClampOffset(static_cast(cursorPosition.x), offset.x); - cursorPosition.y = ClampOffset(static_cast(cursorPosition.y), offset.y); - - SetCursorPosition(cursorPosition); - } - - inline void TextAreaWidget::SetCharacterFilter(CharacterFilter filter) - { - m_characterFilter = std::move(filter); - } - - inline void TextAreaWidget::SetCursorPosition(std::size_t glyphIndex) - { - OnTextAreaCursorMove(this, &glyphIndex); - - m_cursorPositionBegin = GetCursorPosition(glyphIndex); - m_cursorPositionEnd = m_cursorPositionBegin; - - RefreshCursor(); - } - - inline void TextAreaWidget::SetCursorPosition(Nz::Vector2ui cursorPosition) - { - std::size_t lineCount = m_drawer.GetLineCount(); - if (cursorPosition.y >= lineCount) - cursorPosition.y = static_cast(lineCount - 1); - - m_cursorPositionBegin = cursorPosition; - - const auto& lineInfo = m_drawer.GetLine(cursorPosition.y); - if (cursorPosition.y + 1 < lineCount) - { - const auto& nextLineInfo = m_drawer.GetLine(cursorPosition.y + 1); - cursorPosition.x = std::min(cursorPosition.x, static_cast(nextLineInfo.glyphIndex - lineInfo.glyphIndex - 1)); - } - - m_cursorPositionEnd = m_cursorPositionBegin; - - std::size_t glyphIndex = lineInfo.glyphIndex + cursorPosition.x; - - OnTextAreaCursorMove(this, &glyphIndex); - - RefreshCursor(); - } - - inline void TextAreaWidget::SetEchoMode(EchoMode echoMode) - { - m_echoMode = echoMode; + m_drawer.SetCharacterSize(characterSize); + UpdateMinimumSize(); UpdateDisplayText(); } - inline void TextAreaWidget::SetReadOnly(bool readOnly) + inline void TextAreaWidget::SetCharacterSpacingOffset(float offset) { - m_readOnly = readOnly; - m_cursorEntity->Enable(!m_readOnly && HasFocus()); + m_drawer.SetCharacterSpacingOffset(offset); + + UpdateMinimumSize(); + UpdateDisplayText(); } - inline void TextAreaWidget::SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition) + inline void TextAreaWidget::SetLineSpacingOffset(float offset) { - ///TODO: Check if position are valid + m_drawer.SetLineSpacingOffset(offset); - // Ensure begin is before end - if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) - std::swap(fromPosition, toPosition); - - if (m_cursorPositionBegin != fromPosition || m_cursorPositionEnd != toPosition) - { - m_cursorPositionBegin = fromPosition; - m_cursorPositionEnd = toPosition; - - RefreshCursor(); - } + UpdateDisplayText(); } inline void TextAreaWidget::SetText(const Nz::String& text) @@ -241,16 +91,34 @@ namespace Ndk { m_drawer.SetColor(text); - m_textSprite->Update(m_drawer); + UpdateDisplayText(); } - inline void TextAreaWidget::Write(const Nz::String& text) + inline void TextAreaWidget::SetTextFont(Nz::FontRef font) { - Write(text, GetGlyphIndex(m_cursorPositionBegin)); + m_drawer.SetFont(font); + + UpdateDisplayText(); } - inline void TextAreaWidget::Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition) + inline void TextAreaWidget::SetTextOutlineColor(const Nz::Color& color) { - Write(text, GetGlyphIndex(glyphPosition)); + m_drawer.SetOutlineColor(color); + + UpdateDisplayText(); + } + + inline void TextAreaWidget::SetTextOutlineThickness(float thickness) + { + m_drawer.SetOutlineThickness(thickness); + + UpdateDisplayText(); + } + + inline void TextAreaWidget::SetTextStyle(Nz::TextStyleFlags style) + { + m_drawer.SetStyle(style); + + UpdateDisplayText(); } } diff --git a/SDK/include/NDK/World.hpp b/SDK/include/NDK/World.hpp index 98e6d87ac..ca6e917b7 100644 --- a/SDK/include/NDK/World.hpp +++ b/SDK/include/NDK/World.hpp @@ -46,6 +46,7 @@ namespace Ndk void Clear() noexcept; const EntityHandle& CloneEntity(EntityId id); + const EntityHandle& CloneEntity(const EntityHandle& entity); inline void DisableProfiler(); inline void EnableProfiler(bool enable = true); @@ -98,6 +99,12 @@ namespace Ndk inline void InvalidateSystemOrder(); void ReorderSystems(); + struct DoubleBitset + { + Nz::Bitset front; + Nz::Bitset back; + }; + struct EntityBlock { EntityBlock(Entity&& e) : @@ -119,9 +126,9 @@ namespace Ndk std::vector> m_waitingEntities; EntityList m_aliveEntities; ProfilerData m_profilerData; - Nz::Bitset m_dirtyEntities; + DoubleBitset m_dirtyEntities; Nz::Bitset m_freeEntityIds; - Nz::Bitset m_killedEntities; + DoubleBitset m_killedEntities; bool m_orderedSystemsUpdated; bool m_isProfilerEnabled; }; diff --git a/SDK/include/NDK/World.inl b/SDK/include/NDK/World.inl index 860454a0d..1c3e446e1 100644 --- a/SDK/include/NDK/World.inl +++ b/SDK/include/NDK/World.inl @@ -308,7 +308,7 @@ namespace Ndk inline void World::KillEntity(Entity* entity) { if (IsEntityValid(entity)) - m_killedEntities.UnboundedSet(entity->GetId(), true); + m_killedEntities.front.UnboundedSet(entity->GetId(), true); } /*! @@ -343,7 +343,7 @@ namespace Ndk */ inline bool World::IsEntityDying(EntityId id) const { - return m_killedEntities.UnboundedTest(id); + return m_killedEntities.front.UnboundedTest(id); } /*! @@ -467,13 +467,13 @@ namespace Ndk inline void World::Invalidate() { - m_dirtyEntities.Resize(m_entityBlocks.size(), false); - m_dirtyEntities.Set(true); // Activation of all bits + m_dirtyEntities.front.Resize(m_entityBlocks.size(), false); + m_dirtyEntities.front.Set(true); // Activation of all bits } inline void World::Invalidate(EntityId id) { - m_dirtyEntities.UnboundedSet(id, true); + m_dirtyEntities.front.UnboundedSet(id, true); } inline void World::InvalidateSystemOrder() diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index 85757f33a..132947d4e 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -147,16 +147,22 @@ namespace Ndk Nz::Vector2ui windowDimensions; if (info.window->IsValid()) - { windowDimensions = info.window->GetSize(); - windowDimensions.y /= 4; - } else windowDimensions.MakeZero(); - overlay->console = std::make_unique(*info.overlayWorld, Nz::Vector2f(windowDimensions), overlay->lua); + Nz::LuaInstance& lua = overlay->lua; + + overlay->console = info.canvas->Add(); + overlay->console->OnCommand.Connect([&lua](Ndk::Console* console, const Nz::String& command) + { + if (!lua.Execute(command)) + console->AddLine(lua.GetLastError(), Nz::Color::Red); + }); Console& consoleRef = *overlay->console; + consoleRef.Resize({float(windowDimensions.x), windowDimensions.y / 4.f}); + consoleRef.Show(false); // Redirect logs toward the console overlay->logSlot.Connect(Nz::Log::OnLogWrite, [&consoleRef] (const Nz::String& str) @@ -164,11 +170,11 @@ namespace Ndk consoleRef.AddLine(str); }); - overlay->lua.LoadLibraries(); - LuaAPI::RegisterClasses(overlay->lua); + lua.LoadLibraries(); + LuaAPI::RegisterClasses(lua); // Override "print" function to add a line in the console - overlay->lua.PushFunction([&consoleRef] (Nz::LuaState& state) + lua.PushFunction([&consoleRef] (Nz::LuaState& state) { Nz::StringStream stream; @@ -192,31 +198,37 @@ namespace Ndk consoleRef.AddLine(stream); return 0; }); - overlay->lua.SetGlobal("print"); + lua.SetGlobal("print"); // Define a few base variables to allow our interface to interact with the application - overlay->lua.PushGlobal("Application", Ndk::Application::Instance()); - overlay->lua.PushGlobal("Console", consoleRef.CreateHandle()); + lua.PushGlobal("Application", Ndk::Application::Instance()); + lua.PushGlobal("Console", consoleRef.CreateHandle()); // Setup a few event callback to handle the console Nz::EventHandler& eventHandler = info.window->GetEventHandler(); - overlay->eventSlot.Connect(eventHandler.OnEvent, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent& event) - { - if (consoleRef.IsVisible()) - consoleRef.SendEvent(event); - }); - overlay->keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& event) { if (event.virtualKey == Nz::Keyboard::VKey::F9) - consoleRef.Show(!consoleRef.IsVisible()); + { + // Toggle console visibility and focus + if (consoleRef.IsVisible()) + { + consoleRef.ClearFocus(); + consoleRef.Show(false); + } + else + { + consoleRef.Show(true); + consoleRef.SetFocus(); + } + } }); overlay->resizedSlot.Connect(info.renderTarget->OnRenderTargetSizeChange, [&consoleRef] (const Nz::RenderTarget* renderTarget) { Nz::Vector2ui size = renderTarget->GetSize(); - consoleRef.SetSize({float(size.x), size.y / 4.f}); + consoleRef.Resize({float(size.x), size.y / 4.f}); }); info.console = std::move(overlay); @@ -238,6 +250,9 @@ namespace Ndk { info.overlayWorld = std::make_unique(false); //< No default system + if (info.window->IsValid()) + info.canvas = std::make_unique(info.overlayWorld->CreateHandle(), info.window->GetEventHandler(), info.window->GetCursorController().CreateHandle()); + RenderSystem& renderSystem = info.overlayWorld->AddSystem(); renderSystem.ChangeRenderTechnique(); renderSystem.SetDefaultBackground(nullptr); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 03fb87e97..ecfddf33c 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -89,6 +89,7 @@ namespace Ndk } else { + DestroyEntity(m_backgroundEntity); m_backgroundEntity.Reset(); m_backgroundSprite.Reset(); } @@ -144,6 +145,29 @@ namespace Ndk m_canvas->SetKeyboardOwner(m_canvasIndex); } + void BaseWidget::SetParent(BaseWidget* widget) + { + Canvas* oldCanvas = m_canvas; + Canvas* newCanvas = widget->GetCanvas(); + + // Changing a widget canvas is a problem because of the canvas entities + NazaraAssert(oldCanvas == newCanvas, "Transferring a widget between canvas is not yet supported"); + + Node::SetParent(widget); + m_widgetParent = widget; + + Layout(); + } + + void BaseWidget::SetRenderingRect(const Nz::Rectf& renderingRect) + { + m_renderingRect = renderingRect; + + UpdatePositionAndSize(); + for (const auto& widgetPtr : m_children) + widgetPtr->UpdatePositionAndSize(); + } + void BaseWidget::Show(bool show) { if (m_visible != show) @@ -156,21 +180,44 @@ namespace Ndk UnregisterFromCanvas(); for (WidgetEntity& entity : m_entities) - entity.handle->Enable(show); + { + if (entity.isEnabled) + { + entity.handle->Enable(show); //< This will override isEnabled + entity.isEnabled = true; + } + } - for (const auto& widgetPtr : m_children) - widgetPtr->Show(show); + ShowChildren(show); } } - const Ndk::EntityHandle& BaseWidget::CreateEntity() + const EntityHandle& BaseWidget::CreateEntity() { const EntityHandle& newEntity = m_world->CreateEntity(); newEntity->Enable(m_visible); m_entities.emplace_back(); - WidgetEntity& widgetEntity = m_entities.back(); - widgetEntity.handle = newEntity; + WidgetEntity& newWidgetEntity = m_entities.back(); + newWidgetEntity.handle = newEntity; + newWidgetEntity.onDisabledSlot.Connect(newEntity->OnEntityDisabled, [this](Entity* entity) + { + auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); + NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + + it->isEnabled = false; + }); + + newWidgetEntity.onEnabledSlot.Connect(newEntity->OnEntityEnabled, [this](Entity* entity) + { + auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); + NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + + if (!IsVisible()) + entity->Disable(); // Next line will override isEnabled status + + it->isEnabled = true; + }); return newEntity; } @@ -185,7 +232,7 @@ namespace Ndk void BaseWidget::Layout() { - if (m_backgroundEntity) + if (m_backgroundSprite) m_backgroundSprite->SetSize(m_size.x, m_size.y); UpdatePositionAndSize(); @@ -198,6 +245,19 @@ namespace Ndk UpdatePositionAndSize(); } + Nz::Rectf BaseWidget::GetScissorRect() const + { + Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys_Global)); + Nz::Vector2f widgetSize = GetSize(); + + Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); + Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + + widgetRect.Intersect(widgetRenderingRect, &widgetRect); + + return widgetRect; + } + bool BaseWidget::IsFocusable() const { return false; @@ -236,6 +296,10 @@ namespace Ndk { } + void BaseWidget::OnMouseWheelMoved(int /*x*/, int /*y*/, float /*delta*/) + { + } + void BaseWidget::OnMouseExit() { } @@ -250,6 +314,12 @@ namespace Ndk void BaseWidget::OnTextEdited(const std::array& /*characters*/, int /*length*/) { + } + + void BaseWidget::ShowChildren(bool show) + { + for (const auto& widgetPtr : m_children) + widgetPtr->Show(show); } void BaseWidget::DestroyChild(BaseWidget* widget) @@ -290,10 +360,17 @@ namespace Ndk if (IsRegisteredToCanvas()) m_canvas->NotifyWidgetBoxUpdate(m_canvasIndex); - Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition()); - Nz::Vector2f widgetSize = GetSize(); + Nz::Rectf scissorRect = GetScissorRect(); - Nz::Recti fullBounds(Nz::Rectf(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y)); + if (m_widgetParent) + { + Nz::Rectf parentScissorRect = m_widgetParent->GetScissorRect(); + + if (!scissorRect.Intersect(parentScissorRect, &scissorRect)) + scissorRect = parentScissorRect; + } + + Nz::Recti fullBounds(scissorRect); for (WidgetEntity& widgetEntity : m_entities) { const Ndk::EntityHandle& entity = widgetEntity.handle; diff --git a/SDK/src/NDK/Canvas.cpp b/SDK/src/NDK/Canvas.cpp index f628713e2..e80e2890e 100644 --- a/SDK/src/NDK/Canvas.cpp +++ b/SDK/src/NDK/Canvas.cpp @@ -61,7 +61,7 @@ namespace Ndk } } - void Canvas::OnEventMouseButtonRelease(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseButtonEvent & event) + void Canvas::OnEventMouseButtonRelease(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseButtonEvent& event) { if (m_hoveredWidget != InvalidCanvasIndex) { @@ -128,6 +128,19 @@ namespace Ndk } } + void Canvas::OnEventMouseWheelMoved(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseWheelEvent& event) + { + if (m_hoveredWidget != InvalidCanvasIndex) + { + WidgetEntry& hoveredWidget = m_widgetEntries[m_hoveredWidget]; + + int x = static_cast(std::round(event.x - hoveredWidget.box.x)); + int y = static_cast(std::round(event.y - hoveredWidget.box.y)); + + hoveredWidget.widget->OnMouseWheelMoved(x, y, event.delta); + } + } + void Canvas::OnEventMouseLeft(const Nz::EventHandler* /*eventHandler*/) { if (m_hoveredWidget != InvalidCanvasIndex) @@ -137,7 +150,7 @@ namespace Ndk } } - void Canvas::OnEventKeyPressed(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& event) + void Canvas::OnEventKeyPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) { @@ -191,12 +204,16 @@ namespace Ndk } } } + + OnUnhandledKeyPressed(eventHandler, event); } - void Canvas::OnEventKeyReleased(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& event) + void Canvas::OnEventKeyReleased(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) m_widgetEntries[m_keyboardOwner].widget->OnKeyReleased(event); + + OnUnhandledKeyReleased(eventHandler, event); } void Canvas::OnEventTextEntered(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::TextEvent& event) diff --git a/SDK/src/NDK/Components/CameraComponent.cpp b/SDK/src/NDK/Components/CameraComponent.cpp index a688a0ca5..4a599ab9e 100644 --- a/SDK/src/NDK/Components/CameraComponent.cpp +++ b/SDK/src/NDK/Components/CameraComponent.cpp @@ -154,11 +154,10 @@ namespace Ndk } /*! - * \brief Sets the layer of the camera in case of multiples fields + * \brief Sets the layer of the camera in case of multiples layers * * \param layer Layer of the camera */ - void CameraComponent::SetLayer(unsigned int layer) { m_layer = layer; @@ -169,7 +168,6 @@ namespace Ndk /*! * \brief Operation to perform when component is attached to an entity */ - void CameraComponent::OnAttached() { if (m_entity->HasComponent()) @@ -304,6 +302,8 @@ namespace Ndk break; } + m_projectionMatrix *= Nz::Matrix4f::Scale(m_projectionScale); + m_projectionMatrixUpdated = true; } diff --git a/SDK/src/NDK/Components/CollisionComponent2D.cpp b/SDK/src/NDK/Components/CollisionComponent2D.cpp index 5cdfd1589..fddbe8842 100644 --- a/SDK/src/NDK/Components/CollisionComponent2D.cpp +++ b/SDK/src/NDK/Components/CollisionComponent2D.cpp @@ -17,28 +17,57 @@ namespace Ndk * \brief NDK class that represents a two-dimensional collision geometry */ + /*! + * \brief Gets the collision box representing the entity + * \return The physics collision box + */ + Nz::Rectf CollisionComponent2D::GetAABB() const + { + return GetRigidBody()->GetAABB(); + } + + /*! + * \brief Gets the position offset between the actual rigid body center of mass position and the origin of the geometry + * \return Position offset + */ + const Nz::Vector2f& CollisionComponent2D::GetGeomOffset() const + { + return GetRigidBody()->GetPositionOffset(); + } + + /*! + * \brief Convenience function to align center of geometry to a specific point + * + * \param geomOffset Position offset + * + * \remark This does not change the center of mass + */ + void CollisionComponent2D::Recenter(const Nz::Vector2f& origin) + { + const Nz::RigidBody2D* rigidBody = GetRigidBody(); + SetGeomOffset(origin - rigidBody->GetAABB().GetCenter() + rigidBody->GetPositionOffset()); + } + /*! * \brief Sets geometry for the entity * * \param geom Geometry used for collisions - * - * \remark Produces a NazaraAssert if the entity has no physics component and has no static body */ void CollisionComponent2D::SetGeom(Nz::Collider2DRef geom) { m_geom = std::move(geom); - if (m_entity->HasComponent()) - { - // We update the geometry of the PhysiscsObject linked to the PhysicsComponent2D - PhysicsComponent2D& physComponent = m_entity->GetComponent(); - physComponent.GetRigidBody()->SetGeom(m_geom); - } - else - { - NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); - m_staticBody->SetGeom(m_geom); - } + GetRigidBody()->SetGeom(m_geom); + } + + /*! + * \brief Sets the position offset between the actual rigid body center of mass position and the origin of the geometry + * + * \param geomOffset Position offset + */ + void CollisionComponent2D::SetGeomOffset(const Nz::Vector2f& geomOffset) + { + GetRigidBody()->SetPositionOffset(geomOffset); } /*! @@ -47,7 +76,6 @@ namespace Ndk * \remark Produces a NazaraAssert if entity is invalid * \remark Produces a NazaraAssert if entity is not linked to a world, or the world has no physics system */ - void CollisionComponent2D::InitializeStaticBody() { NazaraAssert(m_entity, "Invalid entity"); @@ -67,7 +95,34 @@ namespace Ndk matrix.MakeIdentity(); m_staticBody->SetPosition(Nz::Vector2f(matrix.GetTranslation())); + } + Nz::RigidBody2D* CollisionComponent2D::GetRigidBody() + { + if (m_entity->HasComponent()) + { + PhysicsComponent2D& physComponent = m_entity->GetComponent(); + return physComponent.GetRigidBody(); + } + else + { + NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); + return m_staticBody.get(); + } + } + + const Nz::RigidBody2D* CollisionComponent2D::GetRigidBody() const + { + if (m_entity->HasComponent()) + { + PhysicsComponent2D& physComponent = m_entity->GetComponent(); + return physComponent.GetRigidBody(); + } + else + { + NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); + return m_staticBody.get(); + } } /*! diff --git a/SDK/src/NDK/Components/ConstraintComponent2D.cpp b/SDK/src/NDK/Components/ConstraintComponent2D.cpp index ef841c210..6c75f39ee 100644 --- a/SDK/src/NDK/Components/ConstraintComponent2D.cpp +++ b/SDK/src/NDK/Components/ConstraintComponent2D.cpp @@ -1,6 +1,23 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + #include namespace Ndk { + ConstraintComponent2D::ConstraintComponent2D(const ConstraintComponent2D& /*joint*/) + { + } + + bool ConstraintComponent2D::RemoveConstraint(Nz::Constraint2D* constraintPtr) + { + auto it = std::find_if(m_constraints.begin(), m_constraints.end(), [constraintPtr](const ConstraintData& constraintData) { return constraintData.constraint.get() == constraintPtr; }); + if (it != m_constraints.end()) + m_constraints.erase(it); + + return !m_constraints.empty(); + } + ComponentIndex ConstraintComponent2D::componentIndex; } diff --git a/SDK/src/NDK/Components/DebugComponent.cpp b/SDK/src/NDK/Components/DebugComponent.cpp index 6c8ab9f1c..604e1d143 100644 --- a/SDK/src/NDK/Components/DebugComponent.cpp +++ b/SDK/src/NDK/Components/DebugComponent.cpp @@ -3,8 +3,33 @@ // For conditions of distribution and use, see copyright notice in Prerequisites.hpp #include +#include namespace Ndk { + void DebugComponent::DetachDebugRenderables(GraphicsComponent& gfxComponent) + { + for (auto& renderable : m_debugRenderables) + { + if (renderable) + { + gfxComponent.Detach(renderable); + renderable.Reset(); + } + } + } + + void DebugComponent::OnComponentDetached(BaseComponent& component) + { + if (IsComponent(component)) + DetachDebugRenderables(static_cast(component)); + } + + void DebugComponent::OnDetached() + { + if (m_entity->HasComponent()) + DetachDebugRenderables(m_entity->GetComponent()); + } + ComponentIndex DebugComponent::componentIndex; } diff --git a/SDK/src/NDK/Components/LifetimeComponent.cpp b/SDK/src/NDK/Components/LifetimeComponent.cpp new file mode 100644 index 000000000..5ffa6da82 --- /dev/null +++ b/SDK/src/NDK/Components/LifetimeComponent.cpp @@ -0,0 +1,10 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + ComponentIndex LifetimeComponent::componentIndex; +} diff --git a/SDK/src/NDK/Components/PhysicsComponent2D.cpp b/SDK/src/NDK/Components/PhysicsComponent2D.cpp index 62cd922a4..871fa762e 100644 --- a/SDK/src/NDK/Components/PhysicsComponent2D.cpp +++ b/SDK/src/NDK/Components/PhysicsComponent2D.cpp @@ -31,9 +31,17 @@ namespace Ndk Nz::PhysWorld2D& world = entityWorld->GetSystem().GetPhysWorld(); + Nz::Vector2f positionOffset; + Nz::Collider2DRef geom; if (m_entity->HasComponent()) - geom = m_entity->GetComponent().GetGeom(); + { + const CollisionComponent2D& entityCollision = m_entity->GetComponent(); + geom = entityCollision.GetGeom(); + positionOffset = entityCollision.GetStaticBody()->GetPositionOffset(); //< Calling GetGeomOffset would retrieve current component which is not yet initialized + } + else + positionOffset = Nz::Vector2f::Zero(); Nz::Matrix4f matrix; if (m_entity->HasComponent()) @@ -42,8 +50,12 @@ namespace Ndk matrix.MakeIdentity(); m_object = std::make_unique(&world, 1.f, geom); + m_object->SetPositionOffset(positionOffset); m_object->SetPosition(Nz::Vector2f(matrix.GetTranslation())); m_object->SetUserdata(reinterpret_cast(static_cast(m_entity->GetId()))); + + if (m_pendingStates.valid) + ApplyPhysicsState(*m_object); } /*! @@ -86,7 +98,11 @@ namespace Ndk void PhysicsComponent2D::OnDetached() { - m_object.reset(); + if (m_object) + { + CopyPhysicsState(*m_object); + m_object.reset(); + } } void PhysicsComponent2D::OnEntityDestruction() diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 3dcdaca71..7adf8da99 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -4,14 +4,12 @@ #include #include -#include #include #include #include +#include #include -///TODO: For now is unable to display different color in the history, it needs a RichTextDrawer to do so - namespace Ndk { namespace @@ -34,71 +32,76 @@ namespace Ndk * \param instance Lua instance that will interact with the world */ - Console::Console(World& world, const Nz::Vector2f& size, Nz::LuaState& state) : + Console::Console(BaseWidget* parent) : + BaseWidget(parent), m_historyPosition(0), m_defaultFont(Nz::Font::GetDefault()), - m_state(state), - m_size(size), - m_opened(false), - m_characterSize(24) + m_characterSize(24), + m_maxHistoryLines(200) { - Nz::MaterialRef backgroundMaterial = Nz::Material::New(); - backgroundMaterial->EnableBlending(true); - backgroundMaterial->EnableDepthBuffer(false); - backgroundMaterial->SetDstBlend(Nz::BlendFunc_InvSrcAlpha); - backgroundMaterial->SetSrcBlend(Nz::BlendFunc_SrcAlpha); - - // History bakckground - m_historyBackgroundSprite = Nz::Sprite::New(); - m_historyBackgroundSprite->SetColor(Nz::Color(80, 80, 160, 128)); - m_historyBackgroundSprite->SetMaterial(backgroundMaterial); - - m_historyBackground = world.CreateEntity(); - m_historyBackground->Enable(m_opened); - m_historyBackground->AddComponent().Attach(m_historyBackgroundSprite, -1); - m_historyBackground->AddComponent().SetParent(this); - // History - m_historyDrawer.SetCharacterSize(m_characterSize); - m_historyDrawer.SetColor(Nz::Color(200, 200, 200)); - m_historyDrawer.SetFont(m_defaultFont); + m_history = Add(); + m_history->EnableBackground(true); + m_history->EnableLineWrap(true); + m_history->SetReadOnly(true); + m_history->SetBackgroundColor(Nz::Color(80, 80, 160, 128)); - m_historyTextSprite = Nz::TextSprite::New(); - - m_history = world.CreateEntity(); - m_history->Enable(m_opened); - m_history->AddComponent().Attach(m_historyTextSprite); - - Ndk::NodeComponent& historyNode = m_history->AddComponent(); - historyNode.SetParent(this); - - // Input background - m_inputBackgroundSprite = Nz::Sprite::New(); - m_inputBackgroundSprite->SetColor(Nz::Color(255, 255, 255, 200)); - m_inputBackgroundSprite->SetMaterial(backgroundMaterial); - - m_inputBackground = world.CreateEntity(); - m_inputBackground->Enable(m_opened); - m_inputBackground->AddComponent().Attach(m_inputBackgroundSprite, -1); - m_inputBackground->AddComponent().SetParent(this); + m_historyArea = Add(m_history); // Input - m_inputDrawer.SetColor(Nz::Color::Black); - m_inputDrawer.SetCharacterSize(m_characterSize); - m_inputDrawer.SetFont(m_defaultFont); - m_inputDrawer.SetText(s_inputPrefix); + m_input = Add(); + m_input->EnableBackground(true); + m_input->SetText(s_inputPrefix); + m_input->SetTextColor(Nz::Color::Black); - m_inputTextSprite = Nz::TextSprite::New(); - m_inputTextSprite->Update(m_inputDrawer); + m_input->OnTextAreaKeyReturn.Connect(this, &Console::ExecuteInput); - m_input = world.CreateEntity(); - m_input->Enable(m_opened); - m_input->AddComponent().Attach(m_inputTextSprite); + // Protect input prefix from erasure/selection + m_input->SetCursorPosition(s_inputPrefixSize); - Ndk::NodeComponent& inputNode = m_input->AddComponent(); - inputNode.SetParent(this); + m_input->OnTextAreaCursorMove.Connect([](const AbstractTextAreaWidget* textArea, Nz::Vector2ui* newCursorPos) + { + newCursorPos->x = std::max(newCursorPos->x, static_cast(s_inputPrefixSize)); + }); - Layout(); + m_input->OnTextAreaSelection.Connect([](const AbstractTextAreaWidget* textArea, Nz::Vector2ui* start, Nz::Vector2ui* end) + { + start->x = std::max(start->x, static_cast(s_inputPrefixSize)); + end->x = std::max(end->x, static_cast(s_inputPrefixSize)); + }); + + m_input->OnTextAreaKeyBackspace.Connect([](const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) + { + if (textArea->GetGlyphIndex() < s_inputPrefixSize) + *ignoreDefaultAction = true; + }); + + // Handle history + m_input->OnTextAreaKeyUp.Connect([&] (const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) + { + *ignoreDefaultAction = true; + + if (m_commandHistory.empty()) + return; + + if (m_historyPosition > 0) + m_historyPosition--; + + m_input->SetText(s_inputPrefix + m_commandHistory[m_historyPosition]); + }); + + m_input->OnTextAreaKeyDown.Connect([&] (const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) + { + *ignoreDefaultAction = true; + + if (m_commandHistory.empty()) + return; + + if (++m_historyPosition >= m_commandHistory.size()) + m_historyPosition = 0; + + m_input->SetText(s_inputPrefix + m_commandHistory[m_historyPosition]); + }); } /*! @@ -107,141 +110,65 @@ namespace Ndk * \param text New line of text * \param color Color for the text */ - void Console::AddLine(const Nz::String& text, const Nz::Color& color) { - AddLineInternal(text, color); - RefreshHistory(); + if (m_historyLines.size() >= m_maxHistoryLines) + m_historyLines.erase(m_historyLines.begin()); + + m_historyLines.emplace_back(Line{ color, text }); + m_history->SetTextColor(color); + m_history->AppendText(text + '\n'); + m_history->Resize(m_history->GetPreferredSize()); + m_historyArea->Resize(m_historyArea->GetSize()); + m_historyArea->ScrollToRatio(1.f); } /*! * \brief Clears the console + * + * Clears the console history and input */ - void Console::Clear() { m_historyLines.clear(); - RefreshHistory(); + m_history->Clear(); + m_history->Resize(m_history->GetPreferredSize()); + m_historyArea->Resize(m_historyArea->GetSize()); + m_input->SetText(s_inputPrefix); } /*! - * \brief Sends a character to the console + * \brief Clears the console focus * - * \param character Character that will be added to the console + * Clear console input widget focus (if owned) */ - - void Console::SendCharacter(char32_t character) + void Console::ClearFocus() { - switch (character) - { - case '\b': - { - Nz::String input = m_inputDrawer.GetText(); - if (input.GetLength() <= s_inputPrefixSize) // Prevent removal of the input prefix - return; // Ignore if no user character is there - - input.Resize(-1, Nz::String::HandleUtf8); - m_inputDrawer.SetText(input); - break; - } - - case '\r': - case '\n': - ExecuteInput(); - break; - - default: - { - if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control) - return; - - m_inputDrawer.AppendText(Nz::String::Unicode(character)); - break; - } - } - - m_inputTextSprite->Update(m_inputDrawer); - } - - /*! - * \brief Sends an event to the console - * - * \param event Event to be takin into consideration by the console - */ - void Console::SendEvent(const Nz::WindowEvent& event) - { - switch (event.type) - { - case Nz::WindowEventType_TextEntered: - SendCharacter(event.text.character); - break; - - case Nz::WindowEventType_KeyPressed: - { - switch (event.key.virtualKey) - { - case Nz::Keyboard::VKey::Down: - case Nz::Keyboard::VKey::Up: - { - if (event.key.virtualKey == Nz::Keyboard::VKey::Up) - m_historyPosition = std::min(m_commandHistory.size(), m_historyPosition + 1); - else - { - if (m_historyPosition > 1) - m_historyPosition--; - else if (m_historyPosition == 0) - m_historyPosition = 1; - } - - if (!m_commandHistory.empty()) - { - Nz::String text = m_commandHistory[m_commandHistory.size() - m_historyPosition]; - m_inputDrawer.SetText(s_inputPrefix + text); - m_inputTextSprite->Update(m_inputDrawer); - } - break; - } - - default: - break; - } - break; - } - - default: - break; - } - } + m_input->ClearFocus(); + } /*! * \brief Sets the character size * * \param size Size of the font */ - void Console::SetCharacterSize(unsigned int size) { m_characterSize = size; - m_historyDrawer.SetCharacterSize(m_characterSize); - m_historyTextSprite->Update(m_historyDrawer); - m_inputDrawer.SetCharacterSize(m_characterSize); - m_inputTextSprite->Update(m_inputDrawer); + m_history->SetCharacterSize(size); + m_input->SetCharacterSize(size); Layout(); } /*! - * \brief Sets the console size + * \brief Give the console input focus * - * \param size (Width, Height) of the console */ - - void Console::SetSize(const Nz::Vector2f& size) + void Console::SetFocus() { - m_size = size; - m_historyBackgroundSprite->SetSize(m_size); - Layout(); + m_input->SetFocus(); } /*! @@ -251,121 +178,55 @@ namespace Ndk * * \remark Produces a NazaraAssert if font is invalid or null */ - void Console::SetTextFont(Nz::FontRef font) { NazaraAssert(font && font->IsValid(), "Invalid font"); m_defaultFont = std::move(font); - m_historyDrawer.SetFont(m_defaultFont); - m_inputDrawer.SetFont(m_defaultFont); + m_history->SetTextFont(m_defaultFont); + m_input->SetTextFont(m_defaultFont); Layout(); } - /*! - * \brief Shows the console - * - * \param show Should the console be showed - */ - - void Console::Show(bool show) - { - if (m_opened != show) - { - m_historyBackground->Enable(show); - m_history->Enable(show); - m_input->Enable(show); - m_inputBackground->Enable(show); - - m_opened = show; - } - } - - /*! - * \brief Adds a line to the history of the console - * - * \param text New line of text - * \param color Color for the text - */ - - void Console::AddLineInternal(const Nz::String& text, const Nz::Color& color) - { - m_historyLines.emplace_back(Line{color, text}); - } - /*! * \brief Performs this action when an input is added to the console */ - - void Console::ExecuteInput() + void Console::ExecuteInput(const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) { - Nz::String input = m_inputDrawer.GetText(); + NazaraAssert(textArea == m_input, "Unexpected signal from an other text area"); + + *ignoreDefaultAction = true; + + Nz::String input = m_input->GetText(); Nz::String inputCmd = input.SubString(s_inputPrefixSize); - m_inputDrawer.SetText(s_inputPrefix); + m_input->SetText(s_inputPrefix); if (m_commandHistory.empty() || m_commandHistory.back() != inputCmd) m_commandHistory.push_back(inputCmd); - m_historyPosition = 0; + m_historyPosition = m_commandHistory.size(); - AddLineInternal(input); //< With the input prefix + AddLine(input); //< With the input prefix - if (!m_state.Execute(inputCmd)) - AddLineInternal(m_state.GetLastError(), Nz::Color::Red); - - RefreshHistory(); + OnCommand(this, inputCmd); } /*! * \brief Places the console according to its layout */ - void Console::Layout() { + Nz::Vector2f origin = Nz::Vector2f(GetPosition()); + const Nz::Vector2f& size = GetSize(); + unsigned int lineHeight = m_defaultFont->GetSizeInfo(m_characterSize).lineHeight; + float historyHeight = size.y - lineHeight; - Ndk::NodeComponent& inputNode = m_input->GetComponent(); - inputNode.SetPosition(0.f, m_size.y - lineHeight - 5.f); + m_historyArea->SetPosition(origin.x, origin.y); + m_historyArea->Resize({ size.x, historyHeight - 4.f }); - float historyHeight = m_size.y - lineHeight - 5.f - 2.f; - m_historyBackgroundSprite->SetSize(m_size.x, historyHeight); - - m_maxHistoryLines = static_cast(std::ceil(historyHeight / lineHeight)); - - Ndk::NodeComponent& historyNode = m_history->GetComponent(); - historyNode.SetPosition(0.f, historyHeight - m_maxHistoryLines * lineHeight); - - Ndk::NodeComponent& inputBackgroundNode = m_inputBackground->GetComponent(); - inputBackgroundNode.SetPosition(0.f, historyHeight + 2.f); - - m_inputBackgroundSprite->SetSize(m_size.x, m_size.y - historyHeight); - } - - /*! - * \brief Refreshes the history of the console - */ - - void Console::RefreshHistory() - { - m_historyDrawer.Clear(); - auto it = m_historyLines.end(); - if (m_historyLines.size() > m_maxHistoryLines) - it -= m_maxHistoryLines; - else - it = m_historyLines.begin(); - - for (unsigned int i = 0; i < m_maxHistoryLines; ++i) - { - if (m_maxHistoryLines - i <= m_historyLines.size() && it != m_historyLines.end()) - { - m_historyDrawer.AppendText(it->text); - ++it; - } - - m_historyDrawer.AppendText(Nz::String('\n')); - } - - m_historyTextSprite->Update(m_historyDrawer); + m_input->Resize({size.x, size.y - historyHeight}); + m_input->SetPosition(origin.x, origin.y + historyHeight); } } diff --git a/SDK/src/NDK/Entity.cpp b/SDK/src/NDK/Entity.cpp index 7bc81982d..8086e5905 100644 --- a/SDK/src/NDK/Entity.cpp +++ b/SDK/src/NDK/Entity.cpp @@ -97,6 +97,36 @@ namespace Ndk return m_world->CloneEntity(m_id); } + /*! + * \brief Detaches a component from the entity + * \return An owning pointer to the component + * + * Instantly detaches a component from the entity and returns it, allowing to attach it to another entity + * + * \remark Unlike RemoveComponent, this function instantly removes the component + */ + std::unique_ptr Entity::DropComponent(ComponentIndex index) + { + if (!HasComponent(index)) + return nullptr; + + // We get the component and we alert existing components of the deleted one + std::unique_ptr component = std::move(m_components[index]); + m_components[index].reset(); + + for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) + { + if (i != index) + m_components[i]->OnComponentDetached(*component); + } + m_componentBits.Reset(index); + m_removedComponentBits.UnboundedReset(index); + + component->SetEntity(nullptr); + + return component; + } + /*! * \brief Enables the entity * @@ -111,11 +141,15 @@ namespace Ndk { for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) m_components[i]->OnEntityEnabled(); + + OnEntityEnabled(this); } else { for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) m_components[i]->OnEntityDisabled(); + + OnEntityDisabled(this); } Invalidate(); @@ -204,32 +238,4 @@ namespace Ndk m_valid = false; } - - /*! - * \brief Destroys a component by index - * - * \param index Index of the component - * - * \remark If component is not available, no action is performed - */ - - void Entity::DestroyComponent(ComponentIndex index) - { - if (HasComponent(index)) - { - // We get the component and we alert existing components of the deleted one - BaseComponent& component = *m_components[index].get(); - for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) - { - if (i != index) - m_components[i]->OnComponentDetached(component); - } - - component.SetEntity(nullptr); - - m_components[index].reset(); - m_componentBits.Reset(index); - } - } - } diff --git a/SDK/src/NDK/Lua/LuaBinding_Math.cpp b/SDK/src/NDK/Lua/LuaBinding_Math.cpp index c218c2a66..15deebfab 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Math.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Math.cpp @@ -282,7 +282,7 @@ namespace Ndk { case 1: if (lua.IsOfType(argIndex, "Matrix4")) - instance.Set(*static_cast(lua.ToUserdata(argIndex))); + instance = *static_cast(lua.ToUserdata(argIndex)); break; case 16: @@ -291,7 +291,7 @@ namespace Ndk for (std::size_t i = 0; i < 16; ++i) values[i] = lua.CheckNumber(argIndex++); - instance.Set(values); + instance = Nz::Matrix4d(values); return 0; } diff --git a/SDK/src/NDK/Lua/LuaBinding_SDK.cpp b/SDK/src/NDK/Lua/LuaBinding_SDK.cpp index 36c28d973..805f7742d 100644 --- a/SDK/src/NDK/Lua/LuaBinding_SDK.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_SDK.cpp @@ -62,24 +62,14 @@ namespace Ndk console.BindMethod("AddLine", &Console::AddLine, Nz::Color::White); console.BindMethod("Clear", &Console::Clear); console.BindMethod("GetCharacterSize", &Console::GetCharacterSize); - console.BindMethod("GetHistory", &Console::GetHistory); - console.BindMethod("GetHistoryBackground", &Console::GetHistoryBackground); - console.BindMethod("GetInput", &Console::GetInput); - console.BindMethod("GetInputBackground", &Console::GetInputBackground); - console.BindMethod("GetSize", &Console::GetSize); + //console.BindMethod("GetHistory", &Console::GetHistory); + //console.BindMethod("GetInput", &Console::GetInput); console.BindMethod("GetTextFont", &Console::GetTextFont); console.BindMethod("IsValidHandle", &ConsoleHandle::IsValid); - console.BindMethod("IsVisible", &Console::IsVisible); - - console.BindMethod("SendCharacter", &Console::SendCharacter); - //consoleClass.SetMethod("SendEvent", &Console::SendEvent); console.BindMethod("SetCharacterSize", &Console::SetCharacterSize); - console.BindMethod("SetSize", &Console::SetSize); console.BindMethod("SetTextFont", &Console::SetTextFont); - - console.BindMethod("Show", &Console::Show, true); } #endif diff --git a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp index 43ea4a8c7..262620b12 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp @@ -123,12 +123,13 @@ namespace Ndk lua.Push(instance->GetCachedGlyphCount()); return 1; - case 2: + case 3: { unsigned int characterSize = lua.Check(&argIndex); - Nz::UInt32 style = lua.Check(&argIndex); + Nz::TextStyleFlags style = lua.Check(&argIndex); + float outlineThickness = lua.Check(&argIndex); - lua.Push(instance->GetCachedGlyphCount(characterSize, style)); + lua.Push(instance->GetCachedGlyphCount(characterSize, style, outlineThickness)); return 1; } } @@ -146,7 +147,7 @@ namespace Ndk font.BindMethod("IsValid", &Nz::Font::IsValid); - font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::UInt32, const Nz::String&) const) &Nz::Font::Precache); + font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::TextStyleFlags, float, const Nz::String&) const) &Nz::Font::Precache); font.BindMethod("SetGlyphBorder", &Nz::Font::SetGlyphBorder); font.BindMethod("SetMinimumStepSize", &Nz::Font::SetMinimumStepSize); diff --git a/SDK/src/NDK/Sdk.cpp b/SDK/src/NDK/Sdk.cpp index 90d07c738..341e6f0d5 100644 --- a/SDK/src/NDK/Sdk.cpp +++ b/SDK/src/NDK/Sdk.cpp @@ -17,11 +17,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -88,6 +90,7 @@ namespace Ndk // Shared components InitializeComponent("NdkColl2"); InitializeComponent("NdkColl3"); + InitializeComponent("NdkLiftm"); InitializeComponent("NdkNode"); InitializeComponent("NdkPhys2"); InitializeComponent("NdkPhys3"); @@ -110,6 +113,7 @@ namespace Ndk BaseSystem::Initialize(); // Shared systems + InitializeSystem(); InitializeSystem(); InitializeSystem(); InitializeSystem(); diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 063a25d77..5b8bb7aa6 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -8,10 +8,12 @@ #include #include #include +#include #include #include #include #include +#include namespace Ndk { @@ -151,12 +153,174 @@ namespace Ndk /*! * \brief Constructs an DebugSystem object by default */ - DebugSystem::DebugSystem() + DebugSystem::DebugSystem() : + m_isDepthBufferEnabled(true) { Requires(); SetUpdateOrder(1000); //< Update last } + void DebugSystem::EnableDepthBuffer(bool enable) + { + m_isDepthBufferEnabled = enable; + + if (m_collisionMaterial) + m_collisionMaterial->EnableDepthBuffer(enable); + + if (m_globalAabbMaterial) + m_globalAabbMaterial->EnableDepthBuffer(enable); + + if (m_localAabbMaterial) + m_localAabbMaterial->EnableDepthBuffer(enable); + + if (m_obbMaterial) + m_obbMaterial->EnableDepthBuffer(enable); + } + + Nz::InstancedRenderableRef DebugSystem::GenerateBox(Nz::Boxf box) + { + Nz::MeshRef mesh = Nz::Mesh::New(); + mesh->CreateStatic(); + + mesh->BuildSubMesh(Nz::Primitive::Box(box.GetLengths())); + mesh->SetMaterialCount(1); + + Nz::ModelRef model = Nz::Model::New(); + model->SetMesh(mesh); + model->SetMaterial(0, GetOBBMaterial()); + + return model; + } + + Nz::InstancedRenderableRef DebugSystem::GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset) + { + if (entity->HasComponent()) + { + CollisionComponent2D& entityCollision = entity->GetComponent(); + const Nz::Collider2DRef& geom = entityCollision.GetGeom(); + + std::vector vertices; + std::vector indices; + + geom->ForEachPolygon([&](const Nz::Vector2f* polygonVertices, std::size_t vertexCount) + { + std::size_t firstIndex = vertices.size(); + + // Don't reserve and let the vector handle its own capacity + for (std::size_t i = 0; i < vertexCount; ++i) + vertices.emplace_back(*polygonVertices++); + + for (std::size_t i = 0; i < vertexCount - 1; ++i) + { + indices.push_back(firstIndex + i); + indices.push_back(firstIndex + i + 1); + } + + indices.push_back(firstIndex + vertexCount - 1); + indices.push_back(firstIndex); + }); + + Nz::IndexBufferRef indexBuffer = Nz::IndexBuffer::New(vertices.size() > 0xFFFF, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0); + Nz::IndexMapper indexMapper(indexBuffer, Nz::BufferAccess_WriteOnly); + + Nz::IndexIterator indexPtr = indexMapper.begin(); + for (std::size_t index : indices) + *indexPtr++ = static_cast(index); + + indexMapper.Unmap(); + + Nz::VertexBufferRef vertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(vertices.size()), Nz::DataStorage_Hardware, 0); + vertexBuffer->Fill(vertices.data(), 0, Nz::UInt32(vertices.size())); + + Nz::MeshRef mesh = Nz::Mesh::New(); + mesh->CreateStatic(); + + Nz::StaticMeshRef subMesh = Nz::StaticMesh::New(vertexBuffer, indexBuffer); + subMesh->SetPrimitiveMode(Nz::PrimitiveMode_LineList); + subMesh->SetMaterialIndex(0); + subMesh->GenerateAABB(); + + mesh->SetMaterialCount(1); + mesh->AddSubMesh(subMesh); + + Nz::ModelRef model = Nz::Model::New(); + model->SetMesh(mesh); + model->SetMaterial(0, GetCollisionMaterial()); + + // Find center of mass + if (entity->HasComponent()) + { + const PhysicsComponent2D& entityPhys = entity->GetComponent(); + *offset = entityPhys.GetMassCenter(Nz::CoordSys_Local) + entityCollision.GetGeomOffset(); + } + else + *offset = entityCollision.GetGeomOffset(); + + return model; + } + else + return nullptr; + } + + Nz::InstancedRenderableRef DebugSystem::GenerateCollision3DMesh(Entity* entity) + { + if (entity->HasComponent()) + { + CollisionComponent3D& entityCollision = entity->GetComponent(); + const Nz::Collider3DRef& geom = entityCollision.GetGeom(); + + std::vector vertices; + std::vector indices; + + geom->ForEachPolygon([&](const Nz::Vector3f* polygonVertices, std::size_t vertexCount) + { + std::size_t firstIndex = vertices.size(); + vertices.resize(firstIndex + vertexCount); + std::copy(polygonVertices, polygonVertices + vertexCount, &vertices[firstIndex]); + + for (std::size_t i = 0; i < vertexCount - 1; ++i) + { + indices.push_back(firstIndex + i); + indices.push_back(firstIndex + i + 1); + } + + indices.push_back(firstIndex + vertexCount - 1); + indices.push_back(firstIndex); + }); + + Nz::IndexBufferRef indexBuffer = Nz::IndexBuffer::New(vertices.size() > 0xFFFF, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0); + Nz::IndexMapper indexMapper(indexBuffer, Nz::BufferAccess_WriteOnly); + + Nz::IndexIterator indexPtr = indexMapper.begin(); + for (std::size_t index : indices) + *indexPtr++ = static_cast(index); + + indexMapper.Unmap(); + + Nz::VertexBufferRef vertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(vertices.size()), Nz::DataStorage_Hardware, 0); + vertexBuffer->Fill(vertices.data(), 0, Nz::UInt32(vertices.size())); + + Nz::MeshRef mesh = Nz::Mesh::New(); + mesh->CreateStatic(); + + Nz::StaticMeshRef subMesh = Nz::StaticMesh::New(vertexBuffer, indexBuffer); + subMesh->SetPrimitiveMode(Nz::PrimitiveMode_LineList); + subMesh->SetMaterialIndex(0); + subMesh->GenerateAABB(); + + mesh->SetMaterialCount(1); + mesh->AddSubMesh(subMesh); + + Nz::ModelRef model = Nz::Model::New(); + model->SetMesh(mesh); + model->SetMaterial(0, GetCollisionMaterial()); + + return model; + } + else + return nullptr; + } + std::pair DebugSystem::GetBoxMesh() { if (!m_boxMeshIndexBuffer) @@ -208,6 +372,66 @@ namespace Ndk return { m_boxMeshIndexBuffer, m_boxMeshVertexBuffer }; } + Nz::MaterialRef DebugSystem::GetGlobalAABBMaterial() + { + if (!m_globalAabbMaterial) + { + m_globalAabbMaterial = Nz::Material::New(); + m_globalAabbMaterial->EnableFaceCulling(false); + m_globalAabbMaterial->EnableDepthBuffer(true); + m_globalAabbMaterial->SetDiffuseColor(Nz::Color::Orange); + m_globalAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + //m_globalAabbMaterial->SetLineWidth(2.f); + } + + return m_globalAabbMaterial; + } + + Nz::MaterialRef DebugSystem::GetLocalAABBMaterial() + { + if (!m_localAabbMaterial) + { + m_localAabbMaterial = Nz::Material::New(); + m_localAabbMaterial->EnableFaceCulling(false); + m_localAabbMaterial->EnableDepthBuffer(true); + m_localAabbMaterial->SetDiffuseColor(Nz::Color::Red); + m_localAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + //m_localAabbMaterial->SetLineWidth(2.f); + } + + return m_localAabbMaterial; + } + + Nz::MaterialRef DebugSystem::GetCollisionMaterial() + { + if (!m_collisionMaterial) + { + m_collisionMaterial = Nz::Material::New(); + m_collisionMaterial->EnableFaceCulling(false); + m_collisionMaterial->EnableDepthBuffer(true); + m_collisionMaterial->SetDiffuseColor(Nz::Color::Blue); + m_collisionMaterial->SetFaceFilling(Nz::FaceFilling_Line); + //m_collisionMaterial->SetLineWidth(2.f); + } + + return m_collisionMaterial; + } + + Nz::MaterialRef DebugSystem::GetOBBMaterial() + { + if (!m_obbMaterial) + { + m_obbMaterial = Nz::Material::New(); + m_obbMaterial->EnableFaceCulling(false); + m_obbMaterial->EnableDepthBuffer(true); + m_obbMaterial->SetDiffuseColor(Nz::Color::Green); + m_obbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + //m_obbMaterial->SetLineWidth(2.f); + } + + return m_obbMaterial; + } + void DebugSystem::OnEntityValidation(Entity* entity, bool /*justAdded*/) { static constexpr int DebugDrawOrder = 1'000; @@ -227,17 +451,24 @@ namespace Ndk { switch (option) { + case DebugDraw::Collider2D: + { + Nz::Vector3f offset; + Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset); + if (renderable) + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(offset), DebugDrawOrder); + + entityDebug.UpdateDebugRenderable(option, std::move(renderable)); + break; + } + case DebugDraw::Collider3D: { const Nz::Boxf& obb = entityGfx.GetAABB(); Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity); if (renderable) - { - renderable->SetPersistent(false); - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder); - } entityDebug.UpdateDebugRenderable(option, std::move(renderable)); break; @@ -291,143 +522,5 @@ namespace Ndk // Nothing to do } - Nz::InstancedRenderableRef DebugSystem::GenerateBox(Nz::Boxf box) - { - Nz::MeshRef mesh = Nz::Mesh::New(); - mesh->CreateStatic(); - - mesh->BuildSubMesh(Nz::Primitive::Box(box.GetLengths())); - mesh->SetMaterialCount(1); - - Nz::ModelRef model = Nz::Model::New(); - model->SetMesh(mesh); - model->SetMaterial(0, GetOBBMaterial()); - - return model; - } - - Nz::InstancedRenderableRef DebugSystem::GenerateCollision3DMesh(Entity* entity) - { - if (entity->HasComponent()) - { - CollisionComponent3D& entityCollision = entity->GetComponent(); - const Nz::Collider3DRef& geom = entityCollision.GetGeom(); - - std::vector vertices; - std::vector indices; - - geom->ForEachPolygon([&](const float* polygonVertices, std::size_t vertexCount) - { - std::size_t firstIndex = vertices.size(); - - for (std::size_t i = 0; i < vertexCount; ++i) - { - const float* vertexData = &polygonVertices[i * 3]; - vertices.emplace_back(vertexData[0], vertexData[1], vertexData[2]); - } - - for (std::size_t i = 0; i < vertexCount - 1; ++i) - { - indices.push_back(firstIndex + i); - indices.push_back(firstIndex + i + 1); - } - - indices.push_back(firstIndex + vertexCount - 1); - indices.push_back(firstIndex); - }); - - Nz::IndexBufferRef indexBuffer = Nz::IndexBuffer::New(vertices.size() > 0xFFFF, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0); - Nz::IndexMapper indexMapper(indexBuffer, Nz::BufferAccess_WriteOnly); - - Nz::IndexIterator indexPtr = indexMapper.begin(); - for (std::size_t index : indices) - *indexPtr++ = static_cast(index); - - indexMapper.Unmap(); - - Nz::VertexBufferRef vertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(vertices.size()), Nz::DataStorage_Hardware, 0); - vertexBuffer->Fill(vertices.data(), 0, Nz::UInt32(vertices.size())); - - Nz::MeshRef mesh = Nz::Mesh::New(); - mesh->CreateStatic(); - - Nz::StaticMeshRef subMesh = Nz::StaticMesh::New(vertexBuffer, indexBuffer); - subMesh->SetPrimitiveMode(Nz::PrimitiveMode_LineList); - subMesh->SetMaterialIndex(0); - subMesh->GenerateAABB(); - - mesh->SetMaterialCount(1); - mesh->AddSubMesh(subMesh); - - Nz::ModelRef model = Nz::Model::New(); - model->SetMesh(mesh); - model->SetMaterial(0, GetCollisionMaterial()); - - return model; - } - else - return nullptr; - } - - Nz::MaterialRef DebugSystem::GetGlobalAABBMaterial() - { - if (!m_globalAabbMaterial) - { - m_globalAabbMaterial = Nz::Material::New(); - m_globalAabbMaterial->EnableFaceCulling(false); - m_globalAabbMaterial->EnableDepthBuffer(true); - m_globalAabbMaterial->SetDiffuseColor(Nz::Color::Orange); - m_globalAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_globalAabbMaterial->SetLineWidth(2.f); - } - - return m_globalAabbMaterial; - } - - Nz::MaterialRef DebugSystem::GetLocalAABBMaterial() - { - if (!m_localAabbMaterial) - { - m_localAabbMaterial = Nz::Material::New(); - m_localAabbMaterial->EnableFaceCulling(false); - m_localAabbMaterial->EnableDepthBuffer(true); - m_localAabbMaterial->SetDiffuseColor(Nz::Color::Red); - m_localAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_localAabbMaterial->SetLineWidth(2.f); - } - - return m_localAabbMaterial; - } - - Nz::MaterialRef DebugSystem::GetCollisionMaterial() - { - if (!m_collisionMaterial) - { - m_collisionMaterial = Nz::Material::New(); - m_collisionMaterial->EnableFaceCulling(false); - m_collisionMaterial->EnableDepthBuffer(true); - m_collisionMaterial->SetDiffuseColor(Nz::Color::Blue); - m_collisionMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_collisionMaterial->SetLineWidth(2.f); - } - - return m_collisionMaterial; - } - - Nz::MaterialRef DebugSystem::GetOBBMaterial() - { - if (!m_obbMaterial) - { - m_obbMaterial = Nz::Material::New(); - m_obbMaterial->EnableFaceCulling(false); - m_obbMaterial->EnableDepthBuffer(true); - m_obbMaterial->SetDiffuseColor(Nz::Color::Green); - m_obbMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_obbMaterial->SetLineWidth(2.f); - } - - return m_obbMaterial; - } - SystemIndex DebugSystem::systemIndex; } diff --git a/SDK/src/NDK/Systems/LifetimeSystem.cpp b/SDK/src/NDK/Systems/LifetimeSystem.cpp new file mode 100644 index 000000000..d575ebdc4 --- /dev/null +++ b/SDK/src/NDK/Systems/LifetimeSystem.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include +#include + +namespace Ndk +{ + LifetimeSystem::LifetimeSystem() + { + Requires(); + } + + void LifetimeSystem::OnUpdate(float elapsedTime) + { + for (const Ndk::EntityHandle& entity : GetEntities()) + { + auto& lifetime = entity->GetComponent(); + + if (lifetime.UpdateLifetime(elapsedTime)) + entity->Kill(); + } + } + + SystemIndex LifetimeSystem::systemIndex; +} diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 6579bb1fb..4b6386c74 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -86,14 +86,30 @@ namespace Ndk bool PhysicsSystem2D::NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, NearestQueryResult* result) { Nz::PhysWorld2D::NearestQueryResult queryResult; - bool res = GetPhysWorld().NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &queryResult); + if (GetPhysWorld().NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &queryResult)) + { + result->nearestBody = GetEntityFromBody(*queryResult.nearestBody); + result->closestPoint = std::move(queryResult.closestPoint); + result->fraction = std::move(queryResult.fraction); + result->distance = queryResult.distance; - result->nearestBody = GetEntityFromBody(*queryResult.nearestBody); - result->closestPoint = std::move(queryResult.closestPoint); - result->fraction = std::move(queryResult.fraction); - result->distance = queryResult.distance; + return true; + } + else + return false; + } - return res; + void PhysicsSystem2D::RaycastQuery(const Nz::Vector2f & from, const Nz::Vector2f & to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + return GetPhysWorld().RaycastQuery(from, to, radius, collisionGroup, categoryMask, collisionMask, [this, &callback](const Nz::PhysWorld2D::RaycastHit& hitInfo) + { + callback({ + GetEntityFromBody(*hitInfo.nearestBody), + hitInfo.hitPos, + hitInfo.hitNormal, + hitInfo.fraction + }); + }); } bool PhysicsSystem2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos) @@ -108,7 +124,7 @@ namespace Ndk std::move(hitResult.hitPos), std::move(hitResult.hitNormal), hitResult.fraction - }); + }); } return res; @@ -117,14 +133,25 @@ namespace Ndk bool PhysicsSystem2D::RaycastQueryFirst(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RaycastHit* hitInfo) { Nz::PhysWorld2D::RaycastHit queryResult; - bool res = GetPhysWorld().RaycastQueryFirst(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); + if (GetPhysWorld().RaycastQueryFirst(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult)) + { + hitInfo->body = GetEntityFromBody(*queryResult.nearestBody); + hitInfo->hitPos = std::move(queryResult.hitPos); + hitInfo->hitNormal = std::move(queryResult.hitNormal); + hitInfo->fraction = queryResult.fraction; - hitInfo->body = GetEntityFromBody(*queryResult.nearestBody); - hitInfo->hitPos = std::move(queryResult.hitPos); - hitInfo->hitNormal = std::move(queryResult.hitNormal); - hitInfo->fraction = queryResult.fraction; + return true; + } + else + return false; + } - return res; + void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + return GetPhysWorld().RegionQuery(boundingBox, collisionGroup, categoryMask, collisionMask, [this, &callback](Nz::RigidBody2D* body) + { + callback(GetEntityFromBody(*body)); + }); } void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) @@ -169,7 +196,7 @@ namespace Ndk auto& node = entity->GetComponent(); Nz::RigidBody2D* physObj = collision.GetStaticBody(); - physObj->SetPosition(Nz::Vector2f(node.GetPosition())); + physObj->SetPosition(Nz::Vector2f(node.GetPosition(Nz::CoordSys_Global))); //physObj->SetRotation(node.GetRotation()); } } @@ -213,7 +240,7 @@ namespace Ndk Nz::Vector2f newPosition = Nz::Vector2f(node.GetPosition(Nz::CoordSys_Global)); // To move static objects and ensure their collisions, we have to specify them a velocity - // (/!\: the physical motor does not apply the speed on static objects) + // (/!\: the physical engine does not apply the speed on static objects) if (newPosition != oldPosition) { body->SetPosition(newPosition); @@ -222,8 +249,7 @@ namespace Ndk else body->SetVelocity(Nz::Vector2f::Zero()); -/* - if (newRotation != oldRotation) + /*if (newRotation != oldRotation) { Nz::Quaternionf transition = newRotation * oldRotation.GetConjugate(); Nz::EulerAnglesf angles = transition.ToEulerAngles(); @@ -235,8 +261,7 @@ namespace Ndk physObj->SetAngularVelocity(angularVelocity); } else - physObj->SetAngularVelocity(Nz::Vector3f::Zero()); -*/ + physObj->SetAngularVelocity(Nz::Vector3f::Zero());*/ } } @@ -283,7 +308,7 @@ namespace Ndk void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks) { - Nz::PhysWorld2D::Callback worldCallbacks{}; + Nz::PhysWorld2D::Callback worldCallbacks; if (callbacks.endCallback) { diff --git a/SDK/src/NDK/Systems/PhysicsSystem3D.cpp b/SDK/src/NDK/Systems/PhysicsSystem3D.cpp index d0256a416..4e905a64c 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem3D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem3D.cpp @@ -69,8 +69,8 @@ namespace Ndk auto& node = entity->GetComponent(); Nz::RigidBody3D* physObj = collision.GetStaticBody(); - physObj->SetPosition(node.GetPosition()); - physObj->SetRotation(node.GetRotation()); + physObj->SetPosition(node.GetPosition(Nz::CoordSys_Global)); + physObj->SetRotation(node.GetRotation(Nz::CoordSys_Global)); } } diff --git a/SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp b/SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp new file mode 100644 index 000000000..ddb3467f5 --- /dev/null +++ b/SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp @@ -0,0 +1,489 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include +#include +#include +#include +#include + +namespace Ndk +{ + namespace + { + constexpr float paddingWidth = 5.f; + constexpr float paddingHeight = 3.f; + } + + AbstractTextAreaWidget::AbstractTextAreaWidget(BaseWidget* parent) : + BaseWidget(parent), + m_characterFilter(), + m_echoMode(EchoMode_Normal), + m_cursorPositionBegin(0U, 0U), + m_cursorPositionEnd(0U, 0U), + m_isLineWrapEnabled(false), + m_isMouseButtonDown(false), + m_multiLineEnabled(false), + m_readOnly(false), + m_tabEnabled(false) + { + m_textSprite = Nz::TextSprite::New(); + + m_textEntity = CreateEntity(); + m_textEntity->AddComponent().Attach(m_textSprite); + + auto& textNode = m_textEntity->AddComponent(); + textNode.SetParent(this); + textNode.SetPosition(paddingWidth, paddingHeight); + + m_cursorEntity = CreateEntity(); + m_cursorEntity->AddComponent(); + m_cursorEntity->AddComponent().SetParent(m_textEntity); + m_cursorEntity->GetComponent(); + m_cursorEntity->Enable(false); + + SetCursor(Nz::SystemCursor_Text); + + EnableBackground(true); + } + + void AbstractTextAreaWidget::Clear() + { + Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + m_cursorPositionBegin.MakeZero(); + m_cursorPositionEnd.MakeZero(); + textDrawer.Clear(); + m_textSprite->Update(textDrawer); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + + RefreshCursor(); + } + + void AbstractTextAreaWidget::EnableLineWrap(bool enable) + { + if (m_isLineWrapEnabled != enable) + { + m_isLineWrapEnabled = enable; + + Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + if (enable) + textDrawer.SetMaxLineWidth(GetWidth()); + else + textDrawer.SetMaxLineWidth(std::numeric_limits::infinity()); + + UpdateTextSprite(); + } + } + + Nz::Vector2ui AbstractTextAreaWidget::GetHoveredGlyph(float x, float y) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + auto& textNode = m_textEntity->GetComponent(); + Nz::Vector2f textPosition = Nz::Vector2f(textNode.GetPosition(Nz::CoordSys_Local)); + x -= textPosition.x; + y -= textPosition.y; + + std::size_t glyphCount = textDrawer.GetGlyphCount(); + if (glyphCount > 0) + { + std::size_t lineCount = textDrawer.GetLineCount(); + std::size_t line = 0U; + for (; line < lineCount - 1; ++line) + { + Nz::Rectf lineBounds = textDrawer.GetLine(line).bounds; + if (lineBounds.GetMaximum().y > y) + break; + } + + std::size_t upperLimit = (line != lineCount - 1) ? textDrawer.GetLine(line + 1).glyphIndex : glyphCount + 1; + + std::size_t firstLineGlyph = textDrawer.GetLine(line).glyphIndex; + std::size_t i = firstLineGlyph; + for (; i < upperLimit - 1; ++i) + { + Nz::Rectf bounds = textDrawer.GetGlyph(i).bounds; + if (x < bounds.x + bounds.width * 0.75f) + break; + } + + return Nz::Vector2ui(Nz::Vector2(i - firstLineGlyph, line)); + } + + return Nz::Vector2ui::Zero(); + } + + void AbstractTextAreaWidget::Layout() + { + BaseWidget::Layout(); + + if (m_isLineWrapEnabled) + { + Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + textDrawer.SetMaxLineWidth(GetWidth()); + UpdateTextSprite(); + } + + RefreshCursor(); + } + + bool AbstractTextAreaWidget::IsFocusable() const + { + return !m_readOnly; + } + + void AbstractTextAreaWidget::OnFocusLost() + { + m_cursorEntity->Disable(); + } + + void AbstractTextAreaWidget::OnFocusReceived() + { + if (!m_readOnly) + m_cursorEntity->Enable(true); + } + + bool AbstractTextAreaWidget::OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + switch (key.code) + { + case Nz::Keyboard::Backspace: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyBackspace(this, &ignoreDefaultAction); + + std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); + + if (ignoreDefaultAction || cursorGlyphEnd == 0) + return true; + + // When a text is selected, delete key does the same as delete and leave the character behind it + if (HasSelection()) + EraseSelection(); + else + { + MoveCursor(-1); + Erase(GetGlyphIndex(m_cursorPositionBegin)); + } + + return true; + } + + case Nz::Keyboard::Delete: + { + if (HasSelection()) + EraseSelection(); + else + Erase(GetGlyphIndex(m_cursorPositionBegin)); + + return true; + } + + case Nz::Keyboard::Down: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyDown(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionEnd); + + MoveCursor({0, 1}); + return true; + } + + case Nz::Keyboard::End: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyEnd(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + std::size_t lineCount = textDrawer.GetLineCount(); + if (key.control && lineCount > 0) + SetCursorPosition({ static_cast(textDrawer.GetLineGlyphCount(lineCount - 1)), static_cast(lineCount - 1) }); + else + SetCursorPosition({ static_cast(textDrawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); + + return true; + } + + case Nz::Keyboard::Home: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyHome(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + SetCursorPosition({ 0U, key.control ? 0U : m_cursorPositionEnd.y }); + return true; + } + + case Nz::Keyboard::Left: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyLeft(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionBegin); + else if (key.control) + HandleWordCursorMove(true); + else + MoveCursor(-1); + + return true; + } + + case Nz::Keyboard::Return: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyReturn(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (!m_multiLineEnabled) + break; + + if (HasSelection()) + EraseSelection(); + + Write(Nz::String('\n')); + return true;; + } + + case Nz::Keyboard::Right: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyRight(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionEnd); + else if (key.control) + HandleWordCursorMove(false); + else + MoveCursor(1); + + return true; + } + + case Nz::Keyboard::Up: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyUp(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionBegin); + + MoveCursor({0, -1}); + return true; + } + + case Nz::Keyboard::Tab: + { + if (!m_tabEnabled) + return false; + + if (HasSelection()) + HandleSelectionIndentation(!key.shift); + else + HandleIndentation(!key.shift); + + return true; + } + + default: + break; + } + + return false; + } + + void AbstractTextAreaWidget::OnKeyReleased(const Nz::WindowEvent::KeyEvent& /*key*/) + { + } + + void AbstractTextAreaWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) + { + if (button == Nz::Mouse::Left) + { + SetFocus(); + + Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x), float(y)); + + // Shift extends selection + if (Nz::Keyboard::IsKeyPressed(Nz::Keyboard::LShift) || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::RShift)) + SetSelection(hoveredGlyph, m_selectionCursor); + else + { + SetCursorPosition(hoveredGlyph); + m_selectionCursor = m_cursorPositionBegin; + } + + m_isMouseButtonDown = true; + } + } + + void AbstractTextAreaWidget::OnMouseButtonRelease(int, int, Nz::Mouse::Button button) + { + if (button == Nz::Mouse::Left) + m_isMouseButtonDown = false; + } + + void AbstractTextAreaWidget::OnMouseEnter() + { + if (!Nz::Mouse::IsButtonPressed(Nz::Mouse::Left)) + m_isMouseButtonDown = false; + } + + void AbstractTextAreaWidget::OnMouseMoved(int x, int y, int deltaX, int deltaY) + { + if (m_isMouseButtonDown) + SetSelection(m_selectionCursor, GetHoveredGlyph(float(x), float(y))); + } + + void AbstractTextAreaWidget::OnTextEntered(char32_t character, bool /*repeated*/) + { + if (m_readOnly) + return; + + if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) + return; + + if (HasSelection()) + EraseSelection(); + + Write(Nz::String::Unicode(character)); + } + + void AbstractTextAreaWidget::RefreshCursor() + { + if (m_readOnly) + return; + + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + auto GetGlyph = [&](const Nz::Vector2ui& glyphPosition, std::size_t* glyphIndex) -> const Nz::AbstractTextDrawer::Glyph* + { + if (glyphPosition.y >= textDrawer.GetLineCount()) + return nullptr; + + const auto& lineInfo = textDrawer.GetLine(glyphPosition.y); + + std::size_t cursorGlyph = GetGlyphIndex({ glyphPosition.x, glyphPosition.y }); + if (glyphIndex) + *glyphIndex = cursorGlyph; + + std::size_t glyphCount = textDrawer.GetGlyphCount(); + if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) + { + const auto& glyph = textDrawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); + return &glyph; + } + else + return nullptr; + }; + + // Move text so that cursor is always visible + const auto* lastGlyph = GetGlyph(m_cursorPositionEnd, nullptr); + float glyphPos = (lastGlyph) ? lastGlyph->bounds.x : 0.f; + float glyphWidth = (lastGlyph) ? lastGlyph->bounds.width : 0.f; + + auto& node = m_textEntity->GetComponent(); + float textPosition = node.GetPosition(Nz::CoordSys_Local).x - paddingWidth; + float cursorPosition = glyphPos + textPosition; + float width = GetWidth(); + + if (width <= textDrawer.GetBounds().width) + { + if (cursorPosition + glyphWidth > width) + node.Move(width - cursorPosition - glyphWidth, 0.f); + else if (cursorPosition - glyphWidth < 0.f) + node.Move(-cursorPosition + glyphWidth, 0.f); + } + else + node.Move(-textPosition, 0.f); // Reset text position if we have enough room to show everything + + // Show cursor/selection + std::size_t selectionLineCount = m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1; + std::size_t oldSpriteCount = m_cursorSprites.size(); + if (m_cursorSprites.size() != selectionLineCount) + { + m_cursorSprites.resize(m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1); + for (std::size_t i = oldSpriteCount; i < m_cursorSprites.size(); ++i) + { + m_cursorSprites[i] = Nz::Sprite::New(); + m_cursorSprites[i]->SetMaterial(Nz::Material::New("Translucent2D")); + } + } + + GraphicsComponent& gfxComponent = m_cursorEntity->GetComponent(); + gfxComponent.Clear(); + + for (unsigned int i = m_cursorPositionBegin.y; i <= m_cursorPositionEnd.y; ++i) + { + const auto& lineInfo = textDrawer.GetLine(i); + + Nz::SpriteRef& cursorSprite = m_cursorSprites[i - m_cursorPositionBegin.y]; + if (i == m_cursorPositionBegin.y || i == m_cursorPositionEnd.y) + { + auto GetGlyphPos = [&](const Nz::Vector2ui& glyphPosition) + { + std::size_t glyphIndex; + const auto* glyph = GetGlyph(glyphPosition, &glyphIndex); + if (glyph) + { + float position = glyph->bounds.x; + if (glyphIndex >= textDrawer.GetGlyphCount()) + position += glyph->bounds.width; + + return position; + } + else + return 0.f; + }; + + float beginX = (i == m_cursorPositionBegin.y) ? GetGlyphPos({ m_cursorPositionBegin.x, i }) : 0.f; + float endX = (i == m_cursorPositionEnd.y) ? GetGlyphPos({ m_cursorPositionEnd.x, i }) : lineInfo.bounds.width; + float spriteSize = std::max(endX - beginX, 1.f); + + cursorSprite->SetColor((m_cursorPositionBegin == m_cursorPositionEnd) ? Nz::Color::Black : Nz::Color(0, 0, 0, 50)); + cursorSprite->SetSize(spriteSize, lineInfo.bounds.height); + + gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ beginX, lineInfo.bounds.y, 0.f })); + } + else + { + cursorSprite->SetColor(Nz::Color(0, 0, 0, 50)); + cursorSprite->SetSize(lineInfo.bounds.width, lineInfo.bounds.height); + + gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ 0.f, lineInfo.bounds.y, 0.f })); + } + } + } + + void AbstractTextAreaWidget::UpdateTextSprite() + { + m_textSprite->Update(GetTextDrawer()); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + } +} diff --git a/SDK/src/NDK/Widgets/ImageWidget.cpp b/SDK/src/NDK/Widgets/ImageWidget.cpp index 8a766419b..0a1cfdc81 100644 --- a/SDK/src/NDK/Widgets/ImageWidget.cpp +++ b/SDK/src/NDK/Widgets/ImageWidget.cpp @@ -12,7 +12,7 @@ namespace Ndk BaseWidget(parent) { m_entity = CreateEntity(); - m_entity->AddComponent(); + m_entity->AddComponent().SetParent(this); auto& gfx = m_entity->AddComponent(); m_sprite = Nz::Sprite::New(); diff --git a/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp new file mode 100644 index 000000000..35abb6e06 --- /dev/null +++ b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp @@ -0,0 +1,196 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + RichTextAreaWidget::RichTextAreaWidget(BaseWidget* parent) : + AbstractTextAreaWidget(parent) + { + Layout(); + } + + void RichTextAreaWidget::AppendText(const Nz::String& text) + { + //m_text += text; + switch (m_echoMode) + { + case EchoMode_Normal: + m_drawer.AppendText(text); + break; + + case EchoMode_Password: + m_drawer.AppendText(Nz::String(text.GetLength(), '*')); + break; + + case EchoMode_PasswordExceptLast: + { + /*m_drawer.Clear(); + std::size_t textLength = m_text.GetLength(); + if (textLength >= 2) + { + std::size_t lastCharacterPosition = m_text.GetCharacterPosition(textLength - 2); + if (lastCharacterPosition != Nz::String::npos) + m_drawer.AppendText(Nz::String(textLength - 1, '*')); + } + + if (textLength >= 1) + m_drawer.AppendText(m_text.SubString(m_text.GetCharacterPosition(textLength - 1)));*/ + + break; + } + } + + UpdateTextSprite(); + + //OnTextChanged(this, m_text); + } + + void RichTextAreaWidget::Clear() + { + AbstractTextAreaWidget::Clear(); + } + + void RichTextAreaWidget::Erase(std::size_t firstGlyph, std::size_t lastGlyph) + { + if (firstGlyph > lastGlyph) + std::swap(firstGlyph, lastGlyph); + + std::size_t textLength = m_drawer.GetGlyphCount(); + if (firstGlyph > textLength) + return; + + std::size_t firstBlock = m_drawer.FindBlock(firstGlyph); + std::size_t lastBlock = m_drawer.FindBlock((lastGlyph > 0) ? lastGlyph - 1 : lastGlyph); + if (firstBlock == lastBlock) + { + const Nz::String& blockText = m_drawer.GetBlockText(firstBlock); + std::size_t blockFirstGlyph = m_drawer.GetBlockFirstGlyphIndex(firstBlock); + + Nz::String newText; + if (firstGlyph > blockFirstGlyph) + { + std::size_t characterPosition = blockText.GetCharacterPosition(firstGlyph - blockFirstGlyph); + NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); + + newText.Append(blockText.SubString(0, characterPosition - 1)); + } + + if (lastGlyph < textLength) + newText.Append(blockText.SubString(blockText.GetCharacterPosition(lastGlyph - blockFirstGlyph))); + + if (!newText.IsEmpty()) + m_drawer.SetBlockText(firstBlock, std::move(newText)); + else + m_drawer.RemoveBlock(firstBlock); + } + else + { + const Nz::String& lastBlockText = m_drawer.GetBlockText(lastBlock); + std::size_t lastBlockGlyphIndex = m_drawer.GetBlockFirstGlyphIndex(lastBlock); + + // First, update/delete last block + std::size_t lastCharPos = lastBlockText.GetCharacterPosition(lastGlyph - lastBlockGlyphIndex); + if (lastCharPos != Nz::String::npos) + { + Nz::String newText = lastBlockText.SubString(lastCharPos); + if (!newText.IsEmpty()) + m_drawer.SetBlockText(lastBlock, std::move(newText)); + else + m_drawer.RemoveBlock(lastBlock); + } + + // And then remove all middle blocks, remove in reverse order because of index shifting + assert(lastBlock > 0); + for (std::size_t i = lastBlock - 1; i > firstBlock; --i) + m_drawer.RemoveBlock(i); + + const Nz::String& firstBlockText = m_drawer.GetBlockText(firstBlock); + std::size_t firstBlockGlyphIndex = m_drawer.GetBlockFirstGlyphIndex(firstBlock); + + // And finally update/delete first block + if (firstGlyph > firstBlockGlyphIndex) + { + std::size_t firstCharPos = firstBlockText.GetCharacterPosition(firstGlyph - firstBlockGlyphIndex - 1); + if (firstCharPos != Nz::String::npos) + { + Nz::String newText = firstBlockText.SubString(0, firstCharPos); + if (!newText.IsEmpty()) + m_drawer.SetBlockText(firstBlock, std::move(newText)); + else + m_drawer.RemoveBlock(firstBlock); + } + } + else + m_drawer.RemoveBlock(firstBlock); + } + + UpdateDisplayText(); + } + + void RichTextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) + { + if (m_drawer.HasBlocks()) + { + auto block = m_drawer.GetBlock(m_drawer.FindBlock((glyphPosition > 0) ? glyphPosition - 1 : glyphPosition)); + std::size_t firstGlyph = block.GetFirstGlyphIndex(); + assert(glyphPosition >= firstGlyph); + + Nz::String blockText = block.GetText(); + std::size_t characterPosition = blockText.GetCharacterPosition(glyphPosition - firstGlyph); + blockText.Insert(characterPosition, text); + + block.SetText(blockText); + } + else + m_drawer.AppendText(text); + + SetCursorPosition(glyphPosition + text.GetLength()); + + UpdateDisplayText(); + } + + Nz::AbstractTextDrawer& RichTextAreaWidget::GetTextDrawer() + { + return m_drawer; + } + + const Nz::AbstractTextDrawer& RichTextAreaWidget::GetTextDrawer() const + { + return m_drawer; + } + + void RichTextAreaWidget::HandleIndentation(bool add) + { + } + + void RichTextAreaWidget::HandleSelectionIndentation(bool add) + { + } + + void RichTextAreaWidget::HandleWordCursorMove(bool left) + { + } + + void RichTextAreaWidget::UpdateDisplayText() + { + /*m_drawer.Clear(); + switch (m_echoMode) + { + case EchoMode_Normal: + m_drawer.AppendText(m_text); + break; + + case EchoMode_Password: + case EchoMode_PasswordExceptLast: + m_drawer.AppendText(Nz::String(m_text.GetLength(), '*')); + break; + }*/ + + UpdateTextSprite(); + + SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) + } +} diff --git a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp new file mode 100644 index 000000000..0d7c1f934 --- /dev/null +++ b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp @@ -0,0 +1,198 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include +#include +#include +#include + +namespace Ndk +{ + namespace + { + constexpr float scrollbarPadding = 5.f; + } + + ScrollAreaWidget::ScrollAreaWidget(BaseWidget* parent, BaseWidget* content) : + BaseWidget(parent), + m_content(content), + m_scrollbarStatus(ScrollBarStatus::None), + m_isScrollbarEnabled(true), + m_scrollRatio(0.f) + { + m_content->SetParent(this); + m_content->SetPosition(Nz::Vector3f::Zero()); + + m_scrollbarBackgroundSprite = Nz::Sprite::New(); + m_scrollbarBackgroundSprite->SetColor(Nz::Color(62, 62, 62)); + + m_scrollbarBackgroundEntity = CreateEntity(); + m_scrollbarBackgroundEntity->AddComponent().SetParent(this); + m_scrollbarBackgroundEntity->AddComponent().Attach(m_scrollbarBackgroundSprite, 1); + + m_scrollbarSprite = Nz::Sprite::New(); + m_scrollbarSprite->SetColor(Nz::Color(104, 104, 104)); + + m_scrollbarEntity = CreateEntity(); + m_scrollbarEntity->AddComponent().SetParent(this); + m_scrollbarEntity->AddComponent().Attach(m_scrollbarSprite); + + Resize(m_content->GetSize()); + } + + void ScrollAreaWidget::EnableScrollbar(bool enable) + { + if (m_isScrollbarEnabled != enable) + { + m_isScrollbarEnabled = enable; + + bool isVisible = IsScrollbarVisible(); + m_scrollbarEntity->Enable(isVisible); + m_scrollbarBackgroundEntity->Enable(isVisible); + } + } + + void ScrollAreaWidget::ScrollToRatio(float ratio) + { + m_scrollRatio = Nz::Clamp(ratio, 0.f, 1.f); + + float widgetHeight = GetHeight(); + float maxHeight = widgetHeight - m_scrollbarSprite->GetSize().y - 2.f * scrollbarPadding; + + auto& scrollbarNode = m_scrollbarEntity->GetComponent(); + scrollbarNode.SetPosition(Nz::Vector2f(scrollbarNode.GetPosition(Nz::CoordSys_Local).x, scrollbarPadding + m_scrollRatio * maxHeight)); + + float contentPosition = m_scrollRatio * (widgetHeight - m_content->GetHeight()); + + m_content->SetPosition(0.f, contentPosition); + m_content->SetRenderingRect(Nz::Rectf(-std::numeric_limits::infinity(), -contentPosition, std::numeric_limits::infinity(), widgetHeight)); + } + + Nz::Rectf ScrollAreaWidget::GetScrollbarRect() const + { + Nz::Vector2f scrollBarPosition = Nz::Vector2f(m_scrollbarEntity->GetComponent().GetPosition(Nz::CoordSys_Local)); + Nz::Vector2f scrollBarSize = m_scrollbarSprite->GetSize(); + return Nz::Rectf(scrollBarPosition.x, scrollBarPosition.y, scrollBarSize.x, scrollBarSize.y); + } + + void ScrollAreaWidget::Layout() + { + constexpr float scrollBarBackgroundWidth = 20.f; + constexpr float scrollBarWidth = scrollBarBackgroundWidth - 2.f * scrollbarPadding; + + float areaHeight = GetHeight(); + float contentHeight = m_content->GetHeight(); + + if (contentHeight > areaHeight) + { + m_hasScrollbar = true; + + Nz::Vector2f contentSize(GetWidth() - scrollBarBackgroundWidth, contentHeight); + m_content->Resize(contentSize); + + if (m_isScrollbarEnabled) + { + m_scrollbarEntity->Enable(); + m_scrollbarBackgroundEntity->Enable(); + } + + float scrollBarHeight = std::max(std::floor(areaHeight * (areaHeight / contentHeight)), 20.f); + + m_scrollbarBackgroundSprite->SetSize(scrollBarBackgroundWidth, areaHeight); + m_scrollbarSprite->SetSize(scrollBarWidth, scrollBarHeight); + + m_scrollbarBackgroundEntity->GetComponent().SetPosition(contentSize.x, 0.f); + m_scrollbarEntity->GetComponent().SetPosition(contentSize.x + (scrollBarBackgroundWidth - scrollBarWidth) / 2.f, 0.f); + + ScrollToRatio(m_scrollRatio); + } + else + { + m_hasScrollbar = false; + + m_content->Resize(GetSize()); + + m_scrollbarEntity->Disable(); + m_scrollbarBackgroundEntity->Disable(); + + ScrollToRatio(0.f); + } + + BaseWidget::Layout(); + } + + void ScrollAreaWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) + { + if (button != Nz::Mouse::Left) + return; + + if (m_scrollbarStatus == ScrollBarStatus::Hovered) + { + UpdateScrollbarStatus(ScrollBarStatus::Grabbed); + + auto& scrollbarNode = m_scrollbarEntity->GetComponent(); + + m_grabbedDelta.Set(x, int(y - scrollbarNode.GetPosition(Nz::CoordSys_Local).y)); + } + } + + void ScrollAreaWidget::OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) + { + if (button != Nz::Mouse::Left) + return; + + if (m_scrollbarStatus == ScrollBarStatus::Grabbed) + { + Nz::Rectf scrollBarRect = GetScrollbarRect(); + UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(float(x), float(y)))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); + } + } + + void ScrollAreaWidget::OnMouseExit() + { + //if (m_scrollbarStatus == ScrollBarStatus::Hovered) + UpdateScrollbarStatus(ScrollBarStatus::None); + } + + void ScrollAreaWidget::OnMouseMoved(int x, int y, int /*deltaX*/, int /*deltaY*/) + { + if (m_scrollbarStatus == ScrollBarStatus::Grabbed) + { + float height = GetHeight(); + float maxHeight = height - m_scrollbarSprite->GetSize().y; + float newHeight = Nz::Clamp(float(y - m_grabbedDelta.y), 0.f, maxHeight); + + ScrollToHeight(newHeight / maxHeight * m_content->GetHeight()); + } + else + { + Nz::Rectf scrollBarRect = GetScrollbarRect(); + UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(float(x), float(y)))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); + } + } + + void ScrollAreaWidget::OnMouseWheelMoved(int /*x*/, int /*y*/, float delta) + { + constexpr float scrollStep = 100.f; + + ScrollToHeight(GetScrollHeight() - scrollStep * delta); + } + + void ScrollAreaWidget::UpdateScrollbarStatus(ScrollBarStatus status) + { + if (m_scrollbarStatus != status) + { + Nz::Color newColor; + switch (status) + { + case ScrollBarStatus::Grabbed: newColor = Nz::Color(235, 235, 235); break; + case ScrollBarStatus::Hovered: newColor = Nz::Color(152, 152, 152); break; + case ScrollBarStatus::None: newColor = Nz::Color(104, 104, 104); break; + } + + m_scrollbarSprite->SetColor(newColor); + m_scrollbarStatus = status; + } + } +} diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 53d3929c4..4271f43a1 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -11,36 +11,13 @@ namespace Ndk { TextAreaWidget::TextAreaWidget(BaseWidget* parent) : - BaseWidget(parent), - m_characterFilter(), - m_echoMode(EchoMode_Normal), - m_cursorPositionBegin(0U, 0U), - m_cursorPositionEnd(0U, 0U), - m_isMouseButtonDown(false), - m_multiLineEnabled(false), - m_readOnly(false), - m_tabEnabled(false) + AbstractTextAreaWidget(parent) { - m_cursorEntity = CreateEntity(); - m_cursorEntity->AddComponent(); - m_cursorEntity->AddComponent().SetParent(this); - m_cursorEntity->GetComponent().SetPosition(5.f, 3.f); - m_cursorEntity->Enable(false); - - m_textSprite = Nz::TextSprite::New(); - - m_textEntity = CreateEntity(); - m_textEntity->AddComponent().Attach(m_textSprite); - m_textEntity->AddComponent().SetParent(this); - m_textEntity->GetComponent().SetPosition(5.f, 3.f); - - SetCursor(Nz::SystemCursor_Text); SetCharacterSize(GetCharacterSize()); //< Actualize minimum / preferred size - EnableBackground(true); Layout(); } - + void TextAreaWidget::AppendText(const Nz::String& text) { m_text += text; @@ -72,11 +49,19 @@ namespace Ndk } } - m_textSprite->Update(m_drawer); + UpdateTextSprite(); OnTextChanged(this, m_text); } + void TextAreaWidget::Clear() + { + AbstractTextAreaWidget::Clear(); + + m_text.Clear(); + OnTextChanged(this, m_text); + } + void TextAreaWidget::Erase(std::size_t firstGlyph, std::size_t lastGlyph) { if (firstGlyph > lastGlyph) @@ -89,10 +74,10 @@ namespace Ndk Nz::String newText; if (firstGlyph > 0) { - std::size_t characterPosition = m_text.GetCharacterPosition(firstGlyph - 1); + std::size_t characterPosition = m_text.GetCharacterPosition(firstGlyph); NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); - newText.Append(m_text.SubString(0, characterPosition)); + newText.Append(m_text.SubString(0, characterPosition - 1)); } if (lastGlyph < textLength) @@ -106,70 +91,11 @@ namespace Ndk SetText(newText); } - void TextAreaWidget::EraseSelection() - { - if (!HasSelection()) - return; - - Erase(GetGlyphIndex(m_cursorPositionBegin), GetGlyphIndex(m_cursorPositionEnd)); - } - - Nz::Vector2ui TextAreaWidget::GetHoveredGlyph(float x, float y) const - { - std::size_t glyphCount = m_drawer.GetGlyphCount(); - if (glyphCount > 0) - { - std::size_t lineCount = m_drawer.GetLineCount(); - std::size_t line = 0U; - for (; line < lineCount - 1; ++line) - { - Nz::Rectf lineBounds = m_drawer.GetLine(line).bounds; - if (lineBounds.GetMaximum().y > y) - break; - } - - std::size_t upperLimit = (line != lineCount - 1) ? m_drawer.GetLine(line + 1).glyphIndex : glyphCount + 1; - - std::size_t firstLineGlyph = m_drawer.GetLine(line).glyphIndex; - std::size_t i = firstLineGlyph; - for (; i < upperLimit - 1; ++i) - { - Nz::Rectf bounds = m_drawer.GetGlyph(i).bounds; - if (x < bounds.x + bounds.width * 0.75f) - break; - } - - return Nz::Vector2ui(i - firstLineGlyph, line); - } - - return Nz::Vector2ui::Zero(); - } - - void TextAreaWidget::SetCharacterSize(unsigned int characterSize) - { - m_drawer.SetCharacterSize(characterSize); - - std::size_t fontCount = m_drawer.GetFontCount(); - unsigned int lineHeight = 0; - int spaceAdvance = 0; - for (std::size_t i = 0; i < fontCount; ++i) - { - Nz::Font* font = m_drawer.GetFont(i); - - const Nz::Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); - lineHeight = std::max(lineHeight, sizeInfo.lineHeight); - spaceAdvance = std::max(spaceAdvance, sizeInfo.spaceAdvance); - } - - Nz::Vector2f size = { float(spaceAdvance), float(lineHeight) + 5.f }; - SetMinimumSize(size); - SetPreferredSize({ size.x * 6.f, size.y }); - } - void TextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) { if (glyphPosition >= m_drawer.GetGlyphCount()) { + // It's faster to append than to insert in the middle AppendText(text); SetCursorPosition(m_drawer.GetGlyphCount()); } @@ -182,412 +108,109 @@ namespace Ndk } } - void TextAreaWidget::Layout() + Nz::AbstractTextDrawer& TextAreaWidget::GetTextDrawer() { - BaseWidget::Layout(); - - RefreshCursor(); + return m_drawer; } - bool TextAreaWidget::IsFocusable() const + const Nz::AbstractTextDrawer& TextAreaWidget::GetTextDrawer() const { - return !m_readOnly; + return m_drawer; } - void TextAreaWidget::OnFocusLost() + void TextAreaWidget::HandleIndentation(bool add) { - m_cursorEntity->Disable(); - } - - void TextAreaWidget::OnFocusReceived() - { - if (!m_readOnly) - m_cursorEntity->Enable(true); - } - - bool TextAreaWidget::OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) - { - switch (key.virtualKey) + if (add) + Write(Nz::String('\t')); + else { - case Nz::Keyboard::VKey::Delete: + std::size_t currentGlyph = GetGlyphIndex(m_cursorPositionBegin); + + if (currentGlyph > 0 && m_text[m_text.GetCharacterPosition(currentGlyph - 1U)] == '\t') // Check if previous glyph is a tab { - if (HasSelection()) - EraseSelection(); + Erase(currentGlyph - 1U); + + if (m_cursorPositionBegin.x < static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionBegin.y))) + MoveCursor(-1); + } + } + } + + void TextAreaWidget::HandleSelectionIndentation(bool add) + { + for (unsigned line = m_cursorPositionBegin.y; line <= m_cursorPositionEnd.y; ++line) + { + const Nz::Vector2ui cursorPositionBegin = m_cursorPositionBegin; + const Nz::Vector2ui cursorPositionEnd = m_cursorPositionEnd; + + if (add) + { + Write(Nz::String('\t'), { 0U, line }); + SetSelection(cursorPositionBegin + (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{}), + cursorPositionEnd + (cursorPositionEnd.y == line ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{})); + } + else + { + if (m_drawer.GetLineGlyphCount(line) == 0) + continue; + + std::size_t firstGlyph = GetGlyphIndex({ 0U, line }); + + if (m_text[m_text.GetCharacterPosition(firstGlyph)] == '\t') + { + Erase(firstGlyph); + SetSelection(cursorPositionBegin - (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{}), + cursorPositionEnd - (cursorPositionEnd.y == line && cursorPositionEnd.x != 0U ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{})); + } + } + } + } + + void TextAreaWidget::HandleWordCursorMove(bool left) + { + if (left) + { + std::size_t index = GetGlyphIndex(m_cursorPositionBegin); + if (index == 0) + return; + + std::size_t spaceIndex = m_text.FindLast(' ', index - 2); + std::size_t endlIndex = m_text.FindLast('\n', index - 1); + + if ((spaceIndex > endlIndex || endlIndex == Nz::String::npos) && spaceIndex != Nz::String::npos) + SetCursorPosition(spaceIndex + 1); + else if (endlIndex != Nz::String::npos) + { + if (index == endlIndex + 1) + SetCursorPosition(endlIndex); else - Erase(GetGlyphIndex(m_cursorPositionBegin)); - - return true; + SetCursorPosition(endlIndex + 1); } + else + SetCursorPosition({ 0U, m_cursorPositionBegin.y }); + } + else + { + std::size_t index = GetGlyphIndex(m_cursorPositionEnd); + std::size_t spaceIndex = m_text.Find(' ', index); + std::size_t endlIndex = m_text.Find('\n', index); - case Nz::Keyboard::VKey::Down: + if (spaceIndex < endlIndex && spaceIndex != Nz::String::npos) { - bool ignoreDefaultAction = false; - OnTextAreaKeyDown(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionEnd); - - MoveCursor({0, 1}); - return true; - } - - case Nz::Keyboard::VKey::End: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyEnd(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - std::size_t lineCount = m_drawer.GetLineCount(); - if (key.control && lineCount > 0) - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(lineCount - 1)), static_cast(lineCount - 1) }); + if (m_text.GetSize() > spaceIndex) + SetCursorPosition(spaceIndex + 1); else SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); - - return true; } - - case Nz::Keyboard::VKey::Home: + else if (endlIndex != Nz::String::npos) { - bool ignoreDefaultAction = false; - OnTextAreaKeyHome(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - SetCursorPosition({ 0U, key.control ? 0U : m_cursorPositionEnd.y }); - return true; - } - - case Nz::Keyboard::VKey::Left: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyLeft(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionBegin); - else if (key.control) - { - std::size_t index = GetGlyphIndex(m_cursorPositionBegin); - - if (index == 0) - return true; - - std::size_t spaceIndex = m_text.FindLast(' ', index - 2); - std::size_t endlIndex = m_text.FindLast('\n', index - 1); - - if ((spaceIndex > endlIndex || endlIndex == Nz::String::npos) && spaceIndex != Nz::String::npos) - SetCursorPosition(spaceIndex + 1); - else if (endlIndex != Nz::String::npos) - { - if (index == endlIndex + 1) - SetCursorPosition(endlIndex); - else - SetCursorPosition(endlIndex + 1); - } - else - SetCursorPosition({ 0U, m_cursorPositionBegin.y }); - } + if (index == endlIndex) + SetCursorPosition(endlIndex + 1); else - MoveCursor(-1); - - return true; - } - - case Nz::Keyboard::VKey::Right: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyRight(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionEnd); - else if (key.control) - { - std::size_t index = GetGlyphIndex(m_cursorPositionEnd); - std::size_t spaceIndex = m_text.Find(' ', index); - std::size_t endlIndex = m_text.Find('\n', index); - - if (spaceIndex < endlIndex && spaceIndex != Nz::String::npos) - { - if (m_text.GetSize() > spaceIndex) - SetCursorPosition(spaceIndex + 1); - else - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); - } - else if (endlIndex != Nz::String::npos) - { - if (index == endlIndex) - SetCursorPosition(endlIndex + 1); - else - SetCursorPosition(endlIndex); - } - else - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); - } - else - MoveCursor(1); - - return true; - } - - case Nz::Keyboard::VKey::Up: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyUp(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionBegin); - - MoveCursor({0, -1}); - return true; - } - - case Nz::Keyboard::VKey::Tab: - { - if (!m_tabEnabled) - return false; - - if (HasSelection()) - { - for(unsigned line = m_cursorPositionBegin.y; line <= m_cursorPositionEnd.y; ++line) - { - const Nz::Vector2ui cursorPositionBegin = m_cursorPositionBegin; - const Nz::Vector2ui cursorPositionEnd = m_cursorPositionEnd; - - if (key.shift) - { - if (m_drawer.GetLineGlyphCount(line) == 0) - continue; - - std::size_t firstGlyph = GetGlyphIndex({ 0U, line }); - - if (m_text[m_text.GetCharacterPosition(firstGlyph)] == '\t') - { - Erase(firstGlyph); - SetSelection(cursorPositionBegin - (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {}), - cursorPositionEnd - (cursorPositionEnd.y == line && cursorPositionEnd.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); - } - } - else - { - Write(Nz::String('\t'), { 0U, line }); - SetSelection(cursorPositionBegin + (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {}), - cursorPositionEnd + (cursorPositionEnd.y == line ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); - } - } - } - else if (key.shift) - { - std::size_t currentGlyph = GetGlyphIndex(m_cursorPositionBegin); - - if (currentGlyph > 0 && m_text[m_text.GetCharacterPosition(currentGlyph - 1U)] == '\t') // Check if previous glyph is a tab - { - Erase(currentGlyph - 1U); - - if (m_cursorPositionBegin.x < static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionBegin.y))) - MoveCursor(-1); - } - } - else - Write(Nz::String('\t')); - - return true; - } - - default: - return false; - } - } - - void TextAreaWidget::OnKeyReleased(const Nz::WindowEvent::KeyEvent& /*key*/) - { - } - - void TextAreaWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) - { - if (button == Nz::Mouse::Left) - { - SetFocus(); - - Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x) - 5.f, float(y) - 5.f); - - // Shift extends selection - if (Nz::Keyboard::IsKeyPressed(Nz::Keyboard::VKey::LShift) || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::VKey::RShift)) - SetSelection(hoveredGlyph, m_selectionCursor); - else - { - SetCursorPosition(hoveredGlyph); - m_selectionCursor = m_cursorPositionBegin; - } - - m_isMouseButtonDown = true; - } - } - - void TextAreaWidget::OnMouseButtonRelease(int, int, Nz::Mouse::Button button) - { - if (button == Nz::Mouse::Left) - m_isMouseButtonDown = false; - } - - void TextAreaWidget::OnMouseEnter() - { - if (!Nz::Mouse::IsButtonPressed(Nz::Mouse::Left)) - m_isMouseButtonDown = false; - } - - void TextAreaWidget::OnMouseMoved(int x, int y, int deltaX, int deltaY) - { - if (m_isMouseButtonDown) - SetSelection(m_selectionCursor, GetHoveredGlyph(float(x) - 5.f, float(y) - 3.f)); - } - - void TextAreaWidget::OnTextEntered(char32_t character, bool /*repeated*/) - { - if (m_readOnly) - return; - - switch (character) - { - case '\b': - { - bool ignoreDefaultAction = false; - OnTextAreaKeyBackspace(this, &ignoreDefaultAction); - - std::size_t cursorGlyphBegin = GetGlyphIndex(m_cursorPositionBegin); - std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); - - if (ignoreDefaultAction || cursorGlyphEnd == 0) - break; - - // When a text is selected, delete key does the same as delete and leave the character behind it - if (HasSelection()) - EraseSelection(); - else - { - Nz::String newText; - - if (cursorGlyphBegin > 1) - newText.Append(m_text.SubString(0, m_text.GetCharacterPosition(cursorGlyphBegin - 1) - 1)); - - if (cursorGlyphEnd < m_text.GetLength()) - newText.Append(m_text.SubString(m_text.GetCharacterPosition(cursorGlyphEnd))); - - // Move cursor before setting text (to prevent SetText to move our cursor) - MoveCursor(-1); - - SetText(newText); - } - break; - } - - case '\r': - case '\n': - { - bool ignoreDefaultAction = false; - OnTextAreaKeyReturn(this, &ignoreDefaultAction); - - if (ignoreDefaultAction || !m_multiLineEnabled) - break; - - if (HasSelection()) - EraseSelection(); - - Write(Nz::String('\n')); - break; - } - - default: - { - if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) - break; - - if (HasSelection()) - EraseSelection(); - - Write(Nz::String::Unicode(character)); - break; - } - } - } - - void TextAreaWidget::RefreshCursor() - { - if (m_readOnly) - return; - - std::size_t selectionLineCount = m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1; - std::size_t oldSpriteCount = m_cursorSprites.size(); - if (m_cursorSprites.size() != selectionLineCount) - { - m_cursorSprites.resize(m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1); - for (std::size_t i = oldSpriteCount; i < m_cursorSprites.size(); ++i) - { - m_cursorSprites[i] = Nz::Sprite::New(); - m_cursorSprites[i]->SetMaterial(Nz::Material::New("Translucent2D")); - } - } - - float lineHeight = float(m_drawer.GetFont()->GetSizeInfo(m_drawer.GetCharacterSize()).lineHeight); - - GraphicsComponent& gfxComponent = m_cursorEntity->GetComponent(); - gfxComponent.Clear(); - - for (unsigned int i = m_cursorPositionBegin.y; i <= m_cursorPositionEnd.y; ++i) - { - const auto& lineInfo = m_drawer.GetLine(i); - - Nz::SpriteRef& cursorSprite = m_cursorSprites[i - m_cursorPositionBegin.y]; - if (i == m_cursorPositionBegin.y || i == m_cursorPositionEnd.y) - { - auto GetGlyphPos = [&](unsigned int localGlyphPos) - { - std::size_t cursorGlyph = GetGlyphIndex({ localGlyphPos, i }); - - std::size_t glyphCount = m_drawer.GetGlyphCount(); - float position; - if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) - { - const auto& glyph = m_drawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); - position = glyph.bounds.x; - if (cursorGlyph >= glyphCount) - position += glyph.bounds.width; - } - else - position = 0.f; - - return position; - }; - - float beginX = (i == m_cursorPositionBegin.y) ? GetGlyphPos(m_cursorPositionBegin.x) : 0.f; - float endX = (i == m_cursorPositionEnd.y) ? GetGlyphPos(m_cursorPositionEnd.x) : lineInfo.bounds.width; - float spriteSize = std::max(endX - beginX, 1.f); - - cursorSprite->SetColor((m_cursorPositionBegin == m_cursorPositionEnd) ? Nz::Color::Black : Nz::Color(0, 0, 0, 50)); - cursorSprite->SetSize(spriteSize, float(m_drawer.GetFont()->GetSizeInfo(m_drawer.GetCharacterSize()).lineHeight)); - - gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ beginX, lineInfo.bounds.y, 0.f })); + SetCursorPosition(endlIndex); } else - { - cursorSprite->SetColor(Nz::Color(0, 0, 0, 50)); - cursorSprite->SetSize(lineInfo.bounds.width, float(m_drawer.GetFont()->GetSizeInfo(m_drawer.GetCharacterSize()).lineHeight)); - - gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ 0.f, lineInfo.bounds.y, 0.f })); - } + SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); } } @@ -605,8 +228,26 @@ namespace Ndk break; } - m_textSprite->Update(m_drawer); + UpdateTextSprite(); SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) } + + void TextAreaWidget::UpdateMinimumSize() + { + std::size_t fontCount = m_drawer.GetFontCount(); + float lineHeight = 0; + int spaceAdvance = 0; + for (std::size_t i = 0; i < fontCount; ++i) + { + Nz::Font* font = m_drawer.GetFont(i); + + const Nz::Font::SizeInfo& sizeInfo = font->GetSizeInfo(m_drawer.GetCharacterSize()); + lineHeight = std::max(lineHeight, m_drawer.GetLineHeight()); + spaceAdvance = std::max(spaceAdvance, sizeInfo.spaceAdvance); + } + + Nz::Vector2f size = { float(spaceAdvance), lineHeight + 5.f }; + SetMinimumSize(size); + } } diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index bfbe0140c..ef59463bc 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,7 @@ namespace Ndk void World::AddDefaultSystems() { + AddSystem(); AddSystem(); AddSystem(); AddSystem(); @@ -133,9 +135,9 @@ namespace Ndk m_waitingEntities.clear(); m_aliveEntities.Clear(); - m_dirtyEntities.Clear(); + m_dirtyEntities.front.Clear(); m_freeEntityIds.Clear(); - m_killedEntities.Clear(); + m_killedEntities.front.Clear(); } /*! @@ -155,16 +157,26 @@ namespace Ndk return EntityHandle::InvalidHandle; } + return CloneEntity(original); + } + + /*! + * \brief Clones the entity + * \return The clone newly created + * + * \param original Entity handle + * + * \remark Cloning a disabled entity will produce an enabled clone + */ + const EntityHandle& World::CloneEntity(const EntityHandle& original) + { const EntityHandle& clone = CreateEntity(); if (!original->IsEnabled()) clone->Disable(); const Nz::Bitset<>& componentBits = original->GetComponentBits(); for (std::size_t i = componentBits.FindFirst(); i != componentBits.npos; i = componentBits.FindNext(i)) - { - std::unique_ptr component(original->GetComponent(ComponentIndex(i)).Clone()); - clone->AddComponent(std::move(component)); - } + clone->AddComponent(original->GetComponent(ComponentIndex(i)).Clone()); clone->Enable(); @@ -208,7 +220,8 @@ namespace Ndk } // Handle killed entities before last call - for (std::size_t i = m_killedEntities.FindFirst(); i != m_killedEntities.npos; i = m_killedEntities.FindNext(i)) + std::swap(m_killedEntities.front, m_killedEntities.back); + for (std::size_t i = m_killedEntities.back.FindFirst(); i != m_killedEntities.back.npos; i = m_killedEntities.back.FindNext(i)) { NazaraAssert(i < m_entityBlocks.size(), "Entity index out of range"); @@ -218,12 +231,13 @@ namespace Ndk entity->Destroy(); // Send back the identifier of the entity to the free queue - m_freeEntityIds.UnboundedSet(entity->GetId()); + m_freeEntityIds.UnboundedSet(i); } - m_killedEntities.Reset(); + m_killedEntities.back.Clear(); // Handle of entities which need an update from the systems - for (std::size_t i = m_dirtyEntities.FindFirst(); i != m_dirtyEntities.npos; i = m_dirtyEntities.FindNext(i)) + std::swap(m_dirtyEntities.front, m_dirtyEntities.back); + for (std::size_t i = m_dirtyEntities.back.FindFirst(); i != m_dirtyEntities.back.npos; i = m_dirtyEntities.back.FindNext(i)) { NazaraAssert(i < m_entityBlocks.size(), "Entity index out of range"); @@ -234,9 +248,8 @@ namespace Ndk continue; Nz::Bitset<>& removedComponents = entity->GetRemovedComponentBits(); - for (std::size_t j = removedComponents.FindFirst(); j != m_dirtyEntities.npos; j = removedComponents.FindNext(j)) - entity->DestroyComponent(static_cast(j)); - removedComponents.Reset(); + for (std::size_t j = removedComponents.FindFirst(); j != m_dirtyEntities.back.npos; j = removedComponents.FindNext(j)) + entity->DropComponent(static_cast(j)); for (auto& system : m_orderedSystems) { @@ -260,7 +273,7 @@ namespace Ndk } } } - m_dirtyEntities.Reset(); + m_dirtyEntities.back.Clear(); } /*! diff --git a/THANKS.md b/THANKS.md new file mode 100644 index 000000000..b2821222e --- /dev/null +++ b/THANKS.md @@ -0,0 +1,26 @@ +# Thanks + +A special thank you to all those who may have contributed directly or indirectly to this project. We can mention: + +- **RafBill** and **Raakz:** Finding bugs and/or testing. +- **Fissal "DrFisher" Hannoun**: Helping a lot in architecture design. +- **Alexandre "Danman" Janniaux**: Helping making the POSIX implementation. +- **Youri "Gawaboumga" Hubaut**: Improving the whole project by making the documentation, improving the code, and more. +- **Rémi "overdrivr" Bèges**: Made the Noise module. + +## Additional thanks + +This engine also uses different projects, we obviously thank their respective authors and contributors: + +- [Assimp](http://www.assimp.org/): Model loader. +- [Catch2](https://github.com/catchorg/Catch2): Test framework for C++. +- [Chimpmunk](http://chipmunk-physics.net/): Physics engine for 2D. +- [Freetype](https://www.freetype.org/): Font rendering library. +- [Lua](https://www.lua.org/): Scripting library. +- [Netwon](http://newtondynamics.com/forum/newton.php): Physics engine for 3D. +- [Sndfile](http://www.mega-nerd.com/libsndfile/): Audio loader. +- [Stb](https://github.com/nothings/stb): Image loader. +- [Utfcpp](http://utfcpp.sourceforge.net/): UTF-8 handler. +- [OpenAL](https://www.openal.org/): Audio API specification. +- [OpenGL](https://www.khronos.org/opengl/): Graphics API specification. +- [Vulkan](https://www.khronos.org/vulkan/): New graphics API specification which replaced OpenGL. diff --git a/build/Build_VS2015.bat b/build/Build_VS2015.bat index c74550817..8657a02cb 100644 --- a/build/Build_VS2015.bat +++ b/build/Build_VS2015.bat @@ -1 +1 @@ -.\premake5.exe vs2015 +.\premake5.exe --premakeproject vs2015 diff --git a/build/Build_VS2017.bat b/build/Build_VS2017.bat index 51c0417d0..c172c5a59 100644 --- a/build/Build_VS2017.bat +++ b/build/Build_VS2017.bat @@ -1 +1 @@ -.\premake5.exe vs2017 +.\premake5.exe --premakeproject vs2017 diff --git a/build/Build_VS2019.bat b/build/Build_VS2019.bat new file mode 100644 index 000000000..f9dd7c987 --- /dev/null +++ b/build/Build_VS2019.bat @@ -0,0 +1 @@ +.\premake5.exe --premakeproject vs2019 diff --git a/build/config.lua b/build/config.lua index a1f4546eb..fa14d9a90 100644 --- a/build/config.lua +++ b/build/config.lua @@ -11,7 +11,7 @@ BuildDependencies = true BuildExamples = true -- Setup configurations array (valid values: Debug, Release, ReleaseWithDebug) -Configurations = "Debug,Release" -- "Debug,Release,ReleaseWithDebug" +Configurations = "Debug,Release,ReleaseWithDebug" -- "Debug,Release,ReleaseWithDebug" -- Setup additionnals install directories, separated by a semi-colon ; (library binaries will be copied there) --InstallDir = "/usr/local/lib64" diff --git a/build/scripts/common.lua b/build/scripts/common.lua index a50fc5c27..104a0479e 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -58,6 +58,7 @@ function NazaraBuild:Execute() workspace("NazaraEngine") platforms(platformData) + startproject "DemoFirstScene" location(_ACTION) do @@ -840,6 +841,7 @@ function NazaraBuild:PrepareGeneric() targetsuffix("-d") filter("configurations:*Debug*") + optimize("Debug") symbols("On") filter("configurations:not *Debug*") diff --git a/examples/FirstScene/main.cpp b/examples/FirstScene/main.cpp index d6759ea12..f67a79f58 100644 --- a/examples/FirstScene/main.cpp +++ b/examples/FirstScene/main.cpp @@ -92,10 +92,6 @@ int main() // Ce paramètre sert à indiquer la mise à l'échelle désirée lors du chargement du modèle. params.mesh.matrix.MakeScale(Nz::Vector3f(0.01f)); // Un centième de la taille originelle - // Les UVs de ce fichier sont retournées (repère OpenGL, origine coin bas-gauche) par rapport à ce que le moteur attend (haut-gauche) - // Nous devons donc indiquer au moteur de les retourner lors du chargement - params.mesh.texCoordScale.Set(1.f, -1.f); - // Nazara va par défaut optimiser les modèles pour un rendu plus rapide, cela peut prendre du temps et n'est pas nécessaire ici params.mesh.optimizeIndexBuffers = false; diff --git a/examples/Particles/SpacebattleDemo.cpp b/examples/Particles/SpacebattleDemo.cpp index 63b222599..3703c427d 100644 --- a/examples/Particles/SpacebattleDemo.cpp +++ b/examples/Particles/SpacebattleDemo.cpp @@ -230,6 +230,8 @@ ParticleDemo("Space battle", sharedData) Ndk::InitializeSystem(); Nz::ModelParameters parameters; + parameters.mesh.texCoordOffset.Set(0.f, 1.f); + parameters.mesh.texCoordScale.Set(1.f, -1.f); parameters.mesh.optimizeIndexBuffers = false; Nz::Color grey(100, 100, 100); @@ -266,7 +268,8 @@ ParticleDemo("Space battle", sharedData) m_turret.cannonModel->GetMaterial(0)->SetNormalMap("resources/Turret/198_norm.jpg"); parameters.mesh.matrix.MakeIdentity(); - parameters.mesh.texCoordScale.Set(1.f, 1.f); + parameters.mesh.texCoordOffset.Set(0.f, 1.f); + parameters.mesh.texCoordScale.Set(1.f, -1.f); parameters.mesh.center = true; m_spacestationModel = Nz::Model::LoadFromFile("resources/SpaceStation/space_station.obj", parameters); @@ -275,7 +278,8 @@ ParticleDemo("Space battle", sharedData) m_spacestationModel->GetMesh()->GenerateNormalsAndTangents(); - parameters.mesh.texCoordScale.Set(1.f, -1.f); + parameters.mesh.texCoordOffset.Set(0.f, 0.f); + parameters.mesh.texCoordScale.Set(1.f, 1.f); parameters.mesh.matrix.MakeRotation(Nz::EulerAnglesf(0.f, -90.f, 0.f)); m_spaceshipModel = Nz::Model::LoadFromFile("resources/space_frigate_6/space_frigate_6.obj", parameters); @@ -592,7 +596,6 @@ void SpacebattleExample::Enter(Ndk::StateMachine& fsm) auto colorPtr = mapper.GetComponentPtr(Nz::ParticleComponent_Color); auto lifePtr = mapper.GetComponentPtr(Nz::ParticleComponent_Life); - float velFactor = std::pow(0.9f, elapsedTime / 0.1f); for (unsigned int i = startId; i <= endId; ++i) colorPtr[i].a = static_cast(Nz::Clamp(lifePtr[i] * 255.f, 0.f, 255.f)); })); diff --git a/examples/Tut01/main.cpp b/examples/Tut01/main.cpp index 9d53b7b5e..4570cec08 100644 --- a/examples/Tut01/main.cpp +++ b/examples/Tut01/main.cpp @@ -29,9 +29,13 @@ int main(int argc, char* argv[]) viewer.SetTarget(&mainWindow); viewer.SetProjectionType(Nz::ProjectionType_Orthogonal); + Nz::SimpleTextDrawer textDrawer; + textDrawer.SetCharacterSize(72); + textDrawer.SetOutlineThickness(4.f); + textDrawer.SetText("Hello world !"); Nz::TextSpriteRef textSprite = Nz::TextSprite::New(); - textSprite->Update(Nz::SimpleTextDrawer::Draw("Hello world !", 72)); + textSprite->Update(textDrawer); Ndk::EntityHandle text = world.CreateEntity(); Ndk::NodeComponent& nodeComponent = text->AddComponent(); diff --git a/include/Nazara/Core.hpp b/include/Nazara/Core.hpp index faab3b2f8..bb5e6e682 100644 --- a/include/Nazara/Core.hpp +++ b/include/Nazara/Core.hpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Core/ByteArrayPool.hpp b/include/Nazara/Core/ByteArrayPool.hpp new file mode 100644 index 000000000..e45ceee67 --- /dev/null +++ b/include/Nazara/Core/ByteArrayPool.hpp @@ -0,0 +1,43 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BYTEARRAYPOOL_HPP +#define NAZARA_BYTEARRAYPOOL_HPP + +#include +#include +#include +#include + +namespace Nz +{ + class AbstractHash; + + class NAZARA_CORE_API ByteArrayPool + { + public: + ByteArrayPool() = default; + ByteArrayPool(const ByteArrayPool&) = delete; + ByteArrayPool(ByteArrayPool&&) = default; + ~ByteArrayPool() = default; + + inline void Clear(); + + inline ByteArray GetByteArray(std::size_t capacity = 0); + + inline void ReturnByteArray(ByteArray byteArray); + + ByteArrayPool& operator=(const ByteArrayPool&) = delete; + ByteArrayPool& operator=(ByteArrayPool&&) = default; + + private: + std::vector m_byteArrays; + }; +} + +#include + +#endif // NAZARA_BYTEARRAYPOOL_HPP diff --git a/include/Nazara/Core/ByteArrayPool.inl b/include/Nazara/Core/ByteArrayPool.inl new file mode 100644 index 000000000..82cf8349c --- /dev/null +++ b/include/Nazara/Core/ByteArrayPool.inl @@ -0,0 +1,44 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + namespace Detail + { + bool SortByteArrayByCapacity(const ByteArray& byteArray, std::size_t refCapacity) + { + return refCapacity > byteArray.GetCapacity(); + } + } + + inline void ByteArrayPool::Clear() + { + m_byteArrays.clear(); + } + + inline ByteArray ByteArrayPool::GetByteArray(std::size_t capacity) + { + ByteArray ret; + + auto it = std::lower_bound(m_byteArrays.begin(), m_byteArrays.end(), capacity, Detail::SortByteArrayByCapacity); + if (it != m_byteArrays.end()) + { + ret = std::move(*it); + m_byteArrays.erase(it); + } + + return ret; + } + + inline void ByteArrayPool::ReturnByteArray(ByteArray byteArray) + { + auto it = std::lower_bound(m_byteArrays.begin(), m_byteArrays.end(), byteArray.GetCapacity(), Detail::SortByteArrayByCapacity); + m_byteArrays.emplace(it, std::move(byteArray)); + } +} + +#include diff --git a/include/Nazara/Core/EmptyStream.hpp b/include/Nazara/Core/EmptyStream.hpp new file mode 100644 index 000000000..da66ca329 --- /dev/null +++ b/include/Nazara/Core/EmptyStream.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_EMPTYSTREAM_HPP +#define NAZARA_EMPTYSTREAM_HPP + +#include +#include + +namespace Nz +{ + class NAZARA_CORE_API EmptyStream : public Stream + { + public: + inline EmptyStream(); + EmptyStream(const EmptyStream&) = default; + EmptyStream(EmptyStream&&) noexcept = default; + ~EmptyStream() = default; + + void Clear(); + + bool EndOfStream() const override; + + UInt64 GetCursorPos() const override; + UInt64 GetSize() const override; + + bool SetCursorPos(UInt64 offset) override; + + EmptyStream& operator=(const EmptyStream&) = default; + EmptyStream& operator=(EmptyStream&&) noexcept = default; + + private: + void FlushStream() override; + std::size_t ReadBlock(void* buffer, std::size_t size) override; + std::size_t WriteBlock(const void* buffer, std::size_t size) override; + + UInt64 m_size; + }; +} + +#include + +#endif // NAZARA_EMPTYSTREAM_HPP diff --git a/include/Nazara/Core/EmptyStream.inl b/include/Nazara/Core/EmptyStream.inl new file mode 100644 index 000000000..4da4db08d --- /dev/null +++ b/include/Nazara/Core/EmptyStream.inl @@ -0,0 +1,22 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::EmptyStream + * \brief Constructs an EmptyStream object by default + */ + inline EmptyStream::EmptyStream() : + m_size(0) + { + m_openMode = Nz::OpenMode_ReadWrite; + } +} + +#include diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index 92c97de9e..3fa7d2741 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -39,15 +39,20 @@ namespace Nz static constexpr std::size_t MaxValue = static_cast(EnumAsFlags::max); - using BitField16 = std::conditional_t<(MaxValue > 8), UInt16, UInt8>; - using BitField32 = std::conditional_t<(MaxValue > 16), UInt32, BitField16>; + using BitField16 = std::conditional_t<(MaxValue >= 8), UInt16, UInt8>; + using BitField32 = std::conditional_t<(MaxValue >= 16), UInt32, BitField16>; public: - using BitField = std::conditional_t<(MaxValue > 32), UInt64, BitField32>; + using BitField = std::conditional_t<(MaxValue >= 32), UInt64, BitField32>; constexpr Flags(BitField value = 0); constexpr Flags(E enumVal); + void Clear(); + void Clear(const Flags& flags); + + void Set(const Flags& flags); + constexpr bool Test(const Flags& flags) const; explicit constexpr operator bool() const; diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index 2b57a59a8..2e1800ff8 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -39,9 +39,49 @@ namespace Nz { } + /*! + * \brief Clear all flags + * + * \see Test + */ + template + void Flags::Clear() + { + m_value = 0; + } + + /*! + * \brief Clear some flags + * + * \param flags Flags to be cleared + * + * \see Test + */ + template + void Flags::Clear(const Flags& flags) + { + m_value &= ~flags.m_value; + } + + /*! + * \brief Enable some flags + * + * \param flags Flags to be enabled + * + * \see Clear + * \see Test + */ + template + void Flags::Set(const Flags& flags) + { + m_value |= flags.m_value; + } + /*! * \brief Tests if all flags from a Flags object are enabled * \return True if all tested flags are enabled. + * + * \see Clear */ template constexpr bool Flags::Test(const Flags& flags) const diff --git a/include/Nazara/Core/HandledObject.hpp b/include/Nazara/Core/HandledObject.hpp index 27c8646b3..390a4e612 100644 --- a/include/Nazara/Core/HandledObject.hpp +++ b/include/Nazara/Core/HandledObject.hpp @@ -8,6 +8,7 @@ #define NAZARA_OBJECTHANDLER_HPP #include +#include #include #include @@ -41,6 +42,8 @@ namespace Nz HandledObject& operator=(const HandledObject& object); HandledObject& operator=(HandledObject&& object) noexcept; + NazaraSignal(OnHandledObjectDestruction, HandledObject* /*emitter*/); + protected: void UnregisterAllHandles() noexcept; diff --git a/include/Nazara/Core/HandledObject.inl b/include/Nazara/Core/HandledObject.inl index bc11ec645..ed0115f5b 100644 --- a/include/Nazara/Core/HandledObject.inl +++ b/include/Nazara/Core/HandledObject.inl @@ -105,6 +105,8 @@ namespace Nz { if (m_handleData) { + OnHandledObjectDestruction(this); + m_handleData->object = nullptr; m_handleData.reset(); } diff --git a/include/Nazara/Core/ObjectRef.inl b/include/Nazara/Core/ObjectRef.inl index f592fd501..25ff82a95 100644 --- a/include/Nazara/Core/ObjectRef.inl +++ b/include/Nazara/Core/ObjectRef.inl @@ -335,7 +335,7 @@ namespace Nz template bool operator<(const ObjectRef& lhs, const ObjectRef& rhs) { - return lhs.m_object < rhs.m_object; + return lhs.Get() < rhs.Get(); } /*! @@ -348,7 +348,7 @@ namespace Nz template bool operator<(const T& lhs, const ObjectRef& rhs) { - return &lhs < rhs.m_object; + return &lhs < rhs.Get(); } /*! @@ -361,7 +361,7 @@ namespace Nz template bool operator<(const ObjectRef& lhs, const T& rhs) { - return lhs.m_object < &rhs; + return lhs.Get() < &rhs; } /*! diff --git a/include/Nazara/Core/PoolByteStream.hpp b/include/Nazara/Core/PoolByteStream.hpp new file mode 100644 index 000000000..63150290d --- /dev/null +++ b/include/Nazara/Core/PoolByteStream.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_POOLBYTESTREAM_HPP +#define NAZARA_POOLBYTESTREAM_HPP + +#include +#include +#include +#include + +namespace Nz +{ + class ByteArrayPool; + + class NAZARA_CORE_API PoolByteStream : public ByteStream + { + friend class Network; + + public: + inline PoolByteStream(ByteArrayPool& pool); + inline PoolByteStream(ByteArrayPool& pool, std::size_t capacity); + PoolByteStream(const PoolByteStream&) = delete; + PoolByteStream(PoolByteStream&& packet) = default; + inline ~PoolByteStream(); + + void Reset(); + void Reset(std::size_t capacity); + + PoolByteStream& operator=(const PoolByteStream&) = delete; + PoolByteStream& operator=(PoolByteStream&&) = delete; + + private: + void OnEmptyStream() override; + + ByteArrayPool& m_pool; + ByteArray m_buffer; + }; +} + +#include + +#endif // NAZARA_POOLBYTESTREAM_HPP diff --git a/include/Nazara/Core/PoolByteStream.inl b/include/Nazara/Core/PoolByteStream.inl new file mode 100644 index 000000000..d786c6a67 --- /dev/null +++ b/include/Nazara/Core/PoolByteStream.inl @@ -0,0 +1,30 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + inline PoolByteStream::PoolByteStream(ByteArrayPool& pool) : + m_pool(pool) + { + } + + inline PoolByteStream::PoolByteStream(ByteArrayPool& pool, std::size_t capacity) : + PoolByteStream(pool) + { + Reset(capacity); + } + + inline PoolByteStream::~PoolByteStream() + { + FlushBits(); //< Needs to be done here as the stream will be freed before ByteStream calls it + Reset(); //< Returns the byte array (if any) to the pool + } +} + +#include diff --git a/include/Nazara/Core/StackArray.hpp b/include/Nazara/Core/StackArray.hpp index 1bed2b16c..0a9f23faa 100644 --- a/include/Nazara/Core/StackArray.hpp +++ b/include/Nazara/Core/StackArray.hpp @@ -8,6 +8,7 @@ #define NAZARA_STACKARRAY_HPP #include +#include #ifdef NAZARA_ALLOCA_SUPPORT #define NazaraStackArray(T, size) Nz::StackArray(static_cast(NAZARA_ALLOCA((size) * sizeof(T))), size) @@ -40,8 +41,11 @@ namespace Nz using reverse_iterator = std::reverse_iterator; using size_type = std::size_t; + StackArray(); StackArray(T* stackMemory, std::size_t size); StackArray(T* stackMemory, std::size_t size, NoInitTag); + StackArray(const StackArray&) = delete; + StackArray(StackArray&&) = default; ~StackArray(); reference back(); @@ -81,9 +85,12 @@ namespace Nz reference operator[](size_type pos); const_reference operator[](size_type pos) const; + StackArray& operator=(const StackArray&) = delete; + StackArray& operator=(StackArray&&) = default; + private: std::size_t m_size; - T* m_ptr; + MovablePtr m_ptr; }; } diff --git a/include/Nazara/Core/StackArray.inl b/include/Nazara/Core/StackArray.inl index 989ffdf88..7e46afc64 100644 --- a/include/Nazara/Core/StackArray.inl +++ b/include/Nazara/Core/StackArray.inl @@ -24,6 +24,14 @@ namespace Nz * \class Nz::StackArray * \brief Core class that represents a stack-allocated (if alloca is present) array */ + + template + StackArray::StackArray() : + m_size(0), + m_ptr(nullptr) + { + } + template StackArray::StackArray(T* stackMemory, std::size_t size) : m_size(size), diff --git a/include/Nazara/Core/StackVector.hpp b/include/Nazara/Core/StackVector.hpp index 18d7e7437..6d01d8589 100644 --- a/include/Nazara/Core/StackVector.hpp +++ b/include/Nazara/Core/StackVector.hpp @@ -8,6 +8,7 @@ #define NAZARA_STACKVECTOR_HPP #include +#include #ifdef NAZARA_ALLOCA_SUPPORT #define NazaraStackVector(T, capacity) Nz::StackVector(static_cast(NAZARA_ALLOCA((capacity) * sizeof(T))), capacity) @@ -37,7 +38,10 @@ namespace Nz using reverse_iterator = std::reverse_iterator; using size_type = std::size_t; + StackVector(); StackVector(T* stackMemory, std::size_t capacity); + StackVector(const StackVector&) = delete; + StackVector(StackVector&&) = default; ~StackVector(); reference back(); @@ -99,10 +103,13 @@ namespace Nz reference operator[](size_type pos); const_reference operator[](size_type pos) const; + StackVector& operator=(const StackVector&) = delete; + StackVector& operator=(StackVector&&) = default; + private: std::size_t m_capacity; std::size_t m_size; - T* m_ptr; + MovablePtr m_ptr; }; } diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl index c8b71a5cb..580ade499 100644 --- a/include/Nazara/Core/StackVector.inl +++ b/include/Nazara/Core/StackVector.inl @@ -24,6 +24,14 @@ namespace Nz * \class Nz::StackVector * \brief Core class that represents a stack-allocated (if alloca is present) vector, that is with a capacity different from its size */ + template + StackVector::StackVector() : + m_capacity(0), + m_size(0), + m_ptr(nullptr) + { + } + template StackVector::StackVector(T* stackMemory, std::size_t capacity) : m_capacity(capacity), @@ -123,14 +131,16 @@ namespace Nz assert(m_size < m_capacity); assert(pos >= begin() && pos <= end()); - std::size_t index = std::distance(begin(), pos); + std::size_t index = std::distance(cbegin(), pos); if (pos < end()) { iterator lastElement = end() - 1; PlacementNew(&m_ptr[m_size], std::move(*lastElement)); if (&m_ptr[index] < lastElement) - std::move(&m_ptr[index], lastElement, &m_ptr[index + 1]); + std::move_backward(&m_ptr[index], &m_ptr[m_size - 1], &m_ptr[m_size]); + + PlacementDestroy(&m_ptr[index]); } m_size++; @@ -167,8 +177,8 @@ namespace Nz typename StackVector::iterator StackVector::erase(const_iterator pos) { assert(pos < end()); - std::size_t index = std::distance(begin(), pos); - std::move(pos + 1, end(), pos); + std::size_t index = std::distance(cbegin(), pos); + std::move(begin() + index + 1, end(), begin() + index); pop_back(); return iterator(&m_ptr[index]); @@ -177,15 +187,18 @@ namespace Nz template typename StackVector::iterator StackVector::erase(const_iterator first, const_iterator last) { + std::size_t index = std::distance(cbegin(), first); + if (first == last) - return first; + return begin() + index; assert(first < last); assert(first >= begin() && last <= end()); - std::size_t index = std::distance(begin(), first); - std::move(last, end(), first); - resize(size() - (last - first)); + std::size_t count = std::distance(first, last); + + std::move(begin() + index + count, end(), begin() + index); + resize(size() - count); return iterator(&m_ptr[index]); } @@ -244,7 +257,7 @@ namespace Nz template void StackVector::resize(size_type count) { - assert(count < m_capacity); + assert(count <= m_capacity); if (count > m_size) { for (std::size_t i = m_size; i < count; ++i) @@ -264,7 +277,7 @@ namespace Nz template void StackVector::resize(size_type count, const value_type& value) { - assert(count < m_capacity); + assert(count <= m_capacity); if (count > m_size) { for (std::size_t i = m_size; i < count; ++i) diff --git a/include/Nazara/Core/String.inl b/include/Nazara/Core/String.inl index 57c781f9e..eed2269d0 100644 --- a/include/Nazara/Core/String.inl +++ b/include/Nazara/Core/String.inl @@ -41,7 +41,7 @@ namespace Nz inline void String::ReleaseString() { - m_sharedString = std::move(GetEmptyString()); + m_sharedString = GetEmptyString(); } /*! diff --git a/include/Nazara/Core/TypeTag.hpp b/include/Nazara/Core/TypeTag.hpp index 150802b01..c7f6c0f4e 100644 --- a/include/Nazara/Core/TypeTag.hpp +++ b/include/Nazara/Core/TypeTag.hpp @@ -10,7 +10,10 @@ namespace Nz { template - struct TypeTag {}; + struct TypeTag + { + using Type = T; + }; } #endif // NAZARA_TYPETAG_HPP diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index 7feb32362..7eff97852 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -136,6 +136,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: BoxEntry(); BoxEntry(BoxEntry&&) = default; @@ -154,6 +156,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: NoTestEntry(); NoTestEntry(NoTestEntry&&) = default; @@ -170,6 +174,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: SphereEntry(); SphereEntry(SphereEntry&&) = default; @@ -188,6 +194,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: VolumeEntry(); VolumeEntry(VolumeEntry&&) = default; diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 341508351..aa94bc995 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -424,13 +424,13 @@ namespace Nz template CullingList::BoxEntry::BoxEntry() : - Entry() + ParentType() { } template CullingList::BoxEntry::BoxEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } @@ -444,13 +444,13 @@ namespace Nz template CullingList::NoTestEntry::NoTestEntry() : - Entry() + ParentType() { } template CullingList::NoTestEntry::NoTestEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } @@ -458,13 +458,13 @@ namespace Nz template CullingList::SphereEntry::SphereEntry() : - Entry() + ParentType() { } template CullingList::SphereEntry::SphereEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } @@ -478,13 +478,13 @@ namespace Nz template CullingList::VolumeEntry::VolumeEntry() : - Entry() + ParentType() { } template CullingList::VolumeEntry::VolumeEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } diff --git a/include/Nazara/Graphics/DeferredGeometryPass.hpp b/include/Nazara/Graphics/DeferredGeometryPass.hpp index 3c7890bfe..043378642 100644 --- a/include/Nazara/Graphics/DeferredGeometryPass.hpp +++ b/include/Nazara/Graphics/DeferredGeometryPass.hpp @@ -51,8 +51,16 @@ namespace Nz int textureOverlay; }; + struct SpriteBatch + { + std::size_t spriteCount; + const Material* material; + const Texture* overlayTexture; + Recti scissorRect; + }; + mutable std::unordered_map m_shaderUniforms; - mutable std::vector> m_spriteChains; + mutable std::vector m_spriteBatches; Buffer m_vertexBuffer; RenderStates m_clearStates; ShaderRef m_clearShader; diff --git a/include/Nazara/Graphics/DepthRenderTechnique.hpp b/include/Nazara/Graphics/DepthRenderTechnique.hpp index f8f7bc4e3..5ae883352 100644 --- a/include/Nazara/Graphics/DepthRenderTechnique.hpp +++ b/include/Nazara/Graphics/DepthRenderTechnique.hpp @@ -61,8 +61,16 @@ namespace Nz int textureOverlay; }; + struct SpriteBatch + { + std::size_t spriteCount; + const Material* material; + const Texture* overlayTexture; + Recti scissorRect; + }; + mutable std::unordered_map m_shaderUniforms; - mutable std::vector> m_spriteChains; + mutable std::vector m_spriteBatches; Buffer m_vertexBuffer; RenderStates m_clearStates; ShaderRef m_clearShader; diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index 32a59b1bb..66c34e19c 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -119,6 +119,14 @@ namespace Nz { m_pipelineInfo = pipelineInfo; + // Temp and dirty fix for pipeline overriding has*Map + m_pipelineInfo.hasAlphaMap = m_alphaMap.IsValid(); + m_pipelineInfo.hasDiffuseMap = m_diffuseMap.IsValid(); + m_pipelineInfo.hasEmissiveMap = m_emissiveMap.IsValid(); + m_pipelineInfo.hasHeightMap = m_heightMap.IsValid(); + m_pipelineInfo.hasNormalMap = m_normalMap.IsValid(); + m_pipelineInfo.hasSpecularMap = m_specularMap.IsValid(); + InvalidatePipeline(); } diff --git a/include/Nazara/Graphics/TextSprite.hpp b/include/Nazara/Graphics/TextSprite.hpp index d86d999ad..1826aa21b 100644 --- a/include/Nazara/Graphics/TextSprite.hpp +++ b/include/Nazara/Graphics/TextSprite.hpp @@ -59,6 +59,31 @@ namespace Nz void OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer); void UpdateData(InstanceData* instanceData) const override; + struct RenderKey + { + Texture* texture; + int renderOrder; + + bool operator==(const RenderKey& rhs) const + { + return texture == rhs.texture && renderOrder == rhs.renderOrder; + } + + bool operator!=(const RenderKey& rhs) const + { + return !operator==(rhs); + } + }; + + struct HashRenderKey + { + std::size_t operator()(const RenderKey& key) const + { + // Since renderOrder will be very small, this will be enough + return std::hash()(key.texture) + key.renderOrder; + } + }; + struct RenderIndices { unsigned int first; @@ -74,10 +99,10 @@ namespace Nz }; std::unordered_map m_atlases; - mutable std::unordered_map m_renderInfos; + mutable std::unordered_map m_renderInfos; mutable std::vector m_localVertices; Color m_color; - Recti m_localBounds; + Rectf m_localBounds; float m_scale; static TextSpriteLibrary::LibraryMap s_library; diff --git a/include/Nazara/Graphics/TextSprite.inl b/include/Nazara/Graphics/TextSprite.inl index 04a3c1170..97b17d888 100644 --- a/include/Nazara/Graphics/TextSprite.inl +++ b/include/Nazara/Graphics/TextSprite.inl @@ -14,7 +14,7 @@ namespace Nz inline TextSprite::TextSprite() : m_color(Color::White), - m_localBounds(Nz::Recti::Zero()), + m_localBounds(Nz::Rectf::Zero()), m_scale(1.f) { ResetMaterials(1U); diff --git a/include/Nazara/Math/Algorithm.hpp b/include/Nazara/Math/Algorithm.hpp index dd9cb4d5a..7bd77437d 100644 --- a/include/Nazara/Math/Algorithm.hpp +++ b/include/Nazara/Math/Algorithm.hpp @@ -35,15 +35,15 @@ namespace Nz { - template /*constexpr*/ T Approach(T value, T objective, T increment); + template constexpr T Approach(T value, T objective, T increment); template constexpr T Clamp(T value, T min, T max); - template /*constexpr*/ std::size_t CountBits(T value); + template constexpr std::size_t CountBits(T value); template constexpr T FromDegrees(T degrees); template constexpr T FromRadians(T radians); template constexpr T DegreeToRadian(T degrees); - template /*constexpr*/ T GetNearestPowerOfTwo(T number); - /*constexpr*/ unsigned int GetNumberLength(signed char number); - /*constexpr*/ unsigned int GetNumberLength(unsigned char number); + template constexpr T GetNearestPowerOfTwo(T number); + constexpr unsigned int GetNumberLength(signed char number); + constexpr unsigned int GetNumberLength(unsigned char number); unsigned int GetNumberLength(int number); /*constexpr*/ unsigned int GetNumberLength(unsigned int number); unsigned int GetNumberLength(long long number); @@ -53,12 +53,12 @@ namespace Nz unsigned int GetNumberLength(long double number, UInt8 precision = NAZARA_CORE_DECIMAL_DIGITS); template /*constexpr*/ unsigned int IntegralLog2(T number); template /*constexpr*/ unsigned int IntegralLog2Pot(T pot); - template /*constexpr*/ T IntegralPow(T base, unsigned int exponent); + template constexpr T IntegralPow(T base, unsigned int exponent); template constexpr T Lerp(const T& from, const T& to, const T2& interpolation); template constexpr T MultiplyAdd(T x, T y, T z); - template /*constexpr*/ T NormalizeAngle(T angle); - template /*constexpr*/ bool NumberEquals(T a, T b); - template /*constexpr*/ bool NumberEquals(T a, T b, T maxDifference); + template constexpr T NormalizeAngle(T angle); + template constexpr bool NumberEquals(T a, T b); + template constexpr bool NumberEquals(T a, T b, T maxDifference); String NumberToString(long long number, UInt8 radix = 10); template constexpr T RadianToDegree(T radians); long long StringToNumber(String str, UInt8 radix = 10, bool* ok = nullptr); diff --git a/include/Nazara/Math/Algorithm.inl b/include/Nazara/Math/Algorithm.inl index b393d38e6..5a7bfb8fc 100644 --- a/include/Nazara/Math/Algorithm.inl +++ b/include/Nazara/Math/Algorithm.inl @@ -98,13 +98,13 @@ namespace Nz return 0; } - template /*constexpr*/ std::enable_if_t::value, bool> NumberEquals(T a, T b, T maxDifference) + template constexpr std::enable_if_t::value, bool> NumberEquals(T a, T b, T maxDifference) { T diff = std::abs(a - b); return diff <= maxDifference; } - template /*constexpr*/ std::enable_if_t::value || (!std::is_integral::value && !std::is_floating_point::value), bool> NumberEquals(T a, T b, T maxDifference) + template constexpr std::enable_if_t::value || (!std::is_integral::value && !std::is_floating_point::value), bool> NumberEquals(T a, T b, T maxDifference) { if (b > a) std::swap(a, b); @@ -113,7 +113,7 @@ namespace Nz return diff <= maxDifference; } - template /*constexpr*/ std::enable_if_t::value && std::is_integral::value, bool> NumberEquals(T a, T b, T maxDifference) + template constexpr std::enable_if_t::value && std::is_integral::value, bool> NumberEquals(T a, T b, T maxDifference) { if (b > a) std::swap(a, b); @@ -132,10 +132,8 @@ namespace Nz * \param objective Target value * \param increment One step value */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline T Approach(T value, T objective, T increment) + constexpr inline T Approach(T value, T objective, T increment) { if (value < objective) return std::min(value + increment, objective); @@ -154,7 +152,6 @@ namespace Nz * \param min Minimum of the interval * \param max Maximum of the interval */ - template constexpr T Clamp(T value, T min, T max) { @@ -168,10 +165,8 @@ namespace Nz * * \param value The value to count bits */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline std::size_t CountBits(T value) + constexpr inline std::size_t CountBits(T value) { // https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan std::size_t count = 0; @@ -191,7 +186,6 @@ namespace Nz * * \param degrees Angle in degree (this is expected between 0..360) */ - template constexpr T DegreeToRadian(T degrees) { @@ -205,7 +199,6 @@ namespace Nz * * \param degrees Convert degree to NAZARA_MATH_ANGLE_RADIAN unit */ - template constexpr T FromDegrees(T degrees) { @@ -223,7 +216,6 @@ namespace Nz * * \param radians Convert radian to NAZARA_MATH_ANGLE_RADIAN unit */ - template constexpr T FromRadians(T radians) { @@ -241,10 +233,8 @@ namespace Nz * * \param number Number to get nearest power */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline T GetNearestPowerOfTwo(T number) + constexpr inline T GetNearestPowerOfTwo(T number) { T x = 1; while (x < number) @@ -260,9 +250,7 @@ namespace Nz * * \param number Number to get number of digits */ - - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline unsigned int GetNumberLength(signed char number) + constexpr inline unsigned int GetNumberLength(signed char number) { // Char is expected to be 1 byte static_assert(sizeof(number) == 1, "Signed char must be one byte-sized"); @@ -288,9 +276,7 @@ namespace Nz * * \param number Number to get number of digits */ - - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline unsigned int GetNumberLength(unsigned char number) + constexpr inline unsigned int GetNumberLength(unsigned char number) { // Char is expected to be 1 byte static_assert(sizeof(number) == 1, "Unsigned char must be one byte-sized"); @@ -310,7 +296,6 @@ namespace Nz * * \param number Number to get number of digits */ - inline unsigned int GetNumberLength(int number) { if (number == 0) @@ -326,7 +311,6 @@ namespace Nz * * \param number Number to get number of digits */ - //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int GetNumberLength(unsigned int number) { @@ -343,7 +327,6 @@ namespace Nz * * \param number Number to get number of digits */ - inline unsigned int GetNumberLength(long long number) { if (number == 0) @@ -359,7 +342,6 @@ namespace Nz * * \param number Number to get number of digits */ - //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int GetNumberLength(unsigned long long number) { @@ -377,7 +359,6 @@ namespace Nz * \param number Number to get number of digits * \param precision Number of digit after the dot */ - inline unsigned int GetNumberLength(float number, UInt8 precision) { // The imprecision of floats need a cast (log10(9.99999) = 0.99999) @@ -392,7 +373,6 @@ namespace Nz * \param number Number to get number of digits * \param precision Number of digit after the dot */ - inline unsigned int GetNumberLength(double number, UInt8 precision) { // The imprecision of floats need a cast (log10(9.99999) = 0.99999) @@ -407,7 +387,6 @@ namespace Nz * \param number Number to get number of digits * \param precision Number of digit after the dot */ - inline unsigned int GetNumberLength(long double number, UInt8 precision) { // The imprecision of floats need a cast (log10(9.99999) = 0.99999) @@ -423,7 +402,6 @@ namespace Nz * * \remark If number is 0, 0 is returned */ - template //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int IntegralLog2(T number) @@ -442,7 +420,6 @@ namespace Nz * \remark Only works for power of two * \remark If number is 0, 0 is returned */ - template //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int IntegralLog2Pot(T pot) @@ -458,10 +435,8 @@ namespace Nz * \param base Base of the exponentation * \param exponent Power for the base */ - - //TODO: Mark as constexpr when supported by all major compilers template - /*constexpr*/ T IntegralPow(T base, unsigned int exponent) + constexpr T IntegralPow(T base, unsigned int exponent) { T r = 1; for (unsigned int i = 0; i < exponent; ++i) @@ -484,7 +459,6 @@ namespace Nz * * \see Lerp */ - template constexpr T Lerp(const T& from, const T& to, const T2& interpolation) { @@ -540,10 +514,8 @@ namespace Nz * * \param angle Angle to normalize */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline T NormalizeAngle(T angle) + constexpr inline T NormalizeAngle(T angle) { #if NAZARA_MATH_ANGLE_RADIAN const T limit = T(M_PI); @@ -567,10 +539,8 @@ namespace Nz * \param a First value * \param b Second value */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline bool NumberEquals(T a, T b) + constexpr inline bool NumberEquals(T a, T b) { return NumberEquals(a, b, std::numeric_limits::epsilon()); } @@ -584,10 +554,8 @@ namespace Nz * \param b Second value * \param maxDifference Epsilon of comparison (expected to be positive) */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline bool NumberEquals(T a, T b, T maxDifference) + constexpr inline bool NumberEquals(T a, T b, T maxDifference) { return Detail::NumberEquals(a, b, maxDifference); } @@ -603,7 +571,6 @@ namespace Nz * \remark radix is meant to be between 2 and 36, other values are potentially undefined behavior * \remark With NAZARA_MATH_SAFE, a NazaraError is produced and String() is returned */ - inline String NumberToString(long long number, UInt8 radix) { #if NAZARA_MATH_SAFE @@ -651,7 +618,6 @@ namespace Nz * * \param radians Angle in radian (this is expected between 0..2*pi) */ - template constexpr T RadianToDegree(T radians) { @@ -670,7 +636,6 @@ namespace Nz * \remark radix is meant to be between 2 and 36, other values are potentially undefined behavior * \remark With NAZARA_MATH_SAFE, a NazaraError is produced and 0 is returned */ - inline long long StringToNumber(String str, UInt8 radix, bool* ok) { #if NAZARA_MATH_SAFE @@ -727,7 +692,6 @@ namespace Nz * * \param angle Convert degree from NAZARA_MATH_ANGLE_RADIAN unit to degrees */ - template constexpr T ToDegrees(T angle) { @@ -745,7 +709,6 @@ namespace Nz * * \param angle Convert degree from NAZARA_MATH_ANGLE_RADIAN unit to radians */ - template constexpr T ToRadians(T angle) { diff --git a/include/Nazara/Math/Box.hpp b/include/Nazara/Math/Box.hpp index 555e10130..e9e57c8f0 100644 --- a/include/Nazara/Math/Box.hpp +++ b/include/Nazara/Math/Box.hpp @@ -63,7 +63,6 @@ namespace Nz Box& Set(T Width, T Height, T Depth); Box& Set(T X, T Y, T Z, T Width, T Height, T Depth); Box& Set(const T box[6]); - Box& Set(const Box& box); Box& Set(const Rect& rect); Box& Set(const Vector3& lengths); Box& Set(const Vector3& vec1, const Vector3& vec2); diff --git a/include/Nazara/Math/Box.inl b/include/Nazara/Math/Box.inl index 6b0ed9112..6055b3444 100644 --- a/include/Nazara/Math/Box.inl +++ b/include/Nazara/Math/Box.inl @@ -585,21 +585,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the box with components from another - * \return A reference to this box - * - * \param box The other box - */ - - template - Box& Box::Set(const Box& box) - { - std::memcpy(this, &box, sizeof(Box)); - - return *this; - } - /*! * \brief Sets the components of the box with components from a Rect * \return A reference to this box diff --git a/include/Nazara/Math/EulerAngles.hpp b/include/Nazara/Math/EulerAngles.hpp index 0079d2f6a..503a0fb94 100644 --- a/include/Nazara/Math/EulerAngles.hpp +++ b/include/Nazara/Math/EulerAngles.hpp @@ -37,7 +37,6 @@ namespace Nz EulerAngles& Set(T P, T Y, T R); EulerAngles& Set(const T angles[3]); template EulerAngles& Set(const Angle& angles); - EulerAngles& Set(const EulerAngles& angles); //EulerAngles& Set(const Matrix3& mat); EulerAngles& Set(const Quaternion& quat); template EulerAngles& Set(const EulerAngles& angles); diff --git a/include/Nazara/Math/EulerAngles.inl b/include/Nazara/Math/EulerAngles.inl index 52c2e4b41..00f78bf27 100644 --- a/include/Nazara/Math/EulerAngles.inl +++ b/include/Nazara/Math/EulerAngles.inl @@ -169,20 +169,6 @@ namespace Nz return Set(angle.ToEulerAngles()); } - /*! - * \brief Sets the components of the euler angle from another euler angle - * \return A reference to this euler angle - * - * \param angles The other euler angle - */ - template - EulerAngles& EulerAngles::Set(const EulerAngles& angles) - { - std::memcpy(this, &angles, sizeof(EulerAngles)); - - return *this; - } - /*! * \brief Sets the components of the euler angle from a quaternion * \return A reference to this euler angle diff --git a/include/Nazara/Math/Frustum.hpp b/include/Nazara/Math/Frustum.hpp index 042d55cee..f1b37811a 100644 --- a/include/Nazara/Math/Frustum.hpp +++ b/include/Nazara/Math/Frustum.hpp @@ -52,7 +52,6 @@ namespace Nz Frustum& operator=(const Frustum& other) = default; - Frustum& Set(const Frustum& frustum); template Frustum& Set(const Frustum& frustum); String ToString() const; diff --git a/include/Nazara/Math/Frustum.inl b/include/Nazara/Math/Frustum.inl index 6d6d38500..36a13a316 100644 --- a/include/Nazara/Math/Frustum.inl +++ b/include/Nazara/Math/Frustum.inl @@ -623,21 +623,6 @@ namespace Nz return (c == 6) ? IntersectionSide_Inside : IntersectionSide_Intersecting; } - /*! - * \brief Sets the components of the frustum from another frustum - * \return A reference to this frustum - * - * \param frustum The other frustum - */ - - template - Frustum& Frustum::Set(const Frustum& frustum) - { - std::memcpy(this, &frustum, sizeof(Frustum)); - - return *this; - } - /*! * \brief Sets the components of the frustum from another type of Frustum * \return A reference to this frustum diff --git a/include/Nazara/Math/Matrix4.hpp b/include/Nazara/Math/Matrix4.hpp index cb8667036..3ed2cd717 100644 --- a/include/Nazara/Math/Matrix4.hpp +++ b/include/Nazara/Math/Matrix4.hpp @@ -44,6 +44,8 @@ namespace Nz Matrix4& Concatenate(const Matrix4& matrix); Matrix4& ConcatenateAffine(const Matrix4& matrix); + void Decompose(Vector3& translation, Quaternion& rotation, Vector3& scale); + Vector4 GetColumn(unsigned int column) const; T GetDeterminant() const; T GetDeterminantAffine() const; @@ -82,9 +84,7 @@ namespace Nz T r21, T r22, T r23, T r24, T r31, T r32, T r33, T r34, T r41, T r42, T r43, T r44); - Matrix4& Set(const T matrix[16]); //Matrix4(const Matrix3& matrix); - Matrix4& Set(const Matrix4& matrix); template Matrix4& Set(const Matrix4& matrix); Matrix4& SetRotation(const Quaternion& rotation); Matrix4& SetScale(const Vector3& scale); diff --git a/include/Nazara/Math/Matrix4.inl b/include/Nazara/Math/Matrix4.inl index 297edf8a8..1f2f58a17 100644 --- a/include/Nazara/Math/Matrix4.inl +++ b/include/Nazara/Math/Matrix4.inl @@ -55,9 +55,12 @@ namespace Nz */ template - Matrix4::Matrix4(const T matrix[16]) + Matrix4::Matrix4(const T matrix[16]) : + Matrix4(matrix[ 0], matrix[ 1], matrix[ 2], matrix[ 3], + matrix[ 4], matrix[ 5], matrix[ 6], matrix[ 7], + matrix[ 8], matrix[ 9], matrix[10], matrix[11], + matrix[12], matrix[13], matrix[14], matrix[15]) { - Set(matrix); } /*! @@ -217,6 +220,25 @@ namespace Nz F(1.0)); } + template + void Matrix4::Decompose(Vector3& translation, Quaternion& rotation, Vector3& scale) + { + Matrix4f localMat(*this); + + translation = localMat.GetTranslation(); + scale = localMat.GetScale(); + + Vector3 invScale; + invScale.x = T(1) / scale.x; + invScale.y = T(1) / scale.y; + invScale.z = T(1) / scale.z; + + localMat.ApplyScale(invScale); + + rotation = localMat.GetRotation(); + } + + /*! * \brief Gets the ith column of the matrix * \return Vector4 which is the transformation of this axis @@ -448,7 +470,7 @@ namespace Nz for (unsigned int i = 0; i < 16; ++i) inv[i] *= invDet; - dest->Set(inv); + *dest = inv; return true; } else @@ -550,7 +572,7 @@ namespace Nz inv[15] = F(1.0); - dest->Set(inv); + *dest = inv; return true; } else @@ -1097,37 +1119,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the matrix from an array of sixteen elements - * \return A reference to this matrix - * - * \param matrix[16] Matrix components - */ - - template - Matrix4& Matrix4::Set(const T matrix[16]) - { - // Here we are confident of the continuity of memory elements - std::memcpy(&m11, matrix, 16 * sizeof(T)); - - return *this; - } - - /*! - * \brief Sets the components of the matrix from another matrix - * \return A reference to this matrix - * - * \param matrix The other matrix - */ - - template - Matrix4& Matrix4::Set(const Matrix4& matrix) - { - std::memcpy(this, &matrix, sizeof(Matrix4)); - - return *this; - } - /*! * \brief Sets the components of the matrix from another type of Matrix4 * \return A reference to this matrix diff --git a/include/Nazara/Math/OrientedBox.hpp b/include/Nazara/Math/OrientedBox.hpp index ab136a530..dbc1820c5 100644 --- a/include/Nazara/Math/OrientedBox.hpp +++ b/include/Nazara/Math/OrientedBox.hpp @@ -36,7 +36,6 @@ namespace Nz OrientedBox& Set(T X, T Y, T Z, T Width, T Height, T Depth); OrientedBox& Set(const Box& box); - OrientedBox& Set(const OrientedBox& orientedBox); OrientedBox& Set(const Vector3& vec1, const Vector3& vec2); template OrientedBox& Set(const OrientedBox& orientedBox); diff --git a/include/Nazara/Math/OrientedBox.inl b/include/Nazara/Math/OrientedBox.inl index df864fe26..7e561eb41 100644 --- a/include/Nazara/Math/OrientedBox.inl +++ b/include/Nazara/Math/OrientedBox.inl @@ -164,21 +164,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the oriented box with components from another - * \return A reference to this oriented box - * - * \param orientedBox The other OrientedBox - */ - - template - OrientedBox& OrientedBox::Set(const OrientedBox& orientedBox) - { - std::memcpy(this, &orientedBox, sizeof(OrientedBox)); - - return *this; - } - /*! * \brief Sets a OrientedBox object from two vectors representing point of the space * (X, Y, Z) will be the components minimum of the two vectors and the (width, height, depth) will be the components maximum - minimum diff --git a/include/Nazara/Math/Plane.hpp b/include/Nazara/Math/Plane.hpp index d5384b3fe..0f0dbd5f0 100644 --- a/include/Nazara/Math/Plane.hpp +++ b/include/Nazara/Math/Plane.hpp @@ -37,7 +37,6 @@ namespace Nz Plane& Set(T normalX, T normalY, T normalZ, T Distance); Plane& Set(const T plane[4]); - Plane& Set(const Plane& plane); Plane& Set(const Vector3& Normal, T Distance); Plane& Set(const Vector3& Normal, const Vector3& point); Plane& Set(const Vector3& point1, const Vector3& point2, const Vector3& point3); diff --git a/include/Nazara/Math/Plane.inl b/include/Nazara/Math/Plane.inl index 4c2adc90c..7430b4dca 100644 --- a/include/Nazara/Math/Plane.inl +++ b/include/Nazara/Math/Plane.inl @@ -212,21 +212,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the plane from another plane - * \return A reference to this plane - * - * \param plane The other plane - */ - - template - Plane& Plane::Set(const Plane& plane) - { - std::memcpy(this, &plane, sizeof(Plane)); - - return *this; - } - /*! * \brief Sets the components of the plane from a normal and a distance * \return A reference to this plane diff --git a/include/Nazara/Math/Quaternion.hpp b/include/Nazara/Math/Quaternion.hpp index 16e88b8ef..991b23b94 100644 --- a/include/Nazara/Math/Quaternion.hpp +++ b/include/Nazara/Math/Quaternion.hpp @@ -56,7 +56,6 @@ namespace Nz Quaternion& Set(T angle, const Vector3& normalizedAxis); Quaternion& Set(const T quat[4]); //Quaternion& Set(const Matrix3& mat); - Quaternion& Set(const Quaternion& quat); template Quaternion& Set(const Quaternion& quat); T SquaredMagnitude() const; diff --git a/include/Nazara/Math/Quaternion.inl b/include/Nazara/Math/Quaternion.inl index f253d7d6b..6d8937566 100644 --- a/include/Nazara/Math/Quaternion.inl +++ b/include/Nazara/Math/Quaternion.inl @@ -430,21 +430,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the quaternion from another quaternion - * \return A reference to this quaternion - * - * \param quat The other quaternion - */ - - template - Quaternion& Quaternion::Set(const Quaternion& quat) - { - std::memcpy(this, &quat, sizeof(Quaternion)); - - return *this; - } - /*! * \brief Sets the components of the quaternion from another type of Quaternion * \return A reference to this quaternion diff --git a/include/Nazara/Math/Ray.hpp b/include/Nazara/Math/Ray.hpp index 677bf50b9..8429e7dc8 100644 --- a/include/Nazara/Math/Ray.hpp +++ b/include/Nazara/Math/Ray.hpp @@ -54,7 +54,6 @@ namespace Nz Ray& Set(const Vector3& origin, const Vector3& direction); Ray& Set(const T origin[3], const T direction[3]); Ray& Set(const Plane& planeOne, const Plane& planeTwo); - Ray& Set(const Ray& ray); template Ray& Set(const Ray& ray); template Ray& Set(const Vector3& origin, const Vector3& direction); diff --git a/include/Nazara/Math/Ray.inl b/include/Nazara/Math/Ray.inl index 673dca796..f2248baca 100644 --- a/include/Nazara/Math/Ray.inl +++ b/include/Nazara/Math/Ray.inl @@ -593,21 +593,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the ray with components from another - * \return A reference to this ray - * - * \param ray The other ray - */ - - template - Ray& Ray::Set(const Ray& ray) - { - std::memcpy(this, &ray, sizeof(Ray)); - - return *this; - } - /*! * \brief Sets the components of the ray from another type of Ray * \return A reference to this ray diff --git a/include/Nazara/Math/Rect.hpp b/include/Nazara/Math/Rect.hpp index db7ee15f0..58e6ed677 100644 --- a/include/Nazara/Math/Rect.hpp +++ b/include/Nazara/Math/Rect.hpp @@ -55,7 +55,6 @@ namespace Nz Rect& Set(T Width, T Height); Rect& Set(T X, T Y, T Width, T Height); Rect& Set(const T rect[4]); - Rect& Set(const Rect& rect); Rect& Set(const Vector2& lengths); Rect& Set(const Vector2& vec1, const Vector2& vec2); template Rect& Set(const Rect& rect); @@ -92,7 +91,9 @@ namespace Nz using Recti = Rect; using Rectui = Rect; using Recti32 = Rect; + using Recti64 = Rect; using Rectui32 = Rect; + using Rectui64 = Rect; template bool Serialize(SerializationContext& context, const Rect& rect, TypeTag>); template bool Unserialize(SerializationContext& context, Rect* rect, TypeTag>); diff --git a/include/Nazara/Math/Rect.inl b/include/Nazara/Math/Rect.inl index 93b6e6d79..20181a763 100644 --- a/include/Nazara/Math/Rect.inl +++ b/include/Nazara/Math/Rect.inl @@ -475,21 +475,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the rectangle with components from another - * \return A reference to this rectangle - * - * \param rect The other Rect - */ - - template - Rect& Rect::Set(const Rect& rect) - { - std::memcpy(this, &rect, sizeof(Rect)); - - return *this; - } - /*! * \brief Sets the components of the rectange from a vector representing width and height * \return A reference to this rectangle diff --git a/include/Nazara/Math/Sphere.hpp b/include/Nazara/Math/Sphere.hpp index 0c9880287..762a276dc 100644 --- a/include/Nazara/Math/Sphere.hpp +++ b/include/Nazara/Math/Sphere.hpp @@ -53,7 +53,6 @@ namespace Nz Sphere& Set(T X, T Y, T Z, T Radius); //Sphere& Set(const Circle& rect); - Sphere& Set(const Sphere& sphere); Sphere& Set(const Vector3& center, T Radius); Sphere& Set(const T sphere[4]); template Sphere& Set(const Sphere& sphere); diff --git a/include/Nazara/Math/Sphere.inl b/include/Nazara/Math/Sphere.inl index 643fcee82..c9ac33414 100644 --- a/include/Nazara/Math/Sphere.inl +++ b/include/Nazara/Math/Sphere.inl @@ -397,21 +397,6 @@ namespace Nz } */ - /*! - * \brief Sets the components of the sphere with center and radius from another - * \return A reference to this sphere - * - * \param sphere The other sphere - */ - - template - Sphere& Sphere::Set(const Sphere& sphere) - { - std::memcpy(this, &sphere, sizeof(Sphere)); - - return *this; - } - /*! * \brief Sets the components of the sphere from an array of four elements * \return A reference to this sphere diff --git a/include/Nazara/Math/Vector2.hpp b/include/Nazara/Math/Vector2.hpp index d8a53eb47..fa41597a1 100644 --- a/include/Nazara/Math/Vector2.hpp +++ b/include/Nazara/Math/Vector2.hpp @@ -55,7 +55,6 @@ namespace Nz Vector2& Set(T X, T Y); Vector2& Set(T scale); Vector2& Set(const T vec[2]); - Vector2& Set(const Vector2& vec); Vector2& Set(const Vector3& vec); Vector2& Set(const Vector4& vec); template Vector2& Set(const Vector2& vec); diff --git a/include/Nazara/Math/Vector2.inl b/include/Nazara/Math/Vector2.inl index 15739b024..d1724f838 100644 --- a/include/Nazara/Math/Vector2.inl +++ b/include/Nazara/Math/Vector2.inl @@ -367,22 +367,8 @@ namespace Nz template Vector2& Vector2::Set(const T vec[2]) { - std::memcpy(&x, vec, 2*sizeof(T)); - - return *this; - } - - /*! - * \brief Sets the components of the vector from another vector - * \return A reference to this vector - * - * \param vec The other vector - */ - - template - Vector2& Vector2::Set(const Vector2& vec) - { - std::memcpy(this, &vec, sizeof(Vector2)); + x = vec[0]; + y = vec[1]; return *this; } diff --git a/include/Nazara/Math/Vector3.hpp b/include/Nazara/Math/Vector3.hpp index b46f2e40b..99e3696df 100644 --- a/include/Nazara/Math/Vector3.hpp +++ b/include/Nazara/Math/Vector3.hpp @@ -67,7 +67,6 @@ namespace Nz Vector3& Set(T scale); Vector3& Set(const T vec[3]); Vector3& Set(const Vector2& vec, T Z = 0.0); - Vector3& Set(const Vector3& vec); template Vector3& Set(const Vector3& vec); Vector3& Set(const Vector4& vec); diff --git a/include/Nazara/Math/Vector3.inl b/include/Nazara/Math/Vector3.inl index 5a77c8e05..1dcf48fe7 100644 --- a/include/Nazara/Math/Vector3.inl +++ b/include/Nazara/Math/Vector3.inl @@ -523,20 +523,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the vector from another vector - * \return A reference to this vector - * - * \param vec The other vector - */ - template - Vector3& Vector3::Set(const Vector3& vec) - { - std::memcpy(this, &vec, sizeof(Vector3)); - - return *this; - } - /*! * \brief Sets the components of the vector from another type of Vector3 * \return A reference to this vector diff --git a/include/Nazara/Math/Vector4.hpp b/include/Nazara/Math/Vector4.hpp index 7a34a6d11..2938df3bb 100644 --- a/include/Nazara/Math/Vector4.hpp +++ b/include/Nazara/Math/Vector4.hpp @@ -57,7 +57,6 @@ namespace Nz Vector4& Set(const T vec[4]); Vector4& Set(const Vector2& vec, T Z = 0.0, T W = 1.0); Vector4& Set(const Vector3& vec, T W = 1.0); - Vector4& Set(const Vector4& vec); template Vector4& Set(const Vector4& vec); String ToString() const; diff --git a/include/Nazara/Math/Vector4.inl b/include/Nazara/Math/Vector4.inl index 8c602d214..6deadf5f5 100644 --- a/include/Nazara/Math/Vector4.inl +++ b/include/Nazara/Math/Vector4.inl @@ -417,7 +417,10 @@ namespace Nz template Vector4& Vector4::Set(const T vec[4]) { - std::memcpy(&x, vec, 4*sizeof(T)); + x = vec[0]; + y = vec[1]; + z = vec[2]; + w = vec[3]; return *this; } @@ -459,21 +462,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the vector from another vector - * \return A reference to this vector - * - * \param vec The other vector - */ - - template - Vector4& Vector4::Set(const Vector4& vec) - { - std::memcpy(this, &vec, sizeof(Vector4)); - - return *this; - } - /*! * \brief Sets the components of the vector from another type of Vector4 * \return A reference to this vector diff --git a/include/Nazara/Network/ENetHost.hpp b/include/Nazara/Network/ENetHost.hpp index 01f59234b..b6af25895 100644 --- a/include/Nazara/Network/ENetHost.hpp +++ b/include/Nazara/Network/ENetHost.hpp @@ -44,6 +44,8 @@ namespace Nz ENetHost(ENetHost&&) = default; inline ~ENetHost(); + inline void AllowsIncomingConnections(bool allow = true); + void Broadcast(UInt8 channelId, ENetPacketFlags flags, NetPacket&& packet); bool CheckEvents(ENetEvent* event); @@ -56,6 +58,8 @@ namespace Nz bool Create(const IpAddress& listenAddress, std::size_t peerCount, std::size_t channelCount, UInt32 incomingBandwidth, UInt32 outgoingBandwidth); inline void Destroy(); + inline bool DoesAllowIncomingConnections() const; + void Flush(); inline IpAddress GetBoundAddress() const; diff --git a/include/Nazara/Network/ENetHost.inl b/include/Nazara/Network/ENetHost.inl index fcb6bf6de..fadcc9fc4 100644 --- a/include/Nazara/Network/ENetHost.inl +++ b/include/Nazara/Network/ENetHost.inl @@ -20,6 +20,13 @@ namespace Nz Destroy(); } + inline void ENetHost::AllowsIncomingConnections(bool allow) + { + NazaraAssert(m_address.IsValid() && !m_address.IsLoopback(), "Only server hosts can allow incoming connections"); + + m_allowsIncomingConnections = allow; + } + inline bool ENetHost::Create(NetProtocol protocol, UInt16 port, std::size_t peerCount, std::size_t channelCount) { NazaraAssert(protocol != NetProtocol_Unknown, "Invalid protocol"); @@ -54,6 +61,11 @@ namespace Nz m_socket.Close(); } + inline bool ENetHost::DoesAllowIncomingConnections() const + { + return m_allowsIncomingConnections; + } + inline IpAddress ENetHost::GetBoundAddress() const { return m_address; diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index 634f22402..812b644cd 100644 --- a/include/Nazara/Network/ENetPeer.hpp +++ b/include/Nazara/Network/ENetPeer.hpp @@ -56,8 +56,11 @@ namespace Nz inline UInt16 GetPeerId() const; inline UInt32 GetRoundTripTime() const; inline ENetPeerState GetState() const; - inline UInt64 GetTotalPacketLost() const; - inline UInt64 GetTotalPacketSent() const; + inline UInt64 GetTotalByteReceived() const; + inline UInt64 GetTotalByteSent() const; + inline UInt32 GetTotalPacketReceived() const; + inline UInt32 GetTotalPacketLost() const; + inline UInt32 GetTotalPacketSent() const; inline bool HasPendingCommands(); @@ -236,9 +239,12 @@ namespace Nz UInt32 m_timeoutLimit; UInt32 m_timeoutMaximum; UInt32 m_timeoutMinimum; + UInt32 m_totalPacketReceived; + UInt32 m_totalPacketLost; + UInt32 m_totalPacketSent; UInt32 m_windowSize; - UInt64 m_totalPacketLost; - UInt64 m_totalPacketSent; + UInt64 m_totalByteReceived; + UInt64 m_totalByteSent; bool m_isSimulationEnabled; }; } diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 7820620ca..0d7a96104 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -62,12 +62,27 @@ namespace Nz return m_state; } - inline UInt64 ENetPeer::GetTotalPacketLost() const + inline UInt64 ENetPeer::GetTotalByteReceived() const + { + return m_totalByteReceived; + } + + inline UInt64 ENetPeer::GetTotalByteSent() const + { + return m_totalByteSent; + } + + inline UInt32 ENetPeer::GetTotalPacketReceived() const + { + return m_totalPacketReceived; + } + + inline UInt32 ENetPeer::GetTotalPacketLost() const { return m_totalPacketLost; } - inline UInt64 ENetPeer::GetTotalPacketSent() const + inline UInt32 ENetPeer::GetTotalPacketSent() const { return m_totalPacketSent; } diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index cc2f62eac..d0f7fd608 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -41,9 +41,11 @@ namespace Nz Collider2D(Collider2D&&) = delete; virtual ~Collider2D(); - virtual Nz::Vector2f ComputeCenterOfMass() const = 0; + virtual Vector2f ComputeCenterOfMass() const = 0; virtual float ComputeMomentOfInertia(float mass) const = 0; + virtual void ForEachPolygon(const std::function& callback) const; + inline UInt32 GetCategoryMask() const; inline UInt32 GetCollisionGroup() const; inline unsigned int GetCollisionId() const; @@ -228,13 +230,16 @@ namespace Nz { public: inline SegmentCollider2D(const Vector2f& first, const Vector2f& second, float thickness = 1.f); + inline SegmentCollider2D(const Vector2f& first, const Vector2f& firstNeighbor, const Vector2f& second, const Vector2f& secondNeighbor, float thickness = 1.f); Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; inline const Vector2f& GetFirstPoint() const; + inline const Vector2f& GetFirstPointNeighbor() const; inline float GetLength() const; inline const Vector2f& GetSecondPoint() const; + inline const Vector2f& GetSecondPointNeighbor() const; inline float GetThickness() const; ColliderType2D GetType() const override; @@ -244,7 +249,9 @@ namespace Nz std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Vector2f m_first; + Vector2f m_firstNeighbor; Vector2f m_second; + Vector2f m_secondNeighbor; float m_thickness; }; } diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 2142ba47e..75696ce50 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -12,10 +12,10 @@ namespace Nz m_categoryMask(0xFFFFFFFF), m_collisionGroup(0), m_collisionMask(0xFFFFFFFF), + m_surfaceVelocity(Vector2f::Zero()), m_trigger(false), m_elasticity(0.f), m_friction(0.f), - m_surfaceVelocity(Vector2f::Zero()), m_collisionId(0) { } @@ -191,8 +191,15 @@ namespace Nz } SegmentCollider2D::SegmentCollider2D(const Vector2f& first, const Vector2f& second, float thickness) : + SegmentCollider2D(first, first, second, second, thickness) + { + } + + inline SegmentCollider2D::SegmentCollider2D(const Vector2f& first, const Vector2f& firstNeighbor, const Vector2f& second, const Vector2f& secondNeighbor, float thickness) : m_first(first), + m_firstNeighbor(firstNeighbor), m_second(second), + m_secondNeighbor(secondNeighbor), m_thickness(thickness) { } @@ -202,6 +209,11 @@ namespace Nz return m_first; } + inline const Vector2f& SegmentCollider2D::GetFirstPointNeighbor() const + { + return m_firstNeighbor; + } + inline float SegmentCollider2D::GetLength() const { return m_first.Distance(m_second); @@ -212,6 +224,11 @@ namespace Nz return m_second; } + inline const Vector2f& SegmentCollider2D::GetSecondPointNeighbor() const + { + return m_secondNeighbor; + } + inline float SegmentCollider2D::GetThickness() const { return m_thickness; diff --git a/include/Nazara/Physics2D/Constraint2D.hpp b/include/Nazara/Physics2D/Constraint2D.hpp index 74cded64d..13ee68c86 100644 --- a/include/Nazara/Physics2D/Constraint2D.hpp +++ b/include/Nazara/Physics2D/Constraint2D.hpp @@ -8,7 +8,9 @@ #define NAZARA_CONSTRAINT2D_HPP #include +#include #include +#include #include #include #include @@ -21,11 +23,9 @@ namespace Nz { class Constraint2D; - using Constraint2DConstRef = ObjectRef; - using Constraint2DLibrary = ObjectLibrary; - using Constraint2DRef = ObjectRef; + using Constraint2DHandle = ObjectHandle; - class NAZARA_PHYSICS2D_API Constraint2D : public RefCounted + class NAZARA_PHYSICS2D_API Constraint2D : public HandledObject { public: Constraint2D(const Constraint2D&) = delete; @@ -57,16 +57,12 @@ namespace Nz Constraint2D(Nz::PhysWorld2D* world, cpConstraint* constraint); MovablePtr m_constraint; - - private: - static Constraint2DLibrary s_library; }; class DampedSpringConstraint2D; - using DampedSpringConstraint2DConstRef = ObjectRef; - using DampedSpringConstraint2DRef = ObjectRef; - + using DampedSpringConstraint2DHandle = ObjectHandle; + class NAZARA_PHYSICS2D_API DampedSpringConstraint2D : public Constraint2D { public: @@ -84,14 +80,11 @@ namespace Nz void SetRestLength(float newLength); void SetSecondAnchor(const Vector2f& firstAnchor); void SetStiffness(float newStiffness); - - template static DampedSpringConstraint2DRef New(Args&&... args); }; class DampedRotarySpringConstraint2D; - using DampedRotarySpringConstraint2DConstRef = ObjectRef; - using DampedRotarySpringConstraint2DRef = ObjectRef; + using DampedRotarySpringConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API DampedRotarySpringConstraint2D : public Constraint2D { @@ -106,13 +99,11 @@ namespace Nz void SetDamping(float newDamping); void SetRestAngle(const RadianAnglef& newAngle); void SetStiffness(float newStiffness); - - template static DampedRotarySpringConstraint2DRef New(Args&&... args); }; class GearConstraint2D; - using GearConstraint2DConstRef = ObjectRef; + using GearConstraint2DHandle = ObjectHandle; using GearConstraint2DRef = ObjectRef; class NAZARA_PHYSICS2D_API GearConstraint2D : public Constraint2D @@ -132,8 +123,7 @@ namespace Nz class MotorConstraint2D; - using MotorConstraint2DConstRef = ObjectRef; - using MotorConstraint2DRef = ObjectRef; + using MotorConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API MotorConstraint2D : public Constraint2D { @@ -143,14 +133,11 @@ namespace Nz float GetRate() const; void SetRate(float rate); - - template static MotorConstraint2DRef New(Args&&... args); }; class PinConstraint2D; - using PinConstraint2DConstRef = ObjectRef; - using PinConstraint2DRef = ObjectRef; + using PinConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API PinConstraint2D : public Constraint2D { @@ -165,14 +152,11 @@ namespace Nz void SetDistance(float newDistance); void SetFirstAnchor(const Vector2f& firstAnchor); void SetSecondAnchor(const Vector2f& firstAnchor); - - template static PinConstraint2DRef New(Args&&... args); }; class PivotConstraint2D; - using PivotConstraint2DConstRef = ObjectRef; - using PivotConstraint2DRef = ObjectRef; + using PivotConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API PivotConstraint2D : public Constraint2D { @@ -186,14 +170,11 @@ namespace Nz void SetFirstAnchor(const Vector2f& firstAnchor); void SetSecondAnchor(const Vector2f& firstAnchor); - - template static PivotConstraint2DRef New(Args&&... args); }; class RatchetConstraint2D; - using RatchetConstraint2DConstRef = ObjectRef; - using RatchetConstraint2DRef = ObjectRef; + using RatchetConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API RatchetConstraint2D : public Constraint2D { @@ -208,14 +189,11 @@ namespace Nz void SetAngle(const RadianAnglef& angle); void SetPhase(float phase); void SetRatchet(float ratchet); - - template static RatchetConstraint2DRef New(Args&&... args); }; class RotaryLimitConstraint2D; - using RotaryLimitConstraint2DConstRef = ObjectRef; - using RotaryLimitConstraint2DRef = ObjectRef; + using RotaryLimitConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API RotaryLimitConstraint2D : public Constraint2D { @@ -228,14 +206,11 @@ namespace Nz void SetMaxAngle(const RadianAnglef& maxAngle); void SetMinAngle(const RadianAnglef& minAngle); - - template static RotaryLimitConstraint2DRef New(Args&&... args); }; class SlideConstraint2D; - using SlideConstraint2DConstRef = ObjectRef; - using SlideConstraint2DRef = ObjectRef; + using SlideConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API SlideConstraint2D : public Constraint2D { @@ -252,8 +227,6 @@ namespace Nz void SetMaxDistance(float newMaxDistance); void SetMinDistance(float newMinDistance); void SetSecondAnchor(const Vector2f& firstAnchor); - - template static SlideConstraint2DRef New(Args&&... args); }; } diff --git a/include/Nazara/Physics2D/Constraint2D.inl b/include/Nazara/Physics2D/Constraint2D.inl index 9bdb1d3ad..2ed7744f3 100644 --- a/include/Nazara/Physics2D/Constraint2D.inl +++ b/include/Nazara/Physics2D/Constraint2D.inl @@ -8,86 +8,6 @@ namespace Nz { - template - DampedSpringConstraint2DRef DampedSpringConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new DampedSpringConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - DampedRotarySpringConstraint2DRef DampedRotarySpringConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new DampedRotarySpringConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - GearConstraint2DRef GearConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new GearConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - MotorConstraint2DRef MotorConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new MotorConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - PinConstraint2DRef PinConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new PinConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - PivotConstraint2DRef PivotConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new PivotConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - RatchetConstraint2DRef RatchetConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new RatchetConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - RotaryLimitConstraint2DRef RotaryLimitConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new RotaryLimitConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - SlideConstraint2DRef SlideConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new SlideConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } } #include diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index 42e9288a1..e6521b37a 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -64,18 +64,21 @@ namespace Nz bool NearestBodyQuery(const Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RigidBody2D** nearestBody = nullptr); bool NearestBodyQuery(const Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, NearestQueryResult* result); + void RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); bool RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos); bool RaycastQueryFirst(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RaycastHit* hitInfo = nullptr); + void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies); - void RegisterCallbacks(unsigned int collisionId, const Callback& callbacks); - void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks); + void RegisterCallbacks(unsigned int collisionId, Callback callbacks); + void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks); void SetDamping(float dampingValue); void SetGravity(const Vector2f& gravity); void SetIterationCount(std::size_t iterationCount); void SetMaxStepCount(std::size_t maxStepCount); + void SetSleepTime(float sleepTime); void SetStepSize(float stepSize); void Step(float timestep); @@ -91,7 +94,7 @@ namespace Nz ContactPreSolveCallback preSolveCallback = nullptr; ContactPostSolveCallback postSolveCallback = nullptr; ContactStartCallback startCallback = nullptr; - void* userdata; + void* userdata = nullptr; }; struct DebugDrawOptions @@ -130,7 +133,7 @@ namespace Nz NazaraSignal(OnPhysWorld2DPostStep, const PhysWorld2D* /*physWorld*/, float /*invStepCount*/); private: - void InitCallbacks(cpCollisionHandler* handler, const Callback& callbacks); + void InitCallbacks(cpCollisionHandler* handler, Callback callbacks); using PostStep = std::function; diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index be90acc92..f80c0c8cf 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -32,7 +32,7 @@ namespace Nz RigidBody2D(PhysWorld2D* world, float mass); RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom); RigidBody2D(const RigidBody2D& object); - RigidBody2D(RigidBody2D&& object); + RigidBody2D(RigidBody2D&& object) noexcept; ~RigidBody2D(); void AddForce(const Vector2f& force, CoordSys coordSys = CoordSys_Global); @@ -46,6 +46,7 @@ namespace Nz void EnableSimulation(bool simulation); void ForEachArbiter(std::function callback); + void ForceSleep(); Rectf GetAABB() const; inline float GetAngularDamping() const; @@ -60,6 +61,7 @@ namespace Nz Vector2f GetMassCenter(CoordSys coordSys = CoordSys_Local) const; float GetMomentOfInertia() const; Vector2f GetPosition() const; + inline const Vector2f& GetPositionOffset() const; RadianAnglef GetRotation() const; inline std::size_t GetShapeCount() const; std::size_t GetShapeIndex(cpShape* shape) const; @@ -87,6 +89,7 @@ namespace Nz void SetMassCenter(const Vector2f& center, CoordSys coordSys = CoordSys_Local); void SetMomentOfInertia(float moment); void SetPosition(const Vector2f& position); + void SetPositionOffset(const Vector2f& offset); void SetRotation(const RadianAnglef& rotation); void SetSurfaceVelocity(const Vector2f& surfaceVelocity); void SetSurfaceVelocity(std::size_t shapeIndex, const Vector2f& surfaceVelocity); @@ -97,6 +100,8 @@ namespace Nz void UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime); + void Wakeup(); + RigidBody2D& operator=(const RigidBody2D& object); RigidBody2D& operator=(RigidBody2D&& object); @@ -114,6 +119,7 @@ namespace Nz static void CopyBodyData(cpBody* from, cpBody* to); static void CopyShapeData(cpShape* from, cpShape* to); + Vector2f m_positionOffset; VelocityFunc m_velocityFunc; std::vector m_shapes; Collider2DRef m_geom; diff --git a/include/Nazara/Physics2D/RigidBody2D.inl b/include/Nazara/Physics2D/RigidBody2D.inl index a654c03e7..272c8fe30 100644 --- a/include/Nazara/Physics2D/RigidBody2D.inl +++ b/include/Nazara/Physics2D/RigidBody2D.inl @@ -17,6 +17,11 @@ namespace Nz return GetMassCenter(coordSys); } + inline const Vector2f& RigidBody2D::GetPositionOffset() const + { + return m_positionOffset; + } + inline std::size_t RigidBody2D::GetShapeCount() const { return m_shapes.size(); diff --git a/include/Nazara/Physics3D/Collider3D.hpp b/include/Nazara/Physics3D/Collider3D.hpp index a7a59a2d1..9dbfe126c 100644 --- a/include/Nazara/Physics3D/Collider3D.hpp +++ b/include/Nazara/Physics3D/Collider3D.hpp @@ -54,7 +54,7 @@ namespace Nz virtual void ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const; virtual float ComputeVolume() const; - virtual void ForEachPolygon(const std::function& callback) const; + virtual void ForEachPolygon(const std::function& callback) const; NewtonCollision* GetHandle(PhysWorld3D* world) const; virtual ColliderType3D GetType() const = 0; diff --git a/include/Nazara/Platform/Event.hpp b/include/Nazara/Platform/Event.hpp index 5c8dfd24f..561a27473 100644 --- a/include/Nazara/Platform/Event.hpp +++ b/include/Nazara/Platform/Event.hpp @@ -58,6 +58,8 @@ namespace Nz struct MouseWheelEvent { float delta; + int x; + int y; }; // Used by: diff --git a/include/Nazara/Prerequisites.hpp b/include/Nazara/Prerequisites.hpp index adbe4aa9c..de3ea8da8 100644 --- a/include/Nazara/Prerequisites.hpp +++ b/include/Nazara/Prerequisites.hpp @@ -77,7 +77,7 @@ // Nazara version macro #define NAZARA_VERSION_MAJOR 0 -#define NAZARA_VERSION_MINOR 3 +#define NAZARA_VERSION_MINOR 4 #define NAZARA_VERSION_PATCH 0 #include @@ -137,9 +137,9 @@ #define NAZARA_CORE_API #endif -// Détection 64 bits +// Detect 64 bits #if !defined(NAZARA_PLATFORM_x64) && (defined(_WIN64) || defined(__amd64__) || defined(__x86_64__) || defined(__ia64__) || defined(__ia64) || \ - defined(_M_IA64) || defined(__itanium__) || defined(__MINGW64__) || defined(_M_AMD64) || defined (_M_X64)) + defined(_M_IA64) || defined(__itanium__) || defined(__MINGW64__) || defined(_M_AMD64) || defined (_M_X64)) #define NAZARA_PLATFORM_x64 #endif diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index 6d33dcdd5..b4108f357 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -38,7 +38,6 @@ namespace Nz public: Texture() = default; Texture(ImageType type, PixelFormatType format, unsigned int width, unsigned int height, unsigned int depth = 1, UInt8 levelCount = 1); - explicit Texture(const Image* image); Texture(const Texture&) = delete; Texture(Texture&&) = delete; ~Texture(); diff --git a/include/Nazara/Utility.hpp b/include/Nazara/Utility.hpp index 2ccf84080..97deaca58 100644 --- a/include/Nazara/Utility.hpp +++ b/include/Nazara/Utility.hpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Utility/AbstractAtlas.hpp b/include/Nazara/Utility/AbstractAtlas.hpp index bb6c77c2f..fc84cfa0e 100644 --- a/include/Nazara/Utility/AbstractAtlas.hpp +++ b/include/Nazara/Utility/AbstractAtlas.hpp @@ -22,6 +22,8 @@ namespace Nz { public: AbstractAtlas() = default; + AbstractAtlas(const AbstractAtlas&) = delete; + AbstractAtlas(AbstractAtlas&&) noexcept = default; virtual ~AbstractAtlas(); virtual void Clear() = 0; @@ -31,6 +33,9 @@ namespace Nz virtual UInt32 GetStorage() const = 0; virtual bool Insert(const Image& image, Rectui* rect, bool* flipped, unsigned int* layerIndex) = 0; + AbstractAtlas& operator=(const AbstractAtlas&) = delete; + AbstractAtlas& operator=(AbstractAtlas&&) noexcept = default; + // Signals: NazaraSignal(OnAtlasCleared, const AbstractAtlas* /*atlas*/); NazaraSignal(OnAtlasLayerChange, const AbstractAtlas* /*atlas*/, AbstractImage* /*oldLayer*/, AbstractImage* /*newLayer*/); diff --git a/include/Nazara/Utility/AbstractTextDrawer.hpp b/include/Nazara/Utility/AbstractTextDrawer.hpp index c52051a5c..e62338c61 100644 --- a/include/Nazara/Utility/AbstractTextDrawer.hpp +++ b/include/Nazara/Utility/AbstractTextDrawer.hpp @@ -27,7 +27,9 @@ namespace Nz AbstractTextDrawer() = default; virtual ~AbstractTextDrawer(); - virtual const Recti& GetBounds() const = 0; + virtual void Clear() = 0; + + virtual const Rectf& GetBounds() const = 0; virtual Font* GetFont(std::size_t index) const = 0; virtual std::size_t GetFontCount() const = 0; virtual const Glyph& GetGlyph(std::size_t index) const = 0; @@ -35,6 +37,9 @@ namespace Nz virtual const Line& GetLine(std::size_t index) const = 0; virtual std::size_t GetLineCount() const = 0; inline std::size_t GetLineGlyphCount(std::size_t index) const; + virtual float GetMaxLineWidth() const = 0; + + virtual void SetMaxLineWidth(float lineWidth) = 0; struct Glyph { @@ -44,6 +49,7 @@ namespace Nz Vector2f corners[4]; AbstractImage* atlas; bool flipped; + int renderOrder; }; struct Line diff --git a/include/Nazara/Utility/Enums.hpp b/include/Nazara/Utility/Enums.hpp index d6fee2127..f4d343acc 100644 --- a/include/Nazara/Utility/Enums.hpp +++ b/include/Nazara/Utility/Enums.hpp @@ -329,18 +329,26 @@ namespace Nz TextAlign_Max = TextAlign_Right }; - enum TextStyleFlags + enum TextStyle { - TextStyle_Regular = 0x0, + TextStyle_Bold, + TextStyle_Italic, + TextStyle_StrikeThrough, + TextStyle_Underlined, - TextStyle_Bold = 0x1, - TextStyle_Italic = 0x2, - TextStyle_StrikeThrough = 0x4, - TextStyle_Underlined = 0x8, - - TextStyle_Max = TextStyle_Underlined*2-1 + TextStyle_Max = TextStyle_Underlined }; + template<> + struct EnumAsFlags + { + static constexpr TextStyle max = TextStyle_Max; + }; + + using TextStyleFlags = Flags; + + constexpr TextStyleFlags TextStyle_Regular = 0; + enum VertexComponent { VertexComponent_Unused = -1, diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index be67c92e7..70cbf6150 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -58,14 +59,14 @@ namespace Nz bool Create(FontData* data); void Destroy(); - bool ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* glyph) const; + bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* glyph) const; const std::shared_ptr& GetAtlas() const; - std::size_t GetCachedGlyphCount(unsigned int characterSize, UInt32 style) const; + std::size_t GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const; std::size_t GetCachedGlyphCount() const; String GetFamilyName() const; int GetKerning(unsigned int characterSize, char32_t first, char32_t second) const; - const Glyph& GetGlyph(unsigned int characterSize, UInt32 style, char32_t character) const; + const Glyph& GetGlyph(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const; unsigned int GetGlyphBorder() const; unsigned int GetMinimumStepSize() const; const SizeInfo& GetSizeInfo(unsigned int characterSize) const; @@ -73,8 +74,8 @@ namespace Nz bool IsValid() const; - bool Precache(unsigned int characterSize, UInt32 style, char32_t character) const; - bool Precache(unsigned int characterSize, UInt32 style, const String& characterSet) const; + bool Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const; + bool Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, const String& characterSet) const; void SetAtlas(const std::shared_ptr& atlas); void SetGlyphBorder(unsigned int borderSize); @@ -106,6 +107,7 @@ namespace Nz bool requireFauxItalic; bool flipped; bool valid; + float fauxOutlineThickness; int advance; unsigned int layerIndex; }; @@ -130,11 +132,11 @@ namespace Nz private: using GlyphMap = std::unordered_map; - UInt64 ComputeKey(unsigned int characterSize, UInt32 style) const; + UInt64 ComputeKey(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const; void OnAtlasCleared(const AbstractAtlas* atlas); void OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer); void OnAtlasRelease(const AbstractAtlas* atlas); - const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, UInt32 style, char32_t character) const; + const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const; static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Utility/FontData.hpp b/include/Nazara/Utility/FontData.hpp index efd2e6d94..88838a3b7 100644 --- a/include/Nazara/Utility/FontData.hpp +++ b/include/Nazara/Utility/FontData.hpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Nz { @@ -21,7 +22,7 @@ namespace Nz FontData() = default; virtual ~FontData(); - virtual bool ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* dst) = 0; + virtual bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* dst) = 0; virtual String GetFamilyName() const = 0; virtual String GetStyleName() const = 0; @@ -35,7 +36,8 @@ namespace Nz virtual float QueryUnderlinePosition(unsigned int characterSize) const = 0; virtual float QueryUnderlineThickness(unsigned int characterSize) const = 0; - virtual bool SupportsStyle(UInt32 style) const = 0; + virtual bool SupportsOutline(float outlineThickness) const = 0; + virtual bool SupportsStyle(TextStyleFlags style) const = 0; }; } diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index 6065d1e04..df931a7ba 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -41,10 +41,10 @@ namespace Nz virtual Vector3f GetLeft() const; virtual NodeType GetNodeType() const; const Node* GetParent() const; - Vector3f GetPosition(CoordSys coordSys = CoordSys_Global) const; + Vector3f GetPosition(CoordSys coordSys = CoordSys_Local) const; virtual Vector3f GetRight() const; - Quaternionf GetRotation(CoordSys coordSys = CoordSys_Global) const; - Vector3f GetScale(CoordSys coordSys = CoordSys_Global) const; + Quaternionf GetRotation(CoordSys coordSys = CoordSys_Local) const; + Vector3f GetScale(CoordSys coordSys = CoordSys_Local) const; const Matrix4f& GetTransformMatrix() const; virtual Vector3f GetUp() const; @@ -75,6 +75,7 @@ namespace Nz void SetPosition(const Vector3f& translation, CoordSys coordSys = CoordSys_Local); void SetPosition(float translationX, float translationY, float translationZ = 0.f, CoordSys coordSys = CoordSys_Local); void SetRotation(const Quaternionf& quat, CoordSys coordSys = CoordSys_Local); + void SetScale(const Vector2f& scale, CoordSys coordSys = CoordSys_Local); void SetScale(const Vector3f& scale, CoordSys coordSys = CoordSys_Local); void SetScale(float scale, CoordSys coordSys = CoordSys_Local); void SetScale(float scaleX, float scaleY, float scaleZ = 1.f, CoordSys coordSys = CoordSys_Local); @@ -105,6 +106,8 @@ namespace Nz virtual void UpdateDerived() const; virtual void UpdateTransformMatrix() const; + static Quaternionf ScaleQuaternion(const Vector3f& scale, Quaternionf quaternion); + mutable std::vector m_childs; mutable Matrix4f m_transformMatrix; mutable Quaternionf m_derivedRotation; diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp new file mode 100644 index 000000000..25bd8dcf6 --- /dev/null +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -0,0 +1,212 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_RICHTEXTDRAWER_HPP +#define NAZARA_RICHTEXTDRAWER_HPP + +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + class NAZARA_UTILITY_API RichTextDrawer : public AbstractTextDrawer + { + public: + class BlockRef; + + RichTextDrawer(); + RichTextDrawer(const RichTextDrawer& drawer); + RichTextDrawer(RichTextDrawer&& drawer); + ~RichTextDrawer(); + + BlockRef AppendText(const String& str, bool forceNewBlock = false); + + void Clear() override; + + inline std::size_t FindBlock(std::size_t glyphIndex) const; + + inline unsigned int GetBlockCharacterSize(std::size_t index) const; + inline float GetBlockCharacterSpacingOffset(std::size_t index) const; + inline const Color& GetBlockColor(std::size_t index) const; + inline std::size_t GetBlockCount() const; + inline std::size_t GetBlockFirstGlyphIndex(std::size_t index) const; + inline const FontRef& GetBlockFont(std::size_t index) const; + inline float GetBlockLineHeight(std::size_t index) const; + inline float GetBlockLineSpacingOffset(std::size_t index) const; + inline const Color& GetBlockOutlineColor(std::size_t index) const; + inline float GetBlockOutlineThickness(std::size_t index) const; + inline TextStyleFlags GetBlockStyle(std::size_t index) const; + inline const String& GetBlockText(std::size_t index) const; + + inline BlockRef GetBlock(std::size_t index); + const Rectf& GetBounds() const override; + inline unsigned int GetDefaultCharacterSize() const; + inline float GetDefaultCharacterSpacingOffset() const; + inline const Color& GetDefaultColor() const; + inline const FontRef& GetDefaultFont() const; + inline float GetDefaultLineSpacingOffset() const; + inline const Color& GetDefaultOutlineColor() const; + inline float GetDefaultOutlineThickness() const; + inline TextStyleFlags GetDefaultStyle() const; + Font* GetFont(std::size_t index) const override; + std::size_t GetFontCount() const override; + const Glyph& GetGlyph(std::size_t index) const override; + std::size_t GetGlyphCount() const override; + const Line& GetLine(std::size_t index) const override; + std::size_t GetLineCount() const override; + float GetMaxLineWidth() const override; + + inline bool HasBlocks() const; + + void MergeBlocks(); + + void RemoveBlock(std::size_t index); + + inline void SetBlockCharacterSize(std::size_t index, unsigned int characterSize); + inline void SetBlockCharacterSpacingOffset(std::size_t index, float offset); + inline void SetBlockColor(std::size_t index, const Color& color); + inline void SetBlockFont(std::size_t index, FontRef font); + inline void SetBlockLineSpacingOffset(std::size_t index, float offset); + inline void SetBlockOutlineColor(std::size_t index, const Color& color); + inline void SetBlockOutlineThickness(std::size_t index, float thickness); + inline void SetBlockStyle(std::size_t index, TextStyleFlags style); + inline void SetBlockText(std::size_t index, String str); + + inline void SetDefaultCharacterSize(unsigned int characterSize); + inline void SetDefaultCharacterSpacingOffset(float offset); + inline void SetDefaultColor(const Color& color); + inline void SetDefaultFont(const FontRef& font); + inline void SetDefaultLineSpacingOffset(float offset); + inline void SetDefaultOutlineColor(const Color& color); + inline void SetDefaultOutlineThickness(float thickness); + inline void SetDefaultStyle(TextStyleFlags style); + + void SetMaxLineWidth(float lineWidth) override; + + RichTextDrawer& operator=(const RichTextDrawer& drawer); + RichTextDrawer& operator=(RichTextDrawer&& drawer); + + static constexpr std::size_t InvalidBlockIndex = std::numeric_limits::max(); + + private: + struct Block; + + inline void AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset) const; + void AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset, std::size_t glyphIndex, float glyphPosition) const; + inline void ClearGlyphs() const; + inline void ConnectFontSlots(); + inline void DisconnectFontSlots(); + bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, float lineSpacingOffset, unsigned int characterSize, int renderOrder, int* advance) const; + void GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float characterSpacingOffset, float lineSpacingOffset, float outlineThickness, const String& text) const; + inline float GetLineHeight(const Block& block) const; + inline float GetLineHeight(float lineSpacingOffset, const Font::SizeInfo& sizeInfo) const; + inline std::size_t HandleFontAddition(const FontRef& font); + inline void InvalidateGlyphs(); + inline void ReleaseFont(std::size_t fontIndex); + inline bool ShouldLineWrap(float size) const; + + void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); + void OnFontInvalidated(const Font* font); + void OnFontRelease(const Font* object); + + void UpdateGlyphs() const; + + static constexpr std::size_t InvalidGlyph = std::numeric_limits::max(); + + struct Block + { + std::size_t fontIndex; + std::size_t glyphIndex; + Color color; + Color outlineColor; + String text; + TextStyleFlags style; + float characterSpacingOffset; + float lineSpacingOffset; + float outlineThickness; + unsigned int characterSize; + }; + + struct FontData + { + FontRef font; + std::size_t useCount = 0; + + NazaraSlot(Font, OnFontAtlasChanged, atlasChangedSlot); + NazaraSlot(Font, OnFontAtlasLayerChanged, atlasLayerChangedSlot); + NazaraSlot(Font, OnFontGlyphCacheCleared, glyphCacheClearedSlot); + NazaraSlot(Font, OnFontRelease, fontReleaseSlot); + }; + + Color m_defaultColor; + Color m_defaultOutlineColor; + TextStyleFlags m_defaultStyle; + FontRef m_defaultFont; + mutable std::size_t m_lastSeparatorGlyph; + std::unordered_map m_fontIndexes; + std::vector m_blocks; + std::vector m_fonts; + mutable std::vector m_glyphs; + mutable std::vector m_lines; + mutable Rectf m_bounds; + mutable Vector2f m_drawPos; + mutable bool m_glyphUpdated; + float m_defaultCharacterSpacingOffset; + float m_defaultLineSpacingOffset; + float m_defaultOutlineThickness; + float m_maxLineWidth; + unsigned int m_defaultCharacterSize; + mutable float m_lastSeparatorPosition; + }; + + class RichTextDrawer::BlockRef + { + friend RichTextDrawer; + + public: + BlockRef(const BlockRef&) = default; + BlockRef(BlockRef&&) = default; + ~BlockRef() = default; + + inline float GetCharacterSpacingOffset() const; + inline unsigned int GetCharacterSize() const; + inline Color GetColor() const; + inline std::size_t GetFirstGlyphIndex() const; + inline const FontRef& GetFont() const; + inline float GetLineSpacingOffset() const; + inline Color GetOutlineColor() const; + inline float GetOutlineThickness() const; + inline TextStyleFlags GetStyle() const; + inline const String& GetText() const; + + inline void SetCharacterSpacingOffset(float offset); + inline void SetCharacterSize(unsigned int size); + inline void SetColor(Color color); + inline void SetFont(FontRef font); + inline void SetLineSpacingOffset(float offset); + inline void SetOutlineColor(Color color); + inline void SetOutlineThickness(float thickness); + inline void SetStyle(TextStyleFlags style); + inline void SetText(const String& text); + + BlockRef& operator=(const BlockRef&) = default; + BlockRef& operator=(BlockRef&&) = default; + + private: + inline BlockRef(RichTextDrawer& drawer, std::size_t index); + + std::size_t m_blockIndex; + RichTextDrawer& m_drawer; + }; +} + +#include + +#endif // NAZARA_RICHTEXTDRAWER_HPP diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl new file mode 100644 index 000000000..38f220198 --- /dev/null +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -0,0 +1,631 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline std::size_t RichTextDrawer::FindBlock(std::size_t glyphIndex) const + { + auto it = m_blocks.begin(); + for (; it != m_blocks.end(); ++it) + { + if (it->glyphIndex > glyphIndex) + break; + } + + assert(it != m_blocks.begin()); + return std::distance(m_blocks.begin(), it) - 1; + /* + // Binary search + std::size_t count = m_blocks.size(); + std::size_t step; + + std::size_t i = InvalidBlockIndex; + std::size_t first = 0; + std::size_t last = count; + while (count > 0) + { + i = first; + step = count / 2; + + i += step; + + if (m_blocks[i].glyphIndex < glyphIndex) + { + first = ++i; + count -= step + 1; + } + else + count = step; + } + + return i;*/ + } + + inline auto RichTextDrawer::GetBlock(std::size_t index) -> BlockRef + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return BlockRef(*this, index); + } + + inline unsigned int RichTextDrawer::GetBlockCharacterSize(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].characterSize; + } + + inline float RichTextDrawer::GetBlockCharacterSpacingOffset(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].characterSpacingOffset; + } + + inline const Color& RichTextDrawer::GetBlockColor(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].color; + } + + inline std::size_t RichTextDrawer::GetBlockCount() const + { + return m_blocks.size(); + } + + inline std::size_t RichTextDrawer::GetBlockFirstGlyphIndex(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].glyphIndex; + } + + inline const FontRef& RichTextDrawer::GetBlockFont(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + std::size_t fontIndex = m_blocks[index].fontIndex; + assert(fontIndex < m_fonts.size()); + return m_fonts[fontIndex].font; + } + + inline float RichTextDrawer::GetBlockLineHeight(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].lineSpacingOffset; + } + + inline float RichTextDrawer::GetBlockLineSpacingOffset(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].lineSpacingOffset; + } + + inline const Color& RichTextDrawer::GetBlockOutlineColor(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].outlineColor; + } + + inline float RichTextDrawer::GetBlockOutlineThickness(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].outlineThickness; + } + + inline TextStyleFlags RichTextDrawer::GetBlockStyle(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].style; + } + + inline const String& RichTextDrawer::GetBlockText(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].text; + } + + inline unsigned int RichTextDrawer::GetDefaultCharacterSize() const + { + return m_defaultCharacterSize; + } + + inline float RichTextDrawer::GetDefaultCharacterSpacingOffset() const + { + return m_defaultCharacterSpacingOffset; + } + + inline const Color& RichTextDrawer::GetDefaultColor() const + { + return m_defaultColor; + } + + inline const FontRef& RichTextDrawer::GetDefaultFont() const + { + return m_defaultFont; + } + + inline float RichTextDrawer::GetDefaultLineSpacingOffset() const + { + return m_defaultLineSpacingOffset; + } + + inline const Color& RichTextDrawer::GetDefaultOutlineColor() const + { + return m_defaultOutlineColor; + } + + inline float RichTextDrawer::GetDefaultOutlineThickness() const + { + return m_defaultOutlineThickness; + } + + inline TextStyleFlags RichTextDrawer::GetDefaultStyle() const + { + return m_defaultStyle; + } + + inline void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset) const + { + AppendNewLine(font, characterSize, lineSpacingOffset, InvalidGlyph, 0); + } + + inline void RichTextDrawer::ClearGlyphs() const + { + m_bounds.MakeZero(); + m_lastSeparatorGlyph = InvalidGlyph; + m_lines.clear(); + m_glyphs.clear(); + m_glyphUpdated = true; + m_bounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly) + } + + inline void RichTextDrawer::ConnectFontSlots() + { + for (auto& fontData : m_fonts) + { + fontData.atlasChangedSlot.Connect(fontData.font->OnFontAtlasChanged, this, &RichTextDrawer::OnFontInvalidated); + fontData.atlasLayerChangedSlot.Connect(fontData.font->OnFontAtlasLayerChanged, this, &RichTextDrawer::OnFontAtlasLayerChanged); + fontData.fontReleaseSlot.Connect(fontData.font->OnFontDestroy, this, &RichTextDrawer::OnFontRelease); + fontData.glyphCacheClearedSlot.Connect(fontData.font->OnFontGlyphCacheCleared, this, &RichTextDrawer::OnFontInvalidated); + } + } + + inline void RichTextDrawer::DisconnectFontSlots() + { + for (auto& fontData : m_fonts) + { + fontData.atlasChangedSlot.Disconnect(); + fontData.atlasLayerChangedSlot.Disconnect(); + fontData.fontReleaseSlot.Disconnect(); + fontData.glyphCacheClearedSlot.Disconnect(); + } + } + + inline float RichTextDrawer::GetLineHeight(const Block& block) const + { + assert(block.fontIndex < m_fonts.size()); + const FontData& fontData = m_fonts[block.fontIndex]; + + return GetLineHeight(block.lineSpacingOffset, fontData.font->GetSizeInfo(block.characterSize)); + } + + inline float RichTextDrawer::GetLineHeight(float lineSpacingOffset, const Font::SizeInfo& sizeInfo) const + { + return float(sizeInfo.lineHeight) + lineSpacingOffset; + } + + inline std::size_t RichTextDrawer::HandleFontAddition(const FontRef& font) + { + auto it = m_fontIndexes.find(font); + if (it == m_fontIndexes.end()) + { + std::size_t fontIndex = m_fonts.size(); + m_fonts.emplace_back(); + auto& fontData = m_fonts.back(); + fontData.font = font; + fontData.atlasChangedSlot.Connect(font->OnFontAtlasChanged, this, &RichTextDrawer::OnFontInvalidated); + fontData.atlasLayerChangedSlot.Connect(font->OnFontAtlasLayerChanged, this, &RichTextDrawer::OnFontAtlasLayerChanged); + fontData.fontReleaseSlot.Connect(font->OnFontDestroy, this, &RichTextDrawer::OnFontRelease); + fontData.glyphCacheClearedSlot.Connect(font->OnFontGlyphCacheCleared, this, &RichTextDrawer::OnFontInvalidated); + + it = m_fontIndexes.emplace(font, fontIndex).first; + } + + return it->second; + } + + inline void RichTextDrawer::ReleaseFont(std::size_t fontIndex) + { + assert(fontIndex < m_fonts.size()); + + FontData& fontData = m_fonts[fontIndex]; + assert(fontData.useCount > 0); + + if (--fontData.useCount == 0) + { + // Shift font indexes + m_fontIndexes.erase(fontData.font); + for (auto& fontIndexe : m_fontIndexes) + { + if (fontIndexe.second > fontIndex) + fontIndexe.second--; + } + + m_fonts.erase(m_fonts.begin() + fontIndex); + } + } + + inline bool RichTextDrawer::ShouldLineWrap(float size) const + { + if (m_lines.back().glyphIndex > m_glyphs.size()) + return false; + + return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; + } + + inline bool RichTextDrawer::HasBlocks() const + { + return !m_blocks.empty(); + } + + inline void RichTextDrawer::SetBlockCharacterSize(std::size_t index, unsigned int characterSize) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].characterSize = characterSize; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockCharacterSpacingOffset(std::size_t index, float offset) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].characterSpacingOffset = offset; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockColor(std::size_t index, const Color& color) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].color = color; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockFont(std::size_t index, FontRef font) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + std::size_t fontIndex = HandleFontAddition(font); + std::size_t oldFontIndex = m_blocks[index].fontIndex; + + if (oldFontIndex != fontIndex) + { + ReleaseFont(oldFontIndex); + + m_fonts[fontIndex].useCount++; + m_blocks[index].fontIndex = fontIndex; + } + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockLineSpacingOffset(std::size_t index, float offset) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].lineSpacingOffset = offset; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockOutlineColor(std::size_t index, const Color& color) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].outlineColor = color; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockOutlineThickness(std::size_t index, float thickness) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].outlineThickness = thickness; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockStyle(std::size_t index, TextStyleFlags style) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].style = style; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockText(std::size_t index, String str) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + + std::size_t previousLength = m_blocks[index].text.GetLength(); + + m_blocks[index].text = std::move(str); + + std::size_t newLength = m_blocks[index].text.GetLength(); + if (newLength != previousLength) + { + std::size_t delta = newLength - previousLength; //< Underflow allowed + for (std::size_t i = index + 1; i < m_blocks.size(); ++i) + m_blocks[i].glyphIndex += delta; + } + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetDefaultCharacterSize(unsigned int characterSize) + { + m_defaultCharacterSize = characterSize; + } + + inline void RichTextDrawer::SetDefaultCharacterSpacingOffset(float offset) + { + m_defaultCharacterSpacingOffset = offset; + } + + inline void RichTextDrawer::SetDefaultColor(const Color& color) + { + m_defaultColor = color; + } + + inline void RichTextDrawer::SetDefaultFont(const FontRef& font) + { + m_defaultFont = font; + } + + inline void RichTextDrawer::SetDefaultLineSpacingOffset(float offset) + { + m_defaultLineSpacingOffset = offset; + } + + inline void RichTextDrawer::SetDefaultOutlineColor(const Color& color) + { + m_defaultOutlineColor = color; + } + + inline void RichTextDrawer::SetDefaultOutlineThickness(float thickness) + { + m_defaultOutlineThickness = thickness; + } + + inline void RichTextDrawer::SetDefaultStyle(TextStyleFlags style) + { + m_defaultStyle = style; + } + + inline void RichTextDrawer::InvalidateGlyphs() + { + m_glyphUpdated = false; + } + + /*! + * \class Nz::RichTextDrawer::BlockRef + * \brief Helper class representing a block inside a RichTextDrawer, allowing easier access. + * + * \warning This class is meant for temporary use, moving or destroying the RichTextDrawer or one of its blocks invalidates all BlockRef + */ + + inline RichTextDrawer::BlockRef::BlockRef(RichTextDrawer& drawer, std::size_t index) : + m_blockIndex(index), + m_drawer(drawer) + { + } + + /*! + * Returns the character spacing offset used for the characters of the referenced block + * \return The referenced block character size + * + * \see GetColor, GetFont, GetStyle, GetText, SetCharacterSize + */ + inline float RichTextDrawer::BlockRef::GetCharacterSpacingOffset() const + { + return m_drawer.GetBlockCharacterSpacingOffset(m_blockIndex); + } + + /*! + * Returns the character size used for the characters of the referenced block + * \return The referenced block character size + * + * \see GetColor, GetFont, GetStyle, GetText, SetCharacterSize + */ + inline unsigned int RichTextDrawer::BlockRef::GetCharacterSize() const + { + return m_drawer.GetBlockCharacterSize(m_blockIndex); + } + + /*! + * Returns the color used for the characters of the referenced block + * \return The referenced block color + * + * \see GetCharacterSize, GetFont, GetStyle, GetText, SetColor + */ + inline Color RichTextDrawer::BlockRef::GetColor() const + { + return m_drawer.GetBlockColor(m_blockIndex); + } + + /*! + * Returns the font used for the characters of the referenced block + * \return A reference on the referenced block font + * + * \see GetCharacterSize, GetColor, GetStyle, GetText, SetFont + */ + inline const FontRef& RichTextDrawer::BlockRef::GetFont() const + { + return m_drawer.GetBlockFont(m_blockIndex); + } + + /*! + * Returns the line spacing offset used for the characters of the referenced block + * \return The referenced block character size + * + * \see GetColor, GetFont, GetStyle, GetText, SetCharacterSize + */ + inline float RichTextDrawer::BlockRef::GetLineSpacingOffset() const + { + return m_drawer.GetBlockLineSpacingOffset(m_blockIndex); + } + + /*! + * Returns the outline color used for the characters of the referenced block + * \return The referenced block outline color + * + * \see GetCharacterSize, GetColor, GetStyle, GetText, SetFont + */ + inline Color RichTextDrawer::BlockRef::GetOutlineColor() const + { + return m_drawer.GetBlockOutlineColor(m_blockIndex); + } + + /*! + * Returns the outline thickness used for the characters of the referenced block + * \return The referenced block outline thickness + * + * \see GetCharacterSize, GetColor, GetStyle, GetText, SetFont + */ + inline float RichTextDrawer::BlockRef::GetOutlineThickness() const + { + return m_drawer.GetBlockOutlineThickness(m_blockIndex); + } + + /*! + * Returns the style flags used for the characters of the referenced block + * \return The referenced block style flags (see TextStyleFlags) + * + * \see GetCharacterSize, GetColor, GetFont, GetText, SetStyle + */ + inline TextStyleFlags RichTextDrawer::BlockRef::GetStyle() const + { + return m_drawer.GetBlockStyle(m_blockIndex); + } + + /*! + * Returns the first glyph index at which starts the referenced block + * \return The first glyph index concerned by this block + * + * \see GetText + */ + inline std::size_t RichTextDrawer::BlockRef::GetFirstGlyphIndex() const + { + return m_drawer.GetBlockFirstGlyphIndex(m_blockIndex); + } + + /*! + * Returns the text of the referenced block + * \return The referenced block text + * + * \see GetCharacterSize, GetColor, GetFont, GetStyle, SetText + */ + inline const String& RichTextDrawer::BlockRef::GetText() const + { + return m_drawer.GetBlockText(m_blockIndex); + } + + /*! + * Changes the character spacing offset of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSpacingOffset, SetColor, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetCharacterSpacingOffset(float offset) + { + m_drawer.SetBlockCharacterSpacingOffset(m_blockIndex, offset); + } + + /*! + * Changes the character size of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetColor, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetCharacterSize(unsigned int size) + { + m_drawer.SetBlockCharacterSize(m_blockIndex, size); + } + + /*! + * Changes the color of the referenced block characters + * \remark This is the only property that can be changed without forcing a glyph regeneration + * + * \see GetColor, SetCharacterSize, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetColor(Color color) + { + m_drawer.SetBlockColor(m_blockIndex, color); + } + + /*! + * Changes the font of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetCharacterSize, SetColor, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetFont(FontRef font) + { + m_drawer.SetBlockFont(m_blockIndex, std::move(font)); + } + + /*! + * Changes the line spacing offset of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetLineSpacingOffset, SetColor, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetLineSpacingOffset(float offset) + { + m_drawer.SetBlockLineSpacingOffset(m_blockIndex, offset); + } + + /*! + * Changes the outline color of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetCharacterSize, SetColor, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetOutlineColor(Color color) + { + m_drawer.SetBlockOutlineColor(m_blockIndex, std::move(color)); + } + + /*! + * Changes the outline thickness of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetCharacterSize, SetColor, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetOutlineThickness(float thickness) + { + m_drawer.SetBlockOutlineThickness(m_blockIndex, thickness); + } + + /*! + * Changes the style flags of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetStyle, SetCharacterSize, SetColor, SetFont, SetText + */ + inline void RichTextDrawer::BlockRef::SetStyle(TextStyleFlags style) + { + m_drawer.SetBlockStyle(m_blockIndex, style); + } + + /*! + * Changes the text of the referenced block + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetText, SetCharacterSize, SetColor, SetFont, SetStyle + */ + inline void RichTextDrawer::BlockRef::SetText(const String& text) + { + m_drawer.SetBlockText(m_blockIndex, text); + } +} + +#include diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index d3c3bd9cc..3ee3b1b25 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -19,70 +19,108 @@ namespace Nz class NAZARA_UTILITY_API SimpleTextDrawer : public AbstractTextDrawer { public: - SimpleTextDrawer(); - SimpleTextDrawer(const SimpleTextDrawer& drawer); - SimpleTextDrawer(SimpleTextDrawer&& drawer); - virtual ~SimpleTextDrawer(); + inline SimpleTextDrawer(); + inline SimpleTextDrawer(const SimpleTextDrawer& drawer); + inline SimpleTextDrawer(SimpleTextDrawer&& drawer); + ~SimpleTextDrawer() = default; - void AppendText(const String& str); + inline void AppendText(const String& str); - void Clear(); + void Clear() override; - const Recti& GetBounds() const override; - unsigned int GetCharacterSize() const; - const Color& GetColor() const; - Font* GetFont() const; + const Rectf& GetBounds() const override; + inline float GetCharacterSpacingOffset() const; + inline unsigned int GetCharacterSize() const; + inline const Color& GetColor() const; + inline Font* GetFont() const; Font* GetFont(std::size_t index) const override; std::size_t GetFontCount() const override; const Glyph& GetGlyph(std::size_t index) const override; std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; - UInt32 GetStyle() const; - const String& GetText() const; + inline float GetLineHeight() const; + inline float GetLineSpacingOffset() const; + float GetMaxLineWidth() const override; + inline const Color& GetOutlineColor() const; + inline float GetOutlineThickness() const; + inline TextStyleFlags GetStyle() const; + inline const String& GetText() const; - void SetCharacterSize(unsigned int characterSize); - void SetColor(const Color& color); - void SetFont(Font* font); - void SetStyle(UInt32 style); - void SetText(const String& str); + inline void SetCharacterSpacingOffset(float offset); + inline void SetCharacterSize(unsigned int characterSize); + inline void SetColor(const Color& color); + inline void SetFont(Font* font); + inline void SetLineSpacingOffset(float offset); + inline void SetMaxLineWidth(float lineWidth) override; + inline void SetOutlineColor(const Color& color); + inline void SetOutlineThickness(float thickness); + inline void SetStyle(TextStyleFlags style); + inline void SetText(const String& str); - SimpleTextDrawer& operator=(const SimpleTextDrawer& drawer); - SimpleTextDrawer& operator=(SimpleTextDrawer&& drawer); + inline SimpleTextDrawer& operator=(const SimpleTextDrawer& drawer); + inline SimpleTextDrawer& operator=(SimpleTextDrawer&& drawer); - static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); - static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); + static inline SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static inline SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); + static inline SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static inline SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); private: + inline void AppendNewLine() const; + void AppendNewLine(std::size_t glyphIndex, float glyphPosition) const; + void ClearGlyphs() const; - void ConnectFontSlots(); - void DisconnectFontSlots(); + + inline void ConnectFontSlots(); + inline void DisconnectFontSlots(); + + bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const; void GenerateGlyphs(const String& text) const; + + inline float GetLineHeight(const Font::SizeInfo& sizeInfo) const; + + inline void InvalidateColor(); + inline void InvalidateGlyphs(); + void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); void OnFontInvalidated(const Font* font); void OnFontRelease(const Font* object); - void UpdateGlyphColor() const; - void UpdateGlyphs() const; + + inline bool ShouldLineWrap(float size) const; + + inline void UpdateGlyphColor() const; + inline void UpdateGlyphs() const; + + static constexpr std::size_t InvalidGlyph = std::numeric_limits::max(); NazaraSlot(Font, OnFontAtlasChanged, m_atlasChangedSlot); NazaraSlot(Font, OnFontAtlasLayerChanged, m_atlasLayerChangedSlot); NazaraSlot(Font, OnFontGlyphCacheCleared, m_glyphCacheClearedSlot); NazaraSlot(Font, OnFontRelease, m_fontReleaseSlot); + mutable std::size_t m_lastSeparatorGlyph; mutable std::vector m_glyphs; mutable std::vector m_lines; Color m_color; + Color m_outlineColor; FontRef m_font; - mutable Rectf m_workingBounds; - mutable Recti m_bounds; + mutable Rectf m_bounds; String m_text; + TextStyleFlags m_style; mutable UInt32 m_previousCharacter; - UInt32 m_style; - mutable Vector2ui m_drawPos; + mutable Vector2f m_drawPos; mutable bool m_colorUpdated; mutable bool m_glyphUpdated; + mutable float m_lastSeparatorPosition; + float m_characterSpacingOffset; + float m_lineSpacingOffset; + float m_maxLineWidth; + float m_outlineThickness; unsigned int m_characterSize; }; } +#include + #endif // NAZARA_SIMPLETEXTDRAWER_HPP diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl new file mode 100644 index 000000000..fddb6b893 --- /dev/null +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -0,0 +1,385 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline SimpleTextDrawer::SimpleTextDrawer() : + m_color(Color::White), + m_outlineColor(Color::Black), + m_style(TextStyle_Regular), + m_colorUpdated(true), + m_glyphUpdated(true), + m_characterSpacingOffset(0.f), + m_lineSpacingOffset(0.f), + m_maxLineWidth(std::numeric_limits::infinity()), + m_outlineThickness(0.f), + m_characterSize(24) + { + SetFont(Font::GetDefault()); + } + + inline SimpleTextDrawer::SimpleTextDrawer(const SimpleTextDrawer& drawer) : + m_color(drawer.m_color), + m_outlineColor(drawer.m_outlineColor), + m_text(drawer.m_text), + m_style(drawer.m_style), + m_colorUpdated(false), + m_glyphUpdated(false), + m_characterSpacingOffset(drawer.m_characterSpacingOffset), + m_lineSpacingOffset(drawer.m_lineSpacingOffset), + m_maxLineWidth(drawer.m_maxLineWidth), + m_outlineThickness(drawer.m_outlineThickness), + m_characterSize(drawer.m_characterSize) + { + SetFont(drawer.m_font); + } + + inline SimpleTextDrawer::SimpleTextDrawer(SimpleTextDrawer&& drawer) + { + operator=(std::move(drawer)); + } + + inline void SimpleTextDrawer::AppendText(const String& str) + { + m_text.Append(str); + if (m_glyphUpdated) + GenerateGlyphs(str); + } + + inline float SimpleTextDrawer::GetCharacterSpacingOffset() const + { + return m_characterSpacingOffset; + } + + inline unsigned int SimpleTextDrawer::GetCharacterSize() const + { + return m_characterSize; + } + + inline const Color& SimpleTextDrawer::GetColor() const + { + return m_color; + } + + inline Font* SimpleTextDrawer::GetFont() const + { + return m_font; + } + + inline float SimpleTextDrawer::GetLineHeight() const + { + NazaraAssert(m_font, "SimpleTextDrawer has no font"); + return GetLineHeight(m_font->GetSizeInfo(m_characterSize)); + } + + inline float SimpleTextDrawer::GetLineSpacingOffset() const + { + return m_lineSpacingOffset; + } + + inline const Color& SimpleTextDrawer::GetOutlineColor() const + { + return m_outlineColor; + } + + inline float SimpleTextDrawer::GetOutlineThickness() const + { + return m_outlineThickness; + } + + inline TextStyleFlags SimpleTextDrawer::GetStyle() const + { + return m_style; + } + + inline const String& SimpleTextDrawer::GetText() const + { + return m_text; + } + + inline void SimpleTextDrawer::SetCharacterSpacingOffset(float offset) + { + if (m_characterSpacingOffset != offset) + { + m_characterSpacingOffset = offset; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetCharacterSize(unsigned int characterSize) + { + if (m_characterSize != characterSize) + { + m_characterSize = characterSize; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetColor(const Color& color) + { + if (m_color != color) + { + m_color = color; + + InvalidateColor(); + } + } + + inline void SimpleTextDrawer::SetFont(Font* font) + { + if (m_font != font) + { + m_font = font; + + if (m_font) + ConnectFontSlots(); + else + DisconnectFontSlots(); + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetLineSpacingOffset(float offset) + { + if (m_lineSpacingOffset != offset) + { + m_lineSpacingOffset = offset; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetMaxLineWidth(float lineWidth) + { + if (m_maxLineWidth != lineWidth) + { + NazaraAssert(lineWidth > 0.f, "Max line width must be positive"); + + m_maxLineWidth = lineWidth; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetOutlineColor(const Color& color) + { + if (m_outlineColor != color) + { + m_outlineColor = color; + + InvalidateColor(); + } + } + + inline void SimpleTextDrawer::SetOutlineThickness(float thickness) + { + if (m_outlineThickness != thickness) + { + NazaraAssert(thickness >= 0.f, "Thickness must be zero or positive"); + + m_outlineThickness = thickness; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetStyle(TextStyleFlags style) + { + if (m_style != style) + { + m_style = style; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetText(const String& str) + { + if (m_text != str) + { + m_text = str; + + InvalidateGlyphs(); + } + } + + inline SimpleTextDrawer& SimpleTextDrawer::operator=(const SimpleTextDrawer& drawer) + { + m_characterSize = drawer.m_characterSize; + m_characterSpacingOffset = drawer.m_characterSpacingOffset; + m_color = drawer.m_color; + m_lineSpacingOffset = drawer.m_lineSpacingOffset; + m_maxLineWidth = drawer.m_maxLineWidth; + m_outlineColor = drawer.m_outlineColor; + m_outlineThickness = drawer.m_outlineThickness; + m_style = drawer.m_style; + m_text = drawer.m_text; + + SetFont(drawer.m_font); + InvalidateGlyphs(); + + return *this; + } + + inline SimpleTextDrawer& SimpleTextDrawer::operator=(SimpleTextDrawer&& drawer) + { + DisconnectFontSlots(); + + m_bounds = std::move(drawer.m_bounds); + m_colorUpdated = std::move(drawer.m_colorUpdated); + m_characterSize = std::move(drawer.m_characterSize); + m_characterSpacingOffset = drawer.m_characterSpacingOffset; + m_color = std::move(drawer.m_color); + m_glyphs = std::move(drawer.m_glyphs); + m_glyphUpdated = std::move(drawer.m_glyphUpdated); + m_font = std::move(drawer.m_font); + m_lineSpacingOffset = drawer.m_lineSpacingOffset; + m_maxLineWidth = drawer.m_maxLineWidth; + m_outlineColor = std::move(drawer.m_outlineColor); + m_outlineThickness = std::move(drawer.m_outlineThickness); + m_style = std::move(drawer.m_style); + m_text = std::move(drawer.m_text); + + // Update slot pointers (TODO: Improve the way of doing this) + if (m_font) + { + drawer.DisconnectFontSlots(); + ConnectFontSlots(); + } + + return *this; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetOutlineColor(outlineColor); + drawer.SetOutlineThickness(outlineThickness); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetFont(font); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetFont(font); + drawer.SetOutlineColor(outlineColor); + drawer.SetOutlineThickness(outlineThickness); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline void SimpleTextDrawer::AppendNewLine() const + { + AppendNewLine(InvalidGlyph, 0); + } + + inline void SimpleTextDrawer::ConnectFontSlots() + { + m_atlasChangedSlot.Connect(m_font->OnFontAtlasChanged, this, &SimpleTextDrawer::OnFontInvalidated); + m_atlasLayerChangedSlot.Connect(m_font->OnFontAtlasLayerChanged, this, &SimpleTextDrawer::OnFontAtlasLayerChanged); + m_fontReleaseSlot.Connect(m_font->OnFontRelease, this, &SimpleTextDrawer::OnFontRelease); + m_glyphCacheClearedSlot.Connect(m_font->OnFontGlyphCacheCleared, this, &SimpleTextDrawer::OnFontInvalidated); + } + + inline void SimpleTextDrawer::DisconnectFontSlots() + { + m_atlasChangedSlot.Disconnect(); + m_atlasLayerChangedSlot.Disconnect(); + m_fontReleaseSlot.Disconnect(); + m_glyphCacheClearedSlot.Disconnect(); + } + + inline float SimpleTextDrawer::GetLineHeight(const Font::SizeInfo& sizeInfo) const + { + return float(sizeInfo.lineHeight) + m_lineSpacingOffset; + } + + inline void SimpleTextDrawer::InvalidateColor() + { + m_colorUpdated = false; + } + + inline void SimpleTextDrawer::InvalidateGlyphs() + { + m_glyphUpdated = false; + } + + inline bool SimpleTextDrawer::ShouldLineWrap(float size) const + { + if (m_lines.back().glyphIndex > m_glyphs.size()) + return false; + + return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; + } + + inline void SimpleTextDrawer::UpdateGlyphColor() const + { + if (m_outlineThickness > 0.f) + { + for (std::size_t glyphIndex = 0; glyphIndex < m_glyphs.size(); ++glyphIndex) + { + Glyph& glyph = m_glyphs[glyphIndex]; + if (glyphIndex % 2 == 0) + glyph.color = m_outlineColor; + else + glyph.color = m_color; + } + } + else + { + for (Glyph& glyph : m_glyphs) + glyph.color = m_color; + } + + m_colorUpdated = true; + } + + inline void SimpleTextDrawer::UpdateGlyphs() const + { + NazaraAssert(m_font && m_font->IsValid(), "Invalid font"); + + ClearGlyphs(); + GenerateGlyphs(m_text); + } +} + +#include diff --git a/plugins/Assimp/Plugin.cpp b/plugins/Assimp/Plugin.cpp index b91337f9a..3f1e5200a 100644 --- a/plugins/Assimp/Plugin.cpp +++ b/plugins/Assimp/Plugin.cpp @@ -25,11 +25,14 @@ SOFTWARE. #include #include #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -77,7 +80,7 @@ bool IsSupported(const String& extension) return (aiIsExtensionSupported(dotExt.GetConstBuffer()) == AI_TRUE); } -Ternary Check(Stream& /*stream*/, const MeshParams& parameters) +Ternary CheckAnimation(Stream& /*stream*/, const AnimationParams& parameters) { bool skip; if (parameters.custom.GetBooleanParameter("SkipAssimpLoader", &skip) && skip) @@ -86,7 +89,102 @@ Ternary Check(Stream& /*stream*/, const MeshParams& parameters) return Ternary_Unknown; } -MeshRef Load(Stream& stream, const MeshParams& parameters) +AnimationRef LoadAnimation(Stream& stream, const AnimationParams& parameters) +{ + Nz::String streamPath = stream.GetPath(); + + FileIOUserdata userdata; + userdata.originalFilePath = (!streamPath.IsEmpty()) ? streamPath.GetConstBuffer() : StreamPath; + userdata.originalStream = &stream; + + aiFileIO fileIO; + fileIO.CloseProc = StreamCloser; + fileIO.OpenProc = StreamOpener; + fileIO.UserData = reinterpret_cast(&userdata); + + unsigned int postProcess = aiProcess_CalcTangentSpace | aiProcess_Debone + | aiProcess_FindInvalidData | aiProcess_FixInfacingNormals + | aiProcess_FlipWindingOrder | aiProcess_GenSmoothNormals + | aiProcess_GenUVCoords | aiProcess_JoinIdenticalVertices + | aiProcess_LimitBoneWeights | aiProcess_MakeLeftHanded + | aiProcess_OptimizeGraph | aiProcess_OptimizeMeshes + | aiProcess_RemoveComponent | aiProcess_RemoveRedundantMaterials + | aiProcess_SortByPType | aiProcess_SplitLargeMeshes + | aiProcess_TransformUVCoords | aiProcess_Triangulate; + + aiPropertyStore* properties = aiCreatePropertyStore(); + aiSetImportPropertyInteger(properties, AI_CONFIG_PP_LBW_MAX_WEIGHTS, 4); + aiSetImportPropertyInteger(properties, AI_CONFIG_PP_RVC_FLAGS, ~aiComponent_ANIMATIONS); + + const aiScene* scene = aiImportFileExWithProperties(userdata.originalFilePath, 0, &fileIO, properties); + aiReleasePropertyStore(properties); + + if (!scene) + { + NazaraError("Assimp failed to import file: " + Nz::String(aiGetErrorString())); + return nullptr; + } + + if (!scene->HasAnimations()) + { + NazaraError("File has no animation"); + return nullptr; + } + + aiAnimation* animation = scene->mAnimations[0]; + + unsigned int maxFrameCount = 0; + for (unsigned int i = 0; i < animation->mNumChannels; ++i) + { + aiNodeAnim* nodeAnim = animation->mChannels[i]; + + maxFrameCount = std::max({ maxFrameCount, nodeAnim->mNumPositionKeys, nodeAnim->mNumRotationKeys, nodeAnim->mNumScalingKeys }); + } + + AnimationRef anim = Animation::New(); + + anim->CreateSkeletal(maxFrameCount, animation->mNumChannels); + + Sequence sequence; + sequence.firstFrame = 0; + sequence.frameCount = maxFrameCount; + sequence.frameRate = animation->mTicksPerSecond; + + anim->AddSequence(sequence); + + SequenceJoint* sequenceJoints = anim->GetSequenceJoints(); + + Quaternionf rotationQuat = Quaternionf::Identity(); + + for (unsigned int i = 0; i < animation->mNumChannels; ++i) + { + aiNodeAnim* nodeAnim = animation->mChannels[i]; + for (unsigned int j = 0; j < nodeAnim->mNumPositionKeys; ++j) + { + SequenceJoint& sequenceJoint = sequenceJoints[i*animation->mNumChannels + j]; + + aiQuaternion rotation = nodeAnim->mRotationKeys[j].mValue; + aiVector3D position = nodeAnim->mPositionKeys[j].mValue; + + sequenceJoint.position = Vector3f(position.x, position.y, position.z); + sequenceJoint.rotation = Quaternionf(rotation.w, rotation.x, rotation.y, rotation.z); + sequenceJoint.scale.Set(1.f); + } + } + + return anim; +} + +Ternary CheckMesh(Stream& /*stream*/, const MeshParams& parameters) +{ + bool skip; + if (parameters.custom.GetBooleanParameter("SkipAssimpLoader", &skip) && skip) + return Ternary_False; + + return Ternary_Unknown; +} + +MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) { Nz::String streamPath = stream.GetPath(); @@ -157,14 +255,14 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) bool animatedMesh = false; if (parameters.animated) { - for (unsigned int i = 0; i < scene->mNumMeshes; ++i) + for (unsigned int meshIdx = 0; meshIdx < scene->mNumMeshes; ++meshIdx) { - aiMesh* currentMesh = scene->mMeshes[i]; + aiMesh* currentMesh = scene->mMeshes[meshIdx]; if (currentMesh->HasBones()) // Inline functions can be safely called { animatedMesh = true; - for (unsigned int j = 0; j < currentMesh->mNumBones; ++j) - joints.insert(currentMesh->mBones[j]->mName.C_Str()); + for (unsigned int boneIdx = 0; boneIdx < currentMesh->mNumBones; ++boneIdx) + joints.insert(currentMesh->mBones[boneIdx]->mName.C_Str()); } } } @@ -183,7 +281,162 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) ProcessJoints(scene->mRootNode, skeleton, joints); - return nullptr; + // aiMaterial index in scene => Material index and data in Mesh + std::unordered_map> materials; + + for (unsigned int meshIdx = 0; meshIdx < scene->mNumMeshes; ++meshIdx) + { + aiMesh* iMesh = scene->mMeshes[meshIdx]; + if (iMesh->HasBones()) + { + // For now, process only skeletal meshes + } + + unsigned int indexCount = iMesh->mNumFaces * 3; + unsigned int vertexCount = iMesh->mNumVertices; + + // Index buffer + bool largeIndices = (vertexCount > std::numeric_limits::max()); + + IndexBufferRef indexBuffer = IndexBuffer::New(largeIndices, indexCount, parameters.storage, parameters.indexBufferFlags); + + IndexMapper indexMapper(indexBuffer, BufferAccess_DiscardAndWrite); + IndexIterator index = indexMapper.begin(); + + for (unsigned int faceIdx = 0; faceIdx < iMesh->mNumFaces; ++faceIdx) + { + aiFace& face = iMesh->mFaces[faceIdx]; + if (face.mNumIndices != 3) + NazaraWarning("Assimp plugin: This face is not a triangle!"); + + *index++ = face.mIndices[0]; + *index++ = face.mIndices[1]; + *index++ = face.mIndices[2]; + } + indexMapper.Unmap(); + + // Make sure the normal/tangent matrix won't rescale our vectors + Nz::Matrix4f normalTangentMatrix = parameters.matrix; + if (normalTangentMatrix.HasScale()) + normalTangentMatrix.ApplyScale(1.f / normalTangentMatrix.GetScale()); + + VertexBufferRef vertexBuffer = VertexBuffer::New(VertexDeclaration::Get(VertexLayout_XYZ_Normal_UV_Tangent_Skinning), vertexCount, parameters.storage, parameters.vertexBufferFlags | BufferUsage_Dynamic); + BufferMapper vertexMapper(vertexBuffer, BufferAccess_ReadWrite); + SkeletalMeshVertex* vertices = static_cast(vertexMapper.GetPointer()); + + for (std::size_t vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) + { + aiVector3D normal = iMesh->mNormals[vertexIdx]; + aiVector3D position = iMesh->mVertices[vertexIdx]; + aiVector3D tangent = iMesh->mTangents[vertexIdx]; + aiVector3D uv = iMesh->mTextureCoords[0][vertexIdx]; + + vertices[vertexIdx].weightCount = 0; + vertices[vertexIdx].normal = normalTangentMatrix.Transform({ normal.x, normal.y, normal.z }, 0.f); + vertices[vertexIdx].position = parameters.matrix * Vector3f(position.x, position.y, position.z); + vertices[vertexIdx].tangent = normalTangentMatrix.Transform({ tangent.x, tangent.y, tangent.z }, 0.f); + vertices[vertexIdx].uv = parameters.texCoordOffset + Vector2f(uv.x, uv.y) * parameters.texCoordScale; + } + + for (unsigned int boneIdx = 0; boneIdx < iMesh->mNumBones; ++boneIdx) + { + aiBone* bone = iMesh->mBones[boneIdx]; + for (unsigned int weightIdx = 0; weightIdx < bone->mNumWeights; ++weightIdx) + { + aiVertexWeight& vertexWeight = bone->mWeights[weightIdx]; + SkeletalMeshVertex& vertex = vertices[vertexWeight.mVertexId]; + + std::size_t weightIndex = vertex.weightCount++; + vertex.jointIndexes[weightIndex] = boneIdx; + vertex.weights[weightIndex] = vertexWeight.mWeight; + } + } + + // Submesh + SkeletalMeshRef subMesh = SkeletalMesh::New(vertexBuffer, indexBuffer); + subMesh->SetMaterialIndex(iMesh->mMaterialIndex); + + auto matIt = materials.find(iMesh->mMaterialIndex); + if (matIt == materials.end()) + { + ParameterList matData; + aiMaterial* aiMat = scene->mMaterials[iMesh->mMaterialIndex]; + + auto ConvertColor = [&](const char* aiKey, unsigned int aiType, unsigned int aiIndex, const char* colorKey) + { + aiColor4D color; + if (aiGetMaterialColor(aiMat, aiKey, aiType, aiIndex, &color) == aiReturn_SUCCESS) + { + matData.SetParameter(colorKey, Color(static_cast(color.r * 255), static_cast(color.g * 255), static_cast(color.b * 255), static_cast(color.a * 255))); + } + }; + + auto ConvertTexture = [&](aiTextureType aiType, const char* textureKey, const char* wrapKey = nullptr) + { + aiString path; + aiTextureMapMode mapMode[3]; + if (aiGetMaterialTexture(aiMat, aiType, 0, &path, nullptr, nullptr, nullptr, nullptr, &mapMode[0], nullptr) == aiReturn_SUCCESS) + { + matData.SetParameter(textureKey, stream.GetDirectory() + String(path.data, path.length)); + + if (wrapKey) + { + SamplerWrap wrap = SamplerWrap_Default; + switch (mapMode[0]) + { + case aiTextureMapMode_Clamp: + case aiTextureMapMode_Decal: + wrap = SamplerWrap_Clamp; + break; + + case aiTextureMapMode_Mirror: + wrap = SamplerWrap_MirroredRepeat; + break; + + case aiTextureMapMode_Wrap: + wrap = SamplerWrap_Repeat; + break; + + default: + NazaraWarning("Assimp texture map mode 0x" + String::Number(mapMode[0], 16) + " not handled"); + break; + } + + matData.SetParameter(wrapKey, static_cast(wrap)); + } + } + }; + + ConvertColor(AI_MATKEY_COLOR_AMBIENT, MaterialData::AmbientColor); + ConvertColor(AI_MATKEY_COLOR_DIFFUSE, MaterialData::DiffuseColor); + ConvertColor(AI_MATKEY_COLOR_SPECULAR, MaterialData::SpecularColor); + + ConvertTexture(aiTextureType_DIFFUSE, MaterialData::DiffuseTexturePath, MaterialData::DiffuseWrap); + ConvertTexture(aiTextureType_EMISSIVE, MaterialData::EmissiveTexturePath); + ConvertTexture(aiTextureType_HEIGHT, MaterialData::HeightTexturePath); + ConvertTexture(aiTextureType_NORMALS, MaterialData::NormalTexturePath); + ConvertTexture(aiTextureType_OPACITY, MaterialData::AlphaTexturePath); + ConvertTexture(aiTextureType_SPECULAR, MaterialData::SpecularTexturePath, MaterialData::SpecularWrap); + + aiString name; + if (aiGetMaterialString(aiMat, AI_MATKEY_NAME, &name) == aiReturn_SUCCESS) + matData.SetParameter(MaterialData::Name, String(name.data, name.length)); + + int iValue; + if (aiGetMaterialInteger(aiMat, AI_MATKEY_TWOSIDED, &iValue) == aiReturn_SUCCESS) + matData.SetParameter(MaterialData::FaceCulling, !iValue); + + matIt = materials.insert(std::make_pair(iMesh->mMaterialIndex, std::make_pair(UInt32(materials.size()), std::move(matData)))).first; + } + + subMesh->SetMaterialIndex(matIt->first); + + mesh->AddSubMesh(subMesh); + } + + mesh->SetMaterialCount(std::max(UInt32(materials.size()), 1)); + for (const auto& pair : materials) + mesh->SetMaterialData(pair.second.first, pair.second.second); } else { @@ -192,9 +445,9 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) // aiMaterial index in scene => Material index and data in Mesh std::unordered_map> materials; - for (unsigned int i = 0; i < scene->mNumMeshes; ++i) + for (unsigned int meshIdx = 0; meshIdx < scene->mNumMeshes; ++meshIdx) { - aiMesh* iMesh = scene->mMeshes[i]; + aiMesh* iMesh = scene->mMeshes[meshIdx]; if (!iMesh->HasBones()) // Don't process skeletal meshs { unsigned int indexCount = iMesh->mNumFaces * 3; @@ -208,9 +461,9 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) IndexMapper indexMapper(indexBuffer, BufferAccess_DiscardAndWrite); IndexIterator index = indexMapper.begin(); - for (unsigned int j = 0; j < iMesh->mNumFaces; ++j) + for (unsigned int faceIdx = 0; faceIdx < iMesh->mNumFaces; ++faceIdx) { - aiFace& face = iMesh->mFaces[j]; + aiFace& face = iMesh->mFaces[faceIdx]; if (face.mNumIndices != 3) NazaraWarning("Assimp plugin: This face is not a triangle!"); @@ -232,17 +485,17 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) VertexMapper vertexMapper(vertexBuffer, BufferAccess_DiscardAndWrite); auto posPtr = vertexMapper.GetComponentPtr(VertexComponent_Position); - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D position = iMesh->mVertices[j]; + aiVector3D position = iMesh->mVertices[vertexIdx]; *posPtr++ = parameters.matrix * Vector3f(position.x, position.y, position.z); } if (auto normalPtr = vertexMapper.GetComponentPtr(VertexComponent_Normal)) { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D normal = iMesh->mNormals[j]; + aiVector3D normal = iMesh->mNormals[vertexIdx]; *normalPtr++ = normalTangentMatrix.Transform({normal.x, normal.y, normal.z}, 0.f); } } @@ -252,9 +505,9 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) { if (iMesh->HasTangentsAndBitangents()) { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D tangent = iMesh->mTangents[j]; + aiVector3D tangent = iMesh->mTangents[vertexIdx]; *tangentPtr++ = normalTangentMatrix.Transform({tangent.x, tangent.y, tangent.z}, 0.f); } } @@ -266,15 +519,15 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) { if (iMesh->HasTextureCoords(0)) { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D uv = iMesh->mTextureCoords[0][j]; + aiVector3D uv = iMesh->mTextureCoords[0][vertexIdx]; *uvPtr++ = parameters.texCoordOffset + Vector2f(uv.x, uv.y) * parameters.texCoordScale; } } else { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) *uvPtr++ = Vector2f::Zero(); } } @@ -385,12 +638,14 @@ extern "C" { NAZARA_EXPORT int PluginLoad() { - Nz::MeshLoader::RegisterLoader(IsSupported, Check, Load); + Nz::AnimationLoader::RegisterLoader(IsSupported, CheckAnimation, LoadAnimation); + Nz::MeshLoader::RegisterLoader(IsSupported, CheckMesh, LoadMesh); return 1; } NAZARA_EXPORT void PluginUnload() { - Nz::MeshLoader::UnregisterLoader(IsSupported, Check, Load); + Nz::AnimationLoader::RegisterLoader(IsSupported, CheckAnimation, LoadAnimation); + Nz::MeshLoader::UnregisterLoader(IsSupported, CheckMesh, LoadMesh); } } diff --git a/src/Nazara/Core/ByteStream.cpp b/src/Nazara/Core/ByteStream.cpp index a61cae520..6559e50fb 100644 --- a/src/Nazara/Core/ByteStream.cpp +++ b/src/Nazara/Core/ByteStream.cpp @@ -68,7 +68,7 @@ namespace Nz void ByteStream::SetStream(ByteArray* byteArray, OpenModeFlags openMode) { - std::unique_ptr stream(new MemoryStream(byteArray, openMode)); + std::unique_ptr stream = std::make_unique(byteArray, openMode); SetStream(stream.get()); // SetStream reset our smart pointer, set it after calling it @@ -86,7 +86,7 @@ namespace Nz void ByteStream::SetStream(void* ptr, Nz::UInt64 size) { - std::unique_ptr stream(new MemoryView(ptr, size)); + std::unique_ptr stream = std::make_unique(ptr, size); SetStream(stream.get()); // SetStream reset our smart pointer, set it after calling it @@ -104,7 +104,7 @@ namespace Nz void ByteStream::SetStream(const void* ptr, Nz::UInt64 size) { - std::unique_ptr stream(new MemoryView(ptr, size)); + std::unique_ptr stream = std::make_unique(ptr, size); SetStream(stream.get()); // SetStream reset our smart pointer, set it after calling it diff --git a/src/Nazara/Core/EmptyStream.cpp b/src/Nazara/Core/EmptyStream.cpp new file mode 100644 index 000000000..5cba8af35 --- /dev/null +++ b/src/Nazara/Core/EmptyStream.cpp @@ -0,0 +1,99 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::EmptyStream + * \brief Core class that simulate an empty buffer (discarding all content) which can be used to measure size + */ + + /*! + * \brief Resets the stream size to zero + */ + void EmptyStream::Clear() + { + m_size = 0; + } + + /*! + * \brief Checks whether the stream reached the end of the stream + * \return Always false + */ + bool EmptyStream::EndOfStream() const + { + return false; + } + + /*! + * \brief Gets the position of the cursor (which is always zero) + * \return Always zero + */ + UInt64 EmptyStream::GetCursorPos() const + { + return 0; + } + + /*! + * \brief Gets the size of the raw memory (how many bytes would have been written on a regular stream) + * \return Size occupied until now + */ + UInt64 EmptyStream::GetSize() const + { + return m_size; + } + + /*! + * \brief Does nothing + * \return true + * + * \param offset Offset according to the beginning of the stream + */ + bool EmptyStream::SetCursorPos(UInt64 offset) + { + return true; + } + + /*! + * \brief Flushes the stream (does nothing) + */ + void EmptyStream::FlushStream() + { + // Nothing to flush + } + + /*! + * \brief Reads data + * \return Number of byte read (always zero) + * + * Reading from an empty stream does nothing and will always returns zero + * + * \param buffer Preallocated buffer to contain information read + * \param size Size of the read and thus of the buffer + */ + std::size_t EmptyStream::ReadBlock(void* buffer, std::size_t size) + { + return 0; + } + + /*! + * \brief Writes data + * \return size + * + * \param buffer Dummy parameter + * \param size How many bytes will be "written" + */ + std::size_t EmptyStream::WriteBlock(const void* /*buffer*/, std::size_t size) + { + m_size += size; + + return size; + } +} diff --git a/src/Nazara/Core/GuillotineBinPack.cpp b/src/Nazara/Core/GuillotineBinPack.cpp index 9ebae4bbb..ef8e2f953 100644 --- a/src/Nazara/Core/GuillotineBinPack.cpp +++ b/src/Nazara/Core/GuillotineBinPack.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -302,7 +303,8 @@ namespace Nz bool GuillotineBinPack::Insert(Rectui* rects, bool* flipped, bool* inserted, unsigned int count, bool merge, FreeRectChoiceHeuristic rectChoice, GuillotineSplitHeuristic splitMethod) { - std::vector remainingRects(count); // Position of the rectangle + Nz::StackVector remainingRects = NazaraStackVector(Rectui*, count); // Position of the rectangle + remainingRects.resize(count); for (unsigned int i = 0; i < count; ++i) remainingRects[i] = &rects[i]; diff --git a/src/Nazara/Core/PoolByteStream.cpp b/src/Nazara/Core/PoolByteStream.cpp new file mode 100644 index 000000000..889fe32ca --- /dev/null +++ b/src/Nazara/Core/PoolByteStream.cpp @@ -0,0 +1,40 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::PoolByteStream + * \brief ByteStream allocated using a pool + */ + + void PoolByteStream::Reset() + { + if (m_buffer.GetCapacity() > 0) + { + m_pool.ReturnByteArray(std::move(m_buffer)); + m_buffer.Clear(false); + } + + SetStream(static_cast(nullptr)); + } + + void PoolByteStream::Reset(std::size_t capacity) + { + if (m_buffer.GetCapacity() < capacity) + m_buffer = m_pool.GetByteArray(capacity); + + SetStream(&m_buffer, Nz::OpenMode_ReadWrite); + } + + void PoolByteStream::OnEmptyStream() + { + Reset(0); + } +} diff --git a/src/Nazara/Core/String.cpp b/src/Nazara/Core/String.cpp index 351b1c91d..438565449 100644 --- a/src/Nazara/Core/String.cpp +++ b/src/Nazara/Core/String.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -5121,6 +5122,7 @@ namespace Nz String String::Number(float number) { std::ostringstream oss; + oss.imbue(std::locale::classic()); oss.precision(NAZARA_CORE_DECIMAL_DIGITS); oss << number; @@ -5137,6 +5139,7 @@ namespace Nz String String::Number(double number) { std::ostringstream oss; + oss.imbue(std::locale::classic()); oss.precision(NAZARA_CORE_DECIMAL_DIGITS); oss << number; @@ -5153,6 +5156,7 @@ namespace Nz String String::Number(long double number) { std::ostringstream oss; + oss.imbue(std::locale::classic()); oss.precision(NAZARA_CORE_DECIMAL_DIGITS); oss << number; diff --git a/src/Nazara/Core/Win32/ThreadImpl.cpp b/src/Nazara/Core/Win32/ThreadImpl.cpp index 4dd557536..0ad2293cc 100644 --- a/src/Nazara/Core/Win32/ThreadImpl.cpp +++ b/src/Nazara/Core/Win32/ThreadImpl.cpp @@ -11,6 +11,9 @@ namespace Nz { + // Windows 10, version 1607 brought SetThreadDescription in order to name a thread + using SetThreadDescriptionFunc = HRESULT(WINAPI*)(HANDLE hThread, PCWSTR lpThreadDescription); + #ifdef NAZARA_COMPILER_MSVC namespace { @@ -50,12 +53,12 @@ namespace Nz void ThreadImpl::SetName(const Nz::String& name) { - SetThreadName(m_threadId, name.GetConstBuffer()); + SetThreadName(m_handle, name); } void ThreadImpl::SetCurrentName(const Nz::String& name) { - SetThreadName(::GetCurrentThreadId(), name.GetConstBuffer()); + SetThreadName(::GetCurrentThread(), name); } void ThreadImpl::Sleep(UInt32 time) @@ -63,9 +66,12 @@ namespace Nz ::Sleep(time); } - void ThreadImpl::SetThreadName(DWORD threadId, const char* threadName) + void ThreadImpl::RaiseThreadNameException(DWORD threadId, const char* threadName) { - #ifdef NAZARA_COMPILER_MSVC +#ifdef NAZARA_COMPILER_MSVC + if (!::IsDebuggerPresent()) + return; + // https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx constexpr DWORD MS_VC_EXCEPTION = 0x406D1388; @@ -75,8 +81,8 @@ namespace Nz info.dwThreadID = threadId; info.dwFlags = 0; - #pragma warning(push) - #pragma warning(disable: 6320 6322) +#pragma warning(push) +#pragma warning(disable: 6320 6322) __try { RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), reinterpret_cast(&info)); @@ -84,10 +90,20 @@ namespace Nz __except (EXCEPTION_EXECUTE_HANDLER) { } - #pragma warning(pop) - #else - NazaraWarning("SetThreadName on Windows is only supported with MSVC for now"); - #endif +#pragma warning(pop) +#else + NazaraWarning("SetThreadDescription is not supported and threadname exception is only supported with MSVC"); +#endif + } + + void ThreadImpl::SetThreadName(HANDLE threadHandle, const Nz::String& name) + { + // Try to use SetThreadDescription if available + static SetThreadDescriptionFunc SetThreadDescription = reinterpret_cast(::GetProcAddress(::GetModuleHandleW(L"Kernel32.dll"), "SetThreadDescription")); + if (SetThreadDescription) + SetThreadDescription(threadHandle, name.GetWideString().data()); + else + RaiseThreadNameException(::GetThreadId(threadHandle), name.GetConstBuffer()); } unsigned int __stdcall ThreadImpl::ThreadProc(void* userdata) diff --git a/src/Nazara/Core/Win32/ThreadImpl.hpp b/src/Nazara/Core/Win32/ThreadImpl.hpp index 8bc25930d..c12697611 100644 --- a/src/Nazara/Core/Win32/ThreadImpl.hpp +++ b/src/Nazara/Core/Win32/ThreadImpl.hpp @@ -30,7 +30,8 @@ namespace Nz static void Sleep(UInt32 time); private: - static void SetThreadName(DWORD threadId, const char* threadName); + static void RaiseThreadNameException(DWORD threadId, const char* threadName); + static void SetThreadName(HANDLE threadHandle, const Nz::String& name); static unsigned int __stdcall ThreadProc(void* userdata); DWORD m_threadId; diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index dbd500ea4..0129c4980 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -29,8 +29,8 @@ namespace Nz Vector2f uv; }; - UInt32 s_maxQuads = std::numeric_limits::max() / 6; - UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_maxQuadPerDraw = s_vertexBufferSize / sizeof(VertexLayout_XYZ_Color_UV); } /*! @@ -468,62 +468,9 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); - Renderer::SetIndexBuffer(&s_quadIndexBuffer); - Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); - Renderer::SetVertexBuffer(&m_spriteBuffer); + const std::size_t maxSpriteCount = std::min(s_maxQuadPerDraw, m_spriteBuffer.GetVertexCount() / 4); const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); - const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - - m_spriteChains.clear(); - - auto Commit = [&]() - { - std::size_t spriteChainCount = m_spriteChains.size(); - if (spriteChainCount > 0) - { - std::size_t spriteChain = 0; // Which chain of sprites are we treating - std::size_t spriteChainOffset = 0; // Where was the last offset where we stopped in the last chain - - do - { - // We open the buffer in writing mode - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); - - std::size_t spriteCount = 0; - - do - { - const VertexStruct_XYZ_Color_UV* currentChain = m_spriteChains[spriteChain].first; - std::size_t currentChainSpriteCount = m_spriteChains[spriteChain].second; - std::size_t count = std::min(maxSpriteCount - spriteCount, currentChainSpriteCount - spriteChainOffset); - - std::memcpy(vertices, currentChain + spriteChainOffset * 4, 4 * count * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += count * 4; - - spriteCount += count; - spriteChainOffset += count; - - // Have we treated the entire chain ? - if (spriteChainOffset == currentChainSpriteCount) - { - spriteChain++; - spriteChainOffset = 0; - } - } - while (spriteCount < maxSpriteCount && spriteChain < spriteChainCount); - - vertexMapper.Unmap(); - - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, 0, spriteCount * 6); - } - while (spriteChain < spriteChainCount); - } - - m_spriteChains.clear(); - }; - const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; const Shader* lastShader = nullptr; @@ -533,18 +480,19 @@ namespace Nz const MaterialPipeline::Instance* pipelineInstance = nullptr; - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + Renderer::SetIndexBuffer(&s_quadIndexBuffer); + Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); + Renderer::SetVertexBuffer(&m_spriteBuffer); + + auto Draw = [&]() { - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - - if (basicSprites.material != lastMaterial || basicSprites.overlay != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - Commit(); - - const MaterialPipeline* pipeline = basicSprites.material->GetPipeline(); - if (lastPipeline != pipeline) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - pipelineInstance = &basicSprites.material->GetPipeline()->Apply(ShaderFlags_Deferred | ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); const Shader* shader = pipelineInstance->uberInstance->GetShader(); if (shader != lastShader) @@ -566,33 +514,105 @@ namespace Nz lastPipeline = pipeline; } - if (lastMaterial != basicSprites.material) + if (batch.material != lastMaterial) { - basicSprites.material->Apply(*pipelineInstance); + batch.material->Apply(*pipelineInstance); - Renderer::SetTextureSampler(overlayTextureUnit, basicSprites.material->GetDiffuseSampler()); + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); - lastMaterial = basicSprites.material; + lastMaterial = batch.material; } + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } + }; + + m_spriteBatches.clear(); + { + BufferMapper vertexMapper; + VertexStruct_XYZ_Color_UV* vertices = nullptr; + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + { const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - if (overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, overlayTexture); - lastOverlay = overlayTexture; - } + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - if (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect) + const VertexStruct_XYZ_Color_UV* spriteVertices = basicSprites.vertices; + std::size_t spriteCount = basicSprites.spriteCount; + + for (;;) { - Renderer::SetScissorRect(scissorRect); - lastScissorRect = scissorRect; + if (m_spriteBatches.empty() || basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + { + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; + + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; + } + + SpriteBatch& currentBatch = m_spriteBatches.back(); + + if (!vertices) + { + vertexMapper.Map(m_spriteBuffer, BufferAccess_DiscardAndWrite); + vertices = static_cast(vertexMapper.GetPointer()); + } + + std::size_t processedSpriteCount = std::min(remainingSprite, spriteCount); + std::size_t processedVertices = processedSpriteCount * 4; + + std::memcpy(vertices, spriteVertices, processedVertices * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += processedVertices; + spriteVertices += processedVertices; + + currentBatch.spriteCount += processedSpriteCount; + spriteCount -= processedSpriteCount; + + remainingSprite -= processedSpriteCount; + if (remainingSprite == 0) + { + vertexMapper.Unmap(); + vertices = nullptr; + + Draw(); + + remainingSprite = maxSpriteCount; + m_spriteBatches.clear(); + } + + if (spriteCount == 0) + break; } } - - m_spriteChains.emplace_back(basicSprites.vertices, basicSprites.spriteCount); } - Commit(); + Draw(); } const DeferredGeometryPass::ShaderUniforms* DeferredGeometryPass::GetShaderUniforms(const Shader* shader) const @@ -631,12 +651,12 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - s_quadIndexBuffer.Reset(false, s_maxQuads * 6, DataStorage_Hardware, 0); + s_quadIndexBuffer.Reset(true, s_maxQuadPerDraw * 6, DataStorage_Hardware, 0); BufferMapper mapper(s_quadIndexBuffer, BufferAccess_WriteOnly); - UInt16* indices = static_cast(mapper.GetPointer()); + UInt32* indices = static_cast(mapper.GetPointer()); - for (unsigned int i = 0; i < s_maxQuads; ++i) + for (UInt32 i = 0; i < s_maxQuadPerDraw; ++i) { *indices++ = i * 4 + 0; *indices++ = i * 4 + 2; diff --git a/src/Nazara/Graphics/DepthRenderTechnique.cpp b/src/Nazara/Graphics/DepthRenderTechnique.cpp index 5435d7497..531b9988a 100644 --- a/src/Nazara/Graphics/DepthRenderTechnique.cpp +++ b/src/Nazara/Graphics/DepthRenderTechnique.cpp @@ -31,8 +31,8 @@ namespace Nz Vector2f uv; }; - unsigned int s_maxQuads = std::numeric_limits::max() / 6; - unsigned int s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_maxQuadPerDraw = s_vertexBufferSize / sizeof(VertexLayout_XYZ_Color_UV); } /*! @@ -46,7 +46,7 @@ namespace Nz */ DepthRenderTechnique::DepthRenderTechnique() : - m_vertexBuffer(BufferType_Vertex) + m_vertexBuffer(BufferType_Vertex) { ErrorFlags flags(ErrorFlag_ThrowException, true); @@ -148,12 +148,12 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - s_quadIndexBuffer.Reset(false, s_maxQuads * 6, DataStorage_Hardware, 0); + s_quadIndexBuffer.Reset(true, s_maxQuadPerDraw * 6, DataStorage_Hardware, 0); BufferMapper mapper(s_quadIndexBuffer, BufferAccess_WriteOnly); - UInt16* indices = static_cast(mapper.GetPointer()); + UInt32* indices = static_cast(mapper.GetPointer()); - for (unsigned int i = 0; i < s_maxQuads; ++i) + for (UInt32 i = 0; i < s_maxQuadPerDraw; ++i) { *indices++ = i * 4 + 0; *indices++ = i * 4 + 2; @@ -486,62 +486,9 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); - Renderer::SetIndexBuffer(&s_quadIndexBuffer); - Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); - Renderer::SetVertexBuffer(&m_spriteBuffer); + const std::size_t maxSpriteCount = std::min(s_maxQuadPerDraw, m_spriteBuffer.GetVertexCount() / 4); const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); - const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - - m_spriteChains.clear(); - - auto Commit = [&]() - { - std::size_t spriteChainCount = m_spriteChains.size(); - if (spriteChainCount > 0) - { - std::size_t spriteChain = 0; // Which chain of sprites are we treating - std::size_t spriteChainOffset = 0; // Where was the last offset where we stopped in the last chain - - do - { - // We open the buffer in writing mode - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); - - std::size_t spriteCount = 0; - - do - { - const VertexStruct_XYZ_Color_UV* currentChain = m_spriteChains[spriteChain].first; - std::size_t currentChainSpriteCount = m_spriteChains[spriteChain].second; - std::size_t count = std::min(maxSpriteCount - spriteCount, currentChainSpriteCount - spriteChainOffset); - - std::memcpy(vertices, currentChain + spriteChainOffset * 4, 4 * count * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += count * 4; - - spriteCount += count; - spriteChainOffset += count; - - // Have we treated the entire chain ? - if (spriteChainOffset == currentChainSpriteCount) - { - spriteChain++; - spriteChainOffset = 0; - } - } - while (spriteCount < maxSpriteCount && spriteChain < spriteChainCount); - - vertexMapper.Unmap(); - - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, 0, spriteCount * 6); - } - while (spriteChain < spriteChainCount); - } - - m_spriteChains.clear(); - }; - const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; const Shader* lastShader = nullptr; @@ -551,18 +498,19 @@ namespace Nz const MaterialPipeline::Instance* pipelineInstance = nullptr; - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + Renderer::SetIndexBuffer(&s_quadIndexBuffer); + Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); + Renderer::SetVertexBuffer(&m_spriteBuffer); + + auto Draw = [&]() { - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - - if (basicSprites.material != lastMaterial || basicSprites.overlay != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - Commit(); - - const MaterialPipeline* pipeline = basicSprites.material->GetPipeline(); - if (lastPipeline != pipeline) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - pipelineInstance = &basicSprites.material->GetPipeline()->Apply(ShaderFlags_Deferred | ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); const Shader* shader = pipelineInstance->uberInstance->GetShader(); if (shader != lastShader) @@ -582,33 +530,105 @@ namespace Nz lastPipeline = pipeline; } - if (lastMaterial != basicSprites.material) + if (batch.material != lastMaterial) { - basicSprites.material->Apply(*pipelineInstance); + batch.material->Apply(*pipelineInstance); - Renderer::SetTextureSampler(overlayTextureUnit, basicSprites.material->GetDiffuseSampler()); + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); - lastMaterial = basicSprites.material; + lastMaterial = batch.material; } + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } + }; + + m_spriteBatches.clear(); + { + BufferMapper vertexMapper; + VertexStruct_XYZ_Color_UV* vertices = nullptr; + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + { const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - if (overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, overlayTexture); - lastOverlay = overlayTexture; - } + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - if (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect) + const VertexStruct_XYZ_Color_UV* spriteVertices = basicSprites.vertices; + std::size_t spriteCount = basicSprites.spriteCount; + + for (;;) { - Renderer::SetScissorRect(scissorRect); - lastScissorRect = scissorRect; + if (m_spriteBatches.empty() || basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + { + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; + + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; + } + + SpriteBatch& currentBatch = m_spriteBatches.back(); + + if (!vertices) + { + vertexMapper.Map(m_spriteBuffer, BufferAccess_DiscardAndWrite); + vertices = static_cast(vertexMapper.GetPointer()); + } + + std::size_t processedSpriteCount = std::min(remainingSprite, spriteCount); + std::size_t processedVertices = processedSpriteCount * 4; + + std::memcpy(vertices, spriteVertices, processedVertices * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += processedVertices; + spriteVertices += processedVertices; + + currentBatch.spriteCount += processedSpriteCount; + spriteCount -= processedSpriteCount; + + remainingSprite -= processedSpriteCount; + if (remainingSprite == 0) + { + vertexMapper.Unmap(); + vertices = nullptr; + + Draw(); + + remainingSprite = maxSpriteCount; + m_spriteBatches.clear(); + } + + if (spriteCount == 0) + break; } } - - m_spriteChains.emplace_back(basicSprites.vertices, basicSprites.spriteCount); } - Commit(); + Draw(); } /*! diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index 934d54d6d..77098ecf5 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -32,8 +32,8 @@ namespace Nz Vector2f uv; }; - UInt32 s_maxQuads = std::numeric_limits::max() / 6; - UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_maxQuadPerDraw = s_vertexBufferSize / sizeof(VertexLayout_XYZ_Color_UV); } /*! @@ -175,12 +175,12 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - s_quadIndexBuffer.Reset(false, s_maxQuads * 6, DataStorage_Hardware, 0); + s_quadIndexBuffer.Reset(true, s_maxQuadPerDraw * 6, DataStorage_Hardware, 0); BufferMapper mapper(s_quadIndexBuffer, BufferAccess_WriteOnly); - UInt16* indices = static_cast(mapper.GetPointer()); + UInt32* indices = static_cast(mapper.GetPointer()); - for (unsigned int i = 0; i < s_maxQuads; ++i) + for (UInt32 i = 0; i < s_maxQuadPerDraw; ++i) { *indices++ = i * 4 + 0; *indices++ = i * 4 + 2; @@ -618,52 +618,9 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); + const std::size_t maxSpriteCount = std::min(s_maxQuadPerDraw, m_spriteBuffer.GetVertexCount() / 4); + const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); - const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - - m_spriteBatches.clear(); - { - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); - - std::size_t remainingSprite = maxSpriteCount; - - const Material* lastMaterial = nullptr; - const Texture* lastOverlay = nullptr; - Recti lastScissorRect = Recti(-1, -1); - - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) - { - const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - if (basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) - { - m_spriteBatches.emplace_back(); - SpriteBatch& newBatch = m_spriteBatches.back(); - newBatch.material = basicSprites.material; - newBatch.overlayTexture = overlayTexture; - newBatch.scissorRect = scissorRect; - newBatch.spriteCount = 0; - - lastMaterial = basicSprites.material; - lastOverlay = overlayTexture; - lastScissorRect = scissorRect; - } - - SpriteBatch& currentBatch = m_spriteBatches.back(); - - std::size_t spriteCount = std::min(remainingSprite, basicSprites.spriteCount); - std::memcpy(vertices, basicSprites.vertices, spriteCount * 4 * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += spriteCount * 4; - - currentBatch.spriteCount += spriteCount; - - remainingSprite -= spriteCount; - if (remainingSprite == 0) - break; - } - } - const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; const Shader* lastShader = nullptr; @@ -677,59 +634,135 @@ namespace Nz Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); Renderer::SetVertexBuffer(&m_spriteBuffer); - unsigned int firstIndex = 0; - for (const auto& batch : m_spriteBatches) + auto Draw = [&]() { - const MaterialPipeline* pipeline = batch.material->GetPipeline(); - if (pipeline != lastPipeline) + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); - - const Shader* shader = pipelineInstance->uberInstance->GetShader(); - if (shader != lastShader) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - // Index of uniforms in the shader - shaderUniforms = GetShaderUniforms(shader); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); - // Ambient color of the scene - shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); - // Position of the camera - shader->SendVector(shaderUniforms->eyePosition, sceneData.viewer->GetEyePosition()); + const Shader* shader = pipelineInstance->uberInstance->GetShader(); + if (shader != lastShader) + { + // Index of uniforms in the shader + shaderUniforms = GetShaderUniforms(shader); - // Overlay texture unit - shader->SendInteger(shaderUniforms->textureOverlay, overlayTextureUnit); + // Ambient color of the scene + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); + // Position of the camera + shader->SendVector(shaderUniforms->eyePosition, sceneData.viewer->GetEyePosition()); - lastShader = shader; + // Overlay texture unit + shader->SendInteger(shaderUniforms->textureOverlay, overlayTextureUnit); + + lastShader = shader; + } + + lastPipeline = pipeline; } - lastPipeline = pipeline; - } + if (batch.material != lastMaterial) + { + batch.material->Apply(*pipelineInstance); - if (batch.material != lastMaterial) + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); + + lastMaterial = batch.material; + } + + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } + }; + + m_spriteBatches.clear(); + { + BufferMapper vertexMapper; + VertexStruct_XYZ_Color_UV* vertices = nullptr; + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) { - batch.material->Apply(*pipelineInstance); + const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); + const VertexStruct_XYZ_Color_UV* spriteVertices = basicSprites.vertices; + std::size_t spriteCount = basicSprites.spriteCount; + + for (;;) + { + if (m_spriteBatches.empty() || basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + { + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; - lastMaterial = batch.material; + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; + } + + SpriteBatch& currentBatch = m_spriteBatches.back(); + + if (!vertices) + { + vertexMapper.Map(m_spriteBuffer, BufferAccess_DiscardAndWrite); + vertices = static_cast(vertexMapper.GetPointer()); + } + + std::size_t processedSpriteCount = std::min(remainingSprite, spriteCount); + std::size_t processedVertices = processedSpriteCount * 4; + + std::memcpy(vertices, spriteVertices, processedVertices * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += processedVertices; + spriteVertices += processedVertices; + + currentBatch.spriteCount += processedSpriteCount; + spriteCount -= processedSpriteCount; + + remainingSprite -= processedSpriteCount; + if (remainingSprite == 0) + { + vertexMapper.Unmap(); + vertices = nullptr; + + Draw(); + + remainingSprite = maxSpriteCount; + m_spriteBatches.clear(); + } + + if (spriteCount == 0) + break; + } } - - if (batch.overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); - lastOverlay = batch.overlayTexture; - } - - if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) - { - Renderer::SetScissorRect(batch.scissorRect); - lastScissorRect = batch.scissorRect; - } - - unsigned int indexCount = batch.spriteCount * 6; - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); - firstIndex += indexCount; } + + Draw(); } const ForwardRenderTechnique::ShaderUniforms* ForwardRenderTechnique::GetShaderUniforms(const Shader* shader) const diff --git a/src/Nazara/Graphics/SkyboxBackground.cpp b/src/Nazara/Graphics/SkyboxBackground.cpp index 8d5723ab9..411f3d0c1 100644 --- a/src/Nazara/Graphics/SkyboxBackground.cpp +++ b/src/Nazara/Graphics/SkyboxBackground.cpp @@ -56,8 +56,6 @@ namespace Nz const Nz::RenderTarget* target = viewer->GetTarget(); Nz::Vector2ui targetSize = target->GetSize(); - Matrix4f projectionMatrix = Nz::Matrix4f::Perspective(45.f, float(targetSize.x) / targetSize.y, viewer->GetZNear(), viewer->GetZFar()); - Matrix4f skyboxMatrix(viewer->GetViewMatrix()); skyboxMatrix.SetTranslation(Vector3f::Zero()); @@ -77,7 +75,7 @@ namespace Nz world.SetTranslation(offset); Renderer::SetIndexBuffer(s_indexBuffer); - Renderer::SetMatrix(MatrixType_Projection, projectionMatrix); + Renderer::SetMatrix(MatrixType_Projection, viewer->GetProjectionMatrix()); Renderer::SetMatrix(MatrixType_View, skyboxMatrix); Renderer::SetMatrix(MatrixType_World, world); Renderer::SetRenderStates(s_renderStates); diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 8cc4961cf..f253b5539 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -30,13 +30,13 @@ namespace Nz { for (auto& pair : m_renderInfos) { - Texture* overlay = pair.first; + const RenderKey& key = pair.first; RenderIndices& indices = pair.second; if (indices.count > 0) { const VertexStruct_XYZ_Color_UV* vertices = reinterpret_cast(instanceData.data.data()); - renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(), &vertices[indices.first * 4], indices.count, scissorRect, overlay); + renderQueue->AddSprites(instanceData.renderOrder + key.renderOrder, GetMaterial(), &vertices[indices.first * 4], indices.count, scissorRect, key.texture); } } } @@ -101,15 +101,16 @@ namespace Nz } std::size_t glyphCount = drawer.GetGlyphCount(); - m_localVertices.resize(glyphCount * 4); // Reset glyph count for every texture to zero for (auto& pair : m_renderInfos) pair.second.count = 0; // Count glyph count for each texture - Texture* lastTexture = nullptr; + RenderKey lastRenderKey { nullptr, 0 }; unsigned int* count = nullptr; + + std::size_t visibleGlyphCount = 0; for (std::size_t i = 0; i < glyphCount; ++i) { const AbstractTextDrawer::Glyph& glyph = drawer.GetGlyph(i); @@ -117,19 +118,23 @@ namespace Nz continue; Texture* texture = static_cast(glyph.atlas); - if (lastTexture != texture) + RenderKey renderKey{ texture, glyph.renderOrder }; + if (lastRenderKey != renderKey) { - auto it = m_renderInfos.find(texture); + auto it = m_renderInfos.find(renderKey); if (it == m_renderInfos.end()) - it = m_renderInfos.insert(std::make_pair(texture, RenderIndices{0U, 0U})).first; + it = m_renderInfos.insert(std::make_pair(renderKey, RenderIndices{0U, 0U})).first; count = &it->second.count; - lastTexture = texture; + lastRenderKey = renderKey; } (*count)++; + visibleGlyphCount++; } + m_localVertices.resize(visibleGlyphCount * 4); + // Attributes indices and reinitialize glyph count to zero to use it as a counter in the next loop // This is because the 1st glyph can use texture A, the 2nd glyph can use texture B and the 3th glyph C can use texture A again // so we need a counter to know where to write informations @@ -140,7 +145,7 @@ namespace Nz { RenderIndices& indices = infoIt->second; if (indices.count == 0) - m_renderInfos.erase(infoIt++); //< No glyph uses this texture, remove from indices + infoIt = m_renderInfos.erase(infoIt); //< No glyph uses this texture, remove from indices else { indices.first = index; @@ -151,7 +156,7 @@ namespace Nz } } - lastTexture = nullptr; + lastRenderKey = { nullptr, 0 }; RenderIndices* indices = nullptr; for (unsigned int i = 0; i < glyphCount; ++i) { @@ -160,10 +165,11 @@ namespace Nz continue; Texture* texture = static_cast(glyph.atlas); - if (lastTexture != texture) + RenderKey renderKey{ texture, glyph.renderOrder }; + if (lastRenderKey != renderKey) { - indices = &m_renderInfos[texture]; //< We changed texture, adjust the pointer - lastTexture = texture; + indices = &m_renderInfos[renderKey]; //< We changed texture, adjust the pointer + lastRenderKey = renderKey; } // First, compute the uv coordinates from our atlas rect @@ -185,9 +191,10 @@ namespace Nz for (unsigned int j = 0; j < 4; ++j) { // Remember that indices->count is a counter here, not a count value - m_localVertices[indices->count * 4 + j].color = glyph.color; - m_localVertices[indices->count * 4 + j].position.Set(glyph.corners[j]); - m_localVertices[indices->count * 4 + j].uv.Set(uvRect.GetCorner((glyph.flipped) ? flippedCorners[j] : normalCorners[j])); + std::size_t offset = (indices->first + indices->count) * 4 + j; + m_localVertices[offset].color = glyph.color; + m_localVertices[offset].position.Set(glyph.corners[j]); + m_localVertices[offset].uv.Set(uvRect.GetCorner((glyph.flipped) ? flippedCorners[j] : normalCorners[j])); } // Increment the counter, go to next glyph @@ -208,9 +215,8 @@ namespace Nz void TextSprite::MakeBoundingVolume() const { - Rectf bounds(m_localBounds); - Vector2f max = m_scale * bounds.GetMaximum(); - Vector2f min = m_scale * bounds.GetMinimum(); + Vector2f max = m_scale * m_localBounds.GetMaximum(); + Vector2f min = m_scale * m_localBounds.GetMinimum(); m_boundingVolume.Set(min.x * Vector3f::Right() + min.y * Vector3f::Down(), max.x * Vector3f::Right() + max.y * Vector3f::Down()); } @@ -236,13 +242,12 @@ namespace Nz } /*! - * \brief Handle the invalidation of an atlas layer + * \brief Handle the size change of an atlas layer * * \param atlas Atlas being invalidated * \param oldLayer Pointer to the previous layer * \param newLayer Pointer to the new layer */ - void TextSprite::OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer) { NazaraUnused(atlas); @@ -255,33 +260,38 @@ namespace Nz } #endif + if (!oldLayer) + return; + + assert(newLayer); + // The texture of an atlas have just been recreated (size change) // we have to adjust the coordinates of the texture and the rendering texture Texture* oldTexture = static_cast(oldLayer); Texture* newTexture = static_cast(newLayer); - // It is possible that we don't use the texture (the atlas warning us for each of its layers) - auto it = m_renderInfos.find(oldTexture); - if (it != m_renderInfos.end()) + Vector2ui oldSize(oldTexture->GetSize()); + Vector2ui newSize(newTexture->GetSize()); + Vector2f scale = Vector2f(oldSize) / Vector2f(newSize); // ratio of the old one to the new one + + // It is possible we actually use that texture multiple times, check them all + for (auto it = m_renderInfos.begin(); it != m_renderInfos.end(); ++it) { - // We indeed use this texture, we have to update its coordinates - RenderIndices indices = std::move(it->second); + const RenderKey& renderKey = it->first; + const RenderIndices& indices = it->second; - Vector2ui oldSize(oldTexture->GetSize()); - Vector2ui newSize(newTexture->GetSize()); - Vector2f scale = Vector2f(oldSize) / Vector2f(newSize); // ratio of the old one to the new one - - // Now we will iterate through each coordinates of the concerned texture to multiply them by the ratio - SparsePtr texCoordPtr(&m_localVertices[indices.first].uv, sizeof(VertexStruct_XYZ_Color_UV)); + // Adjust texture coordinates by size ratio + SparsePtr texCoordPtr(&m_localVertices[indices.first].uv, sizeof(VertexStruct_XY_Color_UV)); for (unsigned int i = 0; i < indices.count; ++i) { for (unsigned int j = 0; j < 4; ++j) - m_localVertices[i*4 + j].uv *= scale; + m_localVertices[i * 4 + j].uv *= scale; } - // We get rid off the old texture and we set the new one at the place (same for indices) + // Erase and re-insert with the new texture handle m_renderInfos.erase(it); - m_renderInfos.insert(std::make_pair(newTexture, std::move(indices))); + m_renderInfos.insert(std::make_pair(RenderKey{ newTexture, renderKey.renderOrder }, indices)); + it = m_renderInfos.begin(); //< std::unordered_map::insert may invalidate all iterators, start from the beginning... } } diff --git a/src/Nazara/Lua/LuaInstance.cpp b/src/Nazara/Lua/LuaInstance.cpp index 85567df81..eb9e4e48f 100644 --- a/src/Nazara/Lua/LuaInstance.cpp +++ b/src/Nazara/Lua/LuaInstance.cpp @@ -63,7 +63,7 @@ namespace Nz void LuaInstance::LoadLibraries(LuaLibFlags libFlags) { // From luaL_openlibs - std::array libs; + std::array libs; std::size_t libCount = 0; libs[libCount++] = { "_G", luaopen_base }; diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index c5c599b5b..04119a330 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -541,6 +541,7 @@ namespace Nz { peer->m_address = m_receivedAddress; peer->m_incomingDataTotal += UInt32(m_receivedDataLength); + peer->m_totalByteReceived += UInt32(m_receivedDataLength); } auto commandError = [&]() -> bool @@ -657,6 +658,10 @@ namespace Nz return commandError(); } + m_totalReceivedPackets++; + if (peer) + peer->m_totalPacketReceived++; + if (peer && (command->header.command & ENetProtocolFlag_Acknowledge) != 0) { UInt16 sentTime; @@ -750,7 +755,6 @@ namespace Nz m_receivedDataLength = receivedLength; m_totalReceivedData += receivedLength; - m_totalReceivedPackets++; // Intercept @@ -886,6 +890,7 @@ namespace Nz canPing = false; + assert((outgoingCommand->command.header.command & ENetProtocolCommand_Mask) < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->GetMtu() - m_packetSize < commandSize || (outgoingCommand->packet && UInt16(peer->GetMtu() - m_packetSize) < UInt16(commandSize + outgoingCommand->fragmentLength))) @@ -1138,6 +1143,7 @@ namespace Nz { auto outgoingCommand = currentCommand; + assert((outgoingCommand->command.header.command & ENetProtocolCommand_Mask) < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->m_mtu - m_packetSize < commandSize || @@ -1351,6 +1357,7 @@ namespace Nz std::size_t ENetHost::GetCommandSize(UInt8 commandNumber) { + assert((commandNumber & ENetProtocolCommand_Mask) < ENetProtocolCommand_Count); return s_commandSizes[commandNumber & ENetProtocolCommand_Mask]; } diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index 823eaaf18..294585631 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -163,6 +163,9 @@ namespace Nz m_incomingUnsequencedGroup = 0; m_outgoingUnsequencedGroup = 0; m_eventData = 0; + m_totalByteReceived = 0; + m_totalByteSent = 0; + m_totalPacketReceived = 0; m_totalPacketLost = 0; m_totalPacketSent = 0; m_totalWaitingData = 0; @@ -1085,6 +1088,7 @@ namespace Nz acknowledgment.sentTime = sentTime; m_outgoingDataTotal += sizeof(Acknowledgement); + m_totalByteSent += sizeof(Acknowledgement); m_acknowledgements.emplace_back(acknowledgment); @@ -1265,7 +1269,10 @@ namespace Nz void ENetPeer::SetupOutgoingCommand(OutgoingCommand& outgoingCommand) { - m_outgoingDataTotal += static_cast(ENetHost::GetCommandSize(outgoingCommand.command.header.command) + outgoingCommand.fragmentLength); + UInt32 commandSize = static_cast(ENetHost::GetCommandSize(outgoingCommand.command.header.command) + outgoingCommand.fragmentLength); + + m_outgoingDataTotal += commandSize; + m_totalByteSent += commandSize; if (outgoingCommand.command.header.channelID == 0xFF) { diff --git a/src/Nazara/Network/Posix/IpAddressImpl.cpp b/src/Nazara/Network/Posix/IpAddressImpl.cpp index d00d58068..4abaaee94 100644 --- a/src/Nazara/Network/Posix/IpAddressImpl.cpp +++ b/src/Nazara/Network/Posix/IpAddressImpl.cpp @@ -63,7 +63,7 @@ namespace Nz IpAddress::IPv6 ipv6; for (unsigned int i = 0; i < 8; ++i) - ipv6[i] = rawIpV6[i * 2] << 8 | rawIpV6[i * 2 + 1]; + ipv6[i] = Nz::UInt16(rawIpV6[i * 2]) << 8 | rawIpV6[i * 2 + 1]; return ipv6; } diff --git a/src/Nazara/Network/Win32/IpAddressImpl.cpp b/src/Nazara/Network/Win32/IpAddressImpl.cpp index 853dae840..38da48b4b 100644 --- a/src/Nazara/Network/Win32/IpAddressImpl.cpp +++ b/src/Nazara/Network/Win32/IpAddressImpl.cpp @@ -157,7 +157,7 @@ namespace Nz IpAddress::IPv6 ipv6; for (unsigned int i = 0; i < 8; ++i) - ipv6[i] = rawIpV6[i * 2] << 8 | rawIpV6[i * 2 + 1]; + ipv6[i] = Nz::UInt16(rawIpV6[i * 2]) << 8 | rawIpV6[i * 2 + 1]; return IpAddress(ipv6, ntohs(addressv6->sin6_port)); } diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 75f5fe332..16587a092 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -3,14 +3,81 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include +#include #include -#include +#include +#include +#include namespace Nz { Collider2D::~Collider2D() = default; + void Collider2D::ForEachPolygon(const std::function& callback) const + { + // Currently, the only way to get only the polygons of a shape is to create a temporary cpSpace containing only this shape + // A better way to do this would be to reimplement this function in every subclass type in the very same way chipmunk does + + PhysWorld2D physWorld; + RigidBody2D rigidBody(&physWorld, 0.f); + + std::vector shapeVector; + rigidBody.SetGeom(const_cast(this), false, false); //< Won't be used for writing, but still ugly + + PhysWorld2D::DebugDrawOptions drawCallbacks; + drawCallbacks.circleCallback = [&](const Vector2f& origin, const RadianAnglef& /*rotation*/, float radius, Nz::Color /*outlineColor*/, Nz::Color /*fillColor*/, void* /*userData*/) + { + constexpr std::size_t circleVerticesCount = 20; + + std::array vertices; + + RadianAnglef angleBetweenVertices = 2.f * float(M_PI) / vertices.size(); + for (std::size_t i = 0; i < vertices.size(); ++i) + { + RadianAnglef angle = float(i) * angleBetweenVertices; + std::pair sincos = angle.GetSinCos(); + + vertices[i] = origin + Vector2f(radius * sincos.first, radius * sincos.second); + } + + callback(vertices.data(), vertices.size()); + }; + + drawCallbacks.polygonCallback = [&](const Vector2f* vertices, std::size_t vertexCount, float radius, Nz::Color /*outlineColor*/, Nz::Color /*fillColor*/, void* /*userData*/) + { + //TODO: Handle radius + callback(vertices, vertexCount); + }; + + drawCallbacks.segmentCallback = [&](const Vector2f& first, const Vector2f& second, Nz::Color /*color*/, void* /*userData*/) + { + std::array vertices = { first, second }; + + callback(vertices.data(), vertices.size()); + }; + + drawCallbacks.thickSegmentCallback = [&](const Vector2f& first, const Vector2f& second, float thickness, Nz::Color /*outlineColor*/, Nz::Color /*fillColor*/, void* /*userData*/) + { + static std::pair sincos = Nz::DegreeAnglef(90.f).GetSinCos(); + + Vector2f normal = Vector2f::Normalize(second - first); + Vector2f thicknessNormal(sincos.second * normal.x - sincos.first * normal.y, + sincos.first * normal.x + sincos.second * normal.y); + + std::array vertices; + vertices[0] = first + thickness * thicknessNormal; + vertices[1] = first - thickness * thicknessNormal; + vertices[2] = second - thickness * thicknessNormal; + vertices[3] = second + thickness * thicknessNormal; + + callback(vertices.data(), vertices.size()); + }; + + physWorld.DebugDraw(drawCallbacks, true, false, false); + } + std::size_t Collider2D::GenerateShapes(RigidBody2D* body, std::vector* shapes) const { std::size_t shapeCount = CreateShapes(body, shapes); @@ -75,7 +142,7 @@ namespace Nz Nz::Vector2f CircleCollider2D::ComputeCenterOfMass() const { - return m_offset + Nz::Vector2f(m_radius, m_radius); + return m_offset; } float CircleCollider2D::ComputeMomentOfInertia(float mass) const @@ -231,7 +298,10 @@ namespace Nz std::size_t SegmentCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes->push_back(cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness)); + cpShape* segment = cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness); + cpSegmentShapeSetNeighbors(segment, cpv(m_firstNeighbor.x, m_firstNeighbor.y), cpv(m_secondNeighbor.x, m_secondNeighbor.y)); + + shapes->push_back(segment); return 1; } } diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 7383510f8..0296558ec 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -205,6 +205,27 @@ namespace Nz } } + void PhysWorld2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + using CallbackType = const std::function; + + auto cpCallback = [](cpShape* shape, cpVect point, cpVect normal, cpFloat alpha, void* data) + { + CallbackType& callback = *static_cast(data); + + RaycastHit hitInfo; + hitInfo.fraction = float(alpha); + hitInfo.hitNormal.Set(Nz::Vector2(normal.x, normal.y)); + hitInfo.hitPos.Set(Nz::Vector2(point.x, point.y)); + hitInfo.nearestBody = static_cast(cpShapeGetUserData(shape)); + + callback(hitInfo); + }; + + cpShapeFilter filter = cpShapeFilterNew(collisionGroup, categoryMask, collisionMask); + cpSpaceSegmentQuery(m_handle, { from.x, from.y }, { to.x, to.y }, radius, filter, cpCallback, const_cast(static_cast(&callback))); + } + bool PhysWorld2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos) { using ResultType = decltype(hitInfos); @@ -259,6 +280,20 @@ namespace Nz } } + void PhysWorld2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + using CallbackType = const std::function; + + auto cpCallback = [](cpShape* shape, void* data) + { + CallbackType& callback = *static_cast(data); + callback(static_cast(cpShapeGetUserData(shape))); + }; + + cpShapeFilter filter = cpShapeFilterNew(collisionGroup, categoryMask, collisionMask); + cpSpaceBBQuery(m_handle, cpBBNew(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.width, boundingBox.y + boundingBox.height), filter, cpCallback, const_cast(static_cast(&callback))); + } + void PhysWorld2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) { using ResultType = decltype(bodies); @@ -273,14 +308,14 @@ namespace Nz cpSpaceBBQuery(m_handle, cpBBNew(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.width, boundingBox.y + boundingBox.height), filter, callback, bodies); } - void PhysWorld2D::RegisterCallbacks(unsigned int collisionId, const Callback& callbacks) + void PhysWorld2D::RegisterCallbacks(unsigned int collisionId, Callback callbacks) { - InitCallbacks(cpSpaceAddWildcardHandler(m_handle, collisionId), callbacks); + InitCallbacks(cpSpaceAddWildcardHandler(m_handle, collisionId), std::move(callbacks)); } - void PhysWorld2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks) + void PhysWorld2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks) { - InitCallbacks(cpSpaceAddCollisionHandler(m_handle, collisionIdA, collisionIdB), callbacks); + InitCallbacks(cpSpaceAddCollisionHandler(m_handle, collisionIdA, collisionIdB), std::move(callbacks)); } void PhysWorld2D::SetDamping(float dampingValue) @@ -303,6 +338,14 @@ namespace Nz m_maxStepCount = maxStepCount; } + void PhysWorld2D::SetSleepTime(float sleepTime) + { + if (sleepTime > 0) + cpSpaceSetSleepTimeThreshold(m_handle, cpFloat(sleepTime)); + else + cpSpaceSetSleepTimeThreshold(m_handle, std::numeric_limits::infinity()); + } + void PhysWorld2D::SetStepSize(float stepSize) { m_stepSize = stepSize; @@ -341,15 +384,20 @@ namespace Nz cpSpaceUseSpatialHash(m_handle, cpFloat(cellSize), int(entityCount)); } - void PhysWorld2D::InitCallbacks(cpCollisionHandler* handler, const Callback& callbacks) + void PhysWorld2D::InitCallbacks(cpCollisionHandler* handler, Callback callbacks) { - auto it = m_callbacks.emplace(handler, std::make_unique(callbacks)).first; + auto it = m_callbacks.find(handler); + if (it == m_callbacks.end()) + it = m_callbacks.emplace(handler, std::make_unique(std::move(callbacks))).first; + else + it->second = std::make_unique(std::move(callbacks)); - handler->userData = it->second.get(); + Callback* callbackFunctions = it->second.get(); + handler->userData = callbackFunctions; - if (callbacks.startCallback) + if (callbackFunctions->startCallback) { - handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void *data) -> cpBool + handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool { cpBody* firstBody; cpBody* secondBody; @@ -363,19 +411,22 @@ namespace Nz const Callback* customCallbacks = static_cast(data); if (customCallbacks->startCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) - { - cpBool retA = cpArbiterCallWildcardBeginA(arb, space); - cpBool retB = cpArbiterCallWildcardBeginB(arb, space); - return retA && retB; - } + return cpTrue; else return cpFalse; }; } - - if (callbacks.endCallback) + else { - handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void *data) + handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool + { + return cpTrue; + }; + } + + if (callbackFunctions->endCallback) + { + handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void* data) { cpBody* firstBody; cpBody* secondBody; @@ -389,15 +440,18 @@ namespace Nz const Callback* customCallbacks = static_cast(data); customCallbacks->endCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); - - cpArbiterCallWildcardSeparateA(arb, space); - cpArbiterCallWildcardSeparateB(arb, space); + }; + } + else + { + handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*) + { }; } - if (callbacks.preSolveCallback) + if (callbackFunctions->preSolveCallback) { - handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void *data) -> cpBool + handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool { cpBody* firstBody; cpBody* secondBody; @@ -411,17 +465,20 @@ namespace Nz const Callback* customCallbacks = static_cast(data); if (customCallbacks->preSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) - { - cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space); - cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space); - return retA && retB; - } + return cpTrue; else return cpFalse; }; } + else + { + handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool + { + return cpTrue; + }; + } - if (callbacks.postSolveCallback) + if (callbackFunctions->postSolveCallback) { handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void *data) { @@ -437,9 +494,12 @@ namespace Nz const Callback* customCallbacks = static_cast(data); customCallbacks->postSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); - - cpArbiterCallWildcardPostSolveA(arb, space); - cpArbiterCallWildcardPostSolveB(arb, space); + }; + } + else + { + handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) + { }; } } diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index cc181930f..1e3835bdd 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -19,6 +19,7 @@ namespace Nz } RigidBody2D::RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom) : + m_positionOffset(Vector2f::Zero()), m_geom(), m_userData(nullptr), m_world(world), @@ -35,6 +36,7 @@ namespace Nz } RigidBody2D::RigidBody2D(const RigidBody2D& object) : + m_positionOffset(object.m_positionOffset), m_geom(object.m_geom), m_userData(object.m_userData), m_world(object.m_world), @@ -59,9 +61,10 @@ namespace Nz } } - RigidBody2D::RigidBody2D(RigidBody2D&& object) : + RigidBody2D::RigidBody2D(RigidBody2D&& object) noexcept : OnRigidBody2DMove(std::move(object.OnRigidBody2DMove)), OnRigidBody2DRelease(std::move(object.OnRigidBody2DRelease)), + m_positionOffset(std::move(object.m_positionOffset)), m_shapes(std::move(object.m_shapes)), m_geom(std::move(object.m_geom)), m_handle(object.m_handle), @@ -191,6 +194,15 @@ namespace Nz cpBodyEachArbiter(m_handle, RealCallback, &callback); } + void RigidBody2D::ForceSleep() + { + m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) + { + if (cpBodyGetType(body->GetHandle()) == CP_BODY_TYPE_DYNAMIC) + cpBodySleep(body->GetHandle()); + }); + } + Rectf RigidBody2D::GetAABB() const { if (m_shapes.empty()) @@ -260,7 +272,7 @@ namespace Nz Vector2f RigidBody2D::GetPosition() const { - cpVect pos = cpBodyGetPosition(m_handle); + cpVect pos = cpBodyLocalToWorld(m_handle, cpv(-m_positionOffset.x, -m_positionOffset.y)); return Vector2f(static_cast(pos.x), static_cast(pos.y)); } @@ -467,7 +479,8 @@ namespace Nz void RigidBody2D::SetPosition(const Vector2f& position) { - cpBodySetPosition(m_handle, cpv(position.x, position.y)); + // Use cpTransformVect to rotate/scale the position offset + cpBodySetPosition(m_handle, cpvadd(cpv(position.x, position.y), cpTransformVect(m_handle->transform, cpv(m_positionOffset.x, m_positionOffset.y)))); if (m_isStatic) { m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) @@ -477,6 +490,13 @@ namespace Nz } } + void RigidBody2D::SetPositionOffset(const Vector2f& offset) + { + Nz::Vector2f position = GetPosition(); + m_positionOffset = offset; + SetPosition(position); + } + void RigidBody2D::SetRotation(const RadianAnglef& rotation) { cpBodySetAngle(m_handle, rotation.value); @@ -553,6 +573,17 @@ namespace Nz cpBodyUpdateVelocity(m_handle, cpv(gravity.x, gravity.y), damping, deltaTime); } + void RigidBody2D::Wakeup() + { + m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) + { + if (cpBodyGetType(body->GetHandle()) != CP_BODY_TYPE_STATIC) + cpBodyActivate(body->GetHandle()); + else + cpBodyActivateStatic(body->GetHandle(), nullptr); + }); + } + RigidBody2D& RigidBody2D::operator=(const RigidBody2D& object) { RigidBody2D physObj(object); @@ -573,6 +604,7 @@ namespace Nz m_geom = std::move(object.m_geom); m_gravityFactor = object.m_gravityFactor; m_mass = object.m_mass; + m_positionOffset = object.m_positionOffset; m_shapes = std::move(object.m_shapes); m_userData = object.m_userData; m_velocityFunc = std::move(object.m_velocityFunc); @@ -653,13 +685,16 @@ namespace Nz void RigidBody2D::CopyBodyData(cpBody* from, cpBody* to) { + cpBodySetCenterOfGravity(to, cpBodyGetCenterOfGravity(from)); + cpBodySetAngle(to, cpBodyGetAngle(from)); cpBodySetAngularVelocity(to, cpBodyGetAngularVelocity(from)); - cpBodySetCenterOfGravity(to, cpBodyGetCenterOfGravity(from)); cpBodySetForce(to, cpBodyGetForce(from)); cpBodySetPosition(to, cpBodyGetPosition(from)); cpBodySetTorque(to, cpBodyGetTorque(from)); cpBodySetVelocity(to, cpBodyGetVelocity(from)); + + cpBodySetType(to, cpBodyGetType(from)); } void RigidBody2D::CopyShapeData(cpShape* from, cpShape* to) diff --git a/src/Nazara/Physics3D/Collider3D.cpp b/src/Nazara/Physics3D/Collider3D.cpp index 4dc2f6821..be7ceb6be 100644 --- a/src/Nazara/Physics3D/Collider3D.cpp +++ b/src/Nazara/Physics3D/Collider3D.cpp @@ -114,12 +114,14 @@ namespace Nz return volume; } - void Collider3D::ForEachPolygon(const std::function& callback) const + void Collider3D::ForEachPolygon(const std::function& callback) const { auto newtCallback = [](void* const userData, int vertexCount, const dFloat* const faceArray, int /*faceId*/) { + static_assert(sizeof(Vector3f) == 3 * sizeof(float), "Vector3 is expected to contain 3 floats without padding"); + const auto& cb = *static_cast>(userData); - cb(faceArray, vertexCount); + cb(reinterpret_cast(faceArray), vertexCount); }; // Check for existing collision handles, and create a temporary one if none is available diff --git a/src/Nazara/Physics3D/RigidBody3D.cpp b/src/Nazara/Physics3D/RigidBody3D.cpp index ea6e58621..c18055f56 100644 --- a/src/Nazara/Physics3D/RigidBody3D.cpp +++ b/src/Nazara/Physics3D/RigidBody3D.cpp @@ -444,6 +444,6 @@ namespace Nz NazaraUnused(threadIndex); RigidBody3D* me = static_cast(NewtonBodyGetUserData(body)); - me->m_matrix.Set(matrix); + me->m_matrix = matrix; } } diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index ad381c8f8..ad9168d9c 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -4,8 +4,8 @@ // Un grand merci à Laurent Gomila pour la SFML qui m'aura bien aidé à réaliser cette implémentation -#include -#include +#include +#include #include #include #include @@ -19,6 +19,8 @@ #include #include #include +#include +#include #ifdef _WIN64 #define GCL_HCURSOR GCLP_HCURSOR @@ -61,7 +63,7 @@ namespace Nz bool async = (style & WindowStyle_Threaded) != 0; bool fullscreen = (style & WindowStyle_Fullscreen) != 0; DWORD win32Style, win32StyleEx; - unsigned int x, y; + int x, y; unsigned int width = mode.width; unsigned int height = mode.height; if (fullscreen) @@ -117,8 +119,13 @@ namespace Nz width = rect.right - rect.left; height = rect.bottom - rect.top; - x = (GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (GetSystemMetrics(SM_CYSCREEN) - height) / 2; + // Grab desktop rect in order to center our window on the main display + // TODO: Handle multiple displays + RECT desktopRect; + GetClientRect(GetDesktopWindow(), &desktopRect); + + x = (desktopRect.right / 2) - (width / 2); + y = (desktopRect.bottom / 2) - (height / 2); } m_callback = 0; @@ -709,6 +716,10 @@ namespace Nz WindowEvent event; event.type = WindowEventType_MouseWheelMoved; event.mouseWheel.delta = static_cast(GET_WHEEL_DELTA_WPARAM(wParam)) / WHEEL_DELTA; + + event.mouseWheel.x = GET_X_LPARAM(lParam); + event.mouseWheel.y = GET_Y_LPARAM(lParam); + m_parent->PushEvent(event); } else @@ -719,6 +730,10 @@ namespace Nz WindowEvent event; event.type = WindowEventType_MouseWheelMoved; event.mouseWheel.delta = static_cast(m_scrolling / WHEEL_DELTA); + + event.mouseWheel.x = GET_X_LPARAM(lParam); + event.mouseWheel.y = GET_Y_LPARAM(lParam); + m_parent->PushEvent(event); m_scrolling %= WHEEL_DELTA; @@ -928,6 +943,9 @@ namespace Nz bool WindowImpl::Initialize() { + if (!SetProcessDpiAware()) + NazaraWarning("failed to make process DPI-aware"); + // Nous devons faire un type Unicode pour que la fenêtre le soit également // http://msdn.microsoft.com/en-us/library/windows/desktop/ms633574(v=vs.85).aspx WNDCLASSW windowClass; @@ -950,6 +968,50 @@ namespace Nz UnregisterClassW(className, GetModuleHandle(nullptr)); } + bool WindowImpl::SetProcessDpiAware() + { + // MSDN : https://docs.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process + // This will work only for windows Vista & above + + HINSTANCE shcoreLib = LoadLibraryW(L"SHCore.dll"); + if (shcoreLib) + { + CallOnExit closeLibOnExit([&] { FreeLibrary(shcoreLib); }); + + /// shellscalingapi.h + enum PROCESS_DPI_AWARENESS + { + PROCESS_DPI_UNAWARE, + PROCESS_SYSTEM_DPI_AWARE, + PROCESS_PER_MONITOR_DPI_AWARE + }; + + using SetProcessDpiAwarenessFunc = HRESULT (WINAPI*)(PROCESS_DPI_AWARENESS); + auto SetProcessDpiAwareness = reinterpret_cast(GetProcAddress(shcoreLib, "SetProcessDpiAwareness")); + + if (SetProcessDpiAwareness) + { + HRESULT result = SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE); + + if (result == S_OK || result == E_ACCESSDENIED) //< E_ACCESSDENIED means it has already been set, probably by the .exe manifest + return true; + } + } + + // If SetProcessDpiAwareness doesn't exist, we call old user32 function + HMODULE user32 = GetModuleHandleW(L"user32.dll"); + if (!user32) + return false; //< Shouldn't happen as user32 is linked + + using SetProcessDPIAwareFunc = BOOL (WINAPI*)(); + auto SetProcessDPIAware = reinterpret_cast(GetProcAddress(user32, "SetProcessDPIAware")); + + if (!SetProcessDPIAware || !SetProcessDPIAware()) + return false; + + return true; + } + Keyboard::Key WindowImpl::ConvertVirtualKey(WPARAM key, LPARAM flags) { switch (key) diff --git a/src/Nazara/Platform/Win32/WindowImpl.hpp b/src/Nazara/Platform/Win32/WindowImpl.hpp index e05a86fdf..668108032 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.hpp +++ b/src/Nazara/Platform/Win32/WindowImpl.hpp @@ -84,6 +84,8 @@ namespace Nz bool HandleMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam); void PrepareWindow(bool fullscreen); + static bool SetProcessDpiAware(); + static Keyboard::Key ConvertVirtualKey(WPARAM key, LPARAM flags); static LRESULT CALLBACK MessageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam); static UInt32 RetrieveStyle(HWND window); diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 06ebc251d..3d023993c 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -233,19 +233,19 @@ namespace Nz break; case ShaderAst::ExpressionType::Float1: - Append(String::Format("%F", node.values.vec1)); + Append(String::Number(node.values.vec1)); break; case ShaderAst::ExpressionType::Float2: - Append(String::Format("vec2(%F, %F)", node.values.vec2.x, node.values.vec2.y)); + Append("vec2(" + String::Number(node.values.vec2.x) + ", " + String::Number(node.values.vec2.y) + ")"); break; case ShaderAst::ExpressionType::Float3: - Append(String::Format("vec3(%F, %F, %F)", node.values.vec3.x, node.values.vec3.y, node.values.vec3.z)); + Append("vec3(" + String::Number(node.values.vec3.x) + ", " + String::Number(node.values.vec3.y) + ", " + String::Number(node.values.vec3.z) + ")"); break; case ShaderAst::ExpressionType::Float4: - Append(String::Format("vec4(%F, %F, %F, %F)", node.values.vec4.x, node.values.vec4.y, node.values.vec4.z, node.values.vec4.w)); + Append("vec4(" + String::Number(node.values.vec4.x) + ", " + String::Number(node.values.vec4.y) + ", " + String::Number(node.values.vec4.z) + ", " + String::Number(node.values.vec4.z) + ")"); break; default: diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index 483f60709..a03dc558a 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -54,12 +54,6 @@ namespace Nz Create(type, format, width, height, depth, levelCount); } - Texture::Texture(const Image* image) - { - ErrorFlags flags(ErrorFlag_ThrowException); - LoadFromImage(image); - } - Texture::~Texture() { OnTextureRelease(this); diff --git a/src/Nazara/Renderer/TextureSampler.cpp b/src/Nazara/Renderer/TextureSampler.cpp index 4f1f9233f..3d24e5d1d 100644 --- a/src/Nazara/Renderer/TextureSampler.cpp +++ b/src/Nazara/Renderer/TextureSampler.cpp @@ -389,5 +389,5 @@ namespace Nz UInt8 TextureSampler::s_defaultAnisotropyLevel = 1; SamplerFilter TextureSampler::s_defaultFilterMode = SamplerFilter_Trilinear; - SamplerWrap TextureSampler::s_defaultWrapMode = SamplerWrap_Repeat; + SamplerWrap TextureSampler::s_defaultWrapMode = SamplerWrap_Clamp; } diff --git a/src/Nazara/Renderer/Win32/ContextImpl.cpp b/src/Nazara/Renderer/Win32/ContextImpl.cpp index 9c50faabd..fa975747d 100644 --- a/src/Nazara/Renderer/Win32/ContextImpl.cpp +++ b/src/Nazara/Renderer/Win32/ContextImpl.cpp @@ -67,17 +67,17 @@ namespace Nz UINT numFormats; int attributes[] = { - WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, - WGL_SUPPORT_OPENGL_ARB, GL_TRUE, - WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, - WGL_COLOR_BITS_ARB, (parameters.bitsPerPixel == 32) ? 24 : parameters.bitsPerPixel, - WGL_ALPHA_BITS_ARB, (parameters.bitsPerPixel == 32) ? 8 : 0, - WGL_DEPTH_BITS_ARB, parameters.depthBits, - WGL_STENCIL_BITS_ARB, parameters.stencilBits, - WGL_DOUBLE_BUFFER_ARB, (parameters.doubleBuffered) ? GL_TRUE : GL_FALSE, - WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, - WGL_SAMPLES_ARB, parameters.antialiasingLevel, - 0, 0 + WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, + WGL_SUPPORT_OPENGL_ARB, GL_TRUE, + WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, + WGL_COLOR_BITS_ARB, (parameters.bitsPerPixel == 32) ? 24 : parameters.bitsPerPixel, + WGL_ALPHA_BITS_ARB, (parameters.bitsPerPixel == 32) ? 8 : 0, + WGL_DEPTH_BITS_ARB, parameters.depthBits, + WGL_STENCIL_BITS_ARB, parameters.stencilBits, + WGL_DOUBLE_BUFFER_ARB, (parameters.doubleBuffered) ? GL_TRUE : GL_FALSE, + WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, + WGL_SAMPLES_ARB, parameters.antialiasingLevel, + 0, 0 }; do diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 731557628..a61311fb0 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -13,8 +13,8 @@ namespace Nz { namespace { - const UInt8 r_cabinRegular[] = { - #include + const UInt8 r_sansationRegular[] = { + #include }; } @@ -109,7 +109,7 @@ namespace Nz } } - bool Font::ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* glyph) const + bool Font::ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* glyph) const { #if NAZARA_UTILITY_SAFE if (!IsValid()) @@ -119,7 +119,7 @@ namespace Nz } #endif - return m_data->ExtractGlyph(characterSize, character, style, glyph); + return m_data->ExtractGlyph(characterSize, character, style, outlineThickness, glyph); } const std::shared_ptr& Font::GetAtlas() const @@ -127,9 +127,9 @@ namespace Nz return m_atlas; } - std::size_t Font::GetCachedGlyphCount(unsigned int characterSize, UInt32 style) const + std::size_t Font::GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const { - UInt64 key = ComputeKey(characterSize, style); + UInt64 key = ComputeKey(characterSize, style, outlineThickness); auto it = m_glyphes.find(key); if (it == m_glyphes.end()) return 0; @@ -169,28 +169,27 @@ namespace Nz } #endif - // On utilise un cache car la méthode interne QueryKerning peut se révéler coûteuse (car pouvant induire un changement de taille) + // Use a cache as QueryKerning may be costly (may induce an internal size change) auto& map = m_kerningCache[characterSize]; - UInt64 key = (static_cast(first) << 32) | second; // Combinaison de deux caractères 32 bits dans un nombre 64 bits + UInt64 key = (static_cast(first) << 32) | second; auto it = map.find(key); if (it == map.end()) { - // Absent du cache: on va demander l'information à la police int kerning = m_data->QueryKerning(characterSize, first, second); map.insert(std::make_pair(key, kerning)); return kerning; } else - return it->second; // Présent dans le cache, tout va bien + return it->second; } - const Font::Glyph& Font::GetGlyph(unsigned int characterSize, UInt32 style, char32_t character) const + const Font::Glyph& Font::GetGlyph(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const { - UInt64 key = ComputeKey(characterSize, style); - return PrecacheGlyph(m_glyphes[key], characterSize, style, character); + UInt64 key = ComputeKey(characterSize, style, outlineThickness); + return PrecacheGlyph(m_glyphes[key], characterSize, style, outlineThickness, character); } unsigned int Font::GetGlyphBorder() const @@ -224,11 +223,11 @@ namespace Nz sizeInfo.underlineThickness = m_data->QueryUnderlineThickness(characterSize); FontGlyph glyph; - if (m_data->ExtractGlyph(characterSize, ' ', TextStyle_Regular, &glyph)) + if (m_data->ExtractGlyph(characterSize, ' ', TextStyle_Regular, 0.f, &glyph)) sizeInfo.spaceAdvance = glyph.advance; else { - NazaraWarning("Failed to extract space character from font, using half the size"); + NazaraWarning("Failed to extract space character from font, using half the character size"); sizeInfo.spaceAdvance = characterSize/2; } @@ -256,13 +255,13 @@ namespace Nz return m_data != nullptr; } - bool Font::Precache(unsigned int characterSize, UInt32 style, char32_t character) const + bool Font::Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const { - UInt64 key = ComputeKey(characterSize, style); - return PrecacheGlyph(m_glyphes[key], characterSize, style, character).valid; + UInt64 key = ComputeKey(characterSize, style, outlineThickness); + return PrecacheGlyph(m_glyphes[key], characterSize, style, outlineThickness, character).valid; } - bool Font::Precache(unsigned int characterSize, UInt32 style, const String& characterSet) const + bool Font::Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, const String& characterSet) const { ///TODO: Itération UTF-8 => UTF-32 sans allocation de buffer (Exposer utf8cpp ?) std::u32string set = characterSet.GetUtf32String(); @@ -272,10 +271,10 @@ namespace Nz return false; } - UInt64 key = ComputeKey(characterSize, style); + UInt64 key = ComputeKey(characterSize, style, outlineThickness); auto& glyphMap = m_glyphes[key]; for (char32_t character : set) - PrecacheGlyph(glyphMap, characterSize, style, character); + PrecacheGlyph(glyphMap, characterSize, style, outlineThickness, character); return true; } @@ -317,13 +316,7 @@ namespace Nz { if (m_minimumStepSize != minimumStepSize) { - #if NAZARA_UTILITY_SAFE - if (minimumStepSize == 0) - { - NazaraError("Minimum step size cannot be zero as it implies division by zero"); - return; - } - #endif + NazaraAssert(minimumStepSize != 0, "Minimum step size cannot be zero"); m_minimumStepSize = minimumStepSize; ClearGlyphCache(); @@ -343,7 +336,7 @@ namespace Nz if (!s_defaultFont) { - s_defaultFont = Font::OpenFromMemory(r_cabinRegular, sizeof(r_cabinRegular)); + s_defaultFont = Font::OpenFromMemory(r_sansationRegular, sizeof(r_sansationRegular)); if (!s_defaultFont) NazaraError("Failed to open default font"); } @@ -399,21 +392,21 @@ namespace Nz s_defaultMinimumStepSize = minimumStepSize; } - UInt64 Font::ComputeKey(unsigned int characterSize, UInt32 style) const + UInt64 Font::ComputeKey(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const { - // On prend le pas en compte - UInt64 sizePart = static_cast((characterSize/m_minimumStepSize)*m_minimumStepSize); - - // Ainsi que le style (uniquement le gras et l'italique, les autres sont gérés par un TextDrawer) - UInt64 stylePart = 0; + // Adjust size to step size + UInt64 sizeStylePart = static_cast((characterSize/m_minimumStepSize)*m_minimumStepSize); + sizeStylePart = std::min(sizeStylePart, Nz::IntegralPow(2, 30)); //< 2^30 should be more than enough as a max size + sizeStylePart <<= 2; + // Store bold and italic flags (other style are handled directly by a TextDrawer) if (style & TextStyle_Bold) - stylePart |= TextStyle_Bold; + sizeStylePart |= 1 << 0; if (style & TextStyle_Italic) - stylePart |= TextStyle_Italic; + sizeStylePart |= 1 << 1; - return (stylePart << 32) | sizePart; + return (sizeStylePart << 32) | reinterpret_cast(outlineThickness); } void Font::OnAtlasCleared(const AbstractAtlas* atlas) @@ -471,13 +464,13 @@ namespace Nz NazaraError("Atlas has been released while in use"); } - const Font::Glyph& Font::PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, UInt32 style, char32_t character) const + const Font::Glyph& Font::PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const { auto it = glyphMap.find(character); - if (it != glyphMap.end()) // Si le glyphe n'est pas déjà chargé + if (it != glyphMap.end()) return it->second; - Glyph& glyph = glyphMap[character]; // Insertion du glyphe + Glyph& glyph = glyphMap[character]; //< Insert a new glyph glyph.valid = false; #if NAZARA_UTILITY_SAFE @@ -488,11 +481,12 @@ namespace Nz } #endif - // On vérifie que le style demandé est supporté par la police (dans le cas contraire il devra être simulé au rendu) + // Check if requested style is supported by our font (otherwise it will need to be simulated) + glyph.fauxOutlineThickness = 0.f; glyph.requireFauxBold = false; glyph.requireFauxItalic = false; - UInt32 supportedStyle = style; + TextStyleFlags supportedStyle = style; if (style & TextStyle_Bold && !m_data->SupportsStyle(TextStyle_Bold)) { glyph.requireFauxBold = true; @@ -505,12 +499,18 @@ namespace Nz supportedStyle &= ~TextStyle_Italic; } - // Est-ce que la police supporte le style demandé ? - if (style == supportedStyle) + float supportedOutlineThickness = outlineThickness; + if (outlineThickness > 0.f && !m_data->SupportsOutline(outlineThickness)) + { + glyph.fauxOutlineThickness = supportedOutlineThickness; + supportedOutlineThickness = 0.f; + } + + // Does font support requested style? + if (style == supportedStyle && outlineThickness == supportedOutlineThickness) { - // On extrait le glyphe depuis la police FontGlyph fontGlyph; - if (ExtractGlyph(characterSize, character, style, &fontGlyph)) + if (ExtractGlyph(characterSize, character, style, outlineThickness, &fontGlyph)) { if (fontGlyph.image.IsValid()) { @@ -523,21 +523,20 @@ namespace Nz glyph.atlasRect.height = 0; } - // Insertion du rectangle dans l'un des atlas - if (glyph.atlasRect.width > 0 && glyph.atlasRect.height > 0) // Si l'image contient quelque chose + // Insert rectangle (if not empty) into our atlas + if (glyph.atlasRect.width > 0 && glyph.atlasRect.height > 0) { - // Bordure (pour éviter le débordement lors du filtrage) + // Add a small border to prevent GPU to sample another glyph pixel glyph.atlasRect.width += m_glyphBorder*2; glyph.atlasRect.height += m_glyphBorder*2; - // Insertion du rectangle dans l'atlas virtuel if (!m_atlas->Insert(fontGlyph.image, &glyph.atlasRect, &glyph.flipped, &glyph.layerIndex)) { NazaraError("Failed to insert glyph into atlas"); return glyph; } - // Compensation de la bordure (centrage du glyphe) + // Recenter and remove glyph border glyph.atlasRect.x += m_glyphBorder; glyph.atlasRect.y += m_glyphBorder; glyph.atlasRect.width -= m_glyphBorder*2; @@ -549,16 +548,13 @@ namespace Nz glyph.valid = true; } else - { NazaraWarning("Failed to extract glyph \"" + String::Unicode(character) + "\""); - } } else { - // La police ne supporte pas le style demandé, nous allons donc précharger le glyphe supportant le style "minimum" supporté - // et copier ses données - UInt64 newKey = ComputeKey(characterSize, supportedStyle); - const Glyph& referenceGlyph = PrecacheGlyph(m_glyphes[newKey], characterSize, supportedStyle, character); + // Font doesn't support request style, precache the minimal supported version and copy its data + UInt64 newKey = ComputeKey(characterSize, supportedStyle, supportedOutlineThickness); + const Glyph& referenceGlyph = PrecacheGlyph(m_glyphes[newKey], characterSize, supportedStyle, supportedOutlineThickness, character); if (referenceGlyph.valid) { glyph.aabb = referenceGlyph.aabb; diff --git a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp index 2cd2c51e3..05814a903 100644 --- a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp +++ b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp @@ -6,7 +6,9 @@ #include #include FT_FREETYPE_H #include FT_BITMAP_H +#include FT_STROKER_H #include FT_OUTLINE_H +#include #include #include #include @@ -24,8 +26,10 @@ namespace Nz class FreeTypeLibrary; FT_Library s_library; + FT_Stroker s_stroker; std::shared_ptr s_libraryOwner; - float s_invScaleFactor = 1.f / (1 << 6); // 1/64 + constexpr float s_scaleFactor = 1 << 6; + constexpr float s_invScaleFactor = 1.f / s_scaleFactor; extern "C" unsigned long FT_StreamRead(FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count) @@ -66,9 +70,23 @@ namespace Nz // pour ne libérer FreeType que lorsque plus personne ne l'utilise public: - FreeTypeLibrary() = default; + FreeTypeLibrary() + { + if (FT_Stroker_New(s_library, &s_stroker) != 0) + { + NazaraWarning("Failed to load FreeType stroker, outline will not be possible"); + s_stroker = nullptr; //< Just in case + } + } + ~FreeTypeLibrary() { + if (s_stroker) + { + FT_Stroker_Done(s_stroker); + s_stroker = nullptr; + } + FT_Done_FreeType(s_library); s_library = nullptr; } @@ -96,7 +114,7 @@ namespace Nz return FT_Open_Face(s_library, &m_args, -1, nullptr) == 0; } - bool ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* dst) override + bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* dst) override { #ifdef NAZARA_DEBUG if (!dst) @@ -114,61 +132,85 @@ namespace Nz return false; } - FT_GlyphSlot& glyph = m_face->glyph; + FT_GlyphSlot glyphSlot = m_face->glyph; + + FT_Glyph glyph; + if (FT_Get_Glyph(glyphSlot, &glyph) != 0) + { + NazaraError("Failed to extract glyph"); + return false; + } + CallOnExit destroyGlyph([&]() { FT_Done_Glyph(glyph); }); const FT_Pos boldStrength = 2 << 6; - bool embolden = (style & TextStyle_Bold); + bool embolden = (style & TextStyle_Bold) != 0; + bool hasOutlineFormat = (glyph->format == FT_GLYPH_FORMAT_OUTLINE); dst->advance = (embolden) ? boldStrength >> 6 : 0; - if (embolden && glyph->format == FT_GLYPH_FORMAT_OUTLINE) + if (hasOutlineFormat) { - // http://www.freetype.org/freetype2/docs/reference/ft2-outline_processing.html#FT_Outline_Embolden - FT_Outline_Embolden(&glyph->outline, boldStrength); - embolden = false; + if (embolden) + { + // FT_Glyph can be casted to FT_OutlineGlyph if format is FT_GLYPH_FORMAT_OUTLINE + FT_OutlineGlyph outlineGlyph = reinterpret_cast(glyph); + if (FT_Outline_Embolden(&outlineGlyph->outline, boldStrength) != 0) + { + NazaraError("Failed to embolden glyph"); + return false; + } + } + + if (outlineThickness > 0.f) + { + FT_Stroker_Set(s_stroker, static_cast(s_scaleFactor * outlineThickness), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + if (FT_Glyph_Stroke(&glyph, s_stroker, 1) != 0) + { + NazaraError("Failed to outline glyph"); + return false; + } + } } - // http://www.freetype.org/freetype2/docs/reference/ft2-glyph_management.html#FT_Glyph_To_Bitmap - // Conversion du glyphe vers le format bitmap - // Cette fonction ne fait rien dans le cas où le glyphe est déjà un bitmap - if (FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL) != 0) + if (FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, nullptr, 1) != 0) { NazaraError("Failed to convert glyph to bitmap"); return false; } + FT_Bitmap& bitmap = reinterpret_cast(glyph)->bitmap; + // Dans le cas où nous voulons des caractères gras mais que nous n'avons pas pu agir plus tôt // nous demandons à FreeType d'agir directement sur le bitmap généré if (embolden) { // http://www.freetype.org/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden - // "If you want to embolden the bitmap owned by a FT_GlyphSlot_Rec, you should call FT_GlyphSlot_Own_Bitmap on the slot first" - FT_GlyphSlot_Own_Bitmap(glyph); - FT_Bitmap_Embolden(s_library, &glyph->bitmap, boldStrength, boldStrength); + FT_Bitmap_Embolden(s_library, &bitmap, boldStrength, boldStrength); } - dst->advance += glyph->metrics.horiAdvance >> 6; - dst->aabb.x = glyph->metrics.horiBearingX >> 6; - dst->aabb.y = -(glyph->metrics.horiBearingY >> 6); // Inversion du repère - dst->aabb.width = glyph->metrics.width >> 6; - dst->aabb.height = glyph->metrics.height >> 6; + int outlineThicknessInt = static_cast(outlineThickness * 2.f + 0.5f); //< round it + dst->advance += glyphSlot->metrics.horiAdvance >> 6; + dst->aabb.x = glyphSlot->metrics.horiBearingX >> 6; + dst->aabb.y = -(glyphSlot->metrics.horiBearingY >> 6); // Inversion du repère + dst->aabb.width = (glyphSlot->metrics.width >> 6) + outlineThicknessInt; + dst->aabb.height = (glyphSlot->metrics.height >> 6) + outlineThicknessInt; - unsigned int width = glyph->bitmap.width; - unsigned int height = glyph->bitmap.rows; + unsigned int width = bitmap.width; + unsigned int height = bitmap.rows; if (width > 0 && height > 0) { dst->image.Create(ImageType_2D, PixelFormatType_A8, width, height); UInt8* pixels = dst->image.GetPixels(); - const UInt8* data = glyph->bitmap.buffer; + const UInt8* data = bitmap.buffer; // Selon la documentation FreeType, le glyphe peut être encodé en format A8 (huit bits d'alpha par pixel) // ou au format A1 (un bit d'alpha par pixel). // Cependant dans un cas comme dans l'autre, il nous faut gérer le pitch (les données peuvent ne pas être contigues) // ainsi que le padding dans le cas du format A1 (Chaque ligne prends un nombre fixe d'octets) - if (glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO) + if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO) { // Format A1 for (unsigned int y = 0; y < height; ++y) @@ -176,20 +218,20 @@ namespace Nz for (unsigned int x = 0; x < width; ++x) *pixels++ = (data[x/8] & ((1 << (7 - x%8)) ? 255 : 0)); - data += glyph->bitmap.pitch; + data += bitmap.pitch; } } else { // Format A8 - if (glyph->bitmap.pitch == static_cast(width*sizeof(UInt8))) // Pouvons-nous copier directement ? - dst->image.Update(glyph->bitmap.buffer); + if (bitmap.pitch == static_cast(width*sizeof(UInt8))) // Pouvons-nous copier directement ? + dst->image.Update(bitmap.buffer); //< Small optimization else { for (unsigned int y = 0; y < height; ++y) { std::memcpy(pixels, data, width*sizeof(UInt8)); - data += glyph->bitmap.pitch; + data += bitmap.pitch; pixels += width*sizeof(UInt8); } } @@ -312,7 +354,12 @@ namespace Nz m_args.stream = &m_stream; } - bool SupportsStyle(UInt32 style) const override + bool SupportsOutline(float /*outlineThickness*/) const override + { + return s_stroker != 0; + } + + bool SupportsStyle(TextStyleFlags style) const override { ///TODO return style == TextStyle_Regular || style == TextStyle_Bold; diff --git a/src/Nazara/Utility/Formats/OBJLoader.cpp b/src/Nazara/Utility/Formats/OBJLoader.cpp index b8ff362f1..58b2d8e0a 100644 --- a/src/Nazara/Utility/Formats/OBJLoader.cpp +++ b/src/Nazara/Utility/Formats/OBJLoader.cpp @@ -306,6 +306,8 @@ namespace Nz if (vertexIndices.texCoord > 0) { Vector2f uv = Vector2f(texCoords[vertexIndices.texCoord - 1]); + uv.y = 1.f - uv.y; //< OBJ model texcoords seems to majority start from bottom left + uvPtr[index] = Vector2f(parameters.texCoordOffset + uv * parameters.texCoordScale); } else diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index 2832df42d..e18e81244 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -530,6 +530,12 @@ namespace Nz InvalidateNode(); } + void Node::SetScale(const Vector2f& scale, CoordSys coordSys) + { + // Prevent Z scale at zero (can happen when using SetScale with a Vec2) + SetScale(scale.x, scale.y, 1.f, coordSys); + } + void Node::SetScale(const Vector3f& scale, CoordSys coordSys) { switch (coordSys) @@ -574,7 +580,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return m_derivedPosition + (m_derivedScale * (m_derivedRotation * localPosition)); + return m_derivedPosition + (m_derivedScale * (ScaleQuaternion(m_derivedScale, m_derivedRotation) * localPosition)); } Quaternionf Node::ToGlobalRotation(const Quaternionf& localRotation) const @@ -582,7 +588,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return m_derivedRotation * localRotation; + return ScaleQuaternion(m_derivedScale, m_derivedRotation) * localRotation; } Vector3f Node::ToGlobalScale(const Vector3f& localScale) const @@ -598,7 +604,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return (m_derivedRotation.GetConjugate()*(globalPosition - m_derivedPosition))/m_derivedScale; + return m_derivedRotation.GetConjugate()*(globalPosition - m_derivedPosition)/m_derivedScale; } Quaternionf Node::ToLocalRotation(const Quaternionf& globalRotation) const @@ -688,7 +694,11 @@ namespace Nz if (m_inheritRotation) { - m_derivedRotation = m_parent->m_derivedRotation * m_initialRotation * m_rotation; + Quaternionf rotation = m_initialRotation * m_rotation; + if (m_inheritScale) + rotation = ScaleQuaternion(m_parent->m_derivedScale, rotation); + + m_derivedRotation = m_parent->m_derivedRotation * rotation; m_derivedRotation.Normalize(); } else @@ -716,4 +726,27 @@ namespace Nz m_transformMatrix.MakeTransform(m_derivedPosition, m_derivedRotation, m_derivedScale); m_transformMatrixUpdated = true; } + + Quaternionf Node::ScaleQuaternion(const Vector3f& scale, Quaternionf quaternion) + { + if (std::signbit(scale.x)) + { + quaternion.z = -quaternion.z; + quaternion.y = -quaternion.y; + } + + if (std::signbit(scale.y)) + { + quaternion.x = -quaternion.x; + quaternion.z = -quaternion.z; + } + + if (std::signbit(scale.z)) + { + quaternion.x = -quaternion.x; + quaternion.y = -quaternion.y; + } + + return quaternion; + } } diff --git a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf b/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf deleted file mode 100644 index 7c57306e7..000000000 Binary files a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf and /dev/null differ diff --git a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h b/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h deleted file mode 100644 index d4e6b4702..000000000 --- a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h +++ /dev/null @@ -1 +0,0 @@ -0,1,0,0,0,20,1,0,0,4,0,64,71,80,79,83,151,54,140,15,0,0,1,76,0,0,80,136,71,83,85,66,106,170,88,44,0,0,81,212,0,0,0,226,76,84,83,72,238,121,138,113,0,2,166,40,0,0,1,17,79,83,47,50,107,102,16,29,0,0,82,184,0,0,0,96,86,68,77,88,244,48,222,91,0,2,211,228,0,0,11,186,99,109,97,112,219,189,238,36,0,0,83,24,0,0,3,214,99,118,116,32,10,218,1,14,0,0,86,240,0,0,0,40,102,112,103,109,6,89,156,55,0,0,87,24,0,0,1,115,103,97,115,112,0,7,0,7,0,0,88,140,0,0,0,12,103,108,121,102,165,131,172,68,0,0,88,152,0,1,62,120,104,100,109,120,89,143,73,52,0,2,167,60,0,0,44,168,104,101,97,100,249,107,226,196,0,1,151,16,0,0,0,54,104,104,101,97,8,46,4,154,0,1,151,72,0,0,0,36,104,109,116,120,14,254,41,164,0,1,151,108,0,0,4,52,107,101,114,110,78,121,118,225,0,1,155,160,0,0,248,4,108,111,99,97,52,140,127,38,0,2,147,164,0,0,2,28,109,97,120,112,3,38,4,200,0,2,149,192,0,0,0,32,110,97,109,101,249,131,24,59,0,2,149,224,0,0,11,113,112,111,115,116,73,171,162,27,0,2,161,84,0,0,3,158,112,114,101,112,203,107,102,228,0,2,164,244,0,0,1,52,0,1,0,0,0,10,0,30,0,44,0,1,108,97,116,110,0,8,0,4,0,0,0,0,255,255,0,1,0,0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,2,0,10,21,92,0,1,74,236,0,4,0,0,0,104,0,218,0,224,1,26,1,32,1,130,1,188,1,206,1,216,2,22,2,100,2,162,2,172,2,182,2,188,2,238,2,248,3,46,3,164,3,178,3,216,3,226,4,4,4,22,4,140,4,162,4,184,4,202,5,84,5,126,5,176,5,254,6,104,6,198,7,16,7,70,7,76,8,10,8,28,8,170,9,36,9,110,9,164,9,198,10,108,10,178,10,228,11,34,11,84,11,130,11,188,11,242,12,64,12,106,12,160,12,254,13,48,13,110,13,200,14,30,14,100,14,162,14,208,15,82,15,96,15,134,15,144,15,226,16,40,16,78,16,88,16,106,16,116,16,126,16,144,16,194,16,220,17,6,17,12,17,62,17,68,17,94,17,100,17,122,17,200,17,218,18,44,18,50,18,104,18,138,18,172,18,190,18,252,19,70,19,132,19,174,19,216,20,10,20,64,20,114,20,160,20,174,20,232,20,250,21,64,0,1,0,173,0,29,0,14,0,53,255,202,0,55,255,217,0,56,255,233,0,71,255,242,0,77,255,251,0,85,255,235,0,87,255,243,0,88,255,247,0,158,255,243,0,210,255,210,1,4,255,214,1,6,255,242,1,7,255,247,1,9,255,222,0,1,0,173,0,29,0,24,0,17,255,230,0,21,255,234,0,23,255,229,0,25,255,237,0,26,255,245,0,43,0,22,0,46,255,239,0,71,255,239,0,72,255,232,0,84,255,233,0,85,255,231,0,87,255,231,0,88,255,232,0,158,255,236,0,175,255,232,0,197,255,244,0,244,255,235,0,252,255,237,1,3,255,236,1,4,255,241,1,5,255,230,1,6,255,245,1,7,255,242,1,9,255,248,0,14,0,46,255,238,0,53,0,11,0,55,0,16,0,56,0,9,0,72,255,238,0,133,255,203,0,171,0,16,0,172,0,12,0,173,0,65,0,174,0,43,0,175,255,232,0,251,255,220,0,252,255,238,0,255,255,217,0,4,0,18,255,229,0,19,255,218,0,20,255,238,0,24,255,216,0,2,0,17,255,239,0,18,255,242,0,15,0,17,255,239,0,18,255,242,0,53,255,214,0,55,255,213,0,56,255,226,0,71,255,241,0,85,255,239,0,87,255,227,0,88,255,236,0,158,255,243,1,4,255,222,1,5,255,248,1,6,255,223,1,7,255,232,1,9,255,221,0,19,0,16,255,197,0,17,255,246,0,21,255,217,0,23,255,228,0,46,255,237,0,72,255,218,0,84,255,221,0,133,255,202,0,173,0,13,0,174,0,14,0,175,255,234,0,197,255,231,0,244,255,243,0,249,255,243,0,251,255,200,0,252,255,223,0,255,255,197,1,3,255,235,1,5,255,246,0,15,0,10,255,230,0,13,255,238,0,15,255,238,0,16,255,243,0,24,255,245,0,34,255,246,0,53,255,236,0,55,255,246,0,57,255,246,0,58,255,233,0,59,255,241,0,61,255,248,0,62,255,237,0,94,255,240,0,251,255,245,0,2,0,10,255,245,0,12,255,248,0,2,0,12,255,239,255,255,255,242,0,1,0,10,255,239,0,12,0,10,255,235,0,13,255,240,0,15,255,241,0,53,255,238,0,55,255,244,0,56,255,245,0,58,255,242,0,59,255,248,0,61,255,247,0,91,255,247,0,111,255,245,1,4,255,248,0,2,1,4,255,239,1,9,255,244,0,13,0,10,255,239,0,18,255,248,0,24,255,248,0,53,255,231,0,55,255,240,0,56,255,244,0,58,255,235,0,61,255,244,0,90,255,247,0,111,255,245,1,4,255,225,1,6,255,244,1,9,255,227,0,29,0,4,255,228,0,12,255,220,0,13,255,217,0,15,255,217,0,16,255,200,0,17,255,247,0,21,255,221,0,23,255,232,0,34,255,210,0,46,255,236,0,53,0,17,0,55,0,30,0,56,0,19,0,57,0,22,0,58,0,33,0,62,0,25,0,66,255,223,0,72,255,222,0,84,255,224,0,86,255,233,0,91,255,245,0,94,0,28,0,244,255,245,0,249,255,245,0,251,255,204,0,252,255,226,1,3,255,240,1,5,255,248,255,255,255,238,0,3,0,10,255,238,0,53,255,248,0,58,255,246,0,9,0,10,255,236,0,13,255,234,0,15,255,234,0,16,255,225,0,34,255,232,0,46,255,246,0,59,255,246,0,251,255,229,0,252,255,246,0,2,0,19,255,246,0,24,255,238,0,8,0,53,255,203,0,55,255,227,0,56,255,236,0,57,255,240,0,58,255,211,0,59,255,236,0,210,255,236,1,9,255,241,0,4,0,18,255,239,0,26,255,242,0,158,255,242,0,175,255,250,0,29,0,10,255,231,0,11,255,247,0,19,255,247,0,24,255,243,0,32,255,240,0,53,255,228,0,55,255,240,0,56,255,245,0,57,255,241,0,61,255,241,0,62,255,227,0,71,255,242,0,72,255,249,0,77,255,250,0,85,255,239,0,87,255,239,0,88,255,243,0,89,255,234,0,94,255,231,0,133,255,248,0,158,255,242,0,240,255,244,0,255,255,247,1,4,255,242,1,6,255,248,1,7,255,249,1,8,255,242,1,9,255,243,1,10,255,251,0,5,0,21,255,207,0,158,255,250,0,173,0,31,0,174,0,12,0,175,255,249,0,5,0,20,255,248,0,24,255,240,0,158,255,250,0,175,255,249,0,255,255,226,0,4,0,21,255,220,0,158,255,243,0,173,0,21,0,175,255,246,0,34,0,7,255,245,0,11,0,11,0,13,255,186,0,16,255,199,0,21,255,223,0,23,255,243,0,27,255,243,0,28,255,243,0,33,255,222,0,46,255,239,0,53,0,5,0,62,0,16,0,71,255,244,0,72,255,216,0,85,255,247,0,87,255,247,0,88,255,248,0,89,255,239,0,94,0,19,0,133,255,155,0,158,255,241,0,162,255,206,0,173,0,52,0,174,0,28,0,175,255,222,0,240,0,16,0,244,255,240,0,249,255,240,0,251,255,187,0,252,255,219,0,255,255,146,1,3,255,239,1,5,255,244,1,10,255,250,0,10,0,10,255,248,0,53,255,251,0,71,255,246,0,72,255,250,0,77,255,250,0,85,255,244,0,87,255,244,0,88,255,247,0,158,255,244,1,4,255,251,0,12,0,10,255,246,0,46,255,251,0,71,255,247,0,72,255,241,0,77,255,246,0,85,255,247,0,87,255,247,0,88,255,248,0,158,255,244,0,175,255,243,0,252,255,250,1,5,255,251,0,19,0,7,255,247,0,11,0,9,0,62,0,33,0,71,255,246,0,72,255,238,0,85,255,229,0,87,255,201,0,88,255,211,0,94,0,33,0,110,255,238,0,158,255,245,0,171,0,10,0,173,0,24,0,174,0,41,0,175,255,239,0,240,0,27,1,4,255,247,1,5,255,241,1,7,255,251,0,26,0,11,255,166,0,17,255,243,0,18,255,236,0,21,255,194,0,26,255,227,0,32,255,231,0,53,255,189,0,55,255,154,0,56,255,203,0,61,255,187,0,62,255,240,0,71,255,241,0,72,255,249,0,85,255,232,0,87,255,199,0,88,255,212,0,94,255,241,0,110,255,220,0,158,255,243,0,240,255,166,1,4,255,199,1,5,255,247,1,6,255,194,1,7,255,213,1,9,255,186,255,255,255,198,0,23,0,10,255,242,0,11,255,238,0,18,255,247,0,32,255,242,0,43,255,251,0,53,255,231,0,55,255,236,0,56,255,238,0,61,255,239,0,71,255,240,0,72,255,243,0,77,255,245,0,85,255,236,0,87,255,234,0,88,255,236,0,158,255,238,0,175,255,247,0,240,255,237,1,4,255,240,1,5,255,250,1,6,255,244,1,7,255,243,1,9,255,243,0,18,0,7,255,250,0,10,255,241,0,13,255,175,0,16,255,210,0,20,255,248,0,21,255,242,0,33,255,241,0,46,255,246,0,57,255,242,0,72,255,246,0,77,255,251,0,133,255,187,0,173,0,25,0,174,0,4,0,175,255,234,0,251,255,214,0,252,255,242,0,255,255,182,0,13,0,21,255,234,0,53,255,243,0,55,255,251,0,62,255,240,0,71,255,249,0,72,255,243,0,77,255,248,0,85,255,248,0,87,255,248,0,88,255,250,0,94,255,247,0,158,255,247,0,175,255,242,0,1,0,158,255,244,0,47,0,7,255,241,0,11,0,12,0,13,255,213,0,16,255,205,0,17,255,235,0,21,255,211,0,23,255,218,0,25,255,248,0,27,255,222,0,28,255,222,0,33,255,197,0,46,255,230,0,62,0,18,0,71,255,231,0,72,255,175,0,77,255,250,0,84,255,197,0,85,255,230,0,87,255,173,0,88,255,182,0,89,255,170,0,94,0,21,0,110,255,232,0,133,255,183,0,158,255,227,0,162,255,203,0,171,255,254,0,172,255,254,0,173,0,52,0,174,0,30,0,175,255,215,0,189,255,208,0,197,255,216,0,240,0,16,0,244,255,207,0,249,255,207,0,251,255,186,0,252,255,201,0,255,255,166,1,3,255,225,1,4,255,211,1,5,255,202,1,6,255,213,1,7,255,213,1,8,255,209,1,9,255,214,1,10,255,229,0,4,0,158,255,248,0,173,255,251,0,175,255,242,0,255,255,232,0,35,0,7,255,243,0,11,0,16,0,13,255,213,0,16,255,201,0,17,255,246,0,21,255,220,0,23,255,230,0,28,255,248,0,33,255,213,0,46,255,235,0,62,0,29,0,71,255,244,0,72,255,203,0,84,255,217,0,85,255,239,0,87,255,242,0,88,255,241,0,89,255,243,0,94,0,29,0,110,255,245,0,133,255,196,0,158,255,242,0,171,0,9,0,173,0,44,0,174,0,40,0,175,255,216,0,197,255,227,0,240,0,26,0,244,255,241,0,249,255,241,0,251,255,199,0,252,255,218,0,255,255,186,1,3,255,237,1,5,255,244,0,30,0,7,255,247,0,11,0,17,0,13,255,225,0,16,255,215,0,21,255,233,0,23,255,241,0,33,255,223,0,46,255,239,0,62,0,26,0,71,255,247,0,72,255,216,0,85,255,243,0,87,255,247,0,88,255,247,0,89,255,249,0,94,0,28,0,133,255,209,0,158,255,245,0,171,0,4,0,173,0,44,0,174,0,36,0,175,255,222,0,240,0,23,0,244,255,246,0,249,255,246,0,251,255,215,0,252,255,228,0,255,255,209,1,3,255,245,1,5,255,249,0,18,0,7,255,246,0,62,0,31,0,71,255,245,0,72,255,238,0,85,255,228,0,87,255,207,0,88,255,213,0,94,0,31,0,110,255,238,0,158,255,243,0,171,0,7,0,173,0,23,0,174,0,38,0,175,255,239,0,240,0,24,1,4,255,248,1,5,255,240,1,7,255,251,0,13,0,17,255,233,0,21,255,206,0,23,255,218,0,25,255,246,0,33,255,198,0,158,255,230,0,171,0,16,0,173,0,38,0,174,0,47,0,175,255,216,0,189,255,225,0,197,255,234,0,255,255,174,0,8,0,17,255,243,0,21,255,199,0,23,255,247,0,158,255,239,0,171,0,6,0,173,0,29,0,174,0,37,0,175,255,235,0,41,0,17,255,232,0,21,255,228,0,23,255,229,0,25,255,248,0,43,0,49,0,46,255,244,0,53,0,22,0,55,0,31,0,56,0,27,0,57,0,28,0,75,0,7,0,81,255,223,0,84,255,218,0,85,255,224,0,87,255,216,0,88,255,218,0,89,255,226,0,91,255,219,0,133,255,243,0,158,255,244,0,162,255,228,0,171,0,15,0,173,0,34,0,174,0,45,0,175,255,231,0,189,255,252,0,197,255,232,0,200,255,246,0,244,255,215,0,249,0,32,0,251,255,225,0,252,255,216,0,255,255,236,1,3,255,222,1,4,255,219,1,5,255,215,1,6,255,219,1,7,255,218,1,8,255,228,1,9,255,220,1,10,255,223,0,17,0,17,255,244,0,18,255,241,0,26,255,242,0,43,0,16,0,53,255,205,0,55,255,201,0,56,255,216,0,85,255,240,0,87,255,222,0,88,255,231,0,210,255,214,0,249,0,14,1,4,255,220,1,5,255,243,1,6,255,217,1,7,255,226,1,9,255,215,0,12,0,18,255,234,0,26,255,247,0,38,255,240,0,43,255,240,0,46,255,248,0,52,255,250,0,53,255,173,0,54,255,227,0,55,255,193,0,56,255,210,0,58,255,165,0,158,255,249,0,15,0,18,255,235,0,19,255,232,0,24,255,226,0,38,255,237,0,43,255,237,0,46,255,239,0,52,255,237,0,53,255,171,0,54,255,238,0,55,255,193,0,56,255,212,0,57,255,217,0,58,255,167,0,59,255,227,0,158,255,248,0,12,0,21,255,231,0,24,255,245,0,38,255,247,0,43,255,247,0,46,255,251,0,52,255,244,0,53,255,190,0,54,255,243,0,55,255,236,0,56,255,241,0,58,255,218,0,175,255,251,0,11,0,7,255,244,0,38,255,242,0,43,255,242,0,46,255,240,0,52,255,246,0,53,255,245,0,54,255,240,0,55,255,250,0,56,255,248,0,58,255,251,0,59,255,245,0,14,0,18,255,235,0,19,255,245,0,24,255,230,0,38,255,241,0,43,255,241,0,46,255,243,0,52,255,241,0,53,255,187,0,54,255,240,0,55,255,209,0,56,255,213,0,57,255,243,0,58,255,174,0,59,255,243,0,13,0,7,255,235,0,13,255,229,0,16,255,234,0,21,255,244,0,33,255,239,0,38,255,244,0,43,255,244,0,46,255,229,0,54,255,247,0,59,255,243,0,72,255,252,0,94,0,8,0,175,255,224,0,19,0,7,255,244,0,10,0,5,0,16,0,14,0,24,255,225,0,32,255,217,0,38,255,245,0,43,0,45,0,46,255,242,0,53,255,208,0,54,255,246,0,55,255,247,0,56,255,250,0,57,255,250,0,58,255,238,0,59,255,245,0,62,0,25,0,75,0,19,0,94,0,29,0,175,255,250,0,10,0,7,255,242,0,32,255,237,0,53,255,166,0,54,255,251,0,55,255,245,0,56,255,251,0,58,255,217,0,62,255,239,0,72,255,238,0,175,255,230,0,13,0,7,255,244,0,11,255,246,0,38,255,240,0,43,255,240,0,46,255,248,0,53,255,234,0,54,255,228,0,55,255,239,0,56,255,237,0,58,255,241,0,85,255,251,0,87,255,249,0,88,255,251,0,23,0,7,255,237,0,10,255,232,0,13,255,227,0,16,255,225,0,20,255,231,0,21,255,238,0,24,255,200,0,32,255,202,0,33,255,232,0,38,255,243,0,43,255,243,0,46,255,230,0,53,255,163,0,54,255,247,0,55,255,243,0,56,255,247,0,57,255,214,0,58,255,225,0,59,255,227,0,62,255,217,0,72,255,250,0,94,255,228,0,175,255,218,0,12,0,24,255,234,0,38,255,241,0,43,255,241,0,46,255,245,0,52,255,248,0,53,255,202,0,54,255,238,0,55,255,216,0,56,255,224,0,57,255,244,0,58,255,209,0,59,255,245,0,15,0,7,255,246,0,21,255,234,0,24,255,246,0,32,255,229,0,38,255,248,0,43,255,248,0,46,255,248,0,53,255,209,0,54,255,246,0,55,255,237,0,56,255,243,0,58,255,211,0,62,255,230,0,94,255,242,0,175,255,251,0,22,0,7,255,238,0,10,255,231,0,13,255,227,0,16,255,223,0,20,255,231,0,24,255,200,0,32,255,206,0,33,255,240,0,38,255,242,0,43,255,242,0,46,255,229,0,53,255,170,0,54,255,245,0,55,255,237,0,56,255,242,0,57,255,208,0,58,255,210,0,59,255,224,0,62,255,214,0,72,255,250,0,94,255,227,0,175,255,238,0,21,0,7,255,240,0,10,255,232,0,13,255,235,0,16,255,231,0,20,255,240,0,24,255,207,0,32,255,211,0,33,255,247,0,38,255,243,0,43,255,243,0,46,255,232,0,53,255,178,0,54,255,246,0,55,255,236,0,56,255,242,0,57,255,213,0,58,255,211,0,59,255,228,0,62,255,218,0,94,255,229,0,175,255,246,0,17,0,7,255,238,0,32,255,227,0,38,255,247,0,43,255,247,0,46,255,250,0,52,255,248,0,53,255,167,0,54,255,244,0,55,255,236,0,56,255,242,0,58,255,208,0,61,255,247,0,62,255,230,0,72,255,247,0,94,255,237,0,175,255,240,0,240,255,248,0,15,0,19,255,227,0,20,255,230,0,24,255,198,0,33,255,238,0,38,255,243,0,43,255,243,0,46,255,229,0,53,255,168,0,54,255,245,0,55,255,238,0,56,255,242,0,57,255,208,0,58,255,211,0,59,255,225,0,175,255,236,0,11,0,21,255,225,0,24,255,244,0,38,255,242,0,43,255,242,0,46,255,245,0,53,255,203,0,54,255,239,0,55,255,240,0,56,255,243,0,58,255,227,0,175,255,247,0,32,0,17,255,238,0,21,255,238,0,23,255,235,0,43,0,47,0,46,255,247,0,53,0,21,0,55,0,29,0,56,0,25,0,57,0,28,0,85,255,231,0,87,255,227,0,88,255,228,0,89,255,238,0,158,255,247,0,171,0,12,0,173,0,33,0,174,0,44,0,175,255,234,0,189,255,249,0,244,255,233,0,249,0,30,0,251,255,236,0,252,255,228,0,255,255,247,1,3,255,232,1,4,255,230,1,5,255,225,1,6,255,231,1,7,255,229,1,8,255,246,1,9,255,232,1,10,255,238,0,3,0,53,255,200,0,55,255,236,0,56,255,244,0,9,0,46,255,247,0,53,255,230,0,55,255,243,0,56,255,248,0,57,255,236,0,133,255,236,0,251,255,236,0,252,255,248,0,255,255,235,0,2,0,21,255,229,0,23,255,239,0,20,0,43,0,19,0,46,255,238,0,53,255,192,0,55,255,233,0,56,255,241,0,57,255,231,0,72,255,243,0,75,0,20,0,77,255,247,0,89,255,248,0,133,255,235,0,175,255,240,0,244,255,246,0,251,255,227,0,252,255,233,0,255,255,231,1,5,255,244,1,8,255,243,1,9,255,246,1,10,255,240,0,17,0,10,255,228,0,13,255,177,0,16,255,221,0,32,255,223,0,46,255,251,0,53,255,202,0,55,255,248,0,57,255,205,0,61,255,247,0,62,255,214,0,66,255,247,0,89,255,250,0,94,255,226,0,133,255,201,0,251,255,233,0,252,255,251,1,8,255,250,0,9,0,10,255,239,0,11,255,241,0,71,255,250,0,85,255,247,0,87,255,245,0,88,255,248,0,89,255,251,0,90,255,245,0,240,255,242,0,2,0,62,255,246,0,94,255,248,0,4,0,61,255,220,0,94,255,248,0,210,255,195,0,213,255,195,0,2,0,62,255,245,0,94,255,248,0,2,0,11,0,30,0,240,0,28,0,4,0,11,0,18,0,62,0,9,0,94,0,14,0,240,0,18,0,12,0,3,0,29,0,8,0,29,0,11,0,76,0,32,0,39,0,61,0,13,0,62,0,44,0,94,0,33,0,209,0,37,0,210,0,24,0,212,0,37,0,213,0,24,0,240,0,81,0,6,0,11,0,43,0,32,0,27,0,61,0,14,0,62,0,39,0,94,0,44,0,240,0,48,0,10,0,7,255,247,0,10,255,232,0,11,255,240,0,13,255,247,0,32,255,242,0,61,255,246,0,62,255,240,0,89,255,248,0,94,255,243,0,240,255,241,0,1,0,173,0,37,0,12,0,7,255,239,0,11,0,5,0,16,255,209,0,33,255,210,0,110,255,245,0,161,255,187,0,169,255,174,0,173,0,44,0,174,0,28,0,189,255,224,0,197,255,232,0,240,0,9,0,1,0,173,0,37,0,6,0,161,255,187,0,169,255,174,0,173,0,44,0,174,0,28,0,189,255,224,0,197,255,232,0,1,0,143,0,6,0,5,0,133,255,228,0,143,0,10,0,173,0,11,0,251,255,236,0,255,255,235,0,19,0,2,255,247,0,10,255,228,0,11,255,241,0,18,255,242,0,19,255,240,0,24,255,229,0,26,255,248,0,32,255,221,0,61,255,220,0,62,255,214,0,94,255,224,0,240,255,235,0,255,255,247,1,4,255,238,1,6,255,244,1,7,255,246,1,8,255,243,1,9,255,233,1,10,255,250,0,4,0,21,255,221,0,32,255,242,0,62,255,238,0,94,255,246,0,20,0,10,255,224,0,11,255,244,0,16,255,246,0,18,255,241,0,19,255,229,0,24,255,222,0,32,255,223,0,61,255,222,0,62,255,213,0,94,255,222,0,240,255,240,0,251,255,247,0,252,255,251,0,255,255,231,1,4,255,242,1,6,255,247,1,7,255,249,1,8,255,232,1,9,255,234,1,10,255,242,0,1,0,21,255,241,0,13,0,10,255,240,0,13,255,199,0,16,255,217,0,20,255,245,0,21,255,247,0,24,255,218,0,32,255,218,0,33,255,242,0,62,255,215,0,94,255,228,0,251,255,213,0,252,255,243,0,255,255,188,0,8,0,10,255,239,0,11,255,244,0,24,255,247,0,32,255,236,0,61,255,240,0,62,255,226,0,94,255,232,0,240,255,239,0,8,0,10,255,235,0,24,255,244,0,32,255,237,0,61,255,243,0,62,255,217,0,94,255,233,0,240,255,243,0,252,255,252,0,4,0,21,255,247,0,62,255,234,0,94,255,248,1,3,255,252,0,15,0,11,255,221,0,17,255,246,0,18,255,232,0,26,255,237,0,32,255,232,0,61,255,201,0,62,255,231,0,94,255,236,0,110,255,236,0,240,255,220,1,4,255,210,1,5,255,243,1,6,255,219,1,7,255,227,1,9,255,205,0,18,0,10,255,237,0,11,255,238,0,18,255,241,0,24,255,243,0,26,255,247,0,32,255,229,0,61,255,223,0,62,255,220,0,94,255,228,0,110,255,248,0,240,255,234,0,244,255,252,0,249,255,252,1,4,255,238,1,5,255,249,1,6,255,240,1,7,255,241,1,9,255,236,0,15,0,10,255,227,0,13,255,188,0,16,255,223,0,19,255,245,0,20,255,234,0,24,255,215,0,32,255,223,0,61,255,243,0,62,255,213,0,94,255,224,0,251,255,227,0,252,255,248,0,255,255,199,1,8,255,243,1,10,255,251,0,10,0,21,255,242,0,24,255,244,0,32,255,226,0,61,255,228,0,62,255,224,0,94,255,232,0,240,255,243,1,4,255,249,1,6,255,252,1,9,255,246,0,10,0,10,255,233,0,11,255,245,0,24,255,244,0,32,255,232,0,61,255,239,0,62,255,223,0,94,255,230,0,240,255,238,0,255,255,250,1,8,255,252,0,12,0,10,255,241,0,13,255,222,0,16,255,220,0,21,255,230,0,24,255,219,0,32,255,216,0,33,255,223,0,62,255,218,0,94,255,230,0,251,255,210,0,252,255,238,0,255,255,195,0,13,0,10,255,230,0,13,255,248,0,16,255,243,0,24,255,240,0,32,255,236,0,61,255,246,0,62,255,215,0,94,255,225,0,240,255,245,0,251,255,244,0,252,255,249,0,255,255,247,1,10,255,252,0,12,0,10,255,245,0,13,255,223,0,16,255,217,0,21,255,243,0,24,255,223,0,32,255,222,0,33,255,230,0,62,255,217,0,94,255,230,0,251,255,219,0,252,255,240,0,255,255,213,0,11,0,10,255,243,0,13,255,231,0,16,255,226,0,24,255,223,0,32,255,222,0,33,255,239,0,62,255,218,0,94,255,230,0,251,255,227,0,252,255,242,0,255,255,221,0,3,0,21,255,247,0,62,255,233,0,94,255,247,0,14,0,10,255,248,0,13,255,221,0,16,255,215,0,21,255,226,0,23,255,247,0,24,255,225,0,32,255,222,0,33,255,219,0,62,255,218,0,94,255,232,0,251,255,205,0,252,255,236,0,255,255,198,1,3,255,252,0,4,0,21,255,220,0,32,255,227,0,62,255,222,0,94,255,236,0,17,0,11,255,197,0,17,255,241,0,18,255,231,0,21,255,199,0,26,255,228,0,32,255,228,0,61,255,186,0,62,255,227,0,94,255,233,0,110,255,221,0,240,255,192,1,4,255,207,1,5,255,245,1,6,255,186,1,7,255,210,1,9,255,176,255,255,255,208,0,4,0,19,255,239,0,20,255,246,0,24,255,235,0,18,255,240,0,2,54,70,0,4,0,0,54,206,56,224,0,89,0,77,0,0,255,248,255,146,255,220,255,237,255,245,255,234,255,238,255,241,255,203,255,237,255,223,255,218,255,243,255,234,255,146,255,213,255,243,255,236,255,244,255,241,255,146,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,210,255,203,255,250,255,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,231,255,224,0,0,0,0,0,0,255,224,0,0,0,0,255,227,255,231,255,243,255,229,255,243,255,245,255,243,255,233,255,247,255,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,124,255,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,255,222,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,255,231,0,0,0,0,255,193,255,216,255,238,255,248,255,242,255,237,255,247,255,248,255,247,255,248,255,225,255,243,255,238,255,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,146,255,215,0,0,255,222,0,0,255,242,0,0,0,0,255,243,0,0,0,0,0,0,255,124,255,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,208,255,218,255,214,0,0,0,0,0,0,255,222,0,0,0,7,255,230,0,0,0,0,255,243,0,0,0,0,0,0,255,228,255,241,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,218,0,0,0,0,0,0,255,226,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,255,232,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,255,247,0,0,255,250,255,213,255,192,255,244,255,217,0,0,255,245,0,0,0,0,255,240,0,0,0,0,0,0,255,205,255,204,255,202,255,207,255,219,0,0,0,0,255,241,255,229,0,0,0,0,255,214,0,0,255,213,0,0,255,212,255,239,255,208,255,249,255,221,255,228,255,246,255,241,255,212,255,246,255,223,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,255,229,255,251,255,236,0,0,0,0,0,0,255,251,0,0,255,250,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,255,195,0,0,0,0,0,0,255,242,0,0,255,226,0,0,255,246,0,0,0,0,255,241,255,249,0,0,255,242,0,0,0,0,0,0,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,237,0,0,0,0,0,0,255,250,255,250,255,226,0,0,255,240,0,0,255,249,0,0,255,242,255,244,255,248,255,250,255,250,0,0,255,241,0,0,0,0,255,227,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,250,0,0,0,0,255,247,255,228,255,243,255,248,255,225,255,235,0,0,0,0,255,244,0,0,0,0,255,245,0,0,255,251,0,0,255,237,255,244,255,249,0,0,0,0,255,229,0,0,255,246,0,0,0,0,0,0,255,249,255,249,255,228,255,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,255,240,255,251,255,235,0,0,255,246,0,0,0,0,255,238,255,240,0,0,255,245,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,243,0,0,255,248,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,186,255,203,255,199,255,212,255,217,255,236,255,186,255,234,0,0,0,0,255,217,255,248,0,0,255,248,0,0,0,0,0,0,255,211,255,236,255,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,249,0,0,0,0,255,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,242,0,0,0,0,0,0,0,0,0,0,255,250,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,241,0,0,255,243,0,0,0,0,255,250,0,0,0,0,0,0,255,246,255,242,255,246,0,0,0,0,0,0,0,0,0,0,255,245,255,247,0,0,0,0,0,0,0,0,0,0,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,247,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,255,247,255,248,0,0,0,0,0,0,255,251,0,0,0,0,255,247,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,255,242,255,246,0,0,0,0,0,0,0,0,0,0,255,245,255,247,0,0,0,0,0,0,0,0,0,0,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,255,222,0,0,255,227,0,0,255,224,0,0,0,0,255,232,255,199,0,0,255,228,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,196,0,0,0,0,0,0,255,246,0,0,255,222,0,0,255,249,255,166,255,158,255,249,255,181,0,0,255,232,0,0,0,0,255,238,0,0,0,0,0,0,255,167,255,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,244,255,250,0,0,0,0,255,251,255,238,255,233,255,244,255,233,255,251,255,251,255,251,0,0,255,248,255,246,255,249,0,0,255,236,255,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,255,239,0,0,0,0,0,0,255,251,255,250,255,229,255,250,255,242,255,228,255,250,0,0,255,242,255,245,255,247,255,250,255,250,0,0,255,242,0,0,0,0,255,230,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,250,0,0,0,0,255,247,255,232,255,244,255,248,255,229,255,238,0,0,0,0,255,245,255,251,0,0,255,246,0,0,0,0,0,0,255,240,255,245,255,250,0,0,0,0,255,231,0,0,255,246,0,0,0,0,0,0,255,250,255,249,255,229,255,227,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,175,255,216,255,242,255,243,255,248,0,0,255,175,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,237,0,0,255,242,0,0,255,248,0,0,255,245,255,244,255,248,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,255,250,255,240,0,0,0,0,0,0,0,0,0,0,255,250,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,255,243,255,241,255,242,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,241,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,250,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,216,255,214,255,202,255,195,255,177,0,0,255,195,255,213,255,197,0,0,0,0,255,169,255,171,0,0,255,232,0,0,0,0,0,0,255,168,255,208,255,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,247,0,0,0,0,255,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,234,0,0,0,0,0,0,255,248,255,242,255,240,0,0,255,233,0,0,255,245,0,0,255,243,255,240,255,242,255,243,255,243,0,0,255,243,0,0,0,0,0,0,255,242,255,250,0,0,0,0,0,0,0,0,0,0,255,240,255,244,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,250,255,249,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,243,255,245,0,0,0,0,0,0,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,213,255,207,255,216,255,196,0,0,255,220,255,213,255,214,0,0,0,0,255,220,255,243,0,0,255,244,0,0,0,0,0,0,255,220,255,243,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,255,226,255,219,255,216,255,217,255,219,255,230,255,225,255,230,0,0,0,0,255,227,255,248,0,0,255,249,0,0,0,0,0,0,255,224,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,255,223,0,0,255,226,0,0,255,224,0,0,0,0,255,232,255,206,0,0,255,229,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,255,215,255,201,0,0,0,0,0,0,255,232,255,180,255,180,0,0,255,181,0,0,255,197,255,222,255,215,255,192,255,189,255,171,255,186,255,198,255,215,255,193,0,0,0,0,255,190,255,217,0,0,255,230,0,0,0,0,0,0,255,187,255,229,255,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,255,221,255,214,0,0,0,0,0,0,0,0,255,248,0,13,0,13,0,7,0,0,255,215,255,216,0,33,255,230,0,33,255,228,0,0,0,0,0,0,0,0,0,0,0,31,255,225,0,0,255,223,255,223,255,235,255,235,255,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,229,0,0,0,0,0,0,0,0,255,251,255,217,0,0,0,0,255,246,255,227,255,245,255,214,0,0,255,234,0,0,0,0,255,224,255,242,0,0,255,238,0,0,0,0,0,0,255,235,255,248,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,241,0,23,255,233,0,24,255,237,0,0,0,0,0,0,255,250,0,0,0,23,0,0,0,0,255,246,255,246,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,218,255,213,0,0,0,0,0,0,255,214,0,0,0,36,255,215,255,216,0,0,255,226,0,0,0,0,0,0,255,214,0,0,255,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,220,255,201,0,0,255,219,0,0,255,236,0,0,0,0,255,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,0,0,0,0,255,236,255,240,255,237,0,0,0,0,0,0,0,0,0,0,0,0,255,186,255,183,0,0,0,0,0,0,0,0,0,0,255,251,255,246,0,0,0,0,0,0,0,0,0,0,0,0,255,231,255,229,255,210,0,0,255,238,255,243,255,231,255,248,255,230,0,0,0,0,0,0,0,0,0,0,255,246,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,240,0,0,0,0,0,0,0,0,255,246,0,0,255,234,0,0,0,0,255,245,255,237,255,246,0,0,0,0,0,0,0,0,255,246,0,0,255,181,255,178,0,0,0,0,0,0,0,0,0,0,255,251,255,250,255,238,0,0,0,0,0,0,0,0,0,0,255,232,255,224,255,217,0,0,255,247,255,251,255,226,0,0,255,234,0,0,0,0,0,0,0,0,0,0,255,227,255,217,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,219,0,0,0,0,0,0,255,249,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,216,255,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,228,255,240,0,0,0,0,0,0,255,239,0,0,255,245,0,0,0,0,0,0,0,0,0,0,255,244,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,255,251,255,241,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,189,255,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,255,238,255,223,255,220,0,0,255,252,0,0,255,227,0,0,255,237,0,0,0,0,0,0,0,0,0,0,255,230,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,232,255,229,255,211,255,251,255,246,0,0,255,239,255,229,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,223,255,221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,163,0,0,255,242,255,238,255,243,255,238,255,241,255,231,0,0,0,0,0,0,255,187,255,184,255,162,255,198,255,214,255,249,255,245,255,251,255,248,0,0,255,248,0,0,0,0,0,0,0,0,255,235,255,224,255,214,0,0,255,243,255,248,255,225,0,0,255,235,0,0,0,0,0,0,0,0,0,0,255,232,255,216,0,0,255,233,0,0,0,0,0,0,0,0,0,0,255,248,255,231,255,238,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,255,242,255,244,255,242,255,244,255,238,0,0,0,0,0,0,0,0,0,0,255,242,255,247,255,246,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,255,251,255,234,0,0,255,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,0,0,0,0,0,0,0,0,0,0,0,0,255,229,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,255,247,0,0,0,0,255,247,0,0,0,0,255,249,255,240,255,237,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,0,0,0,0,0,0,255,236,255,167,0,0,255,245,255,237,255,246,255,237,255,238,255,238,0,0,255,246,0,0,255,182,255,179,255,173,255,192,255,212,255,218,255,227,255,251,255,249,255,237,255,248,0,0,0,0,0,0,0,0,255,234,255,222,255,214,0,0,255,247,255,251,255,222,0,0,255,236,0,0,0,0,0,0,0,0,0,0,255,224,255,213,255,247,255,223,0,0,0,0,0,0,0,0,0,0,0,0,255,230,255,237,255,229,0,0,255,244,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,183,0,0,0,0,255,242,255,244,255,242,255,243,255,235,0,0,0,0,0,0,255,211,255,209,255,164,255,216,255,218,255,246,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,255,223,255,228,0,0,0,0,0,0,255,226,0,0,255,239,0,0,0,0,0,0,0,0,0,0,255,233,255,215,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,255,227,255,211,255,249,255,243,0,0,255,237,255,227,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,233,255,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,203,255,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,224,255,225,0,0,0,0,0,0,255,229,0,0,255,235,0,0,0,0,0,0,0,0,0,0,255,231,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,252,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,255,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,216,255,250,255,247,255,252,0,0,255,227,0,0,0,0,0,0,0,0,0,0,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,226,255,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,236,255,223,255,252,255,251,0,0,0,0,255,235,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,255,252,255,238,0,0,255,236,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,240,0,0,0,0,0,0,0,0,0,0,0,0,255,224,255,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,225,255,220,0,0,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,225,255,214,255,250,255,246,255,252,0,0,255,225,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,205,0,0,0,0,0,0,0,0,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,231,255,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,255,245,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,255,242,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,219,255,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,221,255,242,0,0,0,0,0,0,255,232,0,0,255,242,0,0,0,0,0,0,0,0,0,0,255,246,255,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,255,229,255,222,255,229,0,0,0,0,255,223,0,0,0,34,255,225,255,227,0,0,255,231,0,0,0,0,0,0,255,227,255,232,255,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,255,248,0,0,255,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,229,255,197,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,255,240,255,238,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,198,0,0,255,248,0,0,0,0,0,0,255,234,0,0,0,0,255,233,0,0,0,0,255,204,255,195,255,220,255,230,255,224,255,223,0,0,255,247,255,236,255,248,255,226,255,227,255,223,255,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,233,255,241,255,243,255,241,0,0,0,0,255,246,0,0,255,219,255,243,0,0,255,247,0,0,255,247,0,0,255,245,255,241,255,241,255,246,0,0,0,0,0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,177,255,235,0,0,0,0,0,0,0,0,255,177,0,0,0,0,255,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,255,247,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,236,255,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,123,0,0,0,0,0,0,0,0,255,236,255,189,255,190,255,235,255,217,255,209,255,241,0,0,255,124,255,205,255,194,255,182,255,193,0,0,0,0,255,228,0,0,0,0,255,213,255,227,0,0,0,0,0,0,0,0,0,0,255,211,255,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,248,255,225,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,226,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,255,110,0,0,0,0,0,0,0,0,255,234,255,174,255,184,255,237,255,210,255,203,255,234,255,181,255,110,255,200,255,179,255,167,255,178,255,192,255,110,255,223,0,0,0,6,255,200,255,215,0,0,255,234,0,0,0,0,0,0,255,198,255,204,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,244,255,213,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,214,255,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,220,0,0,255,248,255,248,0,0,0,0,255,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,146,255,215,0,0,255,222,0,0,255,242,0,0,0,0,255,243,0,0,0,0,0,0,0,0,255,121,255,214,255,213,255,226,0,0,0,0,255,241,255,239,0,0,255,242,255,222,0,0,255,221,0,0,0,0,0,0,0,0,0,0,255,227,255,236,0,0,0,0,0,0,255,248,255,223,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,0,0,255,248,255,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,217,255,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,197,0,0,0,0,0,0,0,0,0,0,255,233,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,199,0,0,0,0,0,0,0,0,0,0,255,199,255,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,255,243,0,0,0,0,0,0,255,233,0,0,255,243,0,0,0,0,0,0,0,0,0,0,255,235,255,217,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,255,227,0,0,255,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,208,0,0,0,0,0,0,0,0,0,0,255,221,0,0,255,244,255,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,203,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,252,255,241,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,255,232,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,228,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,234,255,235,255,244,255,244,255,223,255,222,0,0,0,0,0,0,255,223,0,0,255,240,0,0,255,247,255,250,0,0,0,0,255,224,255,214,255,248,255,223,0,0,0,0,0,0,0,0,0,0,0,0,255,242,0,0,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,188,0,0,0,0,0,0,0,0,0,0,255,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,225,255,222,0,0,0,0,0,0,0,0,255,226,255,222,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,223,0,0,0,0,0,0,0,0,255,240,255,223,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,232,0,0,0,0,0,0,0,0,255,247,255,231,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,255,227,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,221,0,0,0,0,0,0,0,0,255,223,255,221,255,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,236,0,0,0,0,0,0,0,0,0,0,255,226,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,28,0,3,0,3,0,0,0,7,0,9,0,1,0,11,0,13,0,4,0,15,0,26,0,7,0,30,0,30,0,19,0,33,0,40,0,20,0,43,0,46,0,28,0,49,0,49,0,32,0,51,0,61,0,33,0,66,0,72,0,44,0,76,0,77,0,51,0,83,0,85,0,53,0,87,0,92,0,56,0,97,0,97,0,62,0,110,0,111,0,63,0,126,0,126,0,65,0,157,0,158,0,66,0,161,0,163,0,68,0,171,0,175,0,71,0,209,0,210,0,76,0,212,0,213,0,78,0,221,0,221,0,80,0,240,0,246,0,81,0,249,0,252,0,88,1,0,1,0,0,92,1,2,1,10,0,93,1,12,1,12,0,102,255,255,255,255,0,103,0,2,0,22,0,3,0,3,0,0,0,7,0,7,0,1,0,9,0,9,0,2,0,13,0,16,0,3,0,21,0,21,0,7,0,24,0,24,0,8,0,33,0,61,0,9,0,66,0,92,0,38,0,97,0,97,0,65,0,107,0,107,0,66,0,110,0,110,0,67,0,122,0,122,0,68,0,126,0,149,0,69,0,151,0,181,0,93,0,183,0,190,0,124,0,193,0,200,0,132,0,207,0,214,0,140,0,220,0,221,0,148,0,240,0,245,0,150,0,247,0,248,0,156,0,250,1,2,0,158,1,4,1,12,0,167,0,1,0,7,1,6,0,1,0,0,0,2,0,0,0,0,0,0,0,3,0,4,0,5,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,17,0,18,0,19,0,20,0,21,0,17,0,22,0,23,0,22,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,0,0,0,0,0,0,0,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,43,0,44,0,45,0,42,0,42,0,46,0,46,0,47,0,48,0,49,0,50,0,47,0,51,0,52,0,53,0,54,0,55,0,56,0,0,0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,61,0,10,0,10,0,10,0,10,0,10,0,10,0,14,0,12,0,14,0,14,0,14,0,14,0,17,0,17,0,17,0,17,0,13,0,17,0,22,0,22,0,22,0,22,0,22,0,0,0,22,0,27,0,27,0,27,0,27,0,31,0,62,0,63,0,35,0,35,0,35,0,35,0,35,0,35,0,39,0,37,0,39,0,39,0,39,0,39,0,43,0,43,0,43,0,43,0,64,0,42,0,46,0,46,0,46,0,46,0,46,0,0,0,46,0,47,0,47,0,47,0,47,0,54,0,36,0,54,0,0,0,0,0,43,0,14,0,39,0,25,0,49,0,31,0,32,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,65,0,66,0,67,0,65,0,66,0,67,0,0,0,0,0,0,0,0,0,0,0,58,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,71,0,72,0,73,0,70,0,74,0,0,0,75,0,75,0,0,0,76,0,69,0,78,0,75,0,79,0,70,0,80,0,79,0,81,0,0,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,70,0,77,0,1,0,2,1,11,0,73,0,23,0,0,0,0,0,0,0,1,0,23,0,0,0,64,0,50,0,0,0,2,0,14,0,15,0,3,0,0,0,74,0,76,0,0,0,4,0,0,0,5,0,67,0,0,0,0,0,70,0,71,0,0,0,0,0,0,0,51,0,6,0,16,0,27,0,28,0,27,0,29,0,27,0,28,0,27,0,27,0,75,0,27,0,27,0,7,0,27,0,28,0,27,0,28,0,27,0,30,0,37,0,31,0,38,0,39,0,40,0,24,0,41,0,0,0,52,0,65,0,0,0,0,0,0,0,17,0,62,0,18,0,18,0,18,0,42,0,8,0,62,0,63,0,63,0,62,0,53,0,32,0,32,0,18,0,32,0,18,0,32,0,19,0,43,0,25,0,54,0,55,0,44,0,26,0,33,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0,16,0,16,0,16,0,16,0,16,0,16,0,9,0,28,0,29,0,29,0,29,0,29,0,27,0,27,0,27,0,27,0,27,0,27,0,28,0,28,0,28,0,28,0,28,0,0,0,28,0,31,0,31,0,31,0,31,0,24,0,27,0,45,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,18,0,18,0,18,0,18,0,18,0,63,0,63,0,63,0,63,0,10,0,32,0,18,0,18,0,18,0,18,0,18,0,0,0,18,0,25,0,25,0,25,0,25,0,26,0,32,0,26,0,0,0,0,0,63,0,28,0,18,0,30,0,19,0,24,0,41,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,14,0,35,0,36,0,21,0,35,0,36,0,21,0,0,0,0,0,0,0,15,0,0,0,20,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,34,0,22,0,34,0,68,0,34,0,22,0,34,0,34,0,69,0,34,0,11,0,13,0,34,0,22,0,12,0,34,0,22,0,34,0,72,0,46,0,59,0,60,0,61,0,47,0,48,0,49,0,22,0,34,0,1,0,0,0,10,0,32,0,58,0,1,108,97,116,110,0,8,0,4,0,0,0,0,255,255,0,2,0,0,0,1,0,2,97,97,108,116,0,14,115,109,99,112,0,20,0,0,0,1,0,0,0,0,0,1,0,1,0,2,0,6,0,14,0,1,0,0,0,1,0,78,0,1,0,0,0,1,0,8,0,2,0,124,0,28,0,251,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,1,12,0,252,0,253,0,254,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,0,255,1,11,0,2,0,62,0,28,0,251,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,1,12,0,252,0,253,0,254,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,0,255,1,11,0,2,0,3,0,66,0,91,0,0,0,165,0,165,0,26,0,195,0,195,0,27,0,0,0,3,1,245,1,144,0,5,0,0,2,188,2,138,0,0,0,140,2,188,2,138,0,0,1,221,0,50,0,250,8,2,2,11,8,3,5,2,2,2,0,4,128,0,0,47,0,0,0,11,0,0,0,0,0,0,0,0,80,89,82,83,0,64,0,32,33,34,3,197,255,6,0,0,3,197,0,250,0,0,0,1,0,0,0,0,1,234,2,188,0,0,0,32,0,2,0,0,0,3,0,0,0,3,0,0,2,222,0,1,0,0,0,0,0,28,0,3,0,1,0,0,1,230,0,6,1,202,0,0,0,32,0,224,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,0,0,239,0,0,0,211,0,201,0,214,0,218,0,215,0,216,0,203,0,219,0,196,0,220,0,194,0,0,0,199,0,0,0,0,0,209,0,210,0,212,0,213,0,217,0,207,0,208,0,206,0,240,0,197,0,221,0,195,0,0,0,200,0,198,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,0,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0,151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163,0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,0,189,0,190,0,4,0,248,0,0,0,58,0,32,0,4,0,26,0,126,0,142,0,158,0,174,0,255,1,13,1,49,1,83,1,97,1,120,1,126,1,146,2,55,2,199,2,218,2,220,32,20,32,26,32,30,32,34,32,38,32,48,32,58,32,112,32,121,32,137,32,172,33,34,255,255,0,0,0,32,0,142,0,158,0,160,0,176,1,12,1,49,1,82,1,96,1,120,1,125,1,146,2,55,2,198,2,218,2,220,32,19,32,24,32,28,32,32,32,38,32,48,32,57,32,112,32,116,32,128,32,172,33,34,255,255,255,225,0,57,0,42,255,192,255,191,255,179,255,144,255,112,255,100,255,78,255,74,255,55,254,147,254,5,253,243,253,242,224,188,224,185,224,184,224,183,224,180,224,171,224,163,224,110,224,107,224,101,224,67,223,206,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,248,0,0,0,58,0,32,0,4,0,26,0,126,0,142,0,158,0,174,0,255,1,13,1,49,1,83,1,97,1,120,1,126,1,146,2,55,2,199,2,218,2,220,32,20,32,26,32,30,32,34,32,38,32,48,32,58,32,112,32,121,32,137,32,172,33,34,255,255,0,0,0,32,0,142,0,158,0,160,0,176,1,12,1,49,1,82,1,96,1,120,1,125,1,146,2,55,2,198,2,218,2,220,32,19,32,24,32,28,32,32,32,38,32,48,32,57,32,112,32,116,32,128,32,172,33,34,255,255,255,225,0,57,0,42,255,192,255,191,255,179,255,144,255,112,255,100,255,78,255,74,255,55,254,147,254,5,253,243,253,242,224,188,224,185,224,184,224,183,224,180,224,171,224,163,224,110,224,107,224,101,224,67,223,206,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,70,0,84,0,58,0,96,0,72,0,0,0,14,255,14,0,8,1,64,0,8,1,234,0,10,2,188,0,14,2,48,0,11,2,238,0,5,184,0,0,44,75,184,0,9,80,88,177,1,1,142,89,184,1,255,133,184,0,68,29,185,0,9,0,3,95,94,45,184,0,1,44,32,32,69,105,68,176,1,96,45,184,0,2,44,184,0,1,42,33,45,184,0,3,44,32,70,176,3,37,70,82,88,35,89,32,138,32,138,73,100,138,32,70,32,104,97,100,176,4,37,70,32,104,97,100,82,88,35,101,138,89,47,32,176,0,83,88,105,32,176,0,84,88,33,176,64,89,27,105,32,176,0,84,88,33,176,64,101,89,89,58,45,184,0,4,44,32,70,176,4,37,70,82,88,35,138,89,32,70,32,106,97,100,176,4,37,70,32,106,97,100,82,88,35,138,89,47,253,45,184,0,5,44,75,32,176,3,38,80,88,81,88,176,128,68,27,176,64,68,89,27,33,33,32,69,176,192,80,88,176,192,68,27,33,89,89,45,184,0,6,44,32,32,69,105,68,176,1,96,32,32,69,125,105,24,68,176,1,96,45,184,0,7,44,184,0,6,42,45,184,0,8,44,75,32,176,3,38,83,88,176,64,27,176,0,89,138,138,32,176,3,38,83,88,35,33,176,128,138,138,27,138,35,89,32,176,3,38,83,88,35,33,184,0,192,138,138,27,138,35,89,32,176,3,38,83,88,35,33,184,1,0,138,138,27,138,35,89,32,176,3,38,83,88,35,33,184,1,64,138,138,27,138,35,89,32,184,0,3,38,83,88,176,3,37,69,184,1,128,80,88,35,33,184,1,128,35,33,27,176,3,37,69,35,33,35,33,89,27,33,89,68,45,184,0,9,44,75,83,88,69,68,27,33,33,89,45,0,0,0,0,2,0,8,0,2,255,255,0,3,0,1,0,72,0,250,0,162,1,104,0,3,0,28,184,0,2,47,65,3,0,0,0,2,0,1,93,184,0,3,220,0,184,0,1,47,184,0,2,220,48,49,55,35,53,51,162,90,90,250,110,0,0,2,0,59,0,0,0,183,2,238,0,3,0,7,0,164,187,0,7,0,4,0,6,0,4,43,65,5,0,0,0,7,0,16,0,7,0,2,93,184,0,7,16,184,0,0,208,65,13,0,6,0,0,0,22,0,0,0,38,0,0,0,54,0,0,0,70,0,0,0,86,0,0,0,6,113,65,5,0,0,0,6,0,16,0,6,0,2,93,184,0,6,16,184,0,3,208,65,13,0,9,0,3,0,25,0,3,0,41,0,3,0,57,0,3,0,73,0,3,0,89,0,3,0,6,113,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,7,220,65,3,0,63,0,7,0,1,113,184,0,1,220,48,49,19,3,35,3,19,35,53,51,183,30,64,30,104,84,84,2,238,253,218,2,38,253,18,86,0,2,0,40,1,194,1,106,2,238,0,3,0,7,0,60,184,0,7,47,184,0,3,220,185,0,0,0,4,244,184,0,7,16,185,0,4,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,18,62,89,184,0,6,220,184,0,2,208,184,0,7,16,184,0,3,208,48,49,1,3,35,3,35,3,35,3,1,106,20,52,20,136,20,54,20,2,238,254,212,1,44,254,212,1,44,0,0,2,0,33,255,245,2,160,2,188,0,27,0,31,1,239,184,0,12,47,65,3,0,137,0,12,0,1,93,65,5,0,0,0,12,0,16,0,12,0,2,93,184,0,8,220,184,0,7,220,184,0,26,208,65,3,0,71,0,26,0,1,93,186,0,27,0,26,0,7,17,18,57,184,0,27,16,184,0,0,208,184,0,0,47,186,0,2,0,26,0,7,17,18,57,186,0,3,0,26,0,7,17,18,57,184,0,3,16,184,0,4,208,184,0,4,47,186,0,6,0,7,0,26,17,18,57,184,0,8,16,184,0,25,208,65,3,0,71,0,25,0,1,93,186,0,9,0,8,0,25,17,18,57,184,0,12,16,184,0,11,220,184,0,22,208,65,3,0,71,0,22,0,1,93,186,0,10,0,11,0,22,17,18,57,184,0,12,16,184,0,21,208,65,3,0,71,0,21,0,1,93,186,0,13,0,12,0,21,17,18,57,184,0,13,16,184,0,14,208,184,0,14,47,186,0,16,0,12,0,21,17,18,57,186,0,17,0,21,0,12,17,18,57,184,0,17,16,184,0,18,208,184,0,18,47,186,0,20,0,21,0,12,17,18,57,186,0,23,0,22,0,11,17,18,57,186,0,24,0,25,0,8,17,18,57,186,0,28,0,25,0,8,17,18,57,186,0,29,0,22,0,11,17,18,57,186,0,30,0,11,0,22,17,18,57,186,0,31,0,8,0,25,17,18,57,0,184,0,0,69,88,184,0,22,47,27,185,0,22,0,14,62,89,184,0,0,69,88,184,0,11,47,27,185,0,11,0,6,62,89,186,0,23,0,22,0,11,17,18,57,184,0,23,47,65,3,0,15,0,23,0,1,93,185,0,29,0,2,244,65,3,0,159,0,29,0,1,93,184,0,2,208,186,0,30,0,11,0,22,17,18,57,184,0,30,47,65,3,0,144,0,30,0,1,93,184,0,3,208,184,0,30,16,185,0,10,0,2,244,65,3,0,159,0,10,0,1,93,184,0,6,208,184,0,11,16,184,0,8,208,184,0,10,16,184,0,13,208,184,0,30,16,184,0,16,208,184,0,29,16,184,0,17,208,184,0,23,16,184,0,20,208,184,0,22,16,184,0,25,208,184,0,23,16,184,0,27,208,48,49,1,7,35,7,51,7,35,7,35,55,35,7,35,55,35,55,51,55,35,55,51,55,51,7,51,55,51,15,1,35,7,51,2,160,29,116,48,128,38,122,87,80,87,133,87,80,86,120,37,115,48,126,29,129,74,80,74,133,75,80,74,113,132,48,132,1,251,84,123,84,227,227,227,227,84,123,84,193,193,193,193,84,123,0,0,0,1,0,42,255,224,1,222,2,236,0,43,2,240,186,0,39,0,17,0,3,43,65,3,0,16,0,39,0,1,93,65,3,0,208,0,39,0,1,93,65,3,0,144,0,39,0,1,93,65,3,0,176,0,39,0,1,93,65,3,0,111,0,17,0,1,93,65,3,0,79,0,17,0,1,93,65,3,0,16,0,17,0,1,93,186,0,2,0,39,0,17,17,18,57,184,0,2,47,185,0,1,0,4,244,186,0,0,0,1,0,2,17,18,57,186,0,3,0,2,0,1,17,18,57,186,0,5,0,17,0,39,17,18,57,184,0,5,47,184,0,39,16,184,0,10,220,65,11,0,79,0,10,0,95,0,10,0,111,0,10,0,127,0,10,0,143,0,10,0,5,93,65,3,0,223,0,10,0,1,93,184,0,3,16,184,0,22,208,184,0,2,16,184,0,23,208,184,0,1,16,184,0,24,208,184,0,0,16,184,0,25,208,186,0,27,0,39,0,17,17,18,57,184,0,27,47,184,0,17,16,184,0,32,220,65,3,0,239,0,32,0,1,93,65,9,0,80,0,32,0,96,0,32,0,112,0,32,0,128,0,32,0,4,93,0,184,0,2,47,184,0,0,69,88,184,0,23,47,27,185,0,23,0,18,62,89,65,5,0,80,0,2,0,96,0,2,0,2,93,186,0,3,0,2,0,23,17,18,57,184,0,3,47,184,0,0,208,184,0,3,16,184,0,6,220,65,3,0,128,0,6,0,1,93,65,3,0,32,0,6,0,1,93,184,0,3,16,185,0,8,0,2,244,186,0,22,0,23,0,2,17,18,57,184,0,22,47,186,0,13,0,3,0,22,17,18,57,65,9,0,90,0,13,0,106,0,13,0,122,0,13,0,138,0,13,0,4,93,184,0,25,208,184,0,22,16,184,0,28,220,184,0,22,16,185,0,30,0,2,244,186,0,35,0,22,0,3,17,18,57,48,49,1,65,3,0,135,0,5,0,1,93,65,3,0,25,0,15,0,1,93,65,3,0,27,0,16,0,1,93,65,3,0,139,0,16,0,1,93,65,3,0,8,0,20,0,1,93,65,11,0,53,0,34,0,69,0,34,0,85,0,34,0,101,0,34,0,117,0,34,0,5,93,65,3,0,21,0,37,0,1,93,65,3,0,117,0,37,0,1,93,65,3,0,38,0,37,0,1,93,65,7,0,71,0,37,0,87,0,37,0,103,0,37,0,3,93,65,3,0,118,0,38,0,1,93,65,3,0,22,0,42,0,1,93,65,3,0,7,0,42,0,1,93,0,65,3,0,139,0,4,0,1,93,65,11,0,60,0,4,0,76,0,4,0,92,0,4,0,108,0,4,0,124,0,4,0,5,93,65,3,0,139,0,5,0,1,93,65,3,0,137,0,12,0,1,93,65,3,0,24,0,15,0,1,93,65,3,0,41,0,15,0,1,93,65,3,0,6,0,20,0,1,93,65,3,0,131,0,26,0,1,93,65,11,0,52,0,26,0,68,0,26,0,84,0,26,0,100,0,26,0,116,0,26,0,5,93,65,11,0,55,0,34,0,71,0,34,0,87,0,34,0,103,0,34,0,119,0,34,0,5,93,65,3,0,69,0,37,0,1,93,65,5,0,22,0,37,0,38,0,37,0,2,93,65,7,0,86,0,37,0,102,0,37,0,118,0,37,0,3,93,65,5,0,9,0,42,0,25,0,42,0,2,93,37,23,35,55,38,39,55,22,51,50,53,52,46,4,53,52,62,2,55,39,51,7,22,23,7,38,35,34,21,20,30,4,21,20,14,2,1,29,15,89,17,117,59,12,70,116,110,47,71,82,71,47,21,45,71,49,17,90,16,108,53,9,102,65,121,49,73,85,73,49,14,42,76,82,114,113,6,32,109,58,63,29,36,26,24,34,52,42,28,53,41,28,5,117,117,6,31,96,48,58,27,32,23,24,38,61,49,22,49,43,33,0,0,0,0,5,0,35,255,242,3,37,2,193,0,3,0,21,0,37,0,55,0,71,2,46,184,0,7,47,184,0,41,47,65,7,0,0,0,41,0,16,0,41,0,32,0,41,0,3,93,184,0,51,220,186,0,1,0,7,0,51,17,18,57,184,0,1,47,184,0,0,220,184,0,1,16,184,0,3,220,184,0,2,220,184,0,7,16,184,0,17,220,184,0,7,16,184,0,27,220,65,3,0,31,0,27,0,1,113,184,0,17,16,184,0,33,220,65,3,0,16,0,33,0,1,113,184,0,41,16,184,0,61,220,65,3,0,31,0,61,0,1,113,184,0,51,16,184,0,67,220,65,3,0,16,0,67,0,1,113,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,38,47,27,185,0,38,0,6,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,12,16,184,0,4,220,184,0,12,16,184,0,22,220,184,0,4,16,184,0,30,220,184,0,38,16,184,0,46,220,184,0,56,220,184,0,38,16,184,0,64,220,48,49,1,65,3,0,87,0,0,0,1,93,65,7,0,10,0,6,0,26,0,6,0,42,0,6,0,3,93,65,7,0,10,0,9,0,26,0,9,0,42,0,9,0,3,93,65,3,0,200,0,10,0,1,93,65,3,0,199,0,14,0,1,93,65,7,0,5,0,15,0,21,0,15,0,37,0,15,0,3,93,65,7,0,5,0,19,0,21,0,19,0,37,0,19,0,3,93,65,3,0,199,0,20,0,1,93,65,5,0,118,0,24,0,134,0,24,0,2,93,65,3,0,201,0,39,0,1,93,65,7,0,10,0,40,0,26,0,40,0,42,0,40,0,3,93,65,7,0,10,0,43,0,26,0,43,0,42,0,43,0,3,93,65,3,0,200,0,44,0,1,93,65,3,0,199,0,48,0,1,93,65,7,0,5,0,49,0,21,0,49,0,37,0,49,0,3,93,65,7,0,5,0,53,0,21,0,53,0,37,0,53,0,3,93,65,3,0,199,0,54,0,1,93,65,5,0,118,0,58,0,134,0,58,0,2,93,0,65,3,0,203,0,5,0,1,93,65,3,0,197,0,10,0,1,93,65,3,0,195,0,14,0,1,93,65,3,0,202,0,20,0,1,93,65,3,0,201,0,39,0,1,93,65,3,0,199,0,44,0,1,93,65,3,0,198,0,48,0,1,93,65,3,0,202,0,54,0,1,93,23,35,1,51,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,237,75,1,165,74,254,36,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,1,195,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,12,2,200,254,145,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,253,101,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,0,3,0,36,255,233,2,81,2,191,0,30,0,43,0,51,3,97,186,0,28,0,10,0,3,43,65,3,0,127,0,10,0,1,93,65,3,0,16,0,10,0,1,93,184,0,10,16,185,0,47,0,4,244,65,3,0,16,0,28,0,1,93,184,0,28,16,185,0,27,0,5,244,186,0,44,0,47,0,27,17,18,57,65,3,0,105,0,44,0,1,93,186,0,30,0,28,0,10,17,18,57,65,3,0,103,0,30,0,1,93,186,0,2,0,44,0,30,17,18,57,186,0,14,0,10,0,28,17,18,57,184,0,14,47,184,0,22,220,65,3,0,128,0,22,0,1,93,186,0,12,0,14,0,22,17,18,57,65,3,0,25,0,12,0,1,93,65,3,0,8,0,12,0,1,93,186,0,24,0,22,0,14,17,18,57,65,3,0,135,0,24,0,1,93,65,3,0,10,0,24,0,1,93,65,3,0,153,0,24,0,1,93,65,3,0,102,0,24,0,1,93,65,3,0,117,0,24,0,1,93,186,0,25,0,44,0,30,17,18,57,65,3,0,136,0,25,0,1,93,184,0,14,16,184,0,34,220,65,3,0,159,0,34,0,1,93,65,7,0,63,0,34,0,79,0,34,0,95,0,34,0,3,113,186,0,36,0,12,0,24,17,18,57,184,0,22,16,184,0,41,220,65,3,0,161,0,41,0,1,93,65,3,0,144,0,41,0,1,93,186,0,45,0,12,0,24,17,18,57,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,27,0,19,0,5,17,18,57,184,0,27,47,186,0,2,0,5,0,27,17,18,57,186,0,36,0,19,0,5,17,18,57,65,3,0,101,0,36,0,1,93,65,3,0,133,0,36,0,1,93,186,0,45,0,19,0,5,17,18,57,65,3,0,105,0,45,0,1,93,186,0,12,0,36,0,45,17,18,57,186,0,24,0,36,0,45,17,18,57,186,0,25,0,27,0,5,17,18,57,65,7,0,101,0,25,0,117,0,25,0,133,0,25,0,3,93,186,0,30,0,25,0,2,17,18,57,184,0,19,16,185,0,31,0,1,244,186,0,44,0,25,0,2,17,18,57,65,3,0,103,0,44,0,1,93,184,0,5,16,185,0,50,0,1,244,48,49,1,65,3,0,22,0,3,0,1,93,65,7,0,88,0,7,0,104,0,7,0,120,0,7,0,3,93,65,3,0,105,0,8,0,1,93,65,3,0,137,0,8,0,1,93,65,3,0,10,0,8,0,1,93,65,3,0,90,0,8,0,1,93,65,3,0,122,0,8,0,1,93,65,3,0,89,0,9,0,1,93,65,3,0,9,0,16,0,1,93,65,3,0,27,0,16,0,1,93,65,5,0,6,0,20,0,22,0,20,0,2,93,65,3,0,4,0,21,0,1,93,65,5,0,38,0,21,0,54,0,21,0,2,93,65,3,0,88,0,25,0,1,93,0,65,3,0,25,0,3,0,1,93,65,3,0,89,0,3,0,1,93,65,3,0,122,0,3,0,1,93,65,7,0,89,0,7,0,105,0,7,0,121,0,7,0,3,93,65,3,0,88,0,8,0,1,93,65,3,0,120,0,8,0,1,93,65,3,0,9,0,8,0,1,93,65,3,0,105,0,8,0,1,93,65,3,0,88,0,9,0,1,93,65,3,0,21,0,16,0,1,93,65,3,0,6,0,16,0,1,93,65,3,0,20,0,20,0,1,93,65,3,0,68,0,20,0,1,93,65,3,0,5,0,20,0,1,93,65,3,0,37,0,20,0,1,93,65,3,0,54,0,20,0,1,93,65,3,0,86,0,20,0,1,93,65,3,0,85,0,25,0,1,93,65,3,0,71,0,25,0,1,93,65,3,0,137,0,45,0,1,93,33,35,39,14,1,35,34,46,2,53,52,55,38,53,52,62,2,51,50,22,21,20,7,23,54,55,51,6,7,3,34,6,21,20,23,63,1,62,1,53,52,38,19,39,6,21,20,22,51,50,2,81,92,44,44,86,58,60,87,58,28,126,75,31,53,71,40,72,71,164,190,32,7,81,4,61,236,43,59,55,53,20,29,24,43,106,208,81,75,73,88,46,38,31,27,49,68,41,115,89,91,79,39,61,44,23,69,57,119,102,195,41,149,156,95,2,22,52,48,61,67,41,17,25,44,26,36,39,253,239,208,57,87,55,69,0,0,0,1,0,41,1,194,0,141,2,238,0,3,0,34,184,0,3,47,185,0,0,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,2,220,48,49,19,3,35,3,141,18,64,18,2,238,254,212,1,44,0,0,0,1,0,42,255,120,0,237,2,238,0,15,0,150,184,0,6,47,184,0,12,220,184,0,0,208,184,0,12,16,184,0,11,220,184,0,1,208,184,0,6,16,185,0,14,0,5,244,65,3,0,15,0,17,0,1,93,0,184,0,0,47,184,0,0,69,88,184,0,12,47,27,185,0,12,0,18,62,89,48,49,1,65,3,0,134,0,13,0,1,93,65,3,0,55,0,13,0,1,93,65,3,0,151,0,13,0,1,93,65,3,0,134,0,15,0,1,93,65,3,0,151,0,15,0,1,93,0,65,3,0,152,0,13,0,1,93,65,3,0,137,0,13,0,1,93,65,3,0,150,0,15,0,1,93,65,3,0,135,0,15,0,1,93,23,35,46,3,53,52,62,2,55,51,6,21,20,237,79,30,44,28,14,14,29,44,29,79,123,136,45,93,106,124,75,76,124,106,92,45,200,243,244,0,0,1,0,24,255,120,0,219,2,238,0,15,0,149,184,0,11,47,65,3,0,48,0,11,0,1,93,65,3,0,112,0,11,0,1,93,184,0,5,220,184,0,6,220,184,0,0,208,184,0,5,16,184,0,1,208,184,0,11,16,185,0,3,0,5,244,65,3,0,15,0,17,0,1,93,0,184,0,0,47,184,0,0,69,88,184,0,6,47,27,185,0,6,0,18,62,89,48,49,1,65,3,0,152,0,2,0,1,93,65,3,0,137,0,2,0,1,93,65,3,0,56,0,4,0,1,93,65,5,0,137,0,4,0,153,0,4,0,2,93,0,65,3,0,151,0,2,0,1,93,65,5,0,136,0,4,0,152,0,4,0,2,93,23,35,54,53,52,39,51,30,3,21,20,14,2,103,79,123,123,79,29,44,29,14,14,29,43,136,199,244,243,200,45,92,106,124,76,75,124,106,93,0,0,0,1,0,33,1,168,1,137,2,237,0,14,0,193,186,0,9,0,8,0,3,43,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,18,62,89,184,0,2,220,65,3,0,64,0,2,0,1,93,65,3,0,64,0,2,0,1,113,184,0,0,208,184,0,0,47,48,49,1,65,5,0,40,0,3,0,56,0,3,0,2,113,65,3,0,56,0,4,0,1,113,65,3,0,228,0,5,0,1,93,65,3,0,121,0,5,0,1,93,65,5,0,137,0,11,0,153,0,11,0,2,93,65,3,0,55,0,14,0,1,113,65,3,0,73,0,14,0,1,93,0,65,3,0,7,0,0,0,1,113,65,3,0,53,0,1,0,1,93,65,3,0,167,0,1,0,1,93,65,3,0,230,0,5,0,1,93,65,3,0,231,0,6,0,1,93,65,7,0,184,0,11,0,200,0,11,0,216,0,11,0,3,93,1,39,7,39,55,39,55,23,39,51,7,55,23,7,23,1,59,102,100,32,108,156,23,148,13,46,16,149,23,158,113,1,171,133,136,32,117,65,41,86,156,156,86,42,63,115,0,0,0,0,1,0,46,0,102,1,160,1,196,0,11,0,177,184,0,4,47,65,3,0,143,0,4,0,1,93,65,3,0,160,0,4,0,1,93,65,3,0,0,0,4,0,1,93,184,0,1,220,65,3,0,159,0,1,0,1,93,184,0,0,220,65,3,0,144,0,0,0,1,93,184,0,4,16,184,0,5,220,65,3,0,159,0,5,0,1,93,184,0,4,16,184,0,7,208,184,0,1,16,184,0,10,208,0,184,0,4,47,184,0,1,208,184,0,4,16,184,0,3,220,184,0,4,16,184,0,7,220,65,7,0,64,0,7,0,80,0,7,0,96,0,7,0,3,113,184,0,8,220,65,3,0,47,0,8,0,1,93,65,5,0,31,0,8,0,47,0,8,0,2,113,65,3,0,175,0,8,0,1,93,184,0,7,16,184,0,10,208,48,49,37,35,21,35,53,35,53,51,53,51,21,51,1,160,145,80,145,145,80,145,238,136,136,86,128,128,0,0,0,0,1,0,57,255,147,0,158,0,86,0,6,0,95,187,0,6,0,4,0,5,0,4,43,65,3,0,16,0,5,0,1,93,184,0,5,16,184,0,2,208,65,3,0,16,0,6,0,1,93,186,0,3,0,5,0,6,17,18,57,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,208,184,0,4,16,184,0,1,220,184,0,4,16,184,0,5,220,65,3,0,63,0,5,0,1,113,48,49,51,7,39,55,39,53,51,158,78,23,35,34,100,109,13,87,9,86,0,0,1,0,57,0,238,1,111,1,68,0,3,0,37,184,0,1,47,65,3,0,0,0,1,0,1,93,184,0,0,220,65,3,0,96,0,0,0,1,93,0,184,0,1,47,184,0,2,220,48,49,37,33,53,33,1,111,254,202,1,54,238,86,0,0,1,0,57,0,0,0,147,0,86,0,3,0,61,187,0,0,0,4,0,1,0,4,43,65,3,0,16,0,0,0,1,93,65,3,0,16,0,1,0,1,93,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,220,65,3,0,63,0,2,0,1,113,48,49,51,35,53,51,147,90,90,86,0,0,1,0,19,255,171,1,241,2,188,0,3,0,61,184,0,2,47,184,0,0,220,65,3,0,128,0,0,0,1,93,184,0,2,16,185,0,1,0,4,244,184,0,0,16,185,0,3,0,4,244,0,184,0,1,47,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,48,49,9,1,35,1,1,241,254,134,100,1,122,2,188,252,239,3,17,0,2,0,63,255,242,2,139,2,202,0,19,0,35,2,48,186,0,15,0,5,0,3,43,65,3,0,15,0,5,0,1,113,65,3,0,143,0,5,0,1,93,65,3,0,239,0,5,0,1,93,65,5,0,0,0,5,0,16,0,5,0,2,93,65,3,0,32,0,15,0,1,113,65,3,0,80,0,15,0,1,113,65,3,0,64,0,15,0,1,93,65,5,0,0,0,15,0,16,0,15,0,2,93,184,0,5,16,185,0,25,0,4,244,184,0,15,16,185,0,31,0,4,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,185,0,20,0,2,244,184,0,0,16,185,0,28,0,2,244,48,49,1,65,3,0,25,0,2,0,1,93,65,7,0,105,0,2,0,121,0,2,0,137,0,2,0,3,93,65,3,0,42,0,2,0,1,93,65,3,0,24,0,3,0,1,93,65,7,0,89,0,3,0,105,0,3,0,121,0,3,0,3,93,65,3,0,104,0,8,0,1,93,65,3,0,25,0,8,0,1,93,65,3,0,121,0,8,0,1,93,65,5,0,22,0,12,0,38,0,12,0,2,93,65,3,0,102,0,12,0,1,93,65,3,0,22,0,13,0,1,93,65,7,0,102,0,13,0,118,0,13,0,134,0,13,0,3,93,65,3,0,87,0,13,0,1,93,65,3,0,86,0,17,0,1,93,65,3,0,38,0,18,0,1,93,65,3,0,23,0,18,0,1,93,65,7,0,103,0,18,0,119,0,18,0,135,0,18,0,3,93,65,3,0,89,0,26,0,1,93,0,65,3,0,137,0,1,0,1,93,65,3,0,40,0,2,0,1,93,65,3,0,25,0,2,0,1,93,65,7,0,105,0,2,0,121,0,2,0,137,0,2,0,3,93,65,3,0,24,0,3,0,1,93,65,3,0,104,0,3,0,1,93,65,3,0,121,0,3,0,1,93,65,3,0,22,0,8,0,1,93,65,3,0,118,0,8,0,1,93,65,3,0,103,0,8,0,1,93,65,7,0,103,0,12,0,119,0,12,0,135,0,12,0,3,93,65,3,0,117,0,13,0,1,93,65,3,0,23,0,13,0,1,93,65,3,0,103,0,13,0,1,93,65,3,0,88,0,17,0,1,93,65,5,0,25,0,18,0,41,0,18,0,2,93,65,5,0,105,0,18,0,121,0,18,0,2,93,65,3,0,138,0,18,0,1,93,65,3,0,87,0,26,0,1,93,5,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,95,65,106,75,42,46,81,110,63,62,106,77,43,43,79,111,57,41,72,53,31,102,87,91,108,29,51,70,14,50,92,130,80,83,139,99,55,53,94,132,78,84,137,97,53,2,130,39,74,108,69,132,134,143,142,64,101,69,37,0,0,0,1,0,34,0,0,0,254,2,188,0,11,0,150,187,0,0,0,4,0,1,0,4,43,65,3,0,16,0,0,0,1,93,65,3,0,16,0,1,0,1,93,184,0,1,16,184,0,5,220,186,0,10,0,1,0,0,17,18,57,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,10,16,184,0,4,220,186,0,2,0,10,0,4,17,18,57,65,5,0,235,0,2,0,251,0,2,0,2,93,65,7,0,11,0,2,0,27,0,2,0,43,0,2,0,3,113,65,5,0,202,0,2,0,218,0,2,0,2,93,185,0,5,0,2,244,48,49,51,35,17,6,7,39,62,3,55,51,254,100,54,50,16,21,43,39,33,11,73,2,51,45,16,89,7,23,29,33,17,0,0,1,0,50,0,0,1,214,2,202,0,28,1,188,186,0,22,0,12,0,3,43,65,3,0,95,0,12,0,1,93,184,0,12,16,184,0,1,208,65,3,0,42,0,1,0,1,113,65,3,0,67,0,1,0,1,113,184,0,22,16,185,0,6,0,4,244,184,0,1,16,184,0,27,208,65,3,0,114,0,27,0,1,93,65,3,0,19,0,27,0,1,113,65,3,0,69,0,27,0,1,93,65,3,0,245,0,27,0,1,93,65,3,0,5,0,27,0,1,113,65,5,0,83,0,27,0,99,0,27,0,2,93,65,5,0,67,0,27,0,83,0,27,0,2,113,65,3,0,33,0,27,0,1,113,65,3,0,128,0,27,0,1,93,184,0,22,16,184,0,28,208,184,0,28,47,0,184,0,0,69,88,184,0,17,47,27,185,0,17,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,4,0,17,0,0,17,18,57,184,0,17,16,185,0,9,0,2,244,184,0,17,16,184,0,11,220,185,0,12,0,2,244,65,3,0,86,0,12,0,1,93,186,0,25,0,0,0,17,17,18,57,184,0,0,16,185,0,28,0,2,244,48,49,1,65,5,0,105,0,3,0,121,0,3,0,2,93,65,3,0,89,0,4,0,1,93,65,3,0,149,0,19,0,1,93,65,7,0,103,0,19,0,119,0,19,0,135,0,19,0,3,93,65,7,0,101,0,20,0,117,0,20,0,133,0,20,0,3,93,65,3,0,6,0,20,0,1,93,65,3,0,150,0,20,0,1,93,0,65,3,0,118,0,3,0,1,93,65,3,0,133,0,4,0,1,93,65,3,0,22,0,4,0,1,93,65,3,0,87,0,4,0,1,93,65,3,0,133,0,14,0,1,93,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,93,65,7,0,101,0,19,0,117,0,19,0,133,0,19,0,3,93,65,3,0,6,0,20,0,1,93,65,3,0,151,0,20,0,1,93,41,1,62,1,55,54,53,52,38,35,34,7,39,62,3,51,50,30,2,21,20,14,2,7,51,1,214,254,98,91,116,28,56,65,57,93,70,12,7,35,51,67,39,55,75,45,19,23,51,82,59,242,129,179,52,104,48,54,59,93,85,13,34,30,20,35,55,69,33,36,83,103,130,84,0,1,0,40,255,242,1,228,2,202,0,49,2,46,186,0,45,0,5,0,3,43,65,3,0,79,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,16,0,45,0,1,113,65,3,0,16,0,45,0,1,93,184,0,45,16,185,0,16,0,4,244,186,0,22,0,45,0,5,17,18,57,184,0,22,47,186,0,40,0,45,0,5,17,18,57,184,0,40,47,185,0,27,0,4,244,186,0,32,0,5,0,45,17,18,57,184,0,32,47,186,0,43,0,22,0,40,17,18,57,65,3,0,117,0,43,0,1,93,65,3,0,86,0,43,0,1,93,65,3,0,100,0,43,0,1,93,65,3,0,132,0,43,0,1,93,0,184,0,0,69,88,184,0,35,47,27,185,0,35,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,6,220,65,3,0,32,0,6,0,1,93,184,0,5,208,65,7,0,10,0,5,0,26,0,5,0,42,0,5,0,3,113,184,0,0,16,185,0,11,0,2,244,186,0,24,0,35,0,0,17,18,57,184,0,24,47,185,0,21,0,2,244,184,0,35,16,185,0,29,0,2,244,184,0,35,16,184,0,31,220,65,5,0,144,0,31,0,160,0,31,0,2,93,186,0,43,0,24,0,21,17,18,57,48,49,1,65,3,0,137,0,3,0,1,93,65,13,0,56,0,33,0,72,0,33,0,88,0,33,0,104,0,33,0,120,0,33,0,136,0,33,0,6,93,65,3,0,7,0,37,0,1,93,65,7,0,87,0,42,0,103,0,42,0,119,0,42,0,3,93,65,5,0,85,0,44,0,101,0,44,0,2,93,65,3,0,133,0,44,0,1,93,65,3,0,118,0,44,0,1,93,65,3,0,87,0,47,0,1,93,0,65,11,0,57,0,3,0,73,0,3,0,89,0,3,0,105,0,3,0,121,0,3,0,5,93,65,3,0,138,0,3,0,1,93,65,13,0,54,0,33,0,70,0,33,0,86,0,33,0,102,0,33,0,118,0,33,0,134,0,33,0,6,93,65,3,0,6,0,37,0,1,93,65,3,0,88,0,42,0,1,93,65,3,0,105,0,42,0,1,93,65,3,0,122,0,42,0,1,93,65,3,0,86,0,44,0,1,93,65,3,0,118,0,44,0,1,93,65,3,0,103,0,44,0,1,93,65,3,0,135,0,44,0,1,93,65,3,0,90,0,47,0,1,93,65,3,0,89,0,48,0,1,93,23,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2,43,1,55,51,50,54,53,52,35,34,7,39,62,1,51,50,30,2,21,20,6,7,22,21,20,14,2,230,30,61,53,39,7,23,28,42,37,38,23,30,55,40,24,17,39,63,47,73,10,37,91,76,119,85,50,17,16,83,63,66,83,47,17,40,51,116,40,69,93,14,11,17,18,7,88,15,20,14,6,15,34,54,38,30,48,34,18,76,58,57,94,41,81,16,30,35,53,63,29,42,69,35,39,135,54,85,59,30,0,2,0,14,0,0,1,244,2,188,0,9,0,12,1,7,186,0,1,0,5,0,3,43,184,0,1,16,184,0,0,220,184,0,1,16,185,0,4,0,4,244,65,3,0,143,0,5,0,1,93,184,0,10,208,184,0,1,16,184,0,8,208,186,0,6,0,10,0,8,17,18,57,65,3,0,137,0,6,0,1,93,184,0,5,16,184,0,12,208,65,3,0,116,0,12,0,1,93,65,3,0,22,0,12,0,1,113,65,3,0,37,0,12,0,1,113,65,3,0,99,0,12,0,1,93,65,3,0,130,0,12,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,186,0,1,0,6,0,3,17,18,57,184,0,1,47,65,3,0,144,0,1,0,1,93,184,0,4,208,184,0,1,16,185,0,8,0,2,244,184,0,10,208,184,0,6,16,184,0,11,208,65,3,0,252,0,11,0,1,93,65,3,0,46,0,11,0,1,113,65,5,0,125,0,11,0,141,0,11,0,2,93,65,3,0,11,0,11,0,1,113,65,3,0,106,0,11,0,1,93,48,49,65,3,0,92,0,11,0,1,93,37,35,21,35,53,33,1,51,17,51,35,53,7,1,244,85,100,254,211,1,66,79,85,185,153,190,190,190,1,254,254,88,254,254,0,0,0,0,1,0,51,255,242,1,233,2,188,0,31,1,213,186,0,27,0,5,0,3,43,65,3,0,79,0,5,0,1,113,65,3,0,47,0,5,0,1,93,65,3,0,47,0,5,0,1,113,65,3,0,16,0,5,0,1,93,65,3,0,16,0,27,0,1,93,65,3,0,64,0,27,0,1,93,65,3,0,96,0,27,0,1,93,184,0,27,16,185,0,13,0,4,244,186,0,17,0,5,0,27,17,18,57,184,0,17,47,184,0,16,220,65,3,0,86,0,16,0,1,113,184,0,17,16,184,0,18,208,186,0,19,0,17,0,27,17,18,57,184,0,19,47,184,0,16,16,184,0,21,208,186,0,22,0,21,0,16,17,18,57,65,3,0,39,0,22,0,1,113,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,6,220,65,3,0,48,0,6,0,1,93,185,0,5,0,2,244,184,0,0,16,185,0,8,0,2,244,186,0,22,0,19,0,0,17,18,57,184,0,22,47,185,0,16,0,2,244,184,0,19,16,185,0,20,0,2,244,48,49,1,65,3,0,72,0,3,0,1,93,65,3,0,137,0,11,0,1,93,65,3,0,70,0,24,0,1,93,65,3,0,102,0,24,0,1,93,65,3,0,55,0,24,0,1,93,65,3,0,100,0,25,0,1,93,65,3,0,69,0,25,0,1,93,65,3,0,54,0,25,0,1,93,65,3,0,86,0,25,0,1,93,65,3,0,119,0,25,0,1,93,65,3,0,55,0,29,0,1,93,65,3,0,71,0,30,0,1,93,0,65,3,0,73,0,3,0,1,93,65,3,0,135,0,11,0,1,93,65,3,0,67,0,24,0,1,93,65,3,0,53,0,24,0,1,93,65,5,0,85,0,24,0,101,0,24,0,2,93,65,9,0,53,0,25,0,69,0,25,0,85,0,25,0,101,0,25,0,4,93,65,3,0,119,0,25,0,1,93,65,3,0,56,0,29,0,1,93,65,3,0,57,0,30,0,1,93,65,3,0,76,0,30,0,1,93,23,34,46,2,39,55,22,51,50,62,2,53,52,38,43,1,19,33,7,35,7,50,30,2,21,20,14,2,220,22,54,50,37,6,23,72,73,35,60,45,26,99,112,85,42,1,62,9,233,20,81,115,72,34,44,73,98,14,7,12,14,6,89,42,25,43,58,34,63,60,1,89,86,174,25,50,77,52,56,92,66,36,0,0,0,0,2,0,62,255,242,2,12,2,188,0,27,0,47,2,74,186,0,23,0,5,0,3,43,65,3,0,239,0,5,0,1,93,65,3,0,31,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,0,0,5,0,1,93,65,3,0,0,0,23,0,1,93,65,3,0,192,0,23,0,1,93,65,5,0,48,0,23,0,64,0,23,0,2,93,186,0,11,0,23,0,5,17,18,57,184,0,11,47,184,0,5,16,185,0,33,0,4,244,184,0,16,208,184,0,23,16,185,0,43,0,4,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,12,208,65,3,0,249,0,12,0,1,93,184,0,0,16,184,0,18,220,65,3,0,64,0,18,0,1,93,186,0,16,0,18,0,0,17,18,57,65,3,0,243,0,16,0,1,93,185,0,28,0,2,244,184,0,0,16,185,0,38,0,2,244,48,49,1,65,7,0,89,0,2,0,105,0,2,0,121,0,2,0,3,93,65,3,0,138,0,2,0,1,93,65,3,0,91,0,3,0,1,93,65,3,0,136,0,8,0,1,93,65,3,0,247,0,11,0,1,93,65,3,0,69,0,13,0,1,93,65,3,0,117,0,13,0,1,93,65,3,0,54,0,13,0,1,93,65,3,0,103,0,13,0,1,93,65,5,0,102,0,14,0,118,0,14,0,2,93,65,5,0,102,0,20,0,118,0,20,0,2,93,65,5,0,7,0,20,0,23,0,20,0,2,93,65,3,0,135,0,20,0,1,93,65,3,0,102,0,21,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,87,0,25,0,1,93,65,3,0,86,0,26,0,1,93,0,65,3,0,136,0,2,0,1,93,65,7,0,89,0,2,0,105,0,2,0,121,0,2,0,3,93,65,3,0,135,0,8,0,1,93,65,3,0,6,0,9,0,1,93,65,3,0,250,0,11,0,1,93,65,3,0,72,0,13,0,1,93,65,3,0,120,0,13,0,1,93,65,3,0,107,0,13,0,1,93,65,3,0,122,0,14,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,117,0,20,0,1,93,65,5,0,6,0,20,0,22,0,20,0,2,93,65,3,0,102,0,20,0,1,93,65,3,0,134,0,20,0,1,93,65,3,0,102,0,21,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,88,0,25,0,1,93,65,3,0,90,0,26,0,1,93,5,34,46,2,53,52,62,2,55,23,14,3,7,54,51,50,30,2,21,20,14,2,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,25,50,80,58,31,61,91,105,43,65,40,76,66,55,19,46,95,45,78,57,32,35,64,89,33,29,51,38,23,20,36,48,27,33,50,34,17,13,30,47,14,30,62,96,66,98,168,123,70,1,38,18,46,69,100,72,63,27,51,76,48,49,84,63,36,1,97,20,36,51,31,33,49,33,17,24,40,52,29,24,45,35,21,0,1,0,39,0,0,1,236,2,188,0,5,0,190,186,0,0,0,5,0,3,43,65,3,0,55,0,0,0,1,93,65,3,0,87,0,0,0,1,93,184,0,0,16,184,0,1,208,184,0,0,16,184,0,3,208,65,7,0,41,0,3,0,57,0,3,0,73,0,3,0,3,93,65,3,0,90,0,3,0,1,93,65,5,0,108,0,3,0,124,0,3,0,2,93,65,3,0,141,0,3,0,1,93,65,5,0,26,0,3,0,42,0,3,0,2,113,65,3,0,249,0,3,0,1,93,65,3,0,9,0,3,0,1,113,65,3,0,232,0,3,0,1,93,65,3,0,151,0,3,0,1,93,184,0,2,208,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,16,185,0,4,0,2,244,48,49,9,1,35,1,33,53,1,236,254,209,100,1,9,254,197,2,188,253,68,2,102,86,0,0,0,3,0,59,255,242,2,37,2,201,0,31,0,43,0,57,2,65,186,0,27,0,5,0,3,43,65,3,0,31,0,5,0,1,113,65,3,0,0,0,5,0,1,93,65,5,0,0,0,27,0,16,0,27,0,2,93,65,3,0,80,0,27,0,1,113,65,3,0,32,0,27,0,1,113,186,0,9,0,5,0,27,17,18,57,184,0,9,47,186,0,19,0,27,0,5,17,18,57,184,0,19,47,186,0,7,0,9,0,19,17,18,57,186,0,24,0,19,0,9,17,18,57,184,0,9,16,185,0,32,0,4,244,184,0,19,16,185,0,38,0,4,244,184,0,5,16,185,0,47,0,4,244,184,0,27,16,185,0,55,0,4,244,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,35,0,14,0,0,17,18,57,65,3,0,134,0,35,0,1,93,65,3,0,170,0,35,0,1,93,65,3,0,185,0,35,0,1,93,65,3,0,86,0,35,0,1,93,65,5,0,101,0,35,0,117,0,35,0,2,93,186,0,44,0,0,0,14,17,18,57,65,3,0,138,0,44,0,1,93,65,3,0,185,0,44,0,1,93,65,3,0,41,0,44,0,1,93,186,0,7,0,35,0,44,17,18,57,186,0,24,0,35,0,44,17,18,57,184,0,14,16,185,0,41,0,2,244,184,0,0,16,185,0,50,0,2,244,48,49,1,65,3,0,104,0,2,0,1,93,65,3,0,90,0,2,0,1,93,65,3,0,89,0,3,0,1,93,65,3,0,10,0,3,0,1,93,65,3,0,122,0,3,0,1,93,65,3,0,107,0,3,0,1,93,65,5,0,57,0,8,0,73,0,8,0,2,93,65,3,0,24,0,11,0,1,93,65,3,0,9,0,11,0,1,93,65,5,0,6,0,17,0,22,0,17,0,2,93,65,3,0,100,0,26,0,1,93,65,3,0,117,0,26,0,1,93,65,5,0,86,0,29,0,102,0,29,0,2,93,65,3,0,133,0,42,0,1,93,65,5,0,56,0,53,0,72,0,53,0,2,93,0,65,5,0,89,0,2,0,105,0,2,0,2,93,65,7,0,89,0,3,0,105,0,3,0,121,0,3,0,3,93,65,3,0,6,0,11,0,1,93,65,3,0,23,0,11,0,1,93,65,3,0,7,0,17,0,1,93,65,3,0,119,0,26,0,1,93,65,5,0,88,0,29,0,104,0,29,0,2,93,65,3,0,89,0,30,0,1,93,65,3,0,69,0,53,0,1,93,65,3,0,55,0,53,0,1,93,5,34,46,2,53,52,55,38,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,21,20,14,2,3,20,22,23,62,1,53,52,38,35,34,6,23,14,1,21,20,22,51,50,62,2,53,52,38,1,40,60,89,59,29,134,93,24,50,78,56,54,76,49,23,11,27,45,34,81,75,33,64,95,170,60,51,58,59,58,54,54,62,119,66,77,71,66,32,54,40,22,79,14,33,56,73,41,116,71,72,92,36,64,46,27,25,43,58,32,27,41,38,38,24,28,89,72,40,76,60,36,2,36,34,60,19,17,67,40,39,44,49,241,13,73,63,58,59,19,34,47,27,51,73,0,0,2,0,45,0,0,1,251,2,202,0,26,0,46,2,23,186,0,5,0,22,0,3,43,65,3,0,224,0,5,0,1,93,65,3,0,64,0,5,0,1,93,65,3,0,192,0,5,0,1,93,65,3,0,128,0,5,0,1,93,65,3,0,63,0,22,0,1,93,65,3,0,31,0,22,0,1,93,186,0,11,0,22,0,5,17,18,57,184,0,11,47,184,0,5,16,185,0,32,0,4,244,184,0,16,208,184,0,22,16,185,0,42,0,4,244,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,14,62,89,184,0,0,69,88,184,0,10,47,27,185,0,10,0,6,62,89,184,0,12,208,65,3,0,246,0,12,0,1,93,184,0,0,16,184,0,19,220,65,3,0,79,0,19,0,1,93,186,0,16,0,0,0,19,17,18,57,185,0,27,0,2,244,184,0,0,16,185,0,37,0,2,244,48,49,1,65,3,0,117,0,2,0,1,93,65,3,0,86,0,2,0,1,93,65,3,0,134,0,2,0,1,93,65,3,0,86,0,3,0,1,93,65,3,0,134,0,6,0,1,93,65,3,0,6,0,8,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,23,0,8,0,1,93,65,5,0,57,0,13,0,73,0,13,0,2,93,65,5,0,106,0,13,0,122,0,13,0,2,93,65,3,0,88,0,16,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,136,0,20,0,1,93,65,3,0,121,0,20,0,1,93,65,5,0,9,0,21,0,25,0,21,0,2,93,65,3,0,105,0,21,0,1,93,65,3,0,138,0,21,0,1,93,65,3,0,89,0,24,0,1,93,65,3,0,89,0,25,0,1,93,0,65,3,0,102,0,2,0,1,93,65,3,0,134,0,2,0,1,93,65,3,0,87,0,2,0,1,93,65,3,0,119,0,2,0,1,93,65,3,0,86,0,3,0,1,93,65,3,0,24,0,8,0,1,93,65,3,0,137,0,8,0,1,93,65,3,0,9,0,9,0,1,93,65,3,0,101,0,13,0,1,93,65,3,0,118,0,13,0,1,93,65,3,0,71,0,13,0,1,93,65,3,0,88,0,16,0,1,93,65,3,0,89,0,17,0,1,93,65,3,0,104,0,20,0,1,93,65,5,0,122,0,20,0,138,0,20,0,2,93,65,3,0,86,0,24,0,1,93,65,3,0,85,0,25,0,1,93,1,50,30,2,21,20,14,2,35,39,62,3,55,14,1,35,34,38,53,52,62,2,19,50,62,2,53,52,46,2,35,34,14,2,21,20,30,2,1,32,42,79,61,37,61,89,101,40,73,41,83,70,50,9,20,76,43,100,112,36,64,89,32,30,51,38,22,21,35,48,27,33,50,34,17,13,29,47,2,202,24,58,97,73,110,172,118,62,38,19,51,71,94,63,27,30,102,100,51,85,62,35,254,159,20,37,51,32,31,49,33,17,24,40,53,28,24,46,34,21,0,0,2,0,57,0,0,0,147,1,184,0,3,0,7,0,102,187,0,7,0,4,0,6,0,4,43,65,3,0,16,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,16,0,6,0,1,93,184,0,6,16,184,0,1,208,0,184,0,2,47,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,2,16,184,0,1,220,65,3,0,48,0,1,0,1,113,184,0,5,16,184,0,6,220,65,3,0,63,0,6,0,1,113,48,49,19,35,53,51,17,35,53,51,147,90,90,90,90,1,98,86,254,72,86,0,0,0,0,2,0,57,255,147,0,158,1,184,0,3,0,10,0,136,187,0,10,0,4,0,9,0,4,43,65,3,0,16,0,10,0,1,93,184,0,10,16,184,0,0,208,65,3,0,16,0,9,0,1,93,184,0,9,16,184,0,1,208,184,0,9,16,184,0,6,208,186,0,7,0,9,0,10,17,18,57,0,184,0,2,47,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,2,16,184,0,1,220,65,3,0,48,0,1,0,1,113,184,0,8,16,184,0,4,208,184,0,8,16,184,0,5,220,184,0,8,16,184,0,9,220,65,3,0,63,0,9,0,1,113,48,49,19,35,53,51,17,7,39,55,39,53,51,158,100,100,78,23,35,34,100,1,98,86,254,71,108,13,87,9,86,0,0,0,0,1,0,33,0,78,1,88,1,234,0,5,0,73,184,0,2,47,184,0,4,220,184,0,0,208,184,0,4,16,185,0,3,0,4,244,184,0,1,208,184,0,2,16,185,0,5,0,4,244,0,25,184,0,2,47,24,184,0,1,208,184,0,1,47,184,0,2,16,184,0,3,208,184,0,3,47,184,0,2,16,184,0,5,208,48,49,37,35,39,55,51,7,1,88,95,216,216,95,216,78,206,206,206,0,2,0,66,0,160,1,180,1,138,0,3,0,7,0,61,184,0,5,47,65,3,0,16,0,5,0,1,93,184,0,4,220,184,0,0,208,184,0,5,16,184,0,1,208,0,184,0,5,47,184,0,1,220,65,3,0,15,0,1,0,1,93,184,0,2,220,184,0,5,16,184,0,6,220,48,49,1,33,53,33,21,33,53,33,1,180,254,142,1,114,254,142,1,114,1,62,76,234,76,0,1,0,60,0,78,1,115,1,234,0,5,0,82,184,0,0,47,65,3,0,16,0,0,0,1,93,184,0,4,220,185,0,5,0,4,244,184,0,1,208,184,0,4,16,184,0,2,208,184,0,0,16,185,0,3,0,4,244,0,25,184,0,0,47,24,184,0,1,208,184,0,1,47,184,0,0,16,184,0,3,208,184,0,0,16,184,0,5,208,184,0,5,47,48,49,1,7,35,55,39,51,1,115,216,95,216,216,95,1,28,206,206,206,0,0,0,2,0,30,0,0,1,141,2,238,0,36,0,40,1,93,186,0,29,0,21,0,3,43,65,3,0,16,0,21,0,1,93,65,3,0,16,0,29,0,1,93,186,0,1,0,21,0,29,17,18,57,184,0,1,47,65,5,0,16,0,1,0,32,0,1,0,2,113,65,7,0,16,0,1,0,32,0,1,0,48,0,1,0,3,93,184,0,0,220,184,0,29,16,184,0,10,220,65,7,0,48,0,10,0,64,0,10,0,80,0,10,0,3,113,186,0,39,0,21,0,29,17,18,57,184,0,39,47,185,0,40,0,4,244,0,184,0,0,69,88,184,0,24,47,27,185,0,24,0,18,62,89,184,0,0,69,88,184,0,38,47,27,185,0,38,0,6,62,89,184,0,39,220,65,3,0,63,0,39,0,1,113,184,0,1,220,184,0,24,16,185,0,15,0,1,244,184,0,24,16,184,0,20,220,48,49,1,65,3,0,121,0,8,0,1,93,65,3,0,6,0,26,0,1,93,65,3,0,102,0,26,0,1,93,65,3,0,101,0,27,0,1,93,65,3,0,119,0,27,0,1,93,65,3,0,39,0,33,0,1,93,65,3,0,134,0,34,0,1,93,65,3,0,23,0,34,0,1,93,0,65,7,0,54,0,22,0,70,0,22,0,86,0,22,0,3,93,65,3,0,7,0,26,0,1,93,65,3,0,103,0,26,0,1,93,65,5,0,103,0,27,0,119,0,27,0,2,93,65,3,0,40,0,33,0,1,93,65,3,0,137,0,33,0,1,93,65,3,0,25,0,34,0,1,93,65,3,0,138,0,34,0,1,93,55,35,38,53,52,62,4,53,52,46,2,35,34,14,2,7,39,62,1,51,50,30,2,21,20,6,15,1,14,1,31,1,35,53,51,226,59,3,22,34,38,34,22,21,35,46,26,22,43,35,26,5,25,19,86,54,48,77,54,29,35,25,51,26,35,1,18,91,91,200,40,5,31,53,49,47,49,55,32,30,46,31,16,13,20,24,11,67,29,38,33,54,67,33,35,76,32,65,33,66,29,227,86,0,2,0,49,255,169,2,163,2,41,0,61,0,76,1,131,184,0,38,47,65,3,0,48,0,38,0,1,93,184,0,48,220,186,0,7,0,38,0,48,17,18,57,184,0,7,47,184,0,0,208,65,3,0,102,0,0,0,1,93,65,3,0,70,0,0,0,1,93,184,0,64,208,65,3,0,68,0,64,0,1,93,65,3,0,197,0,64,0,1,93,65,3,0,54,0,64,0,1,93,65,3,0,53,0,64,0,1,113,65,3,0,5,0,64,0,1,93,65,3,0,212,0,64,0,1,93,65,3,0,19,0,64,0,1,93,184,0,15,208,65,3,0,55,0,15,0,1,93,186,0,28,0,38,0,48,17,18,57,186,0,52,0,48,0,38,17,18,57,184,0,0,16,184,0,57,208,184,0,7,16,184,0,72,220,65,3,0,176,0,72,0,1,93,0,184,0,0,69,88,184,0,43,47,27,185,0,43,0,16,62,89,184,0,33,220,186,0,2,0,33,0,43,17,18,57,184,0,2,47,186,0,10,0,43,0,33,17,18,57,184,0,10,47,186,0,15,0,2,0,10,17,18,57,65,3,0,129,0,15,0,1,93,65,3,0,100,0,15,0,1,93,65,3,0,195,0,15,0,1,93,65,3,0,49,0,15,0,1,93,65,7,0,0,0,15,0,16,0,15,0,32,0,15,0,3,93,184,0,23,208,184,0,23,47,186,0,28,0,33,0,43,17,18,57,65,5,0,19,0,28,0,35,0,28,0,2,93,65,3,0,1,0,28,0,1,93,186,0,52,0,43,0,33,17,18,57,184,0,55,220,184,0,2,16,184,0,62,220,184,0,10,16,184,0,69,220,48,49,1,65,5,0,57,0,5,0,73,0,5,0,2,93,0,65,3,0,54,0,5,0,1,93,1,38,35,34,14,2,21,20,22,51,50,62,2,55,20,14,2,21,20,22,51,50,62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,7,6,35,34,53,52,62,2,39,50,23,14,3,35,34,38,53,52,62,2,2,33,51,71,46,91,72,45,44,51,21,50,48,43,14,1,1,1,26,29,15,36,36,34,12,24,70,86,97,51,57,92,65,34,60,104,136,77,58,93,64,34,5,16,33,28,39,27,37,10,16,19,111,47,7,6,41,54,59,25,22,22,34,53,61,1,123,53,50,79,101,51,48,63,17,31,42,26,1,9,10,10,1,32,51,11,18,23,12,43,71,51,28,35,66,96,60,80,140,103,60,36,66,94,58,26,56,51,42,13,17,53,13,48,61,72,30,22,39,85,72,47,36,28,39,73,55,34,0,0,0,2,0,7,0,0,2,97,2,188,0,7,0,10,1,97,187,0,7,0,4,0,6,0,4,43,65,3,0,16,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,246,0,0,0,1,93,65,3,0,86,0,0,0,1,93,65,3,0,22,0,0,0,1,93,185,0,1,0,4,244,65,3,0,16,0,6,0,1,93,186,0,9,0,6,0,7,17,18,57,186,0,2,0,1,0,9,17,18,57,184,0,6,16,184,0,5,208,65,3,0,249,0,5,0,1,93,65,3,0,25,0,5,0,1,93,65,3,0,89,0,5,0,1,93,185,0,4,0,4,244,186,0,3,0,4,0,9,17,18,57,186,0,8,0,9,0,1,17,18,57,186,0,10,0,9,0,4,17,18,57,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,8,0,7,0,4,17,18,57,184,0,8,47,185,0,2,0,2,244,184,0,7,16,184,0,9,208,48,49,1,65,3,0,56,0,0,0,1,93,65,5,0,72,0,6,0,88,0,6,0,2,93,65,3,0,57,0,6,0,1,93,65,7,0,105,0,6,0,121,0,6,0,137,0,6,0,3,93,65,7,0,102,0,7,0,118,0,7,0,134,0,7,0,3,93,65,7,0,55,0,7,0,71,0,7,0,87,0,7,0,3,93,0,65,3,0,22,0,9,0,1,93,65,3,0,250,0,9,0,1,93,65,5,0,10,0,9,0,26,0,9,0,2,113,65,3,0,43,0,9,0,1,113,33,35,39,33,7,35,19,51,19,11,1,2,97,100,67,254,244,67,100,251,100,54,104,104,189,189,2,188,254,87,1,36,254,220,0,0,3,0,80,0,0,2,50,2,188,0,20,0,33,0,46,2,71,186,0,16,0,1,0,3,43,65,3,0,191,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,80,0,1,0,1,113,65,3,0,240,0,16,0,1,93,65,5,0,0,0,16,0,16,0,16,0,2,93,65,3,0,208,0,16,0,1,93,65,3,0,80,0,16,0,1,113,65,3,0,16,0,16,0,1,113,186,0,8,0,16,0,1,17,18,57,184,0,8,47,184,0,1,16,185,0,36,0,4,244,184,0,23,208,186,0,13,0,8,0,23,17,18,57,65,3,0,5,0,13,0,1,93,184,0,8,16,185,0,29,0,4,244,184,0,16,16,185,0,42,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,23,0,3,0,0,17,18,57,184,0,23,47,185,0,35,0,2,244,186,0,13,0,23,0,35,17,18,57,184,0,3,16,185,0,21,0,2,244,184,0,0,16,185,0,37,0,2,244,48,49,1,65,3,0,119,0,5,0,1,93,65,3,0,117,0,6,0,1,93,65,3,0,6,0,6,0,1,93,65,3,0,38,0,6,0,1,93,65,3,0,134,0,6,0,1,93,65,3,0,23,0,6,0,1,93,65,5,0,118,0,11,0,134,0,11,0,2,93,65,3,0,118,0,12,0,1,93,65,3,0,135,0,12,0,1,93,65,3,0,85,0,14,0,1,93,65,3,0,102,0,14,0,1,93,65,3,0,134,0,14,0,1,93,65,3,0,117,0,15,0,1,93,65,3,0,116,0,18,0,1,93,65,3,0,6,0,18,0,1,93,65,5,0,86,0,18,0,102,0,18,0,2,93,65,5,0,87,0,19,0,103,0,19,0,2,93,0,65,3,0,133,0,5,0,1,93,65,3,0,118,0,5,0,1,93,65,3,0,133,0,6,0,1,93,65,3,0,118,0,6,0,1,93,65,7,0,7,0,6,0,23,0,6,0,39,0,6,0,3,93,65,3,0,136,0,11,0,1,93,65,3,0,121,0,11,0,1,93,65,3,0,136,0,12,0,1,93,65,3,0,122,0,12,0,1,93,65,3,0,101,0,14,0,1,93,65,3,0,86,0,14,0,1,93,65,3,0,134,0,14,0,1,93,65,3,0,119,0,15,0,1,93,65,3,0,9,0,18,0,1,93,65,5,0,90,0,18,0,106,0,18,0,2,93,65,3,0,123,0,18,0,1,93,65,3,0,106,0,19,0,1,93,65,3,0,91,0,19,0,1,93,33,35,17,51,50,30,2,21,20,14,2,7,30,1,21,20,14,2,3,35,21,51,50,62,2,53,52,46,2,19,35,21,51,50,62,2,53,52,46,2,1,64,240,158,65,99,66,34,3,12,23,19,65,52,43,69,87,98,90,118,24,40,30,17,23,38,50,30,148,98,45,70,49,26,20,36,52,2,188,14,39,67,53,27,40,34,33,20,25,80,60,67,82,44,15,2,103,206,7,22,44,38,33,38,19,5,254,220,237,7,24,44,38,35,47,29,13,0,0,0,1,0,39,255,242,2,71,2,202,0,38,1,174,186,0,12,0,5,0,3,43,65,3,0,95,0,5,0,1,93,65,3,0,127,0,5,0,1,93,65,3,0,63,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,0,0,12,0,1,113,65,5,0,0,0,12,0,16,0,12,0,2,93,65,3,0,224,0,12,0,1,93,65,3,0,176,0,12,0,1,93,184,0,5,16,185,0,21,0,4,244,184,0,12,16,184,0,37,208,65,3,0,0,0,40,0,1,93,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,65,3,0,25,0,5,0,1,93,184,0,10,16,184,0,13,220,65,5,0,144,0,13,0,160,0,13,0,2,93,185,0,12,0,2,244,184,0,10,16,185,0,16,0,2,244,184,0,0,16,185,0,26,0,2,244,184,0,0,16,184,0,36,220,65,5,0,159,0,36,0,175,0,36,0,2,93,185,0,37,0,2,244,48,49,1,65,3,0,104,0,2,0,1,93,65,3,0,25,0,2,0,1,93,65,3,0,121,0,2,0,1,93,65,3,0,90,0,2,0,1,93,65,3,0,90,0,3,0,1,93,65,3,0,24,0,7,0,1,93,65,3,0,88,0,7,0,1,93,65,3,0,24,0,8,0,1,93,65,3,0,88,0,8,0,1,93,65,3,0,121,0,8,0,1,93,65,3,0,106,0,8,0,1,93,65,3,0,71,0,19,0,1,93,0,65,3,0,24,0,2,0,1,93,65,5,0,88,0,2,0,104,0,2,0,2,93,65,3,0,121,0,2,0,1,93,65,3,0,88,0,3,0,1,93,65,3,0,23,0,7,0,1,93,65,3,0,87,0,7,0,1,93,65,5,0,85,0,8,0,101,0,8,0,2,93,65,3,0,118,0,8,0,1,93,65,3,0,23,0,8,0,1,93,5,34,46,2,53,52,62,2,51,50,23,7,39,38,35,34,14,2,21,20,30,2,51,50,54,63,1,54,63,1,54,63,1,23,6,1,134,77,129,93,52,52,93,128,77,107,87,10,57,57,70,59,91,63,33,32,63,93,60,15,28,15,25,8,19,23,5,21,23,10,87,14,52,96,134,82,81,134,96,53,41,88,20,23,42,74,102,60,59,102,75,42,2,3,5,1,7,7,1,8,8,88,40,0,0,2,0,80,0,0,2,175,2,188,0,12,0,25,1,67,186,0,8,0,1,0,3,43,65,3,0,47,0,1,0,1,113,65,3,0,127,0,1,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,16,0,1,0,1,93,65,3,0,128,0,8,0,1,93,65,3,0,224,0,8,0,1,93,65,3,0,16,0,8,0,1,113,65,3,0,192,0,8,0,1,93,65,5,0,64,0,8,0,80,0,8,0,2,93,65,5,0,16,0,8,0,32,0,8,0,2,93,184,0,1,16,185,0,15,0,4,244,184,0,8,16,185,0,21,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,16,185,0,13,0,2,244,184,0,0,16,185,0,16,0,2,244,48,49,1,65,7,0,86,0,5,0,102,0,5,0,118,0,5,0,3,93,65,3,0,86,0,6,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,86,0,11,0,1,93,65,3,0,118,0,11,0,1,93,65,3,0,103,0,11,0,1,93,65,3,0,8,0,18,0,1,93,0,65,3,0,86,0,5,0,1,93,65,5,0,103,0,5,0,119,0,5,0,2,93,65,3,0,87,0,6,0,1,93,65,3,0,89,0,10,0,1,93,65,3,0,105,0,11,0,1,93,65,3,0,90,0,11,0,1,93,65,3,0,123,0,11,0,1,93,41,1,17,33,50,30,2,21,20,14,2,3,35,17,51,50,62,2,53,52,46,2,1,83,254,253,1,3,76,128,93,51,51,91,128,78,164,164,58,91,63,32,32,63,91,2,188,48,91,130,81,81,130,90,49,2,102,253,240,37,69,98,60,60,98,69,37,0,0,0,1,0,80,0,0,2,4,2,188,0,11,0,168,186,0,11,0,1,0,3,43,65,3,0,191,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,0,0,11,0,1,93,65,3,0,208,0,11,0,1,93,65,3,0,64,0,11,0,1,93,184,0,11,16,184,0,4,208,184,0,4,47,184,0,1,16,185,0,10,0,4,244,184,0,6,208,184,0,11,16,184,0,8,208,184,0,8,47,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,16,185,0,5,0,2,244,186,0,6,0,2,0,1,17,18,57,184,0,6,47,185,0,9,0,2,244,184,0,1,16,185,0,10,0,2,244,48,49,41,1,17,33,21,33,21,33,21,33,21,33,2,4,254,76,1,171,254,180,1,8,254,248,1,85,2,188,86,205,86,237,0,0,0,1,0,80,0,0,1,251,2,188,0,9,0,163,186,0,0,0,7,0,3,43,65,3,0,143,0,0,0,1,93,65,5,0,0,0,0,0,16,0,0,0,2,93,65,3,0,64,0,0,0,1,93,65,3,0,143,0,7,0,1,93,65,3,0,191,0,7,0,1,93,65,5,0,0,0,7,0,16,0,7,0,2,93,184,0,7,16,185,0,6,0,4,244,184,0,2,208,184,0,0,16,184,0,3,208,184,0,3,47,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,14,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,8,16,185,0,1,0,2,244,186,0,2,0,8,0,6,17,18,57,184,0,2,47,185,0,5,0,2,244,48,49,1,33,21,33,21,33,17,35,17,33,1,251,254,180,1,0,255,0,95,1,171,2,102,205,86,254,189,2,188,0,0,0,1,0,39,255,242,2,109,2,202,0,36,1,79,186,0,31,0,5,0,3,43,65,5,0,63,0,5,0,79,0,5,0,2,93,65,3,0,32,0,5,0,1,93,65,3,0,128,0,31,0,1,93,65,3,0,32,0,31,0,1,113,65,3,0,63,0,31,0,1,93,65,3,0,0,0,31,0,1,113,65,3,0,80,0,31,0,1,93,65,3,0,32,0,31,0,1,93,186,0,12,0,31,0,5,17,18,57,184,0,12,47,184,0,5,16,185,0,20,0,4,244,184,0,31,16,185,0,28,0,4,244,184,0,31,16,184,0,30,220,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,25,0,2,244,186,0,30,0,10,0,0,17,18,57,184,0,30,47,185,0,29,0,2,244,48,49,1,65,3,0,90,0,2,0,1,93,65,3,0,91,0,3,0,1,93,65,3,0,89,0,8,0,1,93,65,3,0,6,0,17,0,1,93,65,3,0,7,0,23,0,1,93,0,65,3,0,90,0,2,0,1,93,65,3,0,83,0,8,0,1,93,65,11,0,70,0,11,0,86,0,11,0,102,0,11,0,118,0,11,0,134,0,11,0,5,93,65,11,0,70,0,12,0,86,0,12,0,102,0,12,0,118,0,12,0,134,0,12,0,5,93,65,3,0,7,0,23,0,1,93,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,14,2,21,20,30,2,51,50,55,53,35,53,51,17,14,3,1,126,74,126,92,51,52,93,129,77,118,90,9,105,91,61,94,63,32,34,67,99,66,72,45,110,205,20,59,65,67,14,53,96,134,82,82,134,95,52,40,83,37,41,73,103,61,63,103,72,40,19,174,86,254,200,11,19,15,8,0,1,0,80,0,0,2,154,2,188,0,11,0,209,186,0,0,0,5,0,3,43,65,3,0,208,0,0,0,1,93,65,3,0,80,0,0,0,1,113,65,3,0,32,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,3,0,16,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,191,0,5,0,1,93,65,3,0,15,0,5,0,1,113,65,3,0,143,0,5,0,1,93,65,3,0,16,0,5,0,1,93,184,0,5,16,185,0,4,0,4,244,184,0,8,208,184,0,1,16,184,0,9,208,65,3,0,64,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,8,0,7,0,4,17,18,57,184,0,8,47,185,0,3,0,2,244,184,0,7,16,184,0,10,208,48,49,1,65,3,0,15,0,12,0,1,93,33,35,17,33,17,35,17,51,17,33,17,51,2,154,95,254,116,95,95,1,140,95,1,65,254,191,2,188,254,223,1,33,0,0,1,0,80,0,0,0,175,2,188,0,3,0,118,187,0,0,0,4,0,1,0,4,43,65,5,0,159,0,0,0,175,0,0,0,2,93,65,3,0,0,0,0,0,1,93,65,3,0,112,0,0,0,1,93,65,5,0,159,0,1,0,175,0,1,0,2,93,65,3,0,112,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,80,0,5,0,1,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,51,35,17,51,175,95,95,2,188,0,0,0,0,1,255,239,255,84,0,175,2,188,0,12,0,104,187,0,10,0,4,0,9,0,4,43,65,3,0,95,0,9,0,1,93,65,5,0,159,0,9,0,175,0,9,0,2,93,65,3,0,0,0,9,0,1,93,65,5,0,159,0,10,0,175,0,10,0,2,93,65,3,0,95,0,10,0,1,93,65,3,0,0,0,10,0,1,93,0,184,0,1,47,184,0,0,69,88,184,0,9,47,27,185,0,9,0,14,62,89,184,0,1,16,184,0,3,220,48,49,23,35,39,51,50,62,2,53,17,51,17,20,9,16,10,4,27,36,21,9,95,172,56,12,27,43,31,2,191,253,36,140,0,0,0,2,0,80,0,0,2,61,2,188,0,5,0,9,1,44,186,0,1,0,7,0,3,43,65,3,0,80,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,176,0,1,0,1,93,184,0,1,16,184,0,0,208,65,5,0,85,0,0,0,101,0,0,0,2,93,65,3,0,70,0,0,0,1,93,65,7,0,153,0,0,0,169,0,0,0,185,0,0,0,3,93,65,3,0,57,0,0,0,1,113,65,3,0,39,0,0,0,1,93,65,5,0,22,0,0,0,38,0,0,0,2,113,65,3,0,116,0,0,0,1,93,65,3,0,131,0,0,0,1,93,184,0,1,16,184,0,2,208,65,3,0,70,0,2,0,1,93,184,0,1,16,184,0,3,208,65,3,0,8,0,3,0,1,93,184,0,0,16,184,0,4,208,65,3,0,8,0,4,0,1,93,184,0,0,16,184,0,5,208,65,3,0,70,0,5,0,1,93,65,3,0,143,0,7,0,1,93,65,3,0,16,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,14,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,1,208,184,0,9,16,184,0,3,208,186,0,5,0,3,0,1,17,18,57,25,184,0,5,47,24,184,0,2,208,48,49,33,35,9,1,51,1,3,35,17,51,2,61,100,254,253,1,3,100,254,253,139,95,95,1,115,1,73,254,183,254,141,2,188,0,0,0,0,1,0,80,0,0,1,240,2,188,0,5,0,114,186,0,5,0,1,0,3,43,65,3,0,175,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,144,0,1,0,1,93,184,0,1,16,185,0,4,0,4,244,65,3,0,175,0,5,0,1,93,65,5,0,0,0,5,0,16,0,5,0,2,93,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,185,0,5,0,2,244,48,49,41,1,17,51,17,33,1,240,254,96,95,1,65,2,188,253,154,0,0,0,0,1,0,48,0,0,2,252,2,188,0,11,2,149,186,0,0,0,6,0,3,43,65,3,0,80,0,0,0,1,113,65,3,0,63,0,0,0,1,93,65,5,0,160,0,0,0,176,0,0,0,2,113,65,5,0,80,0,0,0,96,0,0,0,2,93,65,5,0,0,0,0,0,16,0,0,0,2,93,184,0,0,16,185,0,1,0,4,244,184,0,2,208,65,3,0,7,0,2,0,1,113,65,5,0,22,0,2,0,38,0,2,0,2,113,65,3,0,47,0,6,0,1,113,65,3,0,143,0,6,0,1,93,65,5,0,47,0,6,0,63,0,6,0,2,93,65,3,0,15,0,6,0,1,113,65,3,0,80,0,6,0,1,113,65,5,0,0,0,6,0,16,0,6,0,2,93,186,0,3,0,6,0,0,17,18,57,184,0,6,16,185,0,5,0,4,244,184,0,4,208,65,5,0,25,0,4,0,41,0,4,0,2,113,65,3,0,8,0,4,0,1,113,184,0,6,16,184,0,7,208,65,7,0,57,0,7,0,73,0,7,0,89,0,7,0,3,113,65,3,0,152,0,7,0,1,93,186,0,8,0,4,0,7,17,18,57,65,3,0,7,0,8,0,1,113,184,0,3,16,184,0,9,208,184,0,0,16,184,0,11,208,65,3,0,136,0,11,0,1,93,65,3,0,151,0,11,0,1,93,65,7,0,54,0,11,0,70,0,11,0,86,0,11,0,3,113,186,0,10,0,2,0,11,17,18,57,65,3,0,8,0,10,0,1,113,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,1,208,184,0,8,16,184,0,4,208,65,5,0,91,0,4,0,107,0,4,0,2,113,65,5,0,60,0,4,0,76,0,4,0,2,113,65,3,0,45,0,4,0,1,113,65,3,0,31,0,4,0,1,113,65,3,0,142,0,4,0,1,93,65,3,0,13,0,4,0,1,113,65,3,0,252,0,4,0,1,93,65,5,0,107,0,4,0,123,0,4,0,2,93,65,3,0,89,0,4,0,1,93,184,0,2,208,186,0,3,0,8,0,5,17,18,57,65,5,0,89,0,3,0,105,0,3,0,2,93,184,0,3,16,184,0,9,208,65,7,0,84,0,9,0,100,0,9,0,116,0,9,0,3,93,65,3,0,244,0,9,0,1,93,65,3,0,154,0,9,0,1,93,65,3,0,69,0,9,0,1,93,65,5,0,84,0,9,0,100,0,9,0,2,113,65,3,0,67,0,9,0,1,113,65,3,0,130,0,9,0,1,93,184,0,8,16,184,0,10,208,48,49,1,65,3,0,117,0,8,0,1,93,65,3,0,122,0,10,0,1,93,0,65,3,0,124,0,2,0,1,93,65,3,0,41,0,3,0,1,113,65,3,0,10,0,3,0,1,93,65,3,0,123,0,4,0,1,93,65,5,0,20,0,9,0,36,0,9,0,2,113,33,35,11,3,35,19,51,27,1,51,2,252,100,66,190,194,66,100,94,81,184,182,82,2,17,254,149,1,107,253,239,2,188,254,165,1,91,0,1,0,80,0,0,2,112,2,188,0,9,1,47,186,0,9,0,4,0,3,43,65,3,0,0,0,9,0,1,93,65,3,0,112,0,9,0,1,93,65,3,0,48,0,9,0,1,93,65,3,0,32,0,9,0,1,113,65,3,0,0,0,9,0,1,113,184,0,9,16,185,0,8,0,4,244,184,0,1,208,65,5,0,0,0,4,0,16,0,4,0,2,93,184,0,4,16,185,0,3,0,4,244,184,0,6,208,65,3,0,134,0,6,0,1,93,65,5,0,20,0,6,0,36,0,6,0,2,113,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,184,0,5,16,184,0,2,208,65,3,0,57,0,2,0,1,93,184,0,1,16,184,0,7,208,184,0,5,16,184,0,8,208,48,49,1,65,3,0,89,0,1,0,1,93,65,3,0,85,0,6,0,1,93,0,65,5,0,74,0,2,0,90,0,2,0,2,93,65,3,0,43,0,2,0,1,113,65,5,0,108,0,2,0,124,0,2,0,2,93,65,3,0,143,0,2,0,1,93,65,3,0,128,0,7,0,1,93,65,3,0,67,0,7,0,1,93,65,5,0,99,0,7,0,115,0,7,0,2,93,65,3,0,35,0,7,0,1,113,65,3,0,84,0,7,0,1,93,33,35,1,17,35,17,51,1,17,51,2,112,81,254,144,95,103,1,89,96,2,41,253,215,2,188,253,244,2,12,0,0,2,0,39,255,242,2,217,2,202,0,18,0,37,1,177,186,0,17,0,7,0,3,43,65,3,0,15,0,7,0,1,93,65,5,0,79,0,7,0,95,0,7,0,2,93,65,5,0,176,0,17,0,192,0,17,0,2,93,65,3,0,32,0,17,0,1,113,65,3,0,113,0,17,0,1,93,65,5,0,224,0,17,0,240,0,17,0,2,93,65,3,0,128,0,17,0,1,93,65,3,0,32,0,17,0,1,93,184,0,7,16,185,0,26,0,4,244,184,0,17,16,185,0,36,0,4,244,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,12,16,185,0,21,0,2,244,184,0,2,16,185,0,31,0,2,244,48,49,1,65,3,0,86,0,0,0,1,93,65,5,0,103,0,0,0,119,0,0,0,2,93,65,3,0,88,0,4,0,1,93,65,5,0,105,0,4,0,121,0,4,0,2,93,65,3,0,88,0,5,0,1,93,65,3,0,88,0,9,0,1,93,65,3,0,120,0,9,0,1,93,65,3,0,105,0,10,0,1,93,65,3,0,90,0,10,0,1,93,65,7,0,87,0,14,0,103,0,14,0,119,0,14,0,3,93,65,3,0,86,0,15,0,1,93,65,3,0,118,0,15,0,1,93,65,3,0,15,0,38,0,1,93,0,65,3,0,104,0,0,0,1,93,65,3,0,90,0,0,0,1,93,65,3,0,122,0,0,0,1,93,65,5,0,89,0,4,0,105,0,4,0,2,93,65,3,0,123,0,4,0,1,93,65,3,0,89,0,5,0,1,93,65,3,0,86,0,9,0,1,93,65,3,0,119,0,9,0,1,93,65,5,0,86,0,10,0,102,0,10,0,2,93,65,3,0,86,0,14,0,1,93,65,5,0,103,0,14,0,119,0,14,0,2,93,65,3,0,86,0,15,0,1,93,65,3,0,119,0,15,0,1,93,37,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,3,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,2,120,96,152,76,127,91,51,52,91,127,75,75,127,92,51,167,62,116,58,90,61,32,32,61,90,58,58,90,62,31,85,99,52,95,134,83,83,134,95,52,52,96,134,82,165,1,109,78,42,74,102,60,60,102,74,42,42,75,101,60,122,0,0,2,0,80,0,0,2,36,2,188,0,14,0,25,1,63,186,0,9,0,2,0,3,43,65,5,0,0,0,2,0,16,0,2,0,2,93,65,3,0,143,0,2,0,1,93,65,3,0,175,0,2,0,1,93,65,3,0,144,0,2,0,1,93,65,3,0,112,0,2,0,1,93,184,0,2,16,185,0,1,0,4,244,65,3,0,80,0,9,0,1,93,65,3,0,144,0,9,0,1,93,65,3,0,0,0,9,0,1,113,65,3,0,175,0,9,0,1,93,65,3,0,224,0,9,0,1,93,65,3,0,112,0,9,0,1,93,65,5,0,0,0,9,0,16,0,9,0,2,93,65,3,0,32,0,9,0,1,113,184,0,16,208,184,0,9,16,185,0,20,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,0,0,4,0,1,17,18,57,184,0,0,47,185,0,16,0,2,244,184,0,4,16,185,0,25,0,2,244,48,49,1,65,3,0,135,0,6,0,1,93,65,5,0,101,0,7,0,117,0,7,0,2,93,65,3,0,6,0,7,0,1,93,65,3,0,134,0,7,0,1,93,0,65,3,0,134,0,6,0,1,93,65,5,0,103,0,6,0,119,0,6,0,2,93,65,5,0,101,0,7,0,117,0,7,0,2,93,65,3,0,6,0,7,0,1,93,65,3,0,135,0,7,0,1,93,55,21,35,17,51,50,30,2,21,20,14,2,35,3,17,51,50,54,53,52,46,2,35,180,100,224,49,88,67,40,41,64,76,35,152,134,73,62,16,38,63,46,245,245,2,188,15,47,86,70,68,91,55,23,1,114,254,227,77,71,37,53,32,15,0,0,2,0,39,255,242,2,217,2,202,0,21,0,43,2,27,186,0,19,0,9,0,3,43,65,5,0,224,0,19,0,240,0,19,0,2,93,65,3,0,32,0,19,0,1,93,65,3,0,32,0,19,0,1,113,65,5,0,176,0,19,0,192,0,19,0,2,93,65,3,0,112,0,19,0,1,93,65,5,0,79,0,9,0,95,0,9,0,2,93,65,3,0,15,0,9,0,1,93,186,0,21,0,19,0,9,17,18,57,184,0,21,16,184,0,0,208,186,0,2,0,9,0,19,17,18,57,184,0,2,16,184,0,1,208,65,3,0,88,0,1,0,1,113,184,0,9,16,185,0,27,0,4,244,184,0,19,16,185,0,39,0,4,244,186,0,34,0,27,0,39,17,18,57,65,3,0,121,0,34,0,1,93,184,0,34,16,184,0,35,208,65,3,0,56,0,35,0,1,113,65,3,0,72,0,35,0,1,93,186,0,37,0,39,0,27,17,18,57,184,0,37,16,184,0,36,208,65,3,0,15,0,44,0,1,93,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,186,0,2,0,4,0,14,17,18,57,184,0,2,16,184,0,1,208,184,0,1,47,186,0,21,0,14,0,4,17,18,57,184,0,14,16,185,0,22,0,2,244,184,0,4,16,185,0,32,0,2,244,186,0,34,0,32,0,22,17,18,57,186,0,37,0,22,0,32,17,18,57,184,0,37,16,184,0,36,208,184,0,36,47,48,49,1,65,3,0,104,0,1,0,1,93,65,3,0,89,0,6,0,1,93,65,3,0,121,0,6,0,1,93,65,3,0,89,0,7,0,1,93,65,3,0,89,0,11,0,1,93,65,3,0,123,0,11,0,1,93,65,5,0,89,0,12,0,105,0,12,0,2,93,65,7,0,86,0,16,0,102,0,16,0,118,0,16,0,3,93,65,3,0,86,0,17,0,1,93,65,3,0,105,0,35,0,1,93,0,65,3,0,89,0,2,0,1,93,65,3,0,89,0,6,0,1,93,65,3,0,121,0,6,0,1,93,65,3,0,106,0,6,0,1,93,65,3,0,89,0,7,0,1,93,65,3,0,87,0,11,0,1,93,65,3,0,119,0,11,0,1,93,65,5,0,86,0,12,0,102,0,12,0,2,93,65,3,0,86,0,16,0,1,93,65,3,0,118,0,16,0,1,93,37,7,39,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,7,1,34,14,2,21,20,30,2,51,50,55,39,55,23,54,53,52,46,2,2,203,50,65,100,116,76,127,91,51,52,91,127,75,75,127,92,51,74,254,241,59,89,62,31,31,60,90,60,96,55,103,50,105,48,34,65,93,62,59,54,71,52,95,134,83,83,134,95,52,52,96,134,82,129,110,2,5,41,74,102,61,60,102,74,42,40,84,61,93,75,111,60,101,75,42,0,0,0,0,2,0,80,0,0,2,72,2,188,0,15,0,26,1,159,186,0,12,0,5,0,3,43,65,3,0,15,0,5,0,1,113,65,5,0,0,0,5,0,16,0,5,0,2,93,65,3,0,144,0,5,0,1,93,65,3,0,224,0,12,0,1,93,65,5,0,0,0,12,0,16,0,12,0,2,93,65,3,0,112,0,12,0,1,93,65,3,0,80,0,12,0,1,93,186,0,15,0,5,0,12,17,18,57,65,3,0,38,0,15,0,1,93,65,3,0,23,0,15,0,1,93,65,3,0,135,0,15,0,1,93,65,3,0,102,0,15,0,1,93,65,3,0,85,0,15,0,1,93,65,3,0,117,0,15,0,1,93,184,0,15,16,184,0,0,208,184,0,15,16,185,0,2,0,4,244,65,3,0,136,0,2,0,1,93,184,0,1,208,184,0,5,16,185,0,4,0,4,244,184,0,18,208,184,0,12,16,185,0,24,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,3,0,7,0,4,17,18,57,184,0,3,47,186,0,15,0,3,0,7,17,18,57,184,0,7,16,185,0,16,0,2,244,184,0,3,16,185,0,18,0,2,244,48,49,1,65,3,0,102,0,9,0,1,93,65,3,0,100,0,10,0,1,93,65,3,0,134,0,10,0,1,93,65,3,0,22,0,10,0,1,113,65,3,0,7,0,10,0,1,93,65,3,0,119,0,10,0,1,93,65,3,0,89,0,22,0,1,93,65,3,0,89,0,26,0,1,93,0,65,5,0,101,0,9,0,117,0,9,0,2,93,65,3,0,117,0,10,0,1,93,65,3,0,102,0,10,0,1,93,65,3,0,7,0,10,0,1,93,65,3,0,23,0,10,0,1,113,65,3,0,85,0,22,0,1,93,33,35,3,35,17,35,17,51,50,30,2,21,20,6,7,3,35,17,51,50,62,2,53,52,38,2,72,102,155,147,100,227,58,91,61,32,67,61,115,126,151,24,43,33,19,72,1,17,254,239,2,188,22,49,78,56,66,103,28,1,69,254,254,16,32,49,33,61,67,0,1,0,40,255,242,2,41,2,202,0,57,3,109,186,0,53,0,19,0,3,43,65,3,0,79,0,19,0,1,93,65,3,0,111,0,19,0,1,93,65,3,0,80,0,53,0,1,93,65,3,0,160,0,53,0,1,93,65,3,0,224,0,53,0,1,93,65,3,0,192,0,53,0,1,93,65,5,0,112,0,53,0,128,0,53,0,2,93,65,3,0,32,0,53,0,1,93,65,3,0,0,0,53,0,1,93,186,0,2,0,19,0,53,17,18,57,184,0,2,47,184,0,53,16,185,0,10,0,4,244,186,0,29,0,53,0,19,17,18,57,184,0,29,47,184,0,19,16,185,0,37,0,4,244,0,184,0,0,69,88,184,0,24,47,27,185,0,24,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,220,65,5,0,112,0,3,0,128,0,3,0,2,93,65,3,0,16,0,3,0,1,93,65,3,0,240,0,3,0,1,93,184,0,0,16,185,0,5,0,2,244,186,0,15,0,0,0,24,17,18,57,65,3,0,137,0,15,0,1,93,184,0,24,16,184,0,30,220,65,3,0,143,0,30,0,1,93,65,3,0,255,0,30,0,1,93,184,0,24,16,185,0,32,0,2,244,186,0,40,0,24,0,0,17,18,57,48,49,1,65,11,0,40,0,2,0,56,0,2,0,72,0,2,0,88,0,2,0,104,0,2,0,5,93,65,3,0,136,0,2,0,1,93,65,5,0,56,0,12,0,72,0,12,0,2,93,65,3,0,138,0,12,0,1,93,65,3,0,105,0,16,0,1,93,65,3,0,72,0,17,0,1,93,65,3,0,72,0,18,0,1,93,65,3,0,58,0,18,0,1,93,65,3,0,138,0,18,0,1,93,65,3,0,105,0,21,0,1,93,65,3,0,137,0,21,0,1,93,65,3,0,121,0,22,0,1,93,65,3,0,106,0,22,0,1,93,65,3,0,120,0,39,0,1,93,65,3,0,6,0,49,0,1,93,65,3,0,101,0,50,0,1,93,65,3,0,6,0,50,0,1,93,65,3,0,38,0,50,0,1,93,65,3,0,118,0,50,0,1,93,65,3,0,100,0,55,0,1,93,65,3,0,132,0,55,0,1,93,65,3,0,117,0,55,0,1,93,65,3,0,6,0,56,0,1,93,65,3,0,102,0,56,0,1,93,65,3,0,119,0,56,0,1,93,0,65,11,0,41,0,1,0,57,0,1,0,73,0,1,0,89,0,1,0,105,0,1,0,5,93,65,11,0,40,0,2,0,56,0,2,0,72,0,2,0,88,0,2,0,104,0,2,0,5,93,65,3,0,138,0,2,0,1,93,65,3,0,123,0,2,0,1,93,65,3,0,136,0,12,0,1,93,65,5,0,57,0,12,0,73,0,12,0,2,93,65,3,0,90,0,14,0,1,93,65,3,0,105,0,16,0,1,93,65,3,0,10,0,17,0,1,93,65,3,0,74,0,17,0,1,93,65,3,0,135,0,18,0,1,93,65,3,0,72,0,18,0,1,93,65,3,0,133,0,21,0,1,93,65,3,0,103,0,21,0,1,93,65,3,0,116,0,22,0,1,93,65,3,0,101,0,22,0,1,93,65,11,0,38,0,27,0,54,0,27,0,70,0,27,0,86,0,27,0,102,0,27,0,5,93,65,3,0,132,0,28,0,1,93,65,13,0,38,0,28,0,54,0,28,0,70,0,28,0,86,0,28,0,102,0,28,0,118,0,28,0,6,93,65,3,0,116,0,39,0,1,93,65,3,0,7,0,49,0,1,93,65,3,0,102,0,50,0,1,93,65,3,0,7,0,50,0,1,93,65,3,0,39,0,50,0,1,93,65,3,0,105,0,55,0,1,93,65,3,0,137,0,55,0,1,93,65,3,0,122,0,55,0,1,93,65,3,0,9,0,56,0,1,93,65,3,0,106,0,56,0,1,93,65,3,0,123,0,56,0,1,93,5,34,39,55,22,51,50,62,2,53,52,46,2,47,1,46,1,53,52,62,2,51,50,30,2,23,7,38,35,34,14,2,21,20,22,23,30,3,31,1,30,1,31,1,30,1,23,20,14,2,1,24,145,84,13,94,124,36,61,45,25,26,47,67,41,70,85,73,24,57,97,74,30,64,59,50,17,10,126,75,29,57,44,27,75,76,21,19,18,31,34,34,13,17,5,25,23,15,3,18,58,107,14,45,111,70,13,27,41,27,28,41,32,26,14,23,28,83,57,30,71,61,40,8,13,18,9,101,63,12,26,38,27,44,49,24,7,4,5,11,15,18,7,10,5,26,24,56,39,30,67,58,39,0,1,0,15,0,0,2,6,2,188,0,7,0,86,187,0,1,0,4,0,4,0,4,43,184,0,1,16,184,0,0,220,184,0,4,16,184,0,5,220,65,3,0,31,0,9,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,6,16,185,0,5,0,2,244,184,0,1,208,48,49,1,35,17,35,17,35,53,33,2,6,204,95,204,1,247,2,102,253,154,2,102,86,0,0,0,1,0,72,255,242,2,140,2,188,0,21,1,207,186,0,15,0,1,0,3,43,65,3,0,223,0,1,0,1,93,65,3,0,143,0,1,0,1,93,65,5,0,175,0,1,0,191,0,1,0,2,93,65,3,0,16,0,1,0,1,93,184,0,1,16,185,0,2,0,4,244,65,3,0,64,0,15,0,1,93,65,3,0,175,0,15,0,1,93,65,3,0,240,0,15,0,1,93,65,3,0,0,0,15,0,1,113,65,3,0,16,0,15,0,1,93,65,3,0,32,0,15,0,1,113,184,0,15,16,185,0,14,0,4,244,65,3,0,15,0,22,0,1,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,6,62,89,185,0,8,0,2,244,184,0,2,16,184,0,14,208,48,49,1,65,3,0,103,0,5,0,1,93,65,3,0,135,0,5,0,1,93,65,3,0,136,0,10,0,1,93,65,3,0,104,0,11,0,1,93,65,3,0,136,0,11,0,1,93,65,3,0,36,0,17,0,1,93,65,3,0,22,0,17,0,1,93,65,3,0,118,0,17,0,1,93,65,3,0,23,0,18,0,1,93,65,3,0,71,0,18,0,1,93,65,3,0,24,0,20,0,1,93,65,3,0,72,0,20,0,1,93,65,3,0,58,0,20,0,1,93,65,3,0,25,0,21,0,1,93,65,3,0,122,0,21,0,1,93,65,3,0,43,0,21,0,1,93,0,65,3,0,133,0,5,0,1,93,65,3,0,102,0,5,0,1,93,65,3,0,133,0,6,0,1,93,65,3,0,134,0,10,0,1,93,65,3,0,101,0,11,0,1,93,65,3,0,135,0,11,0,1,93,65,3,0,120,0,17,0,1,93,65,3,0,56,0,18,0,1,93,65,3,0,41,0,18,0,1,93,65,3,0,73,0,18,0,1,93,65,3,0,27,0,18,0,1,93,65,3,0,25,0,20,0,1,93,65,3,0,57,0,20,0,1,93,65,3,0,42,0,20,0,1,93,65,3,0,74,0,20,0,1,93,19,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,6,35,34,38,72,95,14,41,77,63,63,77,42,13,95,145,145,145,145,1,41,1,147,254,155,51,97,77,46,48,76,97,50,1,101,254,109,148,163,163,0,0,0,0,1,0,4,0,0,2,128,2,188,0,6,1,95,187,0,1,0,4,0,2,0,4,43,65,3,0,16,0,1,0,1,93,65,3,0,112,0,1,0,1,93,65,5,0,32,0,1,0,48,0,1,0,2,113,184,0,1,16,184,0,0,208,65,3,0,24,0,0,0,1,93,65,3,0,71,0,0,0,1,93,65,3,0,134,0,0,0,1,93,65,3,0,112,0,2,0,1,93,65,3,0,16,0,2,0,1,93,65,5,0,32,0,2,0,48,0,2,0,2,113,184,0,2,16,184,0,3,208,65,3,0,137,0,3,0,1,93,65,3,0,72,0,3,0,1,93,185,0,4,0,4,244,186,0,5,0,2,0,1,17,18,57,184,0,0,16,185,0,6,0,4,244,65,3,0,79,0,8,0,1,93,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,208,184,0,4,16,184,0,6,208,48,49,1,65,3,0,134,0,1,0,1,93,65,13,0,167,0,1,0,183,0,1,0,199,0,1,0,215,0,1,0,231,0,1,0,247,0,1,0,6,93,65,7,0,7,0,1,0,23,0,1,0,39,0,1,0,3,113,65,13,0,168,0,2,0,184,0,2,0,200,0,2,0,216,0,2,0,232,0,2,0,248,0,2,0,6,93,65,7,0,8,0,2,0,24,0,2,0,40,0,2,0,3,113,65,3,0,137,0,2,0,1,93,0,65,5,0,100,0,5,0,116,0,5,0,2,93,65,3,0,85,0,5,0,1,93,9,1,35,1,51,27,1,2,128,254,244,100,254,244,100,219,217,2,188,253,68,2,188,253,177,2,79,0,1,0,14,0,0,3,193,2,188,0,12,1,221,186,0,10,0,9,0,3,43,65,3,0,63,0,10,0,1,93,184,0,10,16,184,0,1,220,65,3,0,47,0,1,0,1,93,184,0,0,208,184,0,1,16,185,0,2,0,4,244,65,3,0,63,0,9,0,1,93,186,0,3,0,9,0,10,17,18,57,184,0,9,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,6,208,65,3,0,71,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,4,17,18,57,186,0,11,0,2,0,1,17,18,57,184,0,0,16,185,0,12,0,4,244,65,3,0,191,0,14,0,1,93,65,3,0,159,0,14,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,2,208,184,0,7,16,184,0,9,208,184,0,9,47,184,0,3,208,184,0,5,16,184,0,8,208,184,0,11,208,184,0,7,16,184,0,12,208,48,49,1,65,3,0,40,0,1,0,1,93,65,3,0,8,0,2,0,1,93,65,5,0,56,0,2,0,72,0,2,0,2,93,65,3,0,137,0,2,0,1,93,65,3,0,122,0,2,0,1,93,65,7,0,102,0,4,0,118,0,4,0,134,0,4,0,3,93,65,3,0,71,0,4,0,1,93,65,3,0,247,0,4,0,1,93,65,3,0,135,0,7,0,1,93,65,3,0,104,0,9,0,1,93,65,3,0,136,0,9,0,1,93,65,3,0,248,0,9,0,1,93,65,3,0,7,0,10,0,1,93,65,3,0,71,0,10,0,1,93,65,3,0,135,0,10,0,1,93,65,3,0,56,0,10,0,1,93,65,3,0,41,0,10,0,1,93,0,65,3,0,4,0,3,0,1,93,65,3,0,21,0,3,0,1,93,65,3,0,70,0,3,0,1,93,65,3,0,123,0,3,0,1,93,65,3,0,26,0,8,0,1,93,65,3,0,11,0,8,0,1,93,65,3,0,57,0,11,0,1,93,65,3,0,26,0,11,0,1,93,65,3,0,12,0,11,0,1,93,1,3,35,11,1,35,3,51,27,1,51,27,1,3,193,205,105,165,171,105,196,100,155,175,86,177,154,2,188,253,68,2,62,253,194,2,188,253,176,2,66,253,191,2,79,0,1,0,9,0,0,2,82,2,188,0,11,1,205,187,0,11,0,4,0,5,0,4,43,184,0,11,16,184,0,0,208,65,3,0,182,0,0,0,1,93,65,3,0,22,0,0,0,1,113,65,3,0,215,0,0,0,1,93,65,3,0,87,0,0,0,1,93,65,3,0,136,0,0,0,1,93,65,3,0,151,0,0,0,1,93,65,3,0,23,0,0,0,1,93,65,3,0,54,0,0,0,1,113,65,3,0,246,0,0,0,1,93,65,3,0,101,0,0,0,1,93,65,3,0,36,0,0,0,1,93,185,0,1,0,4,244,65,3,0,39,0,1,0,1,93,186,0,2,0,5,0,11,17,18,57,184,0,5,16,184,0,4,208,65,3,0,54,0,4,0,1,93,65,3,0,215,0,4,0,1,93,65,3,0,41,0,4,0,1,93,65,3,0,105,0,4,0,1,93,65,3,0,230,0,4,0,1,93,65,5,0,118,0,4,0,134,0,4,0,2,93,65,3,0,166,0,4,0,1,93,185,0,3,0,4,244,184,0,4,16,184,0,6,208,184,0,3,16,184,0,7,208,65,3,0,118,0,7,0,1,93,186,0,8,0,5,0,11,17,18,57,184,0,1,16,184,0,9,208,184,0,0,16,184,0,10,208,65,3,0,15,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,186,0,2,0,3,0,7,17,18,57,65,3,0,150,0,2,0,1,93,186,0,8,0,7,0,3,17,18,57,186,0,5,0,8,0,2,17,18,57,184,0,7,16,184,0,9,208,186,0,11,0,2,0,8,17,18,57,48,49,65,3,0,74,0,2,0,1,93,65,3,0,106,0,2,0,1,93,65,3,0,138,0,2,0,1,93,65,3,0,123,0,2,0,1,93,65,3,0,116,0,8,0,1,93,65,3,0,101,0,8,0,1,93,65,3,0,133,0,8,0,1,93,65,7,0,54,0,8,0,70,0,8,0,86,0,8,0,3,93,33,35,11,1,35,19,3,51,27,1,51,3,2,82,100,202,183,100,235,235,110,180,194,100,250,1,30,254,226,1,93,1,95,254,239,1,17,254,173,0,0,0,1,255,253,0,0,2,57,2,188,0,8,0,233,187,0,1,0,4,0,4,0,4,43,65,3,0,175,0,1,0,1,93,65,3,0,32,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,121,0,0,0,1,93,65,3,0,102,0,0,0,1,93,65,3,0,38,0,0,0,1,93,65,3,0,175,0,4,0,1,93,65,3,0,32,0,4,0,1,93,184,0,4,16,184,0,5,208,65,3,0,105,0,5,0,1,93,65,3,0,41,0,5,0,1,93,65,3,0,118,0,5,0,1,93,185,0,6,0,4,244,186,0,7,0,4,0,1,17,18,57,184,0,0,16,185,0,8,0,4,244,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,186,0,7,0,6,0,2,17,18,57,184,0,6,16,184,0,8,208,48,49,65,3,0,88,0,1,0,1,93,65,3,0,89,0,4,0,1,93,65,3,0,131,0,7,0,1,93,65,3,0,116,0,7,0,1,93,1,3,17,35,17,3,51,27,1,2,57,236,99,237,100,186,186,2,188,254,135,254,189,1,67,1,121,254,221,1,35,0,0,0,1,0,9,0,0,2,30,2,188,0,7,1,200,186,0,2,0,6,0,3,43,65,3,0,64,0,2,0,1,93,65,3,0,175,0,2,0,1,93,65,3,0,96,0,2,0,1,93,65,5,0,16,0,2,0,32,0,2,0,2,93,65,3,0,128,0,2,0,1,93,184,0,2,16,184,0,0,208,65,3,0,16,0,6,0,1,93,184,0,6,16,184,0,4,208,184,0,1,208,65,3,0,99,0,1,0,1,93,65,3,0,69,0,1,0,1,93,65,5,0,85,0,1,0,101,0,1,0,2,113,65,3,0,38,0,1,0,1,93,65,3,0,184,0,1,0,1,93,65,5,0,153,0,1,0,169,0,1,0,2,93,65,5,0,54,0,1,0,70,0,1,0,2,113,65,3,0,246,0,1,0,1,93,65,3,0,6,0,1,0,1,113,65,3,0,21,0,1,0,1,113,65,3,0,36,0,1,0,1,113,65,3,0,114,0,1,0,1,93,65,3,0,128,0,1,0,1,93,184,0,0,16,184,0,5,208,65,3,0,24,0,5,0,1,93,65,3,0,41,0,5,0,1,93,65,3,0,58,0,5,0,1,113,65,3,0,74,0,5,0,1,93,65,3,0,43,0,5,0,1,113,65,3,0,125,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,108,0,5,0,1,93,65,3,0,26,0,5,0,1,113,65,5,0,90,0,5,0,106,0,5,0,2,113,65,3,0,249,0,5,0,1,93,65,3,0,9,0,5,0,1,113,65,3,0,73,0,5,0,1,113,65,3,0,183,0,5,0,1,93,65,5,0,150,0,5,0,166,0,5,0,2,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,2,0,2,244,184,0,7,16,185,0,6,0,2,244,48,49,1,65,3,0,84,0,1,0,1,93,65,3,0,54,0,1,0,1,93,65,3,0,57,0,5,0,1,93,65,3,0,91,0,5,0,1,93,9,1,33,21,33,1,33,53,2,30,254,135,1,76,254,24,1,120,254,181,2,188,253,154,86,2,102,86,0,0,0,1,0,70,255,121,1,71,2,238,0,7,0,78,184,0,1,47,65,3,0,143,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,184,0,0,220,184,0,4,208,184,0,1,16,184,0,6,220,0,184,0,0,47,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,4,220,184,0,0,16,184,0,7,220,48,49,5,33,17,33,21,35,17,51,1,71,254,255,1,1,174,174,135,3,117,68,253,19,0,0,0,1,0,35,255,171,1,250,2,188,0,3,0,61,184,0,2,47,184,0,0,220,65,5,0,112,0,0,0,128,0,0,0,2,93,185,0,1,0,4,244,184,0,2,16,185,0,3,0,4,244,0,184,0,1,47,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,48,49,5,35,1,51,1,250,93,254,134,93,85,3,17,0,1,0,0,255,121,1,1,2,238,0,7,0,82,184,0,2,47,65,3,0,208,0,2,0,1,93,65,3,0,16,0,2,0,1,93,184,0,4,220,184,0,2,16,184,0,5,220,184,0,4,16,184,0,7,208,0,184,0,3,47,184,0,0,69,88,184,0,0,47,27,185,0,0,0,18,62,89,184,0,3,16,184,0,4,220,184,0,0,16,184,0,7,220,48,49,17,33,17,33,53,51,17,35,1,1,254,255,174,174,2,238,252,139,68,2,237,0,0,0,0,1,0,49,1,181,1,205,2,247,0,5,0,95,25,184,0,4,47,24,184,0,1,208,184,0,4,16,184,0,3,208,184,0,3,47,184,0,4,16,184,0,5,208,184,0,5,47,0,184,0,4,47,184,0,2,220,184,0,0,208,184,0,4,16,184,0,1,208,65,7,0,107,0,1,0,123,0,1,0,139,0,1,0,3,93,184,0,2,16,184,0,3,208,65,3,0,181,0,3,0,1,93,184,0,5,208,48,49,1,39,7,53,55,23,1,205,206,206,206,206,1,181,216,216,106,216,216,0,1,0,3,255,134,2,51,255,220,0,3,0,64,184,0,4,47,184,0,5,47,184,0,4,16,184,0,2,208,184,0,2,47,184,0,5,16,184,0,3,208,184,0,3,47,0,184,0,4,47,184,0,2,220,184,0,1,220,65,7,0,79,0,1,0,95,0,1,0,111,0,1,0,3,113,48,49,5,33,53,33,2,51,253,208,2,48,122,86,0,0,0,1,0,58,2,84,0,245,2,220,0,3,0,126,184,0,1,47,65,7,0,0,0,1,0,16,0,1,0,32,0,1,0,3,93,65,5,0,16,0,1,0,32,0,1,0,2,113,184,0,3,220,0,184,0,0,47,65,3,0,16,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,3,0,32,0,0,0,1,93,184,0,2,220,65,5,0,15,0,2,0,31,0,2,0,2,93,184,0,1,220,184,0,0,16,184,0,3,220,65,11,0,86,0,3,0,102,0,3,0,118,0,3,0,134,0,3,0,150,0,3,0,5,93,48,49,19,39,53,23,245,187,187,2,84,64,72,95,0,2,0,24,255,246,1,216,1,244,0,34,0,43,2,22,186,0,30,0,12,0,3,43,65,3,0,160,0,30,0,1,93,65,3,0,159,0,30,0,1,93,65,3,0,127,0,30,0,1,93,65,3,0,48,0,30,0,1,113,65,3,0,192,0,30,0,1,93,65,3,0,16,0,30,0,1,113,184,0,30,16,184,0,0,208,184,0,0,47,65,3,0,0,0,0,0,1,93,184,0,30,16,185,0,36,0,4,244,186,0,7,0,36,0,30,17,18,57,65,9,0,111,0,12,0,127,0,12,0,143,0,12,0,159,0,12,0,4,93,65,3,0,15,0,12,0,1,113,65,3,0,63,0,12,0,1,93,65,3,0,31,0,12,0,1,93,65,3,0,191,0,12,0,1,93,65,3,0,192,0,12,0,1,93,65,3,0,160,0,12,0,1,93,184,0,17,208,186,0,23,0,12,0,30,17,18,57,184,0,23,47,184,0,12,16,185,0,39,0,4,244,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,6,62,89,186,0,17,0,25,0,9,17,18,57,184,0,17,47,186,0,7,0,17,0,9,17,18,57,184,0,25,16,185,0,20,0,2,244,184,0,25,16,184,0,22,220,65,3,0,79,0,22,0,1,93,184,0,1,16,185,0,34,0,1,244,184,0,17,16,185,0,36,0,1,244,184,0,9,16,185,0,41,0,1,244,48,49,1,65,3,0,56,0,10,0,1,93,65,3,0,25,0,10,0,1,93,65,3,0,41,0,11,0,1,93,65,3,0,26,0,11,0,1,93,65,3,0,24,0,14,0,1,93,65,3,0,136,0,14,0,1,93,65,5,0,120,0,24,0,136,0,24,0,2,93,65,7,0,7,0,27,0,23,0,27,0,39,0,27,0,3,93,65,3,0,6,0,28,0,1,93,0,65,3,0,56,0,10,0,1,93,65,3,0,25,0,10,0,1,93,65,3,0,42,0,10,0,1,93,65,3,0,118,0,14,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,117,0,24,0,1,93,65,5,0,86,0,24,0,102,0,24,0,2,93,65,3,0,135,0,24,0,1,93,65,5,0,6,0,27,0,22,0,27,0,2,93,65,3,0,39,0,27,0,1,93,37,7,35,34,46,2,39,6,35,34,38,53,52,62,2,55,52,38,35,34,7,39,54,51,50,30,2,29,1,20,22,51,39,53,14,1,21,20,51,50,54,1,216,14,7,30,40,28,19,9,62,88,69,82,55,85,104,49,51,56,64,65,13,66,100,47,66,41,19,20,36,146,108,93,76,36,67,62,72,7,17,28,20,72,79,63,51,66,40,17,1,66,47,44,73,51,25,55,90,65,100,58,45,66,117,4,49,55,75,36,0,2,0,60,255,246,2,11,2,238,0,21,0,41,1,57,186,0,17,0,7,0,3,43,65,3,0,15,0,7,0,1,113,65,3,0,31,0,7,0,1,93,65,3,0,47,0,7,0,1,113,65,3,0,0,0,7,0,1,93,65,3,0,32,0,7,0,1,93,184,0,7,16,185,0,10,0,4,244,184,0,5,208,65,3,0,0,0,17,0,1,93,65,7,0,32,0,17,0,48,0,17,0,64,0,17,0,3,93,65,3,0,96,0,17,0,1,93,65,3,0,16,0,17,0,1,113,184,0,10,16,184,0,27,208,184,0,17,16,185,0,37,0,4,244,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,18,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,186,0,5,0,0,0,12,17,18,57,186,0,10,0,12,0,0,17,18,57,184,0,12,16,185,0,22,0,2,244,184,0,0,16,185,0,32,0,2,244,48,49,1,65,3,0,87,0,11,0,1,93,65,3,0,102,0,20,0,1,93,65,3,0,87,0,20,0,1,93,0,65,5,0,85,0,11,0,101,0,11,0,2,93,65,3,0,86,0,14,0,1,93,65,3,0,103,0,14,0,1,93,65,5,0,89,0,20,0,105,0,20,0,2,93,5,34,46,2,39,7,35,17,51,17,54,51,50,30,2,21,20,14,2,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,45,18,42,42,37,12,10,80,90,52,100,49,82,58,32,34,60,81,57,29,53,40,24,23,40,53,30,32,52,36,20,20,37,52,10,10,18,27,17,62,2,238,254,199,63,41,70,93,51,53,93,69,40,1,174,23,45,65,42,43,66,44,22,28,48,64,35,37,64,47,27,0,1,0,33,255,246,1,171,1,244,0,25,1,133,186,0,12,0,5,0,3,43,65,3,0,143,0,5,0,1,93,65,3,0,31,0,5,0,1,93,65,9,0,63,0,5,0,79,0,5,0,95,0,5,0,111,0,5,0,4,93,65,3,0,32,0,5,0,1,93,65,3,0,176,0,12,0,1,93,65,3,0,0,0,12,0,1,113,65,3,0,32,0,12,0,1,113,65,3,0,208,0,12,0,1,93,65,3,0,32,0,12,0,1,93,65,3,0,0,0,12,0,1,93,184,0,5,16,185,0,18,0,4,244,184,0,12,16,184,0,24,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,21,0,2,244,184,0,0,16,184,0,23,220,48,49,1,65,5,0,90,0,2,0,106,0,2,0,2,93,65,5,0,89,0,8,0,105,0,8,0,2,93,65,3,0,104,0,11,0,1,93,65,3,0,104,0,24,0,1,93,65,3,0,104,0,25,0,1,93,0,65,3,0,89,0,2,0,1,93,65,3,0,106,0,2,0,1,93,65,3,0,84,0,8,0,1,93,65,3,0,101,0,8,0,1,93,65,3,0,132,0,11,0,1,93,65,5,0,85,0,11,0,101,0,11,0,2,93,65,3,0,84,0,12,0,1,93,65,3,0,116,0,12,0,1,93,65,3,0,101,0,12,0,1,93,65,3,0,133,0,12,0,1,93,65,7,0,90,0,24,0,106,0,24,0,122,0,24,0,3,93,65,3,0,140,0,24,0,1,93,65,5,0,89,0,25,0,105,0,25,0,2,93,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,6,21,20,22,51,50,55,23,6,1,21,59,90,63,32,32,61,91,59,98,53,14,62,65,81,80,80,81,66,62,12,55,10,39,69,93,55,56,93,68,37,29,81,30,90,84,84,93,30,72,37,0,0,0,0,2,0,32,255,246,1,239,2,238,0,21,0,41,1,39,186,0,21,0,12,0,3,43,65,3,0,143,0,21,0,1,93,65,7,0,0,0,21,0,16,0,21,0,32,0,21,0,3,113,184,0,21,16,185,0,20,0,4,244,184,0,2,208,65,3,0,31,0,12,0,1,93,65,5,0,63,0,12,0,79,0,12,0,2,93,65,3,0,111,0,12,0,1,93,65,3,0,143,0,12,0,1,93,184,0,12,16,185,0,27,0,4,244,184,0,20,16,184,0,37,208,0,184,0,0,69,88,184,0,21,47,27,185,0,21,0,18,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,0,69,88,184,0,7,47,27,185,0,7,0,6,62,89,186,0,2,0,7,0,17,17,18,57,186,0,19,0,17,0,7,17,18,57,184,0,17,16,185,0,22,0,2,244,184,0,7,16,185,0,32,0,2,244,48,49,1,65,3,0,88,0,9,0,1,93,65,3,0,105,0,9,0,1,93,65,3,0,104,0,15,0,1,93,0,65,5,0,88,0,9,0,104,0,9,0,2,93,65,3,0,103,0,15,0,1,93,65,3,0,85,0,16,0,1,93,65,3,0,101,0,18,0,1,93,65,3,0,86,0,18,0,1,93,33,35,39,14,3,35,34,46,2,53,52,62,2,51,50,23,17,51,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,239,80,10,12,37,41,42,18,47,82,60,34,32,59,82,50,99,51,90,233,32,51,36,19,19,35,51,33,30,55,43,25,26,43,55,62,17,26,19,10,40,69,93,53,51,93,70,41,62,1,56,254,182,26,46,64,39,36,64,47,28,21,43,65,43,42,66,46,24,0,0,2,0,31,255,246,1,226,1,244,0,24,0,30,2,2,186,0,23,0,13,0,3,43,65,3,0,175,0,13,0,1,93,65,3,0,79,0,13,0,1,93,65,3,0,47,0,13,0,1,113,65,3,0,143,0,13,0,1,93,65,3,0,111,0,13,0,1,93,184,0,13,16,185,0,1,0,4,244,65,3,0,80,0,23,0,1,93,65,3,0,144,0,23,0,1,93,65,3,0,208,0,23,0,1,93,65,3,0,16,0,23,0,1,113,65,3,0,48,0,23,0,1,113,65,3,0,240,0,23,0,1,93,65,3,0,176,0,23,0,1,93,65,3,0,112,0,23,0,1,93,65,3,0,16,0,23,0,1,93,65,3,0,80,0,23,0,1,113,186,0,6,0,23,0,13,17,18,57,184,0,6,47,184,0,23,16,185,0,28,0,4,244,186,0,27,0,1,0,28,17,18,57,0,184,0,0,69,88,184,0,18,47,27,185,0,18,0,12,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,186,0,1,0,18,0,8,17,18,57,184,0,1,47,65,5,0,144,0,1,0,160,0,1,0,2,93,65,5,0,16,0,1,0,32,0,1,0,2,93,65,5,0,80,0,1,0,96,0,1,0,2,113,184,0,8,16,185,0,3,0,2,244,184,0,8,16,184,0,5,220,184,0,18,16,185,0,25,0,2,244,184,0,1,16,184,0,27,220,65,3,0,255,0,27,0,1,113,65,15,0,159,0,27,0,175,0,27,0,191,0,27,0,207,0,27,0,223,0,27,0,239,0,27,0,255,0,27,0,7,93,48,49,1,65,3,0,69,0,2,0,1,93,65,3,0,54,0,2,0,1,93,65,3,0,135,0,6,0,1,93,65,3,0,103,0,7,0,1,93,65,3,0,120,0,7,0,1,93,65,3,0,88,0,10,0,1,93,65,3,0,135,0,20,0,1,93,65,3,0,132,0,21,0,1,93,65,3,0,6,0,21,0,1,93,0,65,3,0,54,0,2,0,1,93,65,3,0,71,0,2,0,1,93,65,3,0,137,0,6,0,1,93,65,5,0,105,0,7,0,121,0,7,0,2,93,65,3,0,90,0,7,0,1,93,65,3,0,89,0,10,0,1,93,65,3,0,134,0,20,0,1,93,65,3,0,135,0,21,0,1,93,37,33,22,51,50,55,23,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,39,34,7,33,52,38,1,222,254,157,16,168,75,66,12,87,77,62,99,68,36,34,62,89,55,47,78,55,31,213,109,29,1,2,60,245,175,29,71,38,40,69,95,55,53,92,67,39,28,54,77,48,28,155,113,54,59,0,0,0,0,1,0,10,0,0,1,61,2,238,0,23,0,236,186,0,13,0,4,0,3,43,65,3,0,143,0,4,0,1,93,65,3,0,47,0,4,0,1,113,184,0,4,16,185,0,1,0,4,244,184,0,4,16,184,0,5,208,184,0,5,47,184,0,4,16,184,0,7,208,65,3,0,47,0,13,0,1,113,184,0,1,16,184,0,22,208,184,0,13,16,184,0,23,208,184,0,23,47,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,18,62,89,184,0,0,69,88,184,0,22,47,27,185,0,22,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,22,16,185,0,1,0,1,244,184,0,4,208,184,0,22,16,184,0,7,208,184,0,11,16,185,0,16,0,2,244,48,49,1,65,9,0,73,0,9,0,89,0,9,0,105,0,9,0,121,0,9,0,4,93,65,9,0,10,0,9,0,26,0,9,0,42,0,9,0,58,0,9,0,4,93,0,65,9,0,5,0,10,0,21,0,10,0,37,0,10,0,53,0,10,0,4,93,1,35,17,35,17,35,55,51,53,52,54,51,50,23,7,38,35,34,14,2,29,1,51,1,61,132,90,85,12,73,59,55,64,38,14,29,31,17,20,11,4,132,1,164,254,92,1,164,70,124,61,75,13,76,9,7,25,48,40,60,0,0,0,3,0,26,255,6,1,245,1,244,0,53,0,65,0,78,3,224,186,0,30,0,14,0,3,43,65,3,0,95,0,14,0,1,93,65,3,0,32,0,14,0,1,93,65,3,0,160,0,14,0,1,93,184,0,14,16,184,0,5,208,184,0,5,47,184,0,14,16,184,0,9,208,184,0,9,47,65,3,0,0,0,30,0,1,93,65,3,0,96,0,30,0,1,93,65,3,0,160,0,30,0,1,93,65,3,0,128,0,30,0,1,93,65,3,0,32,0,30,0,1,93,65,3,0,192,0,30,0,1,93,65,3,0,16,0,30,0,1,113,186,0,12,0,14,0,30,17,18,57,186,0,21,0,14,0,30,17,18,57,184,0,30,16,184,0,24,208,184,0,24,47,186,0,28,0,30,0,14,17,18,57,186,0,37,0,30,0,14,17,18,57,184,0,9,16,185,0,39,0,4,244,184,0,30,16,184,0,49,208,184,0,49,47,184,0,14,16,185,0,57,0,4,244,184,0,30,16,185,0,63,0,4,244,184,0,5,16,185,0,71,0,4,244,184,0,49,16,185,0,77,0,4,244,65,3,0,79,0,80,0,1,93,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,12,62,89,184,0,0,69,88,184,0,24,47,27,185,0,24,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,8,62,89,65,3,0,0,0,0,0,1,93,186,0,44,0,19,0,0,17,18,57,65,5,0,58,0,44,0,74,0,44,0,2,93,65,3,0,101,0,44,0,1,93,184,0,44,16,185,0,66,0,1,244,186,0,7,0,44,0,66,17,18,57,184,0,19,16,184,0,35,220,65,3,0,111,0,35,0,1,93,65,5,0,63,0,35,0,79,0,35,0,2,93,65,3,0,143,0,35,0,1,93,65,3,0,15,0,35,0,1,113,186,0,12,0,35,0,19,17,18,57,186,0,21,0,19,0,35,17,18,57,184,0,24,16,185,0,25,0,1,244,186,0,28,0,19,0,35,17,18,57,186,0,37,0,35,0,19,17,18,57,184,0,19,16,185,0,54,0,1,244,184,0,35,16,185,0,60,0,1,244,186,0,68,0,66,0,44,17,18,57,184,0,0,16,185,0,74,0,1,244,48,49,1,65,3,0,9,0,3,0,1,93,65,5,0,122,0,8,0,138,0,8,0,2,93,65,3,0,121,0,12,0,1,93,65,3,0,120,0,13,0,1,93,65,3,0,138,0,13,0,1,93,65,3,0,9,0,16,0,1,93,65,3,0,123,0,16,0,1,93,65,3,0,140,0,16,0,1,93,65,3,0,136,0,17,0,1,93,65,3,0,121,0,17,0,1,93,65,3,0,117,0,21,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,117,0,28,0,1,93,65,3,0,134,0,28,0,1,93,65,3,0,117,0,32,0,1,93,65,3,0,134,0,32,0,1,93,65,3,0,134,0,33,0,1,93,65,3,0,7,0,33,0,1,93,65,3,0,119,0,33,0,1,93,65,3,0,134,0,47,0,1,93,65,5,0,23,0,47,0,39,0,47,0,2,93,65,3,0,119,0,47,0,1,93,65,5,0,118,0,51,0,134,0,51,0,2,93,65,3,0,6,0,52,0,1,93,65,3,0,135,0,52,0,1,93,65,3,0,119,0,69,0,1,93,0,65,3,0,8,0,3,0,1,93,65,3,0,120,0,8,0,1,93,65,3,0,120,0,12,0,1,93,65,3,0,120,0,13,0,1,93,65,3,0,6,0,16,0,1,93,65,3,0,119,0,16,0,1,93,65,3,0,133,0,17,0,1,93,65,3,0,119,0,17,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,5,0,118,0,28,0,134,0,28,0,2,93,65,3,0,137,0,32,0,1,93,65,3,0,122,0,32,0,1,93,65,3,0,9,0,33,0,1,93,65,3,0,121,0,33,0,1,93,65,3,0,138,0,33,0,1,93,65,3,0,102,0,42,0,1,93,65,3,0,134,0,47,0,1,93,65,5,0,23,0,47,0,39,0,47,0,2,93,65,3,0,119,0,47,0,1,93,65,5,0,122,0,51,0,138,0,51,0,2,93,65,3,0,9,0,52,0,1,93,65,3,0,121,0,52,0,1,93,65,3,0,138,0,52,0,1,93,65,3,0,121,0,69,0,1,93,65,3,0,138,0,69,0,1,93,23,34,46,2,53,52,55,38,53,52,54,55,38,53,52,62,2,51,50,23,54,59,1,7,35,34,7,22,21,20,14,2,35,34,39,6,21,20,30,2,23,30,3,23,20,14,2,3,34,6,21,20,22,51,50,54,53,52,38,3,34,39,14,1,21,20,22,51,50,54,53,52,255,58,86,57,28,87,50,27,31,85,27,51,75,47,66,59,52,67,8,11,23,31,27,45,28,51,73,46,39,31,24,11,33,59,49,33,70,57,38,2,34,63,92,75,55,60,65,52,54,62,64,12,17,72,34,44,78,69,72,79,250,24,41,54,29,78,32,24,38,17,41,15,61,99,42,72,53,30,36,28,60,7,54,63,39,70,54,32,9,14,16,9,13,10,11,9,6,18,30,47,35,31,56,42,25,2,166,67,55,57,67,72,55,57,62,254,58,12,10,50,26,35,45,47,31,52,0,1,0,60,0,0,1,230,2,238,0,16,1,44,186,0,0,0,9,0,3,43,65,3,0,223,0,0,0,1,93,65,3,0,32,0,0,0,1,93,65,3,0,64,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,223,0,9,0,1,93,65,3,0,15,0,9,0,1,113,65,3,0,47,0,9,0,1,113,65,3,0,32,0,9,0,1,93,184,0,9,16,185,0,8,0,4,244,184,0,12,208,65,3,0,128,0,17,0,1,93,65,3,0,239,0,18,0,1,93,65,3,0,31,0,18,0,1,93,65,3,0,207,0,18,0,1,93,65,3,0,175,0,18,0,1,93,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,18,62,89,184,0,0,69,88,184,0,14,47,27,185,0,14,0,12,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,1,208,184,0,14,16,185,0,5,0,2,244,65,3,0,6,0,9,0,1,113,186,0,12,0,14,0,8,17,18,57,48,49,1,65,7,0,118,0,15,0,134,0,15,0,150,0,15,0,3,93,65,3,0,7,0,15,0,1,93,0,65,3,0,150,0,4,0,1,93,65,3,0,118,0,15,0,1,93,65,3,0,150,0,15,0,1,93,65,3,0,7,0,15,0,1,93,65,3,0,135,0,15,0,1,93,33,35,17,52,38,35,34,7,17,35,17,51,17,54,51,50,21,1,230,90,52,65,88,40,91,91,49,93,193,1,6,87,71,64,254,156,2,238,254,199,63,238,0,2,0,61,0,0,0,151,2,188,0,3,0,7,0,165,187,0,7,0,4,0,6,0,4,43,65,3,0,143,0,7,0,1,93,65,3,0,223,0,7,0,1,93,65,3,0,63,0,7,0,1,113,65,3,0,32,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,223,0,6,0,1,93,65,3,0,63,0,6,0,1,113,65,3,0,143,0,6,0,1,93,65,3,0,32,0,6,0,1,93,184,0,6,16,184,0,1,208,0,184,0,1,47,184,0,0,69,88,184,0,6,47,27,185,0,6,0,12,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,65,3,0,32,0,1,0,1,93,65,3,0,64,0,1,0,1,93,184,0,1,16,184,0,2,220,48,49,19,35,53,51,17,35,17,51,151,90,90,90,90,2,88,100,253,68,1,234,0,0,0,0,2,255,244,255,14,0,151,2,188,0,14,0,18,0,209,187,0,9,0,4,0,8,0,4,43,65,3,0,63,0,8,0,1,113,65,3,0,143,0,8,0,1,93,65,3,0,223,0,8,0,1,93,65,3,0,32,0,8,0,1,93,184,0,8,16,184,0,2,208,184,0,2,47,65,3,0,143,0,9,0,1,93,65,3,0,223,0,9,0,1,93,65,3,0,63,0,9,0,1,113,65,3,0,32,0,9,0,1,93,184,0,9,16,184,0,15,208,184,0,8,16,184,0,16,208,0,184,0,16,47,184,0,0,69,88,184,0,8,47,27,185,0,8,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,8,62,89,185,0,2,0,1,244,65,3,0,64,0,16,0,1,93,65,3,0,32,0,16,0,1,93,184,0,16,16,184,0,17,220,48,49,1,65,11,0,5,0,12,0,21,0,12,0,37,0,12,0,53,0,12,0,69,0,12,0,5,93,23,7,39,62,3,53,17,51,17,20,14,2,19,35,53,51,28,30,10,22,28,16,7,90,20,33,45,98,90,90,237,5,69,2,10,21,37,30,2,51,253,171,32,45,31,18,3,65,100,0,0,0,1,0,60,0,0,1,189,2,238,0,10,1,129,186,0,8,0,1,0,3,43,65,3,0,15,0,1,0,1,113,65,3,0,143,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,32,0,1,0,1,93,184,0,1,16,185,0,0,0,4,244,184,0,4,208,65,3,0,51,0,8,0,1,93,65,3,0,37,0,8,0,1,93,65,3,0,73,0,8,0,1,93,65,3,0,138,0,8,0,1,93,65,3,0,90,0,8,0,1,93,65,3,0,121,0,8,0,1,93,65,3,0,19,0,8,0,1,93,65,3,0,99,0,8,0,1,93,65,3,0,0,0,8,0,1,93,184,0,8,16,184,0,9,208,65,5,0,73,0,9,0,89,0,9,0,2,93,65,3,0,106,0,9,0,1,93,65,5,0,123,0,9,0,139,0,9,0,2,93,65,3,0,41,0,9,0,1,113,65,7,0,166,0,9,0,182,0,9,0,198,0,9,0,3,93,65,3,0,149,0,9,0,1,93,184,0,5,208,65,3,0,134,0,5,0,1,93,184,0,8,16,184,0,6,208,65,3,0,134,0,6,0,1,93,184,0,4,16,184,0,7,208,65,3,0,38,0,7,0,1,113,65,7,0,101,0,7,0,117,0,7,0,133,0,7,0,3,93,65,3,0,63,0,12,0,1,93,65,3,0,31,0,12,0,1,93,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,9,208,186,0,7,0,5,0,9,17,18,57,25,184,0,7,47,24,184,0,4,208,184,0,7,16,184,0,10,208,48,49,51,35,17,51,17,55,51,7,19,35,39,150,90,90,180,110,202,207,110,185,2,238,254,31,221,226,254,248,249,0,1,0,60,255,246,0,229,2,238,0,12,0,111,186,0,0,0,5,0,3,43,65,3,0,255,0,0,0,1,93,65,3,0,32,0,0,0,1,93,65,3,0,47,0,5,0,1,113,65,3,0,255,0,5,0,1,93,65,3,0,32,0,5,0,1,93,184,0,5,16,185,0,8,0,4,244,65,3,0,16,0,13,0,1,93,65,3,0,175,0,14,0,1,93,0,184,0,7,47,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,185,0,0,0,1,244,48,49,55,7,35,34,38,53,17,51,17,20,30,2,229,13,29,66,61,90,5,16,31,62,72,67,51,2,130,253,178,31,39,21,7,0,0,0,1,0,61,0,0,3,53,1,244,0,29,2,14,186,0,9,0,17,0,3,43,65,3,0,0,0,9,0,1,93,65,3,0,255,0,9,0,1,93,65,3,0,32,0,9,0,1,93,65,3,0,64,0,9,0,1,113,184,0,9,16,184,0,1,220,65,3,0,64,0,1,0,1,113,185,0,0,0,4,244,184,0,9,16,185,0,8,0,4,244,65,3,0,255,0,17,0,1,93,65,3,0,32,0,17,0,1,93,65,3,0,0,0,17,0,1,93,184,0,17,16,185,0,16,0,4,244,186,0,20,0,16,0,17,17,18,57,186,0,25,0,8,0,9,17,18,57,65,3,0,95,0,31,0,1,93,0,184,0,0,69,88,184,0,23,47,27,185,0,23,0,12,62,89,184,0,0,69,88,184,0,27,47,27,185,0,27,0,12,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,12,62,89,184,0,0,69,88,184,0,16,47,27,185,0,16,0,6,62,89,184,0,9,208,184,0,1,208,184,0,27,16,185,0,5,0,2,244,184,0,23,16,185,0,13,0,2,244,186,0,20,0,23,0,16,17,18,57,186,0,25,0,27,0,9,17,18,57,48,49,1,65,3,0,168,0,11,0,1,93,65,3,0,154,0,12,0,1,93,65,3,0,123,0,12,0,1,93,65,3,0,87,0,14,0,1,93,65,5,0,88,0,21,0,104,0,21,0,2,93,65,5,0,120,0,25,0,136,0,25,0,2,93,65,3,0,88,0,26,0,1,93,65,3,0,165,0,28,0,1,93,65,3,0,134,0,28,0,1,93,65,5,0,7,0,28,0,23,0,28,0,2,93,65,3,0,151,0,28,0,1,93,0,65,3,0,171,0,11,0,1,93,65,3,0,119,0,12,0,1,93,65,7,0,86,0,14,0,102,0,14,0,118,0,14,0,3,93,65,3,0,85,0,21,0,1,93,65,3,0,102,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,164,0,25,0,1,93,65,5,0,133,0,25,0,149,0,25,0,2,93,65,3,0,118,0,25,0,1,93,65,3,0,86,0,26,0,1,93,65,3,0,103,0,26,0,1,93,65,3,0,133,0,28,0,1,93,65,3,0,6,0,28,0,1,93,65,5,0,150,0,28,0,166,0,28,0,2,93,65,3,0,23,0,28,0,1,93,33,35,17,52,38,35,34,21,17,35,17,52,38,35,34,7,17,35,17,51,23,62,1,51,50,23,54,51,50,21,3,53,90,54,61,130,90,59,56,94,36,90,70,10,40,66,41,112,54,51,128,188,1,32,69,63,136,254,228,1,14,84,66,64,254,156,1,234,52,36,26,98,98,211,0,0,0,1,0,61,0,0,1,247,1,244,0,16,1,95,186,0,0,0,9,0,3,43,65,3,0,96,0,0,0,1,93,65,3,0,32,0,0,0,1,113,65,3,0,0,0,0,0,1,93,65,3,0,64,0,0,0,1,113,65,3,0,0,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,3,0,32,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,143,0,9,0,1,93,65,3,0,255,0,9,0,1,93,65,3,0,223,0,9,0,1,93,65,3,0,0,0,9,0,1,93,65,3,0,32,0,9,0,1,93,184,0,9,16,185,0,8,0,4,244,184,0,12,208,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,12,62,89,184,0,0,69,88,184,0,11,47,27,185,0,11,0,12,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,1,208,184,0,14,16,185,0,5,0,2,244,186,0,7,0,8,0,5,17,18,57,186,0,12,0,14,0,8,17,18,57,48,49,1,65,3,0,117,0,15,0,1,93,65,5,0,6,0,15,0,22,0,15,0,2,93,65,3,0,150,0,15,0,1,93,65,3,0,135,0,15,0,1,93,65,3,0,167,0,15,0,1,93,0,65,3,0,91,0,3,0,1,113,65,3,0,84,0,6,0,1,93,65,3,0,84,0,13,0,1,93,65,3,0,22,0,15,0,1,93,65,3,0,134,0,15,0,1,93,65,3,0,7,0,15,0,1,93,65,3,0,119,0,15,0,1,93,65,3,0,151,0,15,0,1,93,33,35,17,52,38,35,34,7,17,35,17,51,23,54,51,50,21,1,247,90,59,69,98,36,90,70,10,70,92,200,1,14,79,71,64,254,156,1,234,52,62,230,0,0,2,0,32,255,246,2,6,1,244,0,18,0,31,1,107,186,0,17,0,7,0,3,43,65,3,0,31,0,7,0,1,93,65,3,0,95,0,7,0,1,93,65,3,0,159,0,7,0,1,93,65,3,0,47,0,7,0,1,113,65,3,0,127,0,7,0,1,93,65,3,0,63,0,7,0,1,93,65,3,0,32,0,7,0,1,93,65,3,0,160,0,7,0,1,93,65,5,0,160,0,17,0,176,0,17,0,2,93,65,3,0,240,0,17,0,1,93,65,3,0,48,0,17,0,1,113,65,3,0,32,0,17,0,1,93,65,3,0,16,0,17,0,1,113,65,3,0,208,0,17,0,1,93,65,3,0,96,0,17,0,1,93,65,3,0,64,0,17,0,1,93,184,0,7,16,185,0,24,0,4,244,184,0,17,16,185,0,30,0,4,244,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,12,16,185,0,21,0,2,244,184,0,2,16,185,0,27,0,2,244,48,49,1,65,3,0,101,0,0,0,1,93,65,3,0,86,0,0,0,1,93,65,5,0,88,0,4,0,104,0,4,0,2,93,65,3,0,89,0,5,0,1,93,65,5,0,89,0,10,0,105,0,10,0,2,93,65,5,0,86,0,14,0,102,0,14,0,2,93,0,65,5,0,89,0,0,0,105,0,0,0,2,93,65,3,0,88,0,4,0,1,93,65,3,0,105,0,4,0,1,93,65,5,0,87,0,10,0,103,0,10,0,2,93,65,3,0,86,0,14,0,1,93,65,3,0,103,0,14,0,1,93,37,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,39,38,35,34,6,21,20,22,51,50,54,53,52,1,196,65,112,57,90,63,33,34,63,90,56,56,90,63,34,132,39,72,72,79,79,72,73,78,62,72,39,68,94,54,55,93,68,39,39,69,93,54,110,239,46,91,84,84,91,94,81,83,0,0,0,0,2,0,61,255,14,2,12,1,244,0,22,0,42,1,129,186,0,18,0,7,0,3,43,65,3,0,15,0,7,0,1,113,65,3,0,31,0,7,0,1,93,65,3,0,47,0,7,0,1,113,65,3,0,0,0,7,0,1,93,65,3,0,32,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,184,0,10,208,65,3,0,0,0,18,0,1,93,65,7,0,32,0,18,0,48,0,18,0,64,0,18,0,3,93,65,3,0,96,0,18,0,1,93,65,3,0,16,0,18,0,1,113,184,0,6,16,184,0,28,208,184,0,18,16,185,0,38,0,4,244,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,12,62,89,184,0,0,69,88,184,0,13,47,27,185,0,13,0,12,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,8,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,5,0,0,0,13,17,18,57,65,3,0,34,0,7,0,1,113,186,0,10,0,13,0,0,17,18,57,184,0,13,16,185,0,23,0,2,244,184,0,0,16,185,0,33,0,2,244,48,49,1,65,3,0,104,0,11,0,1,93,65,3,0,91,0,11,0,1,93,65,3,0,86,0,15,0,1,93,65,3,0,103,0,15,0,1,93,65,5,0,86,0,20,0,102,0,20,0,2,93,65,3,0,102,0,21,0,1,93,65,3,0,87,0,21,0,1,93,0,65,3,0,85,0,11,0,1,93,65,3,0,103,0,11,0,1,93,65,5,0,87,0,15,0,103,0,15,0,2,93,65,3,0,104,0,20,0,1,93,65,3,0,89,0,20,0,1,93,65,3,0,89,0,21,0,1,93,65,3,0,106,0,21,0,1,93,5,34,46,2,39,17,35,17,51,23,62,1,51,50,30,2,21,20,14,2,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,49,18,43,42,38,13,90,70,10,34,74,57,50,80,57,31,29,55,82,63,29,54,41,25,24,41,54,30,31,51,36,19,19,36,51,10,10,18,27,17,254,208,2,220,70,41,39,41,71,92,51,55,94,68,38,1,174,24,45,65,41,44,65,44,22,27,46,64,38,39,64,46,26,0,0,2,0,33,255,14,1,240,1,244,0,22,0,42,1,65,186,0,16,0,5,0,3,43,65,3,0,31,0,5,0,1,93,65,3,0,111,0,5,0,1,93,65,5,0,63,0,5,0,79,0,5,0,2,93,65,7,0,0,0,16,0,16,0,16,0,32,0,16,0,3,113,184,0,16,16,185,0,17,0,4,244,184,0,13,208,184,0,5,16,185,0,28,0,4,244,184,0,17,16,184,0,38,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,12,62,89,184,0,0,69,88,184,0,15,47,27,185,0,15,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,0,69,88,184,0,16,47,27,185,0,16,0,8,62,89,65,3,0,69,0,5,0,1,93,186,0,13,0,10,0,0,17,18,57,65,3,0,47,0,16,0,1,113,186,0,18,0,0,0,10,17,18,57,184,0,10,16,185,0,23,0,2,244,184,0,0,16,185,0,33,0,2,244,48,49,1,65,3,0,90,0,2,0,1,93,65,3,0,107,0,2,0,1,93,65,3,0,90,0,3,0,1,93,65,5,0,88,0,8,0,104,0,8,0,2,93,65,3,0,85,0,12,0,1,93,65,3,0,103,0,12,0,1,93,0,65,5,0,89,0,2,0,105,0,2,0,2,93,65,5,0,86,0,8,0,102,0,8,0,2,93,65,3,0,102,0,12,0,1,93,65,3,0,87,0,12,0,1,93,23,34,46,2,53,52,62,2,51,50,22,23,55,51,17,35,17,14,3,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,252,53,82,56,28,31,57,80,50,57,74,34,10,70,90,12,38,42,43,9,32,50,36,19,19,36,50,32,30,55,40,24,25,41,54,10,38,68,94,55,52,92,70,41,39,41,70,253,36,1,48,16,27,19,10,1,174,26,46,64,39,38,64,46,27,23,44,66,42,41,65,45,24,0,0,0,0,1,0,61,0,0,1,64,1,252,0,15,0,166,186,0,0,0,9,0,3,43,65,3,0,0,0,0,0,1,93,65,3,0,32,0,0,0,1,93,65,3,0,31,0,9,0,1,93,65,3,0,0,0,9,0,1,93,65,3,0,32,0,9,0,1,93,184,0,9,16,185,0,8,0,4,244,184,0,12,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,12,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,6,62,89,184,0,10,16,184,0,0,208,184,0,0,47,184,0,1,220,65,5,0,127,0,1,0,143,0,1,0,2,93,65,5,0,31,0,1,0,47,0,1,0,2,113,186,0,7,0,9,0,1,17,18,57,186,0,12,0,0,0,9,17,18,57,48,49,1,7,35,34,14,2,7,17,35,17,51,23,62,1,51,1,64,20,31,15,34,31,26,6,96,74,11,46,75,45,1,252,99,11,18,22,12,254,166,1,234,81,52,47,0,1,0,32,255,246,1,131,1,244,0,39,2,81,186,0,35,0,15,0,3,43,65,3,0,127,0,15,0,1,93,184,0,15,16,184,0,2,208,184,0,2,47,65,3,0,208,0,35,0,1,93,65,3,0,0,0,35,0,1,113,65,3,0,160,0,35,0,1,93,65,3,0,128,0,35,0,1,93,184,0,35,16,185,0,8,0,4,244,186,0,20,0,35,0,15,17,18,57,184,0,20,47,184,0,15,16,185,0,25,0,4,244,65,3,0,31,0,41,0,1,93,65,3,0,79,0,41,0,1,93,0,184,0,0,69,88,184,0,18,47,27,185,0,18,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,220,65,5,0,48,0,3,0,64,0,3,0,2,93,184,0,0,16,185,0,6,0,2,244,186,0,10,0,0,0,18,17,18,57,65,3,0,121,0,10,0,1,93,65,3,0,10,0,10,0,1,93,65,3,0,138,0,10,0,1,93,65,5,0,166,0,10,0,182,0,10,0,2,93,65,3,0,149,0,10,0,1,93,184,0,18,16,184,0,21,220,65,5,0,176,0,21,0,192,0,21,0,2,93,184,0,18,16,185,0,23,0,1,244,186,0,29,0,18,0,0,17,18,57,65,3,0,10,0,29,0,1,93,48,49,1,65,9,0,87,0,1,0,103,0,1,0,119,0,1,0,135,0,1,0,4,93,65,3,0,57,0,13,0,1,93,65,3,0,75,0,13,0,1,93,65,3,0,25,0,16,0,1,93,65,3,0,42,0,16,0,1,93,65,3,0,11,0,16,0,1,93,65,5,0,54,0,33,0,70,0,33,0,2,93,65,5,0,118,0,33,0,134,0,33,0,2,93,65,3,0,37,0,38,0,1,93,65,3,0,22,0,38,0,1,93,65,3,0,7,0,38,0,1,93,0,65,9,0,89,0,1,0,105,0,1,0,121,0,1,0,137,0,1,0,4,93,65,9,0,89,0,2,0,105,0,2,0,121,0,2,0,137,0,2,0,4,93,65,3,0,72,0,13,0,1,93,65,3,0,57,0,13,0,1,93,65,3,0,37,0,16,0,1,93,65,3,0,6,0,16,0,1,93,65,3,0,23,0,16,0,1,93,65,9,0,84,0,19,0,100,0,19,0,116,0,19,0,132,0,19,0,4,93,65,9,0,85,0,20,0,101,0,20,0,117,0,20,0,133,0,20,0,4,93,65,5,0,53,0,33,0,69,0,33,0,2,93,65,3,0,134,0,33,0,1,93,65,3,0,119,0,33,0,1,93,65,3,0,9,0,38,0,1,93,65,5,0,26,0,38,0,42,0,38,0,2,93,23,34,39,55,30,1,51,50,53,52,39,46,3,39,52,54,51,50,23,7,38,35,34,21,20,30,2,23,30,3,21,20,14,2,200,107,61,11,20,83,50,98,98,30,53,42,27,2,90,94,67,66,11,52,68,95,10,26,44,34,21,49,42,28,16,42,73,10,43,87,18,32,61,55,26,7,19,31,48,36,63,84,32,82,43,66,16,22,17,16,10,6,21,34,50,35,24,52,42,28,0,0,1,0,18,255,246,1,65,2,108,0,21,0,215,186,0,14,0,6,0,3,43,65,3,0,95,0,14,0,1,93,65,3,0,0,0,14,0,1,93,184,0,14,16,184,0,0,208,184,0,0,47,65,3,0,95,0,6,0,1,93,65,3,0,0,0,6,0,1,93,184,0,6,16,184,0,7,208,184,0,7,47,184,0,6,16,184,0,9,208,184,0,9,47,184,0,6,16,185,0,15,0,4,244,184,0,12,208,184,0,12,47,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,185,0,0,0,1,244,184,0,12,16,185,0,15,0,1,244,184,0,6,208,184,0,12,16,184,0,9,208,184,0,12,16,184,0,11,220,48,49,1,65,9,0,57,0,4,0,73,0,4,0,89,0,4,0,105,0,4,0,4,93,0,65,9,0,57,0,3,0,73,0,3,0,89,0,3,0,105,0,3,0,4,93,37,7,35,34,38,53,17,35,55,51,53,55,21,51,21,35,17,20,30,2,51,1,62,7,81,65,63,84,8,76,90,129,129,4,19,42,38,62,72,68,49,1,57,70,121,9,130,70,254,254,35,40,20,5,0,0,1,0,56,255,246,1,207,1,234,0,15,1,48,186,0,15,0,7,0,3,43,65,3,0,32,0,15,0,1,113,65,3,0,255,0,15,0,1,93,65,3,0,223,0,15,0,1,93,65,3,0,80,0,15,0,1,93,65,3,0,112,0,15,0,1,93,184,0,15,16,185,0,14,0,4,244,184,0,2,208,65,3,0,31,0,7,0,1,113,65,3,0,223,0,7,0,1,93,65,3,0,143,0,7,0,1,93,65,3,0,255,0,7,0,1,93,65,3,0,32,0,7,0,1,93,184,0,7,16,185,0,8,0,4,244,65,3,0,31,0,17,0,1,93,65,3,0,63,0,17,0,1,93,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,12,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,8,16,184,0,14,208,186,0,2,0,4,0,14,17,18,57,184,0,4,16,185,0,11,0,2,244,48,49,1,65,5,0,168,0,5,0,184,0,5,0,2,93,65,3,0,102,0,10,0,1,93,65,3,0,134,0,10,0,1,93,65,3,0,119,0,10,0,1,93,0,65,3,0,185,0,5,0,1,93,65,3,0,170,0,5,0,1,93,65,5,0,102,0,10,0,118,0,10,0,2,93,65,3,0,135,0,10,0,1,93,33,35,39,6,35,34,53,17,51,17,20,51,50,55,17,51,1,207,80,10,46,90,181,90,114,78,35,90,54,64,215,1,29,254,252,160,56,1,108,0,0,0,0,1,0,9,0,0,1,227,1,234,0,6,1,25,187,0,1,0,4,0,2,0,4,43,65,3,0,64,0,1,0,1,93,65,3,0,160,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,224,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,89,0,0,0,1,93,65,3,0,151,0,0,0,1,93,65,3,0,5,0,0,0,1,93,65,3,0,160,0,2,0,1,93,65,3,0,224,0,2,0,1,93,65,3,0,64,0,2,0,1,93,65,3,0,0,0,2,0,1,93,184,0,2,16,184,0,3,208,65,3,0,10,0,3,0,1,93,65,3,0,152,0,3,0,1,93,65,3,0,86,0,3,0,1,93,185,0,4,0,4,244,65,3,0,184,0,4,0,1,93,186,0,5,0,2,0,1,17,18,57,184,0,0,16,185,0,6,0,4,244,65,3,0,183,0,6,0,1,93,65,3,0,47,0,8,0,1,93,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,12,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,208,184,0,4,16,184,0,6,208,48,49,65,3,0,132,0,5,0,1,93,65,3,0,117,0,5,0,1,93,65,3,0,12,0,5,0,1,93,1,3,35,3,51,27,1,1,227,186,101,187,100,137,136,1,234,254,22,1,234,254,121,1,135,0,1,0,12,0,0,2,202,1,234,0,12,1,215,187,0,10,0,4,0,9,0,4,43,65,3,0,144,0,10,0,1,93,184,0,10,16,184,0,1,220,184,0,0,208,65,3,0,134,0,0,0,1,93,65,3,0,38,0,0,0,1,93,184,0,1,16,185,0,2,0,4,244,65,3,0,144,0,9,0,1,93,186,0,3,0,9,0,10,17,18,57,184,0,9,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,6,208,65,3,0,41,0,6,0,1,93,65,3,0,137,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,4,17,18,57,186,0,11,0,2,0,1,17,18,57,184,0,0,16,185,0,12,0,4,244,65,3,0,15,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,12,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,2,208,184,0,2,47,184,0,7,16,184,0,9,208,184,0,9,47,184,0,3,208,184,0,4,16,184,0,8,208,184,0,11,208,184,0,7,16,184,0,12,208,48,49,1,65,3,0,56,0,1,0,1,93,65,3,0,72,0,2,0,1,93,65,5,0,25,0,2,0,41,0,2,0,2,93,65,5,0,121,0,2,0,137,0,2,0,2,93,65,5,0,22,0,4,0,38,0,4,0,2,93,65,5,0,118,0,4,0,134,0,4,0,2,93,65,3,0,71,0,4,0,1,93,65,3,0,72,0,9,0,1,93,65,5,0,121,0,9,0,137,0,9,0,2,93,65,5,0,118,0,10,0,134,0,10,0,2,93,0,65,3,0,3,0,3,0,1,93,65,3,0,54,0,3,0,1,93,65,3,0,71,0,3,0,1,93,65,3,0,41,0,3,0,1,113,65,3,0,89,0,8,0,1,93,65,3,0,74,0,8,0,1,93,65,3,0,27,0,8,0,1,93,65,3,0,12,0,8,0,1,93,65,3,0,44,0,8,0,1,93,65,5,0,73,0,11,0,89,0,11,0,2,93,65,7,0,12,0,11,0,28,0,11,0,44,0,11,0,3,93,1,3,35,11,1,35,3,51,27,1,51,27,1,2,202,148,101,102,103,101,147,106,94,104,93,105,94,1,234,254,22,1,106,254,150,1,234,254,121,1,120,254,136,1,135,0,0,0,1,0,11,0,0,1,207,1,234,0,11,1,236,186,0,11,0,5,0,3,43,65,3,0,160,0,11,0,1,93,65,3,0,0,0,11,0,1,93,65,3,0,208,0,11,0,1,93,65,5,0,96,0,11,0,112,0,11,0,2,93,65,3,0,64,0,11,0,1,93,184,0,11,16,184,0,0,208,65,3,0,22,0,0,0,1,93,65,3,0,200,0,0,0,1,93,65,3,0,137,0,0,0,1,93,65,3,0,122,0,0,0,1,93,65,3,0,41,0,0,0,1,93,65,3,0,103,0,0,0,1,93,65,3,0,245,0,0,0,1,93,65,3,0,5,0,0,0,1,93,185,0,1,0,4,244,65,3,0,64,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,95,0,5,0,1,93,65,3,0,111,0,5,0,1,113,65,3,0,160,0,5,0,1,93,65,3,0,0,0,5,0,1,93,186,0,2,0,5,0,11,17,18,57,184,0,5,16,184,0,4,208,65,3,0,25,0,4,0,1,93,65,3,0,10,0,4,0,1,93,65,3,0,250,0,4,0,1,93,65,3,0,104,0,4,0,1,93,65,3,0,118,0,4,0,1,93,185,0,3,0,4,244,65,3,0,184,0,3,0,1,93,184,0,4,16,184,0,6,208,65,3,0,39,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,11,17,18,57,184,0,0,16,184,0,10,208,185,0,9,0,4,244,65,3,0,47,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,186,0,2,0,3,0,7,17,18,57,65,3,0,214,0,2,0,1,93,65,3,0,165,0,2,0,1,93,186,0,8,0,7,0,3,17,18,57,65,3,0,170,0,8,0,1,93,65,3,0,217,0,8,0,1,93,186,0,5,0,8,0,2,17,18,57,184,0,7,16,184,0,9,208,186,0,11,0,2,0,8,17,18,57,48,49,65,3,0,149,0,2,0,1,93,65,3,0,6,0,2,0,1,93,65,3,0,9,0,8,0,1,93,65,3,0,153,0,8,0,1,93,33,35,39,7,35,55,39,51,23,55,51,7,1,207,101,124,126,101,171,167,101,123,113,105,161,193,193,244,246,194,194,238,0,0,0,1,0,7,255,14,1,242,1,234,0,7,0,254,186,0,0,0,4,0,3,43,65,3,0,80,0,0,0,1,93,65,3,0,127,0,4,0,1,93,65,3,0,140,0,4,0,1,93,186,0,1,0,4,0,0,17,18,57,65,3,0,57,0,1,0,1,93,65,3,0,11,0,1,0,1,93,65,3,0,89,0,1,0,1,93,65,3,0,71,0,1,0,1,93,65,3,0,133,0,1,0,1,93,184,0,1,16,185,0,2,0,4,244,184,0,0,16,185,0,7,0,4,244,186,0,3,0,2,0,7,17,18,57,65,3,0,89,0,3,0,1,93,65,3,0,137,0,3,0,1,93,184,0,4,16,185,0,5,0,4,244,186,0,6,0,7,0,2,17,18,57,65,3,0,119,0,6,0,1,93,65,3,0,134,0,6,0,1,93,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,8,62,89,186,0,3,0,5,0,1,17,18,57,186,0,6,0,1,0,5,17,18,57,65,5,0,115,0,6,0,131,0,6,0,2,93,184,0,5,16,184,0,7,208,48,49,9,1,35,19,3,51,27,1,1,242,254,212,100,113,204,100,153,138,1,234,253,36,1,8,1,212,254,148,1,108,0,0,0,1,0,22,0,0,1,190,1,234,0,7,1,238,186,0,2,0,6,0,3,43,65,3,0,32,0,2,0,1,93,65,3,0,128,0,2,0,1,93,65,3,0,0,0,2,0,1,93,65,3,0,16,0,2,0,1,113,65,3,0,64,0,2,0,1,93,184,0,2,16,184,0,0,208,65,3,0,70,0,0,0,1,113,65,3,0,207,0,6,0,1,93,65,3,0,95,0,6,0,1,93,65,3,0,175,0,6,0,1,93,65,3,0,127,0,6,0,1,93,65,3,0,32,0,6,0,1,93,65,3,0,64,0,6,0,1,93,184,0,6,16,184,0,4,208,65,3,0,10,0,4,0,1,113,65,3,0,73,0,4,0,1,113,65,3,0,249,0,4,0,1,93,184,0,1,208,65,5,0,19,0,1,0,35,0,1,0,2,113,65,3,0,4,0,1,0,1,113,65,5,0,229,0,1,0,245,0,1,0,2,93,65,7,0,38,0,1,0,54,0,1,0,70,0,1,0,3,93,65,3,0,214,0,1,0,1,93,65,3,0,153,0,1,0,1,93,65,5,0,54,0,1,0,70,0,1,0,2,113,65,3,0,101,0,1,0,1,113,65,3,0,84,0,1,0,1,113,65,5,0,84,0,1,0,100,0,1,0,2,93,65,3,0,113,0,1,0,1,93,65,3,0,128,0,1,0,1,93,184,0,0,16,184,0,5,208,65,3,0,233,0,5,0,1,93,65,3,0,10,0,5,0,1,113,65,3,0,202,0,5,0,1,93,65,3,0,107,0,5,0,1,93,65,3,0,92,0,5,0,1,93,65,3,0,30,0,5,0,1,113,65,3,0,143,0,5,0,1,93,65,3,0,124,0,5,0,1,93,65,3,0,44,0,5,0,1,113,65,3,0,91,0,5,0,1,113,65,3,0,106,0,5,0,1,113,65,5,0,57,0,5,0,73,0,5,0,2,113,65,7,0,41,0,5,0,57,0,5,0,73,0,5,0,3,93,65,3,0,150,0,5,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,2,0,1,244,184,0,7,16,185,0,6,0,1,244,48,49,9,1,33,21,33,1,35,53,1,190,254,251,1,0,254,93,1,5,251,1,234,254,92,70,1,164,70,0,0,1,0,19,255,121,1,41,2,238,0,53,0,163,184,0,0,47,184,0,8,220,184,0,0,16,184,0,16,208,184,0,0,16,184,0,50,220,184,0,20,208,184,0,0,16,184,0,45,220,65,7,0,159,0,45,0,175,0,45,0,191,0,45,0,3,93,184,0,30,208,184,0,8,16,184,0,35,208,0,184,0,51,47,184,0,0,69,88,184,0,19,47,27,185,0,19,0,18,62,89,186,0,35,0,19,0,51,17,18,57,25,184,0,35,47,24,184,0,8,208,184,0,19,16,184,0,20,220,184,0,51,16,184,0,50,220,48,49,1,65,3,0,134,0,22,0,1,93,65,3,0,133,0,48,0,1,93,0,65,3,0,136,0,22,0,1,93,65,3,0,134,0,48,0,1,93,55,52,62,2,53,52,38,39,62,1,53,52,46,2,53,52,54,55,21,14,3,21,20,30,2,21,20,14,2,7,30,3,21,20,14,2,21,20,30,2,23,21,46,1,83,2,3,3,32,40,38,34,3,3,2,97,117,53,57,26,5,1,1,1,7,18,32,26,26,33,18,6,1,1,1,8,29,56,48,115,99,14,7,40,46,42,10,54,69,25,26,69,54,10,42,45,40,7,71,75,4,69,1,20,40,64,46,5,24,27,24,6,18,31,27,26,15,14,25,25,28,16,5,25,29,28,7,54,64,36,14,3,69,4,73,0,1,0,70,255,47,0,159,2,238,0,3,0,54,184,0,1,47,65,5,0,0,0,1,0,16,0,1,0,2,93,184,0,0,220,65,3,0,128,0,0,0,1,93,0,184,0,1,47,184,0,0,69,88,184,0,2,47,27,185,0,2,0,18,62,89,48,49,23,35,17,51,159,89,89,209,3,191,0,0,0,1,0,2,255,121,1,24,2,238,0,53,0,171,184,0,38,47,184,0,0,208,184,0,38,16,184,0,35,220,184,0,4,208,184,0,38,16,184,0,29,220,65,7,0,144,0,29,0,160,0,29,0,176,0,29,0,3,93,184,0,9,208,184,0,38,16,184,0,46,220,184,0,19,208,0,184,0,3,47,184,0,0,69,88,184,0,35,47,27,185,0,35,0,18,62,89,184,0,3,16,184,0,4,220,186,0,19,0,35,0,3,17,18,57,25,184,0,19,47,24,184,0,35,16,184,0,34,220,184,0,19,16,184,0,46,208,48,49,1,65,5,0,136,0,6,0,152,0,6,0,2,93,0,65,3,0,149,0,6,0,1,93,65,3,0,134,0,6,0,1,93,65,5,0,138,0,31,0,154,0,31,0,2,93,55,20,6,7,53,62,3,53,52,46,2,53,52,62,2,55,46,3,53,52,62,2,53,52,46,2,39,53,30,1,21,20,14,2,21,20,22,23,14,1,21,20,30,2,216,99,115,54,58,25,4,1,1,1,7,18,32,26,26,32,18,7,1,1,1,8,29,56,48,117,97,3,3,2,34,38,40,32,2,3,3,14,72,73,4,69,1,20,42,64,44,7,27,29,25,6,17,28,24,25,14,15,26,27,31,18,6,24,27,24,5,54,64,36,14,3,69,4,75,71,7,40,45,42,10,54,69,26,25,69,54,10,42,46,40,0,1,0,54,0,179,1,144,1,26,0,23,0,156,184,0,8,47,184,0,7,220,184,0,8,16,184,0,21,220,184,0,20,220,0,184,0,0,47,184,0,13,220,65,9,0,47,0,13,0,63,0,13,0,79,0,13,0,95,0,13,0,4,93,184,0,5,220,65,3,0,128,0,5,0,1,114,184,0,0,16,184,0,7,208,184,0,7,47,184,0,0,16,184,0,18,220,65,3,0,112,0,18,0,1,114,65,3,0,64,0,18,0,1,113,184,0,13,16,184,0,20,208,184,0,20,47,48,49,1,65,5,0,41,0,10,0,57,0,10,0,2,93,65,5,0,38,0,22,0,54,0,22,0,2,93,0,65,5,0,38,0,10,0,54,0,10,0,2,93,37,34,46,2,35,34,7,39,62,3,51,50,30,2,51,50,55,23,14,1,1,37,12,34,44,32,10,53,18,36,6,22,28,32,15,13,36,46,32,13,42,27,34,11,58,179,16,19,16,49,9,22,34,23,11,15,19,15,51,9,43,51,0,2,0,50,255,6,0,174,1,244,0,3,0,7,0,168,187,0,5,0,4,0,4,0,4,43,65,5,0,0,0,4,0,16,0,4,0,2,93,184,0,4,16,184,0,0,208,65,13,0,9,0,0,0,25,0,0,0,41,0,0,0,57,0,0,0,73,0,0,0,89,0,0,0,6,113,65,5,0,0,0,5,0,16,0,5,0,2,93,184,0,5,16,184,0,3,208,65,13,0,6,0,3,0,22,0,3,0,38,0,3,0,54,0,3,0,70,0,3,0,86,0,3,0,6,113,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,8,62,89,184,0,4,16,184,0,7,220,65,3,0,48,0,7,0,1,113,184,0,1,220,48,49,23,19,51,19,3,51,21,35,50,30,64,30,104,84,84,250,2,38,253,218,2,238,86,0,0,1,0,34,255,225,1,170,2,236,0,36,1,110,186,0,18,0,7,0,3,43,65,5,0,63,0,7,0,79,0,7,0,2,93,65,3,0,143,0,7,0,1,93,65,3,0,32,0,18,0,1,113,65,3,0,208,0,18,0,1,93,65,3,0,0,0,18,0,1,93,186,0,1,0,7,0,18,17,18,57,184,0,1,47,65,3,0,0,0,1,0,1,93,185,0,0,0,4,244,184,0,1,16,184,0,13,208,184,0,0,16,184,0,14,208,184,0,7,16,185,0,27,0,4,244,184,0,18,16,184,0,33,208,0,184,0,0,47,184,0,0,69,88,184,0,13,47,27,185,0,13,0,18,62,89,65,3,0,16,0,13,0,1,93,65,5,0,96,0,13,0,112,0,13,0,2,93,65,5,0,48,0,13,0,64,0,13,0,2,93,186,0,36,0,13,0,0,17,18,57,184,0,36,47,65,3,0,79,0,36,0,1,113,65,7,0,159,0,36,0,175,0,36,0,191,0,36,0,3,93,65,3,0,96,0,36,0,1,93,184,0,2,208,184,0,36,16,184,0,15,220,65,3,0,160,0,15,0,1,93,184,0,12,208,184,0,15,16,184,0,19,220,185,0,18,0,2,244,184,0,15,16,185,0,22,0,2,244,184,0,36,16,185,0,30,0,2,244,184,0,36,16,184,0,32,220,185,0,33,0,2,244,48,49,1,65,3,0,9,0,5,0,1,93,65,3,0,9,0,10,0,1,93,65,3,0,69,0,24,0,1,93,65,3,0,69,0,29,0,1,93,0,65,3,0,8,0,5,0,1,93,65,3,0,6,0,10,0,1,93,65,3,0,72,0,29,0,1,93,5,35,55,46,3,53,52,62,2,55,39,51,7,30,1,23,7,46,1,35,34,14,2,21,20,22,51,50,55,23,14,1,7,1,63,90,17,46,78,56,32,28,54,79,51,17,90,16,43,57,23,8,30,62,32,41,61,41,21,88,78,61,61,8,17,48,57,31,120,6,42,66,89,54,49,89,69,46,7,142,140,3,15,14,78,16,17,29,50,67,38,82,100,32,78,11,18,3,0,0,0,1,0,34,0,0,1,224,2,202,0,37,1,125,186,0,37,0,29,0,3,43,65,3,0,16,0,37,0,1,93,184,0,37,16,184,0,0,208,65,3,0,139,0,0,0,1,93,65,3,0,143,0,29,0,1,93,65,3,0,16,0,29,0,1,93,184,0,29,16,185,0,8,0,4,244,186,0,10,0,37,0,29,17,18,57,184,0,10,47,184,0,8,16,184,0,12,208,184,0,17,208,65,5,0,101,0,17,0,117,0,17,0,2,93,65,7,0,53,0,17,0,69,0,17,0,85,0,17,0,3,113,65,3,0,53,0,17,0,1,93,65,3,0,132,0,17,0,1,93,184,0,37,16,184,0,18,208,184,0,18,47,184,0,29,16,184,0,25,208,184,0,20,208,184,0,29,16,184,0,26,208,184,0,26,47,0,184,0,0,69,88,184,0,34,47,27,185,0,34,0,14,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,6,62,89,184,0,34,16,184,0,0,220,184,0,34,16,185,0,3,0,2,244,186,0,9,0,34,0,19,17,18,57,184,0,9,47,65,3,0,15,0,9,0,1,93,185,0,12,0,2,244,184,0,19,16,185,0,18,0,2,244,184,0,12,16,184,0,25,208,184,0,9,16,184,0,28,208,48,49,1,65,3,0,8,0,31,0,1,93,65,3,0,26,0,31,0,1,93,65,3,0,9,0,32,0,1,93,65,5,0,37,0,36,0,53,0,36,0,2,93,65,3,0,70,0,36,0,1,93,0,65,5,0,7,0,31,0,23,0,31,0,2,93,65,5,0,6,0,32,0,22,0,32,0,2,93,65,5,0,54,0,36,0,70,0,36,0,2,93,65,3,0,39,0,36,0,1,93,1,46,1,35,34,14,2,29,1,51,7,35,14,3,7,33,21,33,62,3,55,35,55,51,53,52,62,2,51,50,22,23,1,160,14,45,27,31,35,18,4,192,15,183,3,5,10,17,13,1,5,254,97,25,36,24,16,5,95,14,87,13,38,69,55,69,76,14,2,57,29,27,16,34,51,36,93,86,38,54,49,49,33,86,35,68,73,83,50,86,115,40,73,57,34,49,37,0,2,0,61,0,29,2,53,2,155,0,27,0,46,1,77,184,0,11,47,65,7,0,0,0,11,0,16,0,11,0,32,0,11,0,3,93,184,0,25,220,184,0,11,16,185,0,35,0,4,244,184,0,25,16,185,0,45,0,4,244,0,184,0,4,47,184,0,18,220,185,0,30,0,3,244,184,0,4,16,185,0,40,0,3,244,48,49,1,65,5,0,10,0,1,0,26,0,1,0,2,113,65,5,0,73,0,6,0,89,0,6,0,2,93,65,5,0,73,0,16,0,89,0,16,0,2,93,65,5,0,10,0,21,0,26,0,21,0,2,113,65,5,0,40,0,28,0,56,0,28,0,2,93,65,3,0,137,0,28,0,1,93,65,3,0,134,0,32,0,1,93,65,5,0,39,0,32,0,55,0,32,0,2,93,65,5,0,38,0,38,0,54,0,38,0,2,93,65,3,0,135,0,38,0,1,93,65,3,0,136,0,42,0,1,93,65,5,0,41,0,42,0,57,0,42,0,2,93,65,3,0,136,0,43,0,1,93,0,65,5,0,71,0,6,0,87,0,6,0,2,93,65,3,0,229,0,15,0,1,93,65,5,0,72,0,16,0,88,0,16,0,2,93,65,3,0,229,0,21,0,1,93,65,5,0,40,0,32,0,56,0,32,0,2,93,65,3,0,137,0,32,0,1,93,65,5,0,39,0,38,0,55,0,38,0,2,93,65,3,0,135,0,38,0,1,93,65,5,0,38,0,42,0,54,0,42,0,2,93,65,3,0,134,0,42,0,1,93,37,7,39,6,35,34,39,7,39,55,38,53,52,55,39,55,23,54,51,50,23,55,23,7,22,21,20,7,3,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,2,52,29,79,70,73,74,69,79,28,77,79,80,78,28,78,76,68,71,72,80,28,78,79,80,53,42,77,39,60,41,22,22,41,60,39,39,60,41,22,53,24,103,38,38,103,24,102,82,111,110,83,102,24,103,38,39,104,24,103,82,110,108,86,1,76,54,29,51,70,42,42,71,51,28,29,52,70,41,85,0,0,0,0,1,0,30,0,0,2,134,2,188,0,22,1,100,187,0,9,0,4,0,10,0,4,43,65,3,0,0,0,9,0,1,93,184,0,9,16,184,0,5,208,184,0,1,208,184,0,0,208,65,3,0,40,0,0,0,1,93,65,3,0,23,0,0,0,1,93,65,3,0,86,0,0,0,1,93,184,0,5,16,184,0,6,208,184,0,6,47,184,0,2,208,184,0,2,47,65,3,0,0,0,10,0,1,93,184,0,10,16,184,0,14,208,184,0,12,208,184,0,12,47,184,0,16,208,184,0,16,47,184,0,14,16,184,0,18,208,184,0,19,208,65,3,0,89,0,19,0,1,93,65,3,0,24,0,19,0,1,93,65,3,0,39,0,19,0,1,93,185,0,20,0,4,244,186,0,21,0,18,0,1,17,18,57,184,0,0,16,185,0,22,0,4,244,0,184,0,0,69,88,184,0,20,47,27,185,0,20,0,14,62,89,184,0,0,69,88,184,0,10,47,27,185,0,10,0,6,62,89,186,0,17,0,20,0,10,17,18,57,184,0,17,47,184,0,1,208,184,0,17,16,184,0,16,220,184,0,4,208,184,0,17,16,184,0,13,220,65,5,0,32,0,13,0,48,0,13,0,2,93,184,0,5,208,184,0,13,16,184,0,12,220,184,0,8,208,186,0,21,0,20,0,10,17,18,57,65,3,0,102,0,21,0,1,93,65,3,0,41,0,21,0,1,93,65,3,0,54,0,21,0,1,93,65,3,0,131,0,21,0,1,93,184,0,20,16,184,0,22,208,48,49,65,3,0,134,0,21,0,1,93,65,3,0,9,0,21,0,1,93,9,1,51,7,35,21,51,7,35,21,35,53,35,55,51,53,35,55,51,1,51,27,1,2,134,254,253,177,21,157,178,21,157,96,178,21,157,178,21,156,254,253,93,215,215,2,188,254,128,54,62,54,146,146,54,62,54,1,128,254,205,1,51,0,0,0,0,2,0,72,255,46,0,160,2,238,0,3,0,7,0,78,184,0,6,47,65,5,0,0,0,6,0,16,0,6,0,2,93,184,0,7,220,65,3,0,128,0,7,0,1,93,184,0,0,208,184,0,6,16,184,0,1,208,0,184,0,5,47,184,0,0,69,88,184,0,2,47,27,185,0,2,0,18,62,89,184,0,1,220,184,0,5,16,184,0,6,220,48,49,19,35,17,51,17,35,17,51,160,88,88,88,88,1,52,1,186,252,64,1,117,0,0,2,0,37,255,172,1,163,2,238,0,52,0,64,3,51,186,0,51,0,26,0,3,43,65,3,0,0,0,51,0,1,93,65,3,0,143,0,26,0,1,93,65,3,0,0,0,26,0,1,93,186,0,5,0,51,0,26,17,18,57,184,0,5,47,184,0,26,16,185,0,58,0,5,244,186,0,0,0,5,0,58,17,18,57,186,0,13,0,26,0,51,17,18,57,184,0,13,47,184,0,5,16,185,0,19,0,5,244,186,0,31,0,26,0,51,17,18,57,184,0,31,47,184,0,51,16,185,0,63,0,5,244,186,0,28,0,31,0,63,17,18,57,65,3,0,25,0,28,0,1,93,65,7,0,53,0,28,0,69,0,28,0,85,0,28,0,3,93,65,3,0,116,0,28,0,1,93,186,0,38,0,51,0,26,17,18,57,184,0,38,47,184,0,31,16,185,0,44,0,5,244,186,0,53,0,63,0,31,17,18,57,186,0,60,0,58,0,5,17,18,57,0,184,0,10,47,184,0,0,69,88,184,0,36,47,27,185,0,36,0,18,62,89,186,0,60,0,10,0,36,17,18,57,184,0,60,47,184,0,22,208,65,5,0,121,0,22,0,137,0,22,0,2,93,65,3,0,72,0,22,0,1,93,186,0,0,0,60,0,22,17,18,57,184,0,10,16,184,0,14,220,184,0,10,16,185,0,16,0,3,244,186,0,53,0,36,0,10,17,18,57,184,0,53,47,184,0,47,208,65,5,0,118,0,47,0,134,0,47,0,2,93,65,3,0,22,0,47,0,1,93,65,3,0,69,0,47,0,1,93,186,0,28,0,47,0,53,17,18,57,184,0,36,16,184,0,39,220,184,0,36,16,185,0,41,0,3,244,48,49,1,65,3,0,21,0,7,0,1,93,65,3,0,38,0,7,0,1,93,65,3,0,104,0,13,0,1,93,65,3,0,72,0,23,0,1,93,65,3,0,25,0,24,0,1,93,65,3,0,73,0,24,0,1,93,65,7,0,105,0,24,0,121,0,24,0,137,0,24,0,3,93,65,3,0,73,0,25,0,1,93,65,3,0,26,0,25,0,1,93,65,3,0,139,0,27,0,1,93,65,3,0,40,0,34,0,1,93,65,3,0,25,0,34,0,1,93,65,3,0,133,0,46,0,1,93,65,5,0,103,0,48,0,119,0,48,0,2,93,65,3,0,21,0,49,0,1,93,65,5,0,118,0,49,0,134,0,49,0,2,93,65,3,0,71,0,49,0,1,93,65,3,0,103,0,49,0,1,93,65,3,0,85,0,59,0,1,93,0,65,5,0,24,0,7,0,40,0,7,0,2,93,65,5,0,121,0,12,0,137,0,12,0,2,93,65,3,0,122,0,13,0,1,93,65,3,0,107,0,13,0,1,93,65,3,0,73,0,23,0,1,93,65,3,0,25,0,24,0,1,93,65,3,0,73,0,24,0,1,93,65,5,0,105,0,24,0,121,0,24,0,2,93,65,3,0,138,0,24,0,1,93,65,3,0,133,0,27,0,1,93,65,3,0,20,0,34,0,1,93,65,3,0,37,0,34,0,1,93,65,3,0,101,0,38,0,1,93,65,3,0,133,0,38,0,1,93,65,3,0,118,0,38,0,1,93,65,3,0,135,0,46,0,1,93,65,3,0,117,0,48,0,1,93,65,3,0,102,0,48,0,1,93,65,3,0,116,0,49,0,1,93,65,3,0,21,0,49,0,1,93,65,3,0,70,0,49,0,1,93,65,3,0,102,0,49,0,1,93,65,3,0,134,0,49,0,1,93,65,3,0,83,0,59,0,1,93,65,3,0,37,0,59,0,1,93,65,3,0,41,0,64,0,1,93,65,3,0,91,0,64,0,1,93,37,30,3,21,20,14,2,35,34,38,39,55,22,51,50,54,53,52,46,4,53,52,55,46,1,53,52,62,2,51,50,23,7,38,35,34,6,21,20,30,4,21,20,39,14,3,21,20,23,62,1,53,52,1,59,21,23,12,3,20,41,64,43,43,80,20,13,68,63,48,55,40,61,71,61,40,109,39,25,19,41,62,43,86,61,13,68,62,45,52,39,59,69,59,39,215,14,35,30,20,162,36,42,188,16,26,27,30,20,30,56,42,25,22,17,63,41,41,42,35,39,24,21,37,61,53,116,33,28,51,29,35,60,43,25,40,63,43,50,36,31,37,26,25,40,63,51,99,206,1,11,23,36,25,81,42,10,58,37,81,0,0,2,0,87,2,88,1,79,2,188,0,3,0,7,0,70,184,0,5,47,65,3,0,0,0,5,0,1,93,184,0,1,220,184,0,0,220,184,0,5,16,184,0,4,220,0,184,0,5,47,65,3,0,32,0,5,0,1,93,65,3,0,64,0,5,0,1,93,184,0,1,208,184,0,5,16,184,0,6,220,184,0,2,208,48,49,1,35,53,51,7,35,53,51,1,79,70,70,178,70,70,2,88,100,100,100,0,0,0,3,0,49,0,37,2,158,2,181,0,19,0,39,0,65,3,127,184,0,0,47,184,0,10,220,65,3,0,239,0,10,0,1,93,65,3,0,111,0,10,0,1,93,65,3,0,80,0,10,0,1,93,184,0,0,16,184,0,25,220,184,0,10,16,184,0,35,220,186,0,45,0,0,0,10,17,18,57,184,0,45,47,184,0,52,220,184,0,45,16,184,0,58,220,184,0,52,16,184,0,64,208,0,184,0,5,47,184,0,15,220,184,0,5,16,184,0,20,220,184,0,15,16,184,0,30,220,186,0,40,0,5,0,15,17,18,57,184,0,40,47,65,3,0,15,0,40,0,1,93,65,3,0,111,0,40,0,1,93,184,0,50,220,65,3,0,32,0,50,0,1,93,65,3,0,0,0,50,0,1,93,184,0,53,220,184,0,50,16,184,0,55,220,65,3,0,15,0,55,0,1,113,184,0,40,16,184,0,61,220,184,0,40,16,184,0,63,220,48,49,1,65,5,0,9,0,2,0,25,0,2,0,2,93,65,3,0,41,0,2,0,1,113,65,5,0,106,0,2,0,122,0,2,0,2,93,65,5,0,8,0,3,0,24,0,3,0,2,93,65,3,0,183,0,6,0,1,93,65,3,0,37,0,7,0,1,113,65,5,0,7,0,7,0,23,0,7,0,2,93,65,5,0,101,0,8,0,117,0,8,0,2,93,65,5,0,6,0,8,0,22,0,8,0,2,93,65,5,0,7,0,12,0,23,0,12,0,2,93,65,5,0,6,0,13,0,22,0,13,0,2,93,65,5,0,103,0,13,0,119,0,13,0,2,93,65,3,0,39,0,13,0,1,113,65,5,0,9,0,17,0,25,0,17,0,2,93,65,5,0,106,0,17,0,122,0,17,0,2,93,65,3,0,42,0,17,0,1,113,65,5,0,10,0,18,0,26,0,18,0,2,93,65,9,0,169,0,42,0,185,0,42,0,201,0,42,0,217,0,42,0,4,93,65,9,0,169,0,43,0,185,0,43,0,201,0,43,0,217,0,43,0,4,93,65,3,0,42,0,43,0,1,93,65,9,0,169,0,47,0,185,0,47,0,201,0,47,0,217,0,47,0,4,93,65,3,0,42,0,47,0,1,93,65,9,0,169,0,48,0,185,0,48,0,201,0,48,0,217,0,48,0,4,93,65,9,0,167,0,52,0,183,0,52,0,199,0,52,0,215,0,52,0,4,93,0,65,5,0,6,0,2,0,22,0,2,0,2,93,65,5,0,102,0,2,0,118,0,2,0,2,93,65,3,0,38,0,2,0,1,113,65,5,0,6,0,3,0,22,0,3,0,2,93,65,3,0,182,0,6,0,1,93,65,5,0,7,0,7,0,23,0,7,0,2,93,65,3,0,39,0,7,0,1,113,65,5,0,6,0,8,0,22,0,8,0,2,93,65,5,0,103,0,8,0,119,0,8,0,2,93,65,5,0,8,0,12,0,24,0,12,0,2,93,65,3,0,41,0,13,0,1,113,65,5,0,10,0,13,0,26,0,13,0,2,93,65,5,0,106,0,13,0,122,0,13,0,2,93,65,5,0,9,0,17,0,25,0,17,0,2,93,65,5,0,105,0,17,0,121,0,17,0,2,93,65,3,0,42,0,17,0,1,113,65,5,0,8,0,18,0,24,0,18,0,2,93,65,9,0,168,0,42,0,184,0,42,0,200,0,42,0,216,0,42,0,4,93,65,3,0,40,0,43,0,1,93,65,9,0,169,0,43,0,185,0,43,0,201,0,43,0,217,0,43,0,4,93,65,3,0,38,0,47,0,1,93,65,9,0,167,0,47,0,183,0,47,0,199,0,47,0,215,0,47,0,4,93,65,9,0,165,0,48,0,181,0,48,0,197,0,48,0,213,0,48,0,4,93,65,9,0,165,0,51,0,181,0,51,0,197,0,51,0,213,0,51,0,4,93,65,9,0,165,0,52,0,181,0,52,0,197,0,52,0,213,0,52,0,4,93,65,9,0,172,0,64,0,188,0,64,0,204,0,64,0,220,0,64,0,4,93,19,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,1,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,3,34,46,2,53,52,62,2,51,50,23,7,38,35,34,6,21,20,22,51,50,55,23,6,49,46,83,114,68,68,114,82,46,46,82,114,68,68,115,82,46,1,55,63,96,66,34,33,66,97,63,63,96,66,33,34,65,96,54,35,58,42,23,23,42,58,35,48,42,7,45,38,45,46,46,45,37,46,7,38,1,109,74,121,86,47,47,87,121,73,73,120,87,48,48,86,121,1,100,41,75,104,63,63,104,75,41,42,75,104,62,62,104,75,42,254,61,24,43,61,38,38,62,43,24,19,60,19,59,48,48,59,20,59,20,0,2,0,33,1,178,1,57,2,213,0,27,0,35,1,120,184,0,9,47,65,3,0,96,0,9,0,1,93,184,0,24,220,65,3,0,159,0,24,0,1,93,184,0,0,208,184,0,0,47,184,0,24,16,185,0,29,0,5,244,184,0,4,208,184,0,29,16,184,0,14,208,186,0,19,0,24,0,9,17,18,57,184,0,19,47,184,0,9,16,185,0,32,0,5,244,0,184,0,21,47,184,0,6,220,65,3,0,96,0,6,0,1,93,65,3,0,48,0,6,0,1,93,65,3,0,208,0,6,0,1,93,184,0,2,208,186,0,14,0,21,0,6,17,18,57,184,0,14,47,184,0,21,16,185,0,16,0,3,244,184,0,21,16,184,0,18,220,184,0,6,16,185,0,34,0,3,244,184,0,27,208,184,0,14,16,184,0,29,220,48,49,1,65,3,0,151,0,7,0,1,93,65,3,0,183,0,7,0,1,93,65,3,0,217,0,7,0,1,93,65,13,0,59,0,8,0,75,0,8,0,91,0,8,0,107,0,8,0,123,0,8,0,139,0,8,0,6,93,65,3,0,40,0,11,0,1,93,65,3,0,34,0,22,0,1,93,65,13,0,53,0,22,0,69,0,22,0,85,0,22,0,101,0,22,0,117,0,22,0,133,0,22,0,6,93,65,3,0,151,0,22,0,1,93,0,65,7,0,170,0,7,0,186,0,7,0,202,0,7,0,3,93,65,3,0,155,0,7,0,1,93,65,3,0,220,0,7,0,1,93,65,3,0,38,0,11,0,1,93,65,3,0,36,0,22,0,1,93,65,15,0,53,0,22,0,69,0,22,0,85,0,22,0,101,0,22,0,117,0,22,0,133,0,22,0,149,0,22,0,7,93,1,7,35,34,39,6,35,34,38,53,52,62,2,55,38,35,34,7,39,54,51,50,29,1,20,22,51,39,53,14,1,21,20,51,50,1,57,7,27,48,19,31,61,37,50,35,52,58,23,2,51,32,51,6,54,55,109,9,17,101,35,55,40,27,1,239,61,31,31,46,39,29,38,23,10,1,42,20,60,23,108,80,30,12,12,63,1,25,22,32,0,0,0,2,0,15,0,78,2,11,1,234,0,5,0,11,0,156,184,0,8,47,65,3,0,31,0,8,0,1,93,65,3,0,143,0,8,0,1,93,184,0,2,220,184,0,4,220,184,0,0,208,185,0,1,0,4,244,184,0,3,208,184,0,2,16,185,0,5,0,4,244,184,0,8,16,184,0,10,220,184,0,6,208,184,0,10,16,185,0,9,0,4,244,184,0,7,208,184,0,8,16,185,0,11,0,4,244,65,3,0,47,0,13,0,1,93,0,25,184,0,8,47,24,184,0,7,208,184,0,7,47,184,0,1,208,184,0,8,16,184,0,11,208,184,0,2,208,184,0,8,16,184,0,9,208,184,0,9,47,184,0,3,208,184,0,2,16,184,0,5,208,48,49,37,35,39,55,51,15,1,35,39,55,51,7,2,11,101,147,147,101,148,113,100,147,147,100,147,78,206,206,206,206,206,206,206,0,0,0,0,1,0,66,0,151,2,14,1,150,0,5,0,66,184,0,0,47,65,3,0,0,0,0,0,1,93,65,3,0,208,0,0,0,1,93,184,0,1,220,65,7,0,0,0,1,0,16,0,1,0,32,0,1,0,3,113,184,0,0,16,184,0,3,220,0,184,0,3,47,184,0,4,220,184,0,1,220,48,49,37,35,53,33,53,33,2,14,55,254,107,1,204,151,195,60,0,1,0,57,0,230,1,111,1,68,0,3,0,72,184,0,1,47,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,48,0,1,0,1,113,184,0,0,220,65,3,0,96,0,0,0,1,93,0,184,0,1,47,184,0,2,220,65,3,0,32,0,2,0,1,113,65,5,0,112,0,2,0,128,0,2,0,2,93,48,49,37,33,53,33,1,111,254,202,1,54,230,94,0,0,0,4,0,49,0,37,2,158,2,181,0,19,0,39,0,52,0,60,2,254,184,0,0,47,184,0,10,220,65,3,0,239,0,10,0,1,93,65,3,0,111,0,10,0,1,93,65,3,0,80,0,10,0,1,93,184,0,0,16,184,0,25,220,65,3,0,79,0,25,0,1,113,184,0,10,16,184,0,35,220,65,3,0,64,0,35,0,1,113,186,0,45,0,0,0,10,17,18,57,184,0,45,47,65,3,0,64,0,45,0,1,93,184,0,50,220,184,0,45,16,184,0,44,220,65,5,0,239,0,44,0,255,0,44,0,2,93,186,0,52,0,50,0,44,17,18,57,65,5,0,69,0,52,0,85,0,52,0,2,93,65,3,0,100,0,52,0,1,93,184,0,52,16,184,0,40,208,65,5,0,233,0,40,0,249,0,40,0,2,93,184,0,52,16,184,0,42,208,184,0,41,208,184,0,44,16,184,0,55,208,184,0,50,16,184,0,58,220,0,184,0,5,47,184,0,15,220,184,0,5,16,184,0,20,220,184,0,15,16,184,0,30,220,186,0,45,0,5,0,15,17,18,57,184,0,45,47,184,0,41,208,184,0,45,16,184,0,46,220,65,3,0,32,0,46,0,1,93,65,3,0,0,0,46,0,1,93,186,0,43,0,46,0,45,17,18,57,184,0,43,47,186,0,52,0,46,0,43,17,18,57,65,3,0,88,0,52,0,1,93,184,0,46,16,184,0,54,220,184,0,43,16,184,0,55,220,48,49,1,65,5,0,9,0,2,0,25,0,2,0,2,93,65,5,0,106,0,2,0,122,0,2,0,2,93,65,5,0,9,0,3,0,25,0,3,0,2,93,65,3,0,41,0,3,0,1,113,65,5,0,6,0,7,0,22,0,7,0,2,93,65,3,0,38,0,7,0,1,113,65,5,0,6,0,8,0,22,0,8,0,2,93,65,5,0,102,0,8,0,118,0,8,0,2,93,65,3,0,35,0,12,0,1,113,65,5,0,6,0,12,0,22,0,12,0,2,93,65,5,0,102,0,12,0,118,0,12,0,2,93,65,5,0,7,0,13,0,23,0,13,0,2,93,65,5,0,103,0,13,0,119,0,13,0,2,93,65,5,0,8,0,17,0,24,0,17,0,2,93,65,5,0,9,0,18,0,25,0,18,0,2,93,65,3,0,41,0,18,0,1,113,65,5,0,25,0,40,0,41,0,40,0,2,113,65,3,0,90,0,40,0,1,113,0,65,5,0,102,0,2,0,118,0,2,0,2,93,65,5,0,7,0,2,0,23,0,2,0,2,93,65,3,0,39,0,2,0,1,113,65,5,0,6,0,3,0,22,0,3,0,2,93,65,3,0,38,0,3,0,1,113,65,3,0,37,0,7,0,1,113,65,3,0,182,0,7,0,1,93,65,5,0,7,0,7,0,23,0,7,0,2,93,65,5,0,102,0,8,0,118,0,8,0,2,93,65,5,0,7,0,8,0,23,0,8,0,2,93,65,5,0,8,0,12,0,24,0,12,0,2,93,65,5,0,104,0,12,0,120,0,12,0,2,93,65,3,0,40,0,12,0,1,113,65,5,0,9,0,13,0,25,0,13,0,2,93,65,5,0,105,0,13,0,121,0,13,0,2,93,65,5,0,8,0,17,0,24,0,17,0,2,93,65,5,0,106,0,17,0,122,0,17,0,2,93,65,5,0,8,0,18,0,24,0,18,0,2,93,65,3,0,24,0,40,0,1,113,65,3,0,41,0,40,0,1,113,19,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,1,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,19,35,39,35,21,35,17,51,50,22,21,20,7,39,35,21,51,50,53,52,38,49,46,83,114,68,68,114,82,46,46,82,114,68,68,115,82,46,1,55,63,97,66,34,33,66,97,64,63,97,65,34,34,66,96,66,63,65,55,62,118,54,56,54,70,42,40,61,26,1,109,74,121,86,47,47,87,121,73,73,120,87,48,48,86,121,1,101,42,75,105,62,62,105,76,41,41,76,105,62,62,105,75,42,254,73,117,117,1,65,45,55,51,36,138,99,50,24,25,0,0,0,0,2,0,34,1,226,1,43,2,243,0,16,0,34,1,110,184,0,5,47,65,3,0,246,0,2,0,1,93,184,0,15,220,65,3,0,79,0,15,0,1,93,65,3,0,15,0,15,0,1,93,184,0,5,16,184,0,22,220,65,3,0,143,0,22,0,1,113,65,5,0,239,0,22,0,255,0,22,0,2,114,184,0,15,16,184,0,30,220,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,18,62,89,184,0,2,220,65,3,0,255,0,2,0,1,93,65,3,0,0,0,2,0,1,93,184,0,10,16,184,0,17,220,184,0,2,16,184,0,25,220,48,49,1,65,7,0,21,0,0,0,37,0,0,0,53,0,0,0,3,93,65,3,0,6,0,0,0,1,93,65,7,0,26,0,4,0,42,0,4,0,58,0,4,0,3,93,65,3,0,11,0,4,0,1,93,65,7,0,25,0,7,0,41,0,7,0,57,0,7,0,3,93,65,3,0,10,0,7,0,1,93,65,7,0,24,0,8,0,40,0,8,0,56,0,8,0,3,93,65,7,0,22,0,12,0,38,0,12,0,54,0,12,0,3,93,65,3,0,7,0,12,0,1,93,65,3,0,6,0,13,0,1,93,0,65,9,0,9,0,0,0,25,0,0,0,41,0,0,0,57,0,0,0,4,93,65,9,0,9,0,3,0,25,0,3,0,41,0,3,0,57,0,3,0,4,93,65,3,0,6,0,7,0,1,93,65,7,0,23,0,8,0,39,0,8,0,55,0,8,0,3,93,65,7,0,22,0,12,0,38,0,12,0,54,0,12,0,3,93,65,3,0,7,0,12,0,1,93,65,3,0,7,0,13,0,1,93,1,6,35,34,38,53,52,62,2,51,50,30,2,21,20,39,34,14,2,21,20,22,51,50,62,2,53,52,46,2,1,7,36,61,63,69,18,35,49,30,30,50,34,19,133,21,32,23,12,49,44,21,30,21,10,11,22,32,2,8,38,77,59,30,50,36,21,21,37,50,29,59,170,18,30,41,22,48,62,19,31,36,24,22,40,31,18,0,0,0,0,2,0,64,0,42,1,178,2,20,0,11,0,15,0,121,184,0,4,47,65,3,0,0,0,4,0,1,93,184,0,1,220,65,3,0,239,0,1,0,1,93,184,0,0,220,184,0,4,16,184,0,5,220,184,0,4,16,184,0,7,208,184,0,1,16,184,0,10,208,184,0,5,16,184,0,14,208,184,0,0,16,184,0,15,208,0,184,0,13,47,184,0,5,220,184,0,1,208,184,0,5,16,184,0,3,220,184,0,5,16,184,0,6,220,184,0,8,220,184,0,6,16,184,0,10,208,184,0,13,16,184,0,14,220,48,49,1,35,21,35,53,35,53,51,53,51,21,51,17,33,53,33,1,178,153,64,153,153,64,153,254,142,1,114,1,71,144,144,67,138,138,254,160,67,0,0,1,0,25,1,64,1,17,2,194,0,23,1,117,186,0,20,0,12,0,3,43,65,3,0,80,0,12,0,1,93,184,0,12,16,184,0,1,208,65,3,0,80,0,20,0,1,93,65,3,0,32,0,20,0,1,93,184,0,20,16,185,0,6,0,5,244,184,0,1,16,184,0,22,208,65,3,0,102,0,22,0,1,93,65,3,0,38,0,22,0,1,93,65,7,0,21,0,22,0,37,0,22,0,53,0,22,0,3,113,184,0,20,16,184,0,23,208,184,0,23,47,0,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,185,0,23,0,1,244,184,0,2,208,184,0,15,16,185,0,9,0,3,244,184,0,15,16,184,0,11,220,65,3,0,239,0,11,0,1,93,184,0,12,220,48,49,1,65,3,0,136,0,3,0,1,93,65,11,0,72,0,13,0,88,0,13,0,104,0,13,0,120,0,13,0,136,0,13,0,5,93,65,11,0,55,0,17,0,71,0,17,0,87,0,17,0,103,0,17,0,119,0,17,0,5,93,65,11,0,54,0,18,0,70,0,18,0,86,0,18,0,102,0,18,0,118,0,18,0,5,93,65,7,0,150,0,22,0,166,0,22,0,182,0,22,0,3,93,0,65,3,0,135,0,3,0,1,93,65,11,0,70,0,13,0,86,0,13,0,102,0,13,0,118,0,13,0,134,0,13,0,5,93,65,11,0,55,0,17,0,71,0,17,0,87,0,17,0,103,0,17,0,119,0,17,0,5,93,65,11,0,55,0,18,0,71,0,18,0,87,0,18,0,103,0,18,0,119,0,18,0,5,93,1,35,62,3,53,52,38,35,34,7,39,62,1,51,50,30,2,21,20,7,51,1,17,248,57,66,33,8,30,27,51,42,9,11,61,45,30,42,27,13,106,120,1,64,77,97,60,30,9,25,28,59,65,19,35,16,28,37,21,68,146,0,1,0,19,1,56,1,21,2,194,0,38,1,205,186,0,34,0,5,0,3,43,65,3,0,159,0,5,0,1,93,65,3,0,111,0,5,0,1,93,65,3,0,95,0,5,0,1,113,65,3,0,240,0,5,0,1,93,65,3,0,32,0,5,0,1,113,65,5,0,16,0,34,0,32,0,34,0,2,93,65,3,0,159,0,34,0,1,93,65,3,0,240,0,34,0,1,93,65,3,0,80,0,34,0,1,93,65,3,0,32,0,34,0,1,113,184,0,34,16,185,0,10,0,5,244,186,0,14,0,5,0,34,17,18,57,184,0,14,47,65,3,0,15,0,14,0,1,93,186,0,30,0,34,0,5,17,18,57,184,0,30,47,185,0,18,0,5,244,186,0,23,0,5,0,34,17,18,57,184,0,23,47,186,0,32,0,14,0,30,17,18,57,65,7,0,38,0,32,0,54,0,32,0,70,0,32,0,3,93,65,5,0,85,0,32,0,101,0,32,0,2,93,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,6,220,65,5,0,112,0,6,0,128,0,6,0,2,93,184,0,0,16,185,0,8,0,1,244,186,0,16,0,25,0,0,17,18,57,184,0,16,47,65,3,0,31,0,16,0,1,93,185,0,13,0,3,244,184,0,25,16,185,0,20,0,3,244,184,0,25,16,184,0,22,220,186,0,32,0,16,0,13,17,18,57,48,49,1,65,3,0,38,0,27,0,1,93,65,3,0,70,0,27,0,1,93,65,3,0,55,0,27,0,1,93,65,3,0,87,0,27,0,1,93,65,3,0,104,0,27,0,1,93,65,3,0,38,0,37,0,1,93,65,3,0,71,0,37,0,1,93,0,65,3,0,101,0,27,0,1,93,65,9,0,38,0,27,0,54,0,27,0,70,0,27,0,86,0,27,0,4,93,65,3,0,118,0,27,0,1,93,65,3,0,41,0,37,0,1,93,65,3,0,73,0,37,0,1,93,65,3,0,58,0,37,0,1,93,19,34,46,2,39,55,22,51,50,53,52,38,43,1,55,51,50,53,52,35,34,7,39,54,51,50,30,2,21,20,7,22,21,20,14,2,128,17,35,30,23,4,18,32,56,78,31,43,52,6,27,77,60,49,22,11,26,65,36,48,29,13,39,54,24,41,54,1,56,6,9,10,5,66,26,52,30,34,55,48,44,17,53,25,18,28,36,19,53,22,32,61,30,46,32,17,0,0,1,0,58,2,84,0,245,2,220,0,3,0,105,184,0,2,47,65,3,0,0,0,2,0,1,93,184,0,0,220,0,184,0,1,47,65,3,0,64,0,1,0,1,93,65,3,0,32,0,1,0,1,93,65,3,0,16,0,1,0,1,113,184,0,3,220,65,5,0,15,0,3,0,31,0,3,0,2,93,184,0,0,220,65,11,0,89,0,0,0,105,0,0,0,121,0,0,0,137,0,0,0,153,0,0,0,5,93,184,0,1,16,184,0,2,220,48,49,19,7,53,55,245,187,187,2,148,64,41,95,0,0,1,0,73,255,14,2,44,1,234,0,27,0,252,186,0,23,0,13,0,3,43,65,3,0,143,0,23,0,1,93,65,3,0,0,0,23,0,1,93,65,3,0,32,0,23,0,1,93,184,0,23,16,185,0,22,0,4,244,186,0,4,0,22,0,23,17,18,57,65,3,0,143,0,13,0,1,93,65,3,0,0,0,13,0,1,93,65,3,0,32,0,13,0,1,93,184,0,13,16,185,0,14,0,4,244,184,0,10,208,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,12,62,89,184,0,0,69,88,184,0,7,47,27,185,0,7,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,0,69,88,184,0,12,47,27,185,0,12,0,8,62,89,184,0,1,16,185,0,0,0,1,244,184,0,14,16,184,0,22,208,186,0,4,0,7,0,22,17,18,57,186,0,10,0,14,0,7,17,18,57,65,5,0,122,0,10,0,138,0,10,0,2,93,184,0,7,16,185,0,18,0,2,244,48,49,1,65,5,0,85,0,17,0,101,0,17,0,2,93,0,65,3,0,88,0,17,0,1,93,37,7,35,34,39,14,1,35,34,38,39,17,35,17,51,17,20,22,51,50,54,55,17,51,17,20,22,51,2,44,16,26,79,28,33,57,44,32,47,33,88,89,53,69,38,50,28,87,19,28,62,72,73,38,36,15,23,254,243,2,220,254,254,84,79,26,32,1,107,254,192,57,51,0,0,1,0,33,0,0,2,68,2,188,0,19,0,140,184,0,7,47,65,5,0,0,0,7,0,16,0,7,0,2,93,184,0,3,220,65,5,0,15,0,3,0,31,0,3,0,2,93,184,0,2,220,184,0,0,220,184,0,7,16,184,0,6,220,184,0,7,16,184,0,13,220,65,5,0,15,0,13,0,31,0,13,0,2,93,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,19,16,184,0,0,220,184,0,6,16,184,0,3,208,184,0,0,16,184,0,4,208,184,0,19,16,184,0,8,220,48,49,1,35,17,35,17,35,17,35,53,46,3,53,52,62,2,51,33,2,68,75,48,101,41,70,105,71,36,38,73,108,69,1,3,2,121,253,135,2,121,253,135,243,4,40,63,80,44,45,82,62,37,0,0,0,0,1,0,57,0,213,0,181,1,87,0,3,0,76,184,0,1,47,65,5,0,32,0,1,0,48,0,1,0,2,113,65,5,0,0,0,1,0,16,0,1,0,2,93,184,0,0,220,65,3,0,191,0,0,0,1,93,65,3,0,63,0,0,0,1,93,65,5,0,47,0,0,0,63,0,0,0,2,113,0,184,0,1,47,184,0,2,220,48,49,55,35,53,51,181,124,124,213,130,0,0,1,0,144,255,64,1,22,255,202,0,3,0,54,184,0,2,47,65,3,0,32,0,2,0,1,93,184,0,0,220,65,5,0,31,0,0,0,47,0,0,0,2,93,0,184,0,4,47,184,0,0,220,184,0,2,220,65,3,0,16,0,2,0,1,93,48,49,5,15,1,55,1,22,88,46,68,54,133,5,132,0,0,0,0,1,0,23,1,64,0,155,2,186,0,11,0,171,187,0,0,0,5,0,1,0,4,43,65,5,0,143,0,0,0,159,0,0,0,2,93,65,3,0,207,0,0,0,1,93,65,7,0,0,0,0,0,16,0,0,0,32,0,0,0,3,93,65,5,0,143,0,1,0,159,0,1,0,2,93,65,3,0,207,0,1,0,1,93,65,7,0,0,0,1,0,16,0,1,0,32,0,1,0,3,93,184,0,1,16,184,0,5,208,184,0,5,47,186,0,10,0,1,0,0,17,18,57,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,11,16,184,0,4,220,186,0,2,0,4,0,11,17,18,57,185,0,5,0,3,244,48,49,19,35,17,6,7,39,62,3,55,51,155,75,32,19,6,9,24,21,18,3,57,1,64,1,20,14,3,60,1,13,16,20,9,0,0,0,2,0,33,1,178,1,81,2,213,0,18,0,31,0,233,184,0,7,47,65,3,0,96,0,7,0,1,93,184,0,17,220,184,0,7,16,185,0,24,0,5,244,184,0,17,16,185,0,30,0,5,244,0,184,0,12,47,184,0,2,220,65,3,0,208,0,2,0,1,93,65,3,0,96,0,2,0,1,93,65,3,0,48,0,2,0,1,93,184,0,12,16,185,0,21,0,3,244,184,0,2,16,185,0,27,0,3,244,48,49,1,65,7,0,6,0,0,0,22,0,0,0,38,0,0,0,3,93,65,7,0,9,0,5,0,25,0,5,0,41,0,5,0,3,93,65,7,0,8,0,10,0,24,0,10,0,40,0,10,0,3,93,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,93,0,65,7,0,9,0,0,0,25,0,0,0,41,0,0,0,3,93,65,7,0,8,0,5,0,24,0,5,0,40,0,5,0,3,93,65,7,0,6,0,10,0,22,0,10,0,38,0,10,0,3,93,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,93,1,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,39,38,35,34,6,21,20,22,51,50,54,53,52,1,39,41,69,35,56,39,22,21,39,57,35,35,56,40,21,97,20,35,35,40,40,35,35,40,1,220,42,23,39,53,31,30,53,39,23,23,39,53,30,61,123,24,49,37,38,48,48,38,37,0,2,0,41,0,78,2,36,1,234,0,5,0,11,0,195,184,0,0,47,65,3,0,0,0,0,0,1,93,184,0,4,220,184,0,5,220,65,7,0,96,0,5,0,112,0,5,0,128,0,5,0,3,93,65,7,0,0,0,5,0,16,0,5,0,32,0,5,0,3,113,184,0,1,208,184,0,4,16,184,0,2,208,184,0,0,16,185,0,3,0,4,244,184,0,0,16,184,0,6,220,184,0,10,220,185,0,11,0,4,244,184,0,7,208,184,0,10,16,184,0,8,208,184,0,6,16,185,0,9,0,4,244,65,3,0,47,0,13,0,1,93,0,25,184,0,0,47,24,184,0,1,208,184,0,1,47,184,0,0,16,184,0,3,208,184,0,0,16,184,0,5,208,184,0,5,47,184,0,3,16,184,0,6,208,184,0,1,16,184,0,7,208,184,0,6,16,184,0,9,208,184,0,5,16,184,0,11,208,48,49,1,7,35,55,39,51,15,1,35,55,39,51,2,36,147,100,147,147,100,112,147,101,148,148,101,1,28,206,206,206,206,206,206,206,0,0,0,255,255,0,39,255,171,2,171,2,188,0,38,0,120,16,0,0,38,0,16,42,0,1,7,0,223,1,124,254,193,0,58,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,14,62,89,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,18,47,27,185,0,18,0,6,62,89,184,0,26,208,48,49,0,0,255,255,0,36,255,171,2,182,2,188,0,38,0,120,13,0,0,38,0,16,39,0,1,7,0,113,1,165,254,192,0,54,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,14,62,89,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,16,47,27,185,0,16,0,6,62,89,48,49,0,0,255,255,0,32,255,171,3,83,2,194,0,38,0,114,13,0,0,39,0,16,0,212,0,0,1,7,0,223,2,36,254,193,0,58,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,14,62,89,184,0,0,69,88,184,0,42,47,27,185,0,42,0,14,62,89,184,0,0,69,88,184,0,45,47,27,185,0,45,0,6,62,89,184,0,53,208,48,49,0,2,0,62,255,6,1,173,1,244,0,36,0,40,1,65,186,0,21,0,29,0,3,43,186,0,1,0,21,0,29,17,18,57,184,0,1,47,65,5,0,31,0,1,0,47,0,1,0,2,113,184,0,0,220,184,0,29,16,184,0,10,220,65,7,0,63,0,10,0,79,0,10,0,95,0,10,0,3,113,186,0,39,0,29,0,21,17,18,57,184,0,39,47,185,0,40,0,4,244,0,184,0,0,69,88,184,0,37,47,27,185,0,37,0,12,62,89,184,0,0,69,88,184,0,24,47,27,185,0,24,0,8,62,89,184,0,37,16,184,0,40,220,65,3,0,48,0,40,0,1,113,184,0,0,220,184,0,24,16,185,0,15,0,1,244,184,0,24,16,184,0,20,220,48,49,1,65,3,0,118,0,8,0,1,93,65,3,0,135,0,8,0,1,93,65,7,0,54,0,22,0,70,0,22,0,86,0,22,0,3,93,65,3,0,9,0,26,0,1,93,65,7,0,105,0,27,0,121,0,27,0,137,0,27,0,3,93,65,3,0,40,0,33,0,1,93,65,3,0,25,0,33,0,1,93,0,65,3,0,120,0,8,0,1,93,65,3,0,137,0,8,0,1,93,65,7,0,57,0,22,0,73,0,22,0,89,0,22,0,3,93,65,3,0,9,0,26,0,1,93,65,3,0,104,0,27,0,1,93,65,3,0,136,0,27,0,1,93,65,3,0,22,0,33,0,1,93,65,3,0,39,0,33,0,1,93,19,51,22,21,20,14,4,21,20,30,2,51,50,62,2,55,23,14,1,35,34,46,2,53,52,54,63,1,62,1,47,1,51,21,35,233,59,3,22,34,38,34,22,21,35,46,26,22,42,36,26,5,25,19,86,54,47,77,54,30,35,25,50,26,36,1,18,91,91,1,44,41,4,31,53,49,47,49,55,32,30,46,31,16,13,20,24,11,67,29,38,33,52,67,35,35,76,32,65,33,65,30,227,86,0,0,0,255,255,0,7,0,0,2,97,3,173,2,38,0,34,0,0,1,7,0,65,0,157,0,209,0,70,65,5,0,64,0,12,0,80,0,12,0,2,113,65,3,0,16,0,12,0,1,93,65,3,0,112,0,12,0,1,93,65,3,0,48,0,12,0,1,93,0,65,3,0,47,0,11,0,1,93,65,3,0,31,0,11,0,1,113,65,3,0,255,0,11,0,1,93,48,49,255,255,0,7,0,0,2,97,3,173,2,38,0,34,0,0,1,7,0,115,0,157,0,209,0,48,65,3,0,159,0,12,0,1,93,65,3,0,15,0,12,0,1,93,65,3,0,79,0,12,0,1,93,65,3,0,16,0,12,0,1,93,0,65,3,0,47,0,12,0,1,93,48,49,0,0,255,255,0,7,0,0,2,97,3,186,2,38,0,34,0,0,1,7,0,203,0,86,0,209,0,39,65,3,0,79,0,14,0,1,93,65,3,0,143,0,14,0,1,93,65,3,0,16,0,14,0,1,93,0,65,3,0,47,0,14,0,1,93,48,49,0,0,0,255,255,0,7,0,0,2,97,3,143,2,38,0,34,0,0,1,7,0,206,0,44,0,209,0,39,65,3,0,15,0,19,0,1,93,65,3,0,47,0,19,0,1,113,65,3,0,47,0,19,0,1,93,0,65,3,0,47,0,11,0,1,93,48,49,0,0,0,255,255,0,7,0,0,2,97,3,141,2,38,0,34,0,0,1,7,0,104,0,98,0,209,0,77,184,0,16,47,65,3,0,15,0,16,0,1,113,65,5,0,79,0,16,0,95,0,16,0,2,93,65,3,0,16,0,16,0,1,93,65,3,0,64,0,16,0,1,113,184,0,12,208,0,184,0,15,47,65,3,0,47,0,15,0,1,93,65,3,0,175,0,15,0,1,93,184,0,12,208,48,49,0,255,255,0,7,0,0,2,97,3,196,2,38,0,34,0,0,1,7,0,205,0,163,0,209,0,91,184,0,14,47,65,3,0,15,0,14,0,1,93,65,3,0,47,0,14,0,1,93,65,3,0,112,0,14,0,1,93,184,0,26,208,0,184,0,25,47,65,3,0,111,0,25,0,1,93,65,3,0,47,0,25,0,1,93,65,3,0,15,0,25,0,1,113,65,3,0,32,0,25,0,1,113,65,3,0,224,0,25,0,1,93,184,0,29,208,48,49,0,0,0,0,2,255,249,0,0,3,60,2,188,0,15,0,18,1,163,186,0,0,0,1,0,3,43,65,3,0,64,0,0,0,1,93,65,3,0,176,0,0,0,1,93,65,3,0,96,0,0,0,1,93,65,3,0,223,0,1,0,1,93,184,0,1,16,184,0,16,208,184,0,1,16,184,0,5,208,65,3,0,89,0,5,0,1,93,65,3,0,9,0,5,0,1,93,65,3,0,245,0,5,0,1,93,185,0,4,0,4,244,186,0,3,0,16,0,4,17,18,57,65,3,0,138,0,3,0,1,93,184,0,16,16,184,0,6,208,65,3,0,139,0,6,0,1,93,65,3,0,42,0,6,0,1,113,65,3,0,249,0,6,0,1,93,65,5,0,9,0,6,0,25,0,6,0,2,113,184,0,0,16,184,0,8,208,184,0,8,47,184,0,1,16,184,0,14,220,65,5,0,96,0,14,0,112,0,14,0,2,113,65,7,0,208,0,14,0,224,0,14,0,240,0,14,0,3,93,65,7,0,0,0,14,0,16,0,14,0,32,0,14,0,3,113,65,9,0,80,0,14,0,96,0,14,0,112,0,14,0,128,0,14,0,4,93,184,0,10,208,184,0,0,16,184,0,12,208,184,0,12,47,186,0,18,0,16,0,4,17,18,57,65,3,0,22,0,18,0,1,113,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,16,0,1,0,6,17,18,57,184,0,16,47,185,0,2,0,2,244,184,0,1,16,184,0,4,208,184,0,6,16,185,0,9,0,2,244,186,0,10,0,6,0,1,17,18,57,184,0,10,47,185,0,13,0,2,244,184,0,1,16,185,0,14,0,2,244,184,0,9,16,184,0,17,208,48,49,1,65,5,0,105,0,6,0,121,0,6,0,2,93,65,3,0,117,0,18,0,1,93,41,1,53,35,7,35,1,33,21,33,21,51,21,35,21,33,37,17,3,3,60,254,76,214,92,93,1,86,1,227,254,200,241,241,1,66,254,76,171,180,180,2,188,87,204,86,237,186,1,83,254,173,0,255,255,0,39,255,64,2,71,2,202,2,38,0,36,0,0,0,6,0,119,96,0,0,0,255,255,0,80,0,0,2,4,3,173,2,38,0,38,0,0,1,7,0,65,0,126,0,209,0,74,65,7,0,48,0,13,0,64,0,13,0,80,0,13,0,3,93,65,3,0,47,0,13,0,1,93,65,3,0,80,0,13,0,1,113,65,3,0,48,0,13,0,1,113,0,65,3,0,47,0,12,0,1,93,65,3,0,31,0,12,0,1,113,65,3,0,255,0,12,0,1,93,48,49,255,255,0,80,0,0,2,4,3,173,2,38,0,38,0,0,1,7,0,115,0,125,0,209,0,60,65,7,0,143,0,14,0,159,0,14,0,175,0,14,0,3,93,65,3,0,255,0,14,0,1,93,65,3,0,15,0,14,0,1,113,65,5,0,48,0,14,0,64,0,14,0,2,113,0,65,3,0,47,0,13,0,1,93,48,49,0,0,255,255,0,80,0,0,2,4,3,186,2,38,0,38,0,0,1,7,0,203,0,53,0,209,0,30,65,3,0,143,0,15,0,1,93,65,3,0,16,0,15,0,1,93,0,65,3,0,47,0,15,0,1,93,48,49,255,255,0,80,0,0,2,4,3,141,2,38,0,38,0,0,1,7,0,104,0,65,0,209,0,55,184,0,17,47,65,3,0,143,0,17,0,1,93,65,3,0,175,0,17,0,1,93,184,0,13,208,0,184,0,16,47,65,3,0,47,0,16,0,1,93,65,3,0,175,0,16,0,1,93,184,0,13,208,48,49,0,0,0,255,255,0,35,0,0,0,222,3,173,2,38,0,42,0,0,1,7,0,65,255,233,0,209,0,86,65,5,0,239,0,5,0,255,0,5,0,2,93,65,3,0,15,0,5,0,1,113,65,3,0,0,0,5,0,1,93,65,11,0,48,0,5,0,64,0,5,0,80,0,5,0,96,0,5,0,112,0,5,0,5,93,0,65,3,0,47,0,4,0,1,93,65,3,0,31,0,4,0,1,113,65,3,0,255,0,4,0,1,93,48,49,255,255,0,36,0,0,0,223,3,173,2,38,0,42,0,0,1,7,0,115,255,234,0,209,0,12,0,65,3,0,47,0,5,0,1,93,48,49,0,0,255,255,255,240,0,0,1,22,3,186,2,38,0,42,0,0,1,7,0,203,255,164,0,209,0,47,65,3,0,143,0,7,0,1,93,65,7,0,80,0,7,0,96,0,7,0,112,0,7,0,3,93,65,3,0,32,0,7,0,1,113,0,65,3,0,47,0,7,0,1,93,48,49,0,0,0,255,255,0,5,0,0,0,253,3,141,2,38,0,42,0,0,1,7,0,104,255,174,0,209,0,59,184,0,9,47,65,3,0,175,0,9,0,1,93,65,5,0,64,0,9,0,80,0,9,0,2,113,184,0,5,208,0,184,0,8,47,65,3,0,47,0,8,0,1,93,65,3,0,175,0,8,0,1,93,184,0,5,208,48,49,0,0,0,0,2,255,245,0,0,2,175,2,188,0,16,0,31,1,145,186,0,12,0,1,0,3,43,65,3,0,127,0,1,0,1,93,65,3,0,47,0,1,0,1,113,65,3,0,16,0,1,0,1,93,184,0,1,16,184,0,3,208,184,0,3,47,184,0,1,16,184,0,5,208,65,5,0,16,0,12,0,32,0,12,0,2,93,65,3,0,128,0,12,0,1,93,65,3,0,192,0,12,0,1,93,65,3,0,64,0,12,0,1,93,65,3,0,224,0,12,0,1,93,65,3,0,16,0,12,0,1,113,184,0,1,16,185,0,23,0,4,244,184,0,19,208,184,0,23,16,184,0,21,208,184,0,21,47,184,0,12,16,185,0,27,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,19,0,7,0,0,17,18,57,184,0,19,47,65,3,0,47,0,19,0,1,93,65,3,0,15,0,19,0,1,93,65,3,0,95,0,19,0,1,93,185,0,22,0,1,244,184,0,2,208,184,0,19,16,184,0,5,208,184,0,7,16,185,0,17,0,2,244,184,0,0,16,185,0,24,0,2,244,48,49,1,65,3,0,86,0,9,0,1,93,65,3,0,103,0,9,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,119,0,10,0,1,93,65,3,0,87,0,14,0,1,93,65,3,0,86,0,15,0,1,93,65,5,0,103,0,15,0,119,0,15,0,2,93,0,65,5,0,86,0,9,0,102,0,9,0,2,93,65,3,0,87,0,10,0,1,93,65,3,0,119,0,10,0,1,93,65,3,0,88,0,14,0,1,93,65,3,0,120,0,15,0,1,93,65,3,0,105,0,15,0,1,93,65,3,0,90,0,15,0,1,93,41,1,17,35,53,51,17,33,50,30,2,21,20,14,2,3,35,21,51,21,35,21,51,50,54,53,52,46,2,1,86,255,0,97,97,1,0,76,127,92,50,50,90,127,78,166,133,133,166,118,125,32,61,91,1,57,64,1,67,49,90,130,81,81,129,91,49,2,102,237,64,226,140,123,61,98,68,37,0,255,255,0,80,0,0,2,112,3,143,2,38,0,47,0,0,1,7,0,206,0,87,0,209,0,25,65,5,0,144,0,18,0,160,0,18,0,2,93,0,65,3,0,47,0,10,0,1,93,48,49,0,255,255,0,39,255,242,2,217,3,173,2,38,0,48,0,0,1,7,0,65,0,233,0,209,0,30,0,65,3,0,47,0,38,0,1,93,65,3,0,31,0,38,0,1,113,65,3,0,255,0,38,0,1,93,48,49,255,255,0,39,255,242,2,217,3,173,2,38,0,48,0,0,1,7,0,115,0,232,0,209,0,48,65,3,0,239,0,40,0,1,93,65,3,0,15,0,40,0,1,93,65,3,0,175,0,40,0,1,93,65,3,0,32,0,40,0,1,93,0,65,3,0,47,0,39,0,1,93,48,49,0,0,255,255,0,39,255,242,2,217,3,186,2,38,0,48,0,0,1,7,0,203,0,161,0,209,0,34,65,3,0,15,0,41,0,1,93,65,5,0,16,0,41,0,32,0,41,0,2,93,0,65,3,0,47,0,41,0,1,93,48,49,255,255,0,39,255,242,2,217,3,143,2,38,0,48,0,0,1,7,0,206,0,119,0,209,0,30,65,3,0,15,0,46,0,1,93,65,3,0,63,0,46,0,1,93,0,65,3,0,47,0,38,0,1,93,48,49,255,255,0,39,255,242,2,217,3,141,2,38,0,48,0,0,1,7,0,104,0,173,0,209,0,59,184,0,43,47,65,3,0,95,0,43,0,1,93,65,5,0,16,0,43,0,32,0,43,0,2,93,184,0,39,208,0,184,0,42,47,65,3,0,47,0,42,0,1,93,65,3,0,175,0,42,0,1,93,184,0,39,208,48,49,0,0,0,0,1,0,61,0,119,1,122,1,179,0,11,0,109,184,0,4,47,65,3,0,239,0,4,0,1,93,65,5,0,0,0,4,0,16,0,4,0,2,93,184,0,0,220,186,0,5,0,4,0,0,17,18,57,184,0,4,16,184,0,6,208,184,0,0,16,184,0,10,208,186,0,11,0,0,0,4,17,18,57,0,184,0,3,47,184,0,1,208,184,0,3,16,184,0,7,220,186,0,2,0,3,0,7,17,18,57,186,0,8,0,7,0,3,17,18,57,184,0,9,208,48,49,37,7,39,7,39,55,39,55,23,55,23,7,1,122,36,123,122,36,123,123,36,122,123,36,124,155,36,123,123,36,122,122,36,123,123,36,122,0,3,0,39,255,226,2,217,2,204,0,23,0,33,0,43,3,133,186,0,19,0,7,0,3,43,65,3,0,15,0,7,0,1,93,65,5,0,79,0,7,0,95,0,7,0,2,93,65,3,0,32,0,19,0,1,93,65,5,0,176,0,19,0,192,0,19,0,2,93,65,5,0,224,0,19,0,240,0,19,0,2,93,65,5,0,112,0,19,0,128,0,19,0,2,93,65,3,0,32,0,19,0,1,113,186,0,2,0,7,0,19,17,18,57,184,0,2,16,184,0,3,208,186,0,5,0,7,0,19,17,18,57,65,3,0,121,0,5,0,1,93,184,0,5,16,184,0,4,208,65,3,0,25,0,4,0,1,93,186,0,14,0,19,0,7,17,18,57,184,0,14,16,184,0,15,208,65,3,0,138,0,15,0,1,93,186,0,17,0,19,0,7,17,18,57,65,3,0,118,0,17,0,1,93,184,0,17,16,184,0,16,208,65,3,0,57,0,16,0,1,93,184,0,19,16,185,0,32,0,4,244,184,0,7,16,185,0,39,0,4,244,186,0,24,0,32,0,39,17,18,57,186,0,25,0,39,0,32,17,18,57,65,5,0,54,0,25,0,70,0,25,0,2,93,65,7,0,6,0,25,0,22,0,25,0,38,0,25,0,3,113,65,5,0,117,0,25,0,133,0,25,0,2,93,186,0,41,0,39,0,32,17,18,57,186,0,42,0,32,0,39,17,18,57,65,3,0,122,0,42,0,1,93,65,3,0,139,0,42,0,1,93,65,5,0,57,0,42,0,73,0,42,0,2,93,65,7,0,9,0,42,0,25,0,42,0,41,0,42,0,3,113,65,3,0,15,0,44,0,1,93,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,2,0,0,0,12,17,18,57,184,0,3,208,184,0,3,47,186,0,5,0,0,0,12,17,18,57,186,0,14,0,12,0,0,17,18,57,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,113,184,0,12,16,184,0,15,208,184,0,15,47,186,0,17,0,12,0,0,17,18,57,184,0,12,16,185,0,34,0,2,244,184,0,0,16,185,0,27,0,2,244,186,0,24,0,34,0,27,17,18,57,65,3,0,138,0,24,0,1,93,65,7,0,9,0,24,0,25,0,24,0,41,0,24,0,3,113,65,3,0,121,0,24,0,1,93,186,0,25,0,27,0,34,17,18,57,186,0,41,0,27,0,34,17,18,57,65,7,0,6,0,41,0,22,0,41,0,38,0,41,0,3,113,65,5,0,118,0,41,0,134,0,41,0,2,93,186,0,42,0,34,0,27,17,18,57,48,49,1,65,3,0,105,0,4,0,1,93,65,3,0,137,0,4,0,1,93,65,3,0,90,0,4,0,1,93,65,3,0,89,0,9,0,1,93,65,3,0,121,0,9,0,1,93,65,5,0,88,0,10,0,104,0,10,0,2,93,65,3,0,137,0,14,0,1,93,65,3,0,86,0,17,0,1,93,65,5,0,86,0,21,0,102,0,21,0,2,93,65,3,0,117,0,22,0,1,93,65,3,0,86,0,22,0,1,93,65,3,0,103,0,24,0,1,93,65,3,0,138,0,30,0,1,93,65,3,0,133,0,37,0,1,93,65,3,0,105,0,41,0,1,93,65,3,0,89,0,42,0,1,93,0,65,3,0,90,0,2,0,1,93,65,3,0,85,0,9,0,1,93,65,3,0,118,0,9,0,1,93,65,3,0,101,0,10,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,86,0,14,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,88,0,21,0,1,93,65,3,0,105,0,21,0,1,93,65,3,0,90,0,22,0,1,93,65,3,0,122,0,22,0,1,93,65,3,0,107,0,24,0,1,93,65,3,0,136,0,37,0,1,93,65,3,0,101,0,41,0,1,93,65,3,0,87,0,42,0,1,93,5,34,39,7,35,55,38,53,52,62,2,51,50,23,55,51,7,22,21,20,14,2,19,1,22,51,50,62,2,53,52,39,34,14,2,21,20,23,1,38,1,127,91,85,42,93,73,106,52,91,127,75,86,86,31,92,61,111,51,91,128,104,254,209,69,55,58,89,60,30,238,57,88,60,31,55,1,45,66,12,43,61,105,113,162,83,134,95,52,42,44,89,111,167,81,133,95,52,2,48,254,69,29,41,74,101,60,126,147,41,74,101,60,98,95,1,185,28,0,0,0,255,255,0,72,255,242,2,140,3,173,0,38,0,54,0,0,1,7,0,65,0,211,0,209,0,56,65,3,0,47,0,23,0,1,93,65,7,0,48,0,23,0,64,0,23,0,80,0,23,0,3,93,0,65,3,0,47,0,22,0,1,93,65,3,0,31,0,22,0,1,113,65,3,0,255,0,22,0,1,93,48,49,0,0,255,255,0,72,255,242,2,140,3,173,0,38,0,54,0,0,1,7,0,115,0,211,0,209,0,47,65,3,0,15,0,23,0,1,93,65,7,0,175,0,24,0,191,0,24,0,207,0,24,0,3,93,65,3,0,15,0,24,0,1,113,0,65,3,0,47,0,22,0,1,93,48,49,0,0,0,255,255,0,72,255,242,2,140,3,186,0,38,0,54,0,0,1,7,0,203,0,139,0,209,0,39,65,3,0,15,0,25,0,1,93,65,3,0,143,0,25,0,1,93,65,3,0,32,0,25,0,1,113,0,65,3,0,47,0,25,0,1,93,48,49,0,0,0,255,255,0,72,255,242,2,140,3,141,0,38,0,54,0,0,1,7,0,104,0,152,0,209,0,64,184,0,27,47,65,3,0,15,0,27,0,1,93,65,3,0,16,0,27,0,1,93,65,3,0,80,0,27,0,1,113,184,0,23,208,0,184,0,26,47,65,3,0,47,0,26,0,1,93,65,3,0,175,0,26,0,1,93,184,0,23,208,48,49,0,0,255,255,255,253,0,0,2,57,3,173,2,38,0,58,0,0,1,7,0,115,0,144,0,209,0,52,65,5,0,239,0,11,0,255,0,11,0,2,93,65,3,0,15,0,11,0,1,93,65,3,0,175,0,11,0,1,93,65,3,0,32,0,11,0,1,93,0,65,3,0,47,0,10,0,1,93,48,49,0,0,0,2,0,80,0,0,2,36,2,188,0,16,0,27,1,80,186,0,11,0,2,0,3,43,65,5,0,0,0,2,0,16,0,2,0,2,93,65,3,0,143,0,2,0,1,93,65,3,0,144,0,2,0,1,93,65,3,0,112,0,2,0,1,93,184,0,2,16,185,0,1,0,4,244,184,0,18,208,184,0,5,208,65,3,0,192,0,11,0,1,93,65,3,0,80,0,11,0,1,93,65,3,0,112,0,11,0,1,93,65,5,0,0,0,11,0,16,0,11,0,2,93,65,3,0,224,0,11,0,1,93,65,3,0,32,0,11,0,1,113,184,0,11,16,185,0,22,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,0,0,4,0,1,17,18,57,184,0,0,47,65,7,0,15,0,0,0,31,0,0,0,47,0,0,0,3,113,65,3,0,143,0,0,0,1,93,65,3,0,47,0,0,0,1,93,186,0,5,0,4,0,1,17,18,57,184,0,5,47,185,0,17,0,2,244,184,0,0,16,185,0,18,0,2,244,48,49,1,65,5,0,118,0,8,0,134,0,8,0,2,93,65,7,0,102,0,9,0,118,0,9,0,134,0,9,0,3,93,65,3,0,7,0,9,0,1,93,0,65,3,0,116,0,8,0,1,93,65,3,0,133,0,8,0,1,93,65,3,0,5,0,9,0,1,93,65,3,0,101,0,9,0,1,93,65,3,0,135,0,9,0,1,93,55,21,35,17,51,21,51,50,30,2,21,20,14,2,35,3,17,51,50,54,53,52,46,2,35,180,100,100,124,49,88,67,40,41,64,76,35,152,134,73,62,16,38,63,46,125,125,2,188,120,15,47,86,70,68,91,55,23,1,114,254,227,77,71,37,53,32,15,0,1,0,16,255,120,2,39,2,238,0,62,2,25,186,0,58,0,31,0,3,43,65,3,0,0,0,31,0,1,93,65,3,0,31,0,31,0,1,113,65,3,0,80,0,31,0,1,93,65,3,0,32,0,31,0,1,93,184,0,31,16,185,0,30,0,4,244,65,3,0,32,0,58,0,1,93,65,3,0,160,0,58,0,1,93,65,3,0,80,0,58,0,1,113,65,11,0,64,0,58,0,80,0,58,0,96,0,58,0,112,0,58,0,128,0,58,0,5,93,65,3,0,0,0,58,0,1,93,65,3,0,48,0,58,0,1,113,184,0,58,16,185,0,9,0,4,244,186,0,3,0,30,0,9,17,18,57,184,0,3,47,186,0,16,0,30,0,9,17,18,57,184,0,16,47,186,0,46,0,58,0,31,17,18,57,184,0,46,47,185,0,21,0,4,244,184,0,31,16,184,0,35,208,184,0,33,220,184,0,16,16,185,0,51,0,4,244,0,184,0,30,47,184,0,0,69,88,184,0,41,47,27,185,0,41,0,18,62,89,184,0,0,69,88,184,0,34,47,27,185,0,34,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,4,0,1,244,186,0,16,0,41,0,3,17,18,57,25,184,0,16,47,24,184,0,41,16,185,0,26,0,2,244,184,0,34,16,185,0,33,0,1,244,184,0,16,16,184,0,51,208,48,49,1,65,3,0,72,0,12,0,1,93,65,3,0,73,0,19,0,1,93,65,3,0,138,0,19,0,1,93,65,3,0,123,0,19,0,1,93,65,3,0,9,0,38,0,1,93,65,3,0,7,0,43,0,1,93,65,3,0,39,0,43,0,1,93,65,5,0,6,0,44,0,22,0,44,0,2,93,65,3,0,54,0,49,0,1,93,65,7,0,87,0,55,0,103,0,55,0,119,0,55,0,3,93,65,3,0,7,0,60,0,1,93,65,3,0,6,0,61,0,1,93,0,65,3,0,119,0,19,0,1,93,65,3,0,5,0,38,0,1,93,65,3,0,6,0,43,0,1,93,65,3,0,38,0,43,0,1,93,65,5,0,7,0,44,0,23,0,44,0,2,93,65,3,0,57,0,49,0,1,93,65,3,0,101,0,55,0,1,93,65,3,0,86,0,55,0,1,93,65,3,0,119,0,56,0,1,93,65,3,0,8,0,60,0,1,93,65,3,0,9,0,61,0,1,93,5,34,38,39,53,50,62,2,53,52,46,4,53,52,62,2,53,52,46,2,35,34,6,21,17,35,17,35,55,51,53,52,62,2,51,50,30,2,21,20,14,2,21,20,30,4,21,20,14,2,1,72,18,20,12,42,68,46,25,25,38,44,38,25,33,41,33,16,27,36,20,54,52,90,85,12,73,31,54,72,41,35,68,53,32,31,36,31,24,36,42,36,24,38,62,81,10,2,1,77,3,13,29,27,28,47,41,35,33,30,15,18,42,51,63,39,26,33,20,7,51,71,253,84,2,44,70,87,42,64,44,23,18,39,62,45,45,69,50,34,10,8,23,29,38,47,56,34,42,58,36,17,0,255,255,0,24,255,246,1,216,2,220,2,38,0,66,0,0,1,6,0,65,89,0,0,29,65,3,0,0,0,45,0,1,93,65,3,0,80,0,45,0,1,113,65,3,0,160,0,45,0,1,93,48,49,0,0,0,255,255,0,24,255,246,1,216,2,220,2,38,0,66,0,0,1,6,0,115,88,0,0,29,65,3,0,127,0,46,0,1,93,65,3,0,255,0,46,0,1,93,65,3,0,80,0,46,0,1,113,48,49,0,0,0,255,255,0,24,255,246,1,216,2,233,2,38,0,66,0,0,1,6,0,203,17,0,0,24,65,5,0,127,0,47,0,143,0,47,0,2,93,65,3,0,223,0,47,0,1,93,48,49,255,255,0,24,255,246,1,216,2,190,2,38,0,66,0,0,1,6,0,206,228,0,0,29,65,3,0,255,0,52,0,1,93,65,3,0,32,0,52,0,1,93,65,3,0,64,0,52,0,1,93,48,49,0,0,0,255,255,0,24,255,246,1,216,2,188,2,38,0,66,0,0,1,6,0,104,29,0,0,62,184,0,49,47,65,3,0,160,0,49,0,1,93,65,7,0,95,0,49,0,111,0,49,0,127,0,49,0,3,93,65,3,0,64,0,49,0,1,113,65,7,0,192,0,49,0,208,0,49,0,224,0,49,0,3,93,184,0,45,208,48,49,0,0,255,255,0,24,255,246,1,216,2,243,2,38,0,66,0,0,1,6,0,205,95,0,0,37,184,0,47,47,65,3,0,0,0,47,0,1,93,65,3,0,160,0,47,0,1,93,65,3,0,64,0,47,0,1,93,184,0,59,208,48,49,0,0,0,0,3,0,22,255,242,3,0,1,244,0,45,0,50,0,65,3,170,186,0,43,0,20,0,3,43,65,3,0,255,0,20,0,1,93,65,3,0,15,0,20,0,1,113,65,5,0,63,0,20,0,79,0,20,0,2,93,65,3,0,79,0,20,0,1,113,65,5,0,191,0,20,0,207,0,20,0,2,93,65,7,0,111,0,20,0,127,0,20,0,143,0,20,0,3,93,65,3,0,160,0,43,0,1,93,65,3,0,48,0,43,0,1,113,65,3,0,224,0,43,0,1,93,65,5,0,64,0,43,0,80,0,43,0,2,93,65,3,0,0,0,43,0,1,93,186,0,63,0,20,0,43,17,18,57,184,0,63,47,185,0,1,0,4,244,186,0,10,0,63,0,43,17,18,57,184,0,10,47,186,0,14,0,1,0,63,17,18,57,184,0,63,16,184,0,22,208,186,0,28,0,20,0,1,17,18,57,184,0,28,47,186,0,35,0,63,0,1,17,18,57,184,0,1,16,184,0,48,208,184,0,43,16,185,0,49,0,4,244,184,0,20,16,185,0,56,0,4,244,0,184,0,0,69,88,184,0,30,47,27,185,0,30,0,12,62,89,184,0,0,69,88,184,0,40,47,27,185,0,40,0,12,62,89,184,0,0,69,88,184,0,12,47,27,185,0,12,0,6,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,6,62,89,186,0,1,0,40,0,12,17,18,57,184,0,1,47,65,5,0,144,0,1,0,160,0,1,0,2,93,65,5,0,16,0,1,0,32,0,1,0,2,93,184,0,12,16,185,0,4,0,1,244,184,0,12,16,184,0,9,220,186,0,14,0,12,0,40,17,18,57,186,0,22,0,30,0,17,17,18,57,184,0,22,47,65,3,0,0,0,22,0,1,93,184,0,30,16,185,0,25,0,2,244,184,0,30,16,184,0,27,220,186,0,35,0,40,0,12,17,18,57,65,3,0,135,0,35,0,1,93,184,0,40,16,185,0,46,0,2,244,184,0,1,16,184,0,48,220,65,15,0,159,0,48,0,175,0,48,0,191,0,48,0,207,0,48,0,223,0,48,0,239,0,48,0,255,0,48,0,7,93,184,0,22,16,184,0,51,220,65,15,0,144,0,51,0,160,0,51,0,176,0,51,0,192,0,51,0,208,0,51,0,224,0,51,0,240,0,51,0,7,93,184,0,17,16,185,0,58,0,1,244,48,49,1,65,5,0,52,0,3,0,68,0,3,0,2,93,65,5,0,89,0,13,0,105,0,13,0,2,93,65,5,0,85,0,15,0,101,0,15,0,2,93,65,3,0,72,0,18,0,1,93,65,3,0,26,0,19,0,1,93,65,3,0,43,0,19,0,1,93,65,3,0,120,0,21,0,1,93,65,3,0,137,0,21,0,1,93,65,3,0,120,0,23,0,1,93,65,9,0,87,0,28,0,103,0,28,0,119,0,28,0,135,0,28,0,4,93,65,3,0,134,0,33,0,1,93,65,3,0,135,0,41,0,1,93,65,3,0,133,0,42,0,1,93,65,3,0,101,0,54,0,1,93,65,3,0,86,0,54,0,1,93,0,65,3,0,72,0,3,0,1,93,65,9,0,91,0,10,0,107,0,10,0,123,0,10,0,139,0,10,0,4,93,65,9,0,91,0,11,0,107,0,11,0,123,0,11,0,139,0,11,0,4,93,65,3,0,89,0,13,0,1,93,65,3,0,106,0,13,0,1,93,65,3,0,25,0,18,0,1,93,65,3,0,105,0,18,0,1,93,65,7,0,58,0,18,0,74,0,18,0,90,0,18,0,3,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,88,0,23,0,1,93,65,3,0,121,0,23,0,1,93,65,3,0,106,0,23,0,1,93,65,9,0,84,0,28,0,100,0,28,0,116,0,28,0,132,0,28,0,4,93,65,9,0,86,0,29,0,102,0,29,0,118,0,29,0,134,0,29,0,4,93,65,3,0,134,0,33,0,1,93,65,3,0,101,0,35,0,1,93,65,3,0,101,0,37,0,1,93,65,3,0,133,0,41,0,1,93,65,3,0,135,0,42,0,1,93,65,3,0,104,0,54,0,1,93,37,33,20,22,51,50,62,2,55,23,6,35,34,39,14,1,35,34,38,53,52,37,46,1,35,34,7,39,54,51,50,30,2,23,62,3,51,50,22,21,20,6,39,34,7,51,52,5,34,14,2,21,20,51,50,62,2,53,52,38,2,252,254,176,90,75,18,26,29,35,26,17,87,76,148,53,26,110,72,75,75,1,45,9,53,56,53,69,8,84,72,20,50,47,36,6,10,37,49,59,32,88,103,2,193,107,30,246,254,161,36,76,64,41,78,28,51,39,23,1,245,90,93,3,9,14,11,69,40,113,57,60,69,63,174,15,61,52,29,70,39,11,27,46,36,31,45,30,14,104,96,11,28,159,113,113,175,12,29,45,33,64,17,34,51,34,14,24,255,255,0,33,255,64,1,171,1,244,2,38,0,68,0,0,1,6,0,119,48,0,0,19,65,7,0,32,0,28,0,48,0,28,0,64,0,28,0,3,93,48,49,0,255,255,0,31,255,246,1,226,2,220,2,38,0,70,0,0,1,6,0,65,103,0,0,24,65,5,0,239,0,32,0,255,0,32,0,2,93,65,3,0,80,0,32,0,1,113,48,49,255,255,0,31,255,246,1,226,2,220,2,38,0,70,0,0,1,6,0,115,104,0,0,24,65,3,0,79,0,33,0,1,93,65,5,0,223,0,33,0,239,0,33,0,2,93,48,49,255,255,0,31,255,246,1,226,2,233,2,38,0,70,0,0,1,6,0,203,32,0,0,33,65,3,0,15,0,34,0,1,93,65,5,0,63,0,34,0,79,0,34,0,2,93,65,3,0,144,0,34,0,1,93,48,49,0,0,0,255,255,0,31,255,246,1,226,2,188,2,38,0,70,0,0,1,6,0,104,44,0,0,19,184,0,36,47,65,3,0,47,0,36,0,1,113,184,0,32,208,48,49,0,255,255,0,13,0,0,0,200,2,220,2,38,0,193,0,0,1,6,0,65,211,0,0,56,65,3,0,0,0,5,0,1,93,65,3,0,255,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,223,0,5,0,1,93,65,3,0,80,0,5,0,1,113,65,3,0,32,0,5,0,1,93,48,49,255,255,0,14,0,0,0,201,2,220,2,38,0,193,0,0,1,6,0,115,212,0,0,55,65,3,0,223,0,6,0,1,93,65,5,0,63,0,6,0,79,0,6,0,2,93,65,3,0,255,0,6,0,1,93,65,5,0,143,0,6,0,159,0,6,0,2,93,65,3,0,32,0,6,0,1,93,48,49,0,255,255,255,217,0,0,0,255,2,233,2,38,0,193,0,0,1,6,0,203,141,0,0,29,65,3,0,223,0,7,0,1,93,65,3,0,32,0,7,0,1,93,65,3,0,143,0,8,0,1,93,48,49,0,0,0,255,255,255,239,0,0,0,231,2,188,2,38,0,193,0,0,1,6,0,104,152,0,0,55,184,0,9,47,65,3,0,15,0,9,0,1,113,65,3,0,143,0,9,0,1,93,65,3,0,63,0,9,0,1,113,65,3,0,32,0,9,0,1,93,65,3,0,224,0,9,0,1,93,184,0,5,208,48,49,0,0,2,0,28,255,244,1,228,2,198,0,41,0,57,2,47,186,0,37,0,5,0,3,43,65,3,0,207,0,5,0,1,93,65,3,0,79,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,111,0,5,0,1,93,65,3,0,112,0,37,0,1,93,65,3,0,16,0,37,0,1,93,65,3,0,16,0,37,0,1,113,65,3,0,80,0,37,0,1,93,184,0,37,16,185,0,55,0,4,244,184,0,12,208,186,0,24,0,5,0,37,17,18,57,184,0,24,47,186,0,22,0,24,0,12,17,18,57,186,0,32,0,37,0,24,17,18,57,65,3,0,54,0,32,0,1,93,186,0,17,0,22,0,32,17,18,57,184,0,22,16,184,0,20,208,184,0,20,47,186,0,27,0,22,0,32,17,18,57,65,3,0,55,0,27,0,1,93,65,3,0,86,0,27,0,1,93,65,3,0,69,0,27,0,1,93,184,0,32,16,184,0,30,208,184,0,30,47,184,0,5,16,185,0,47,0,4,244,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,14,62,89,184,0,0,69,88,184,0,29,47,27,185,0,29,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,65,3,0,200,0,5,0,1,93,184,0,10,220,186,0,17,0,10,0,25,17,18,57,184,0,17,16,184,0,19,208,184,0,19,47,186,0,27,0,25,0,10,17,18,57,65,3,0,55,0,27,0,1,93,65,5,0,70,0,27,0,86,0,27,0,2,93,186,0,22,0,27,0,17,17,18,57,184,0,25,16,184,0,24,220,186,0,32,0,17,0,27,17,18,57,184,0,10,16,185,0,42,0,2,244,184,0,0,16,185,0,52,0,2,244,48,49,1,65,3,0,121,0,2,0,1,93,65,3,0,107,0,2,0,1,93,65,5,0,105,0,8,0,121,0,8,0,2,93,65,3,0,103,0,11,0,1,93,65,3,0,120,0,11,0,1,93,65,3,0,136,0,17,0,1,93,65,3,0,135,0,18,0,1,93,65,3,0,119,0,40,0,1,93,0,65,3,0,122,0,2,0,1,93,65,3,0,107,0,2,0,1,93,65,5,0,102,0,8,0,118,0,8,0,2,93,65,3,0,115,0,11,0,1,93,65,3,0,100,0,11,0,1,93,65,3,0,133,0,11,0,1,93,65,3,0,140,0,17,0,1,93,65,3,0,138,0,18,0,1,93,65,3,0,121,0,40,0,1,93,65,3,0,106,0,40,0,1,93,23,34,46,2,53,52,62,2,51,50,23,46,3,39,6,7,39,54,55,38,35,55,50,23,54,55,23,6,7,30,3,21,20,14,2,3,34,14,2,21,20,30,2,51,50,54,53,52,38,249,48,81,59,33,28,53,79,51,86,49,4,16,23,28,15,77,64,30,65,63,60,61,32,72,77,31,28,46,23,46,32,53,37,21,43,68,84,35,29,46,33,18,18,33,46,28,54,66,65,12,32,57,78,46,42,81,63,39,55,24,55,53,45,12,53,9,55,9,43,54,42,55,28,36,12,33,51,29,81,94,102,51,77,104,62,26,1,99,21,37,48,27,30,50,38,21,77,60,60,75,0,0,0,255,255,0,61,0,0,1,247,2,190,2,38,0,79,0,0,1,6,0,206,15,0,0,11,65,3,0,255,0,25,0,1,93,48,49,0,255,255,0,32,255,246,2,6,2,220,2,38,0,80,0,0,1,6,0,65,123,0,0,24,65,3,0,47,0,33,0,1,113,65,5,0,64,0,33,0,80,0,33,0,2,93,48,49,255,255,0,32,255,246,2,6,2,220,2,38,0,80,0,0,1,6,0,115,123,0,0,51,65,3,0,255,0,34,0,1,93,65,3,0,15,0,34,0,1,113,65,3,0,63,0,34,0,1,93,65,3,0,191,0,34,0,1,93,65,5,0,143,0,34,0,159,0,34,0,2,93,48,49,0,255,255,0,32,255,246,2,6,2,233,2,38,0,80,0,0,1,6,0,203,52,0,0,29,65,3,0,15,0,35,0,1,93,65,3,0,32,0,35,0,1,93,65,3,0,160,0,35,0,1,93,48,49,0,0,0,255,255,0,32,255,246,2,6,2,190,2,38,0,80,0,0,1,6,0,206,10,0,0,24,65,5,0,15,0,40,0,31,0,40,0,2,93,65,3,0,47,0,40,0,1,113,48,49,255,255,0,32,255,246,2,6,2,188,2,38,0,80,0,0,1,6,0,104,64,0,0,28,184,0,37,47,65,3,0,143,0,37,0,1,93,65,3,0,32,0,37,0,1,93,184,0,33,208,48,49,0,3,0,66,0,20,2,14,2,22,0,3,0,7,0,11,0,76,184,0,10,47,184,0,11,220,184,0,0,208,184,0,10,16,184,0,1,208,184,0,11,16,184,0,4,220,184,0,10,16,184,0,5,220,0,184,0,5,47,184,0,6,220,184,0,2,220,184,0,1,220,184,0,5,16,184,0,9,220,65,3,0,191,0,9,0,1,93,184,0,10,220,48,49,1,35,53,51,19,33,53,33,3,35,53,51,1,80,89,89,190,254,52,1,204,190,89,89,1,184,94,254,223,74,254,213,94,0,0,3,0,33,255,216,2,27,2,17,0,23,0,36,0,46,2,114,186,0,19,0,7,0,3,43,65,3,0,143,0,7,0,1,93,65,3,0,31,0,7,0,1,93,65,3,0,175,0,7,0,1,93,65,3,0,111,0,7,0,1,93,65,5,0,63,0,7,0,79,0,7,0,2,93,65,3,0,80,0,19,0,1,93,65,3,0,144,0,19,0,1,93,65,3,0,224,0,19,0,1,93,65,3,0,32,0,19,0,1,113,65,3,0,0,0,19,0,1,113,65,3,0,192,0,19,0,1,93,65,3,0,112,0,19,0,1,93,65,3,0,32,0,19,0,1,93,65,3,0,0,0,19,0,1,93,186,0,2,0,7,0,19,17,18,57,186,0,5,0,7,0,19,17,18,57,186,0,14,0,19,0,7,17,18,57,186,0,17,0,19,0,7,17,18,57,184,0,19,16,185,0,32,0,4,244,184,0,7,16,185,0,42,0,4,244,186,0,24,0,32,0,42,17,18,57,186,0,25,0,42,0,32,17,18,57,65,3,0,102,0,25,0,1,93,65,3,0,134,0,25,0,1,93,186,0,44,0,42,0,32,17,18,57,186,0,45,0,32,0,42,17,18,57,65,3,0,105,0,45,0,1,93,65,3,0,137,0,45,0,1,93,65,3,0,128,0,48,0,1,93,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,2,0,0,0,12,17,18,57,184,0,3,208,184,0,3,47,186,0,5,0,0,0,12,17,18,57,186,0,14,0,12,0,0,17,18,57,184,0,12,16,184,0,15,208,184,0,15,47,65,3,0,144,0,15,0,1,93,186,0,17,0,12,0,0,17,18,57,184,0,12,16,185,0,37,0,1,244,184,0,0,16,185,0,27,0,1,244,186,0,24,0,37,0,27,17,18,57,65,3,0,137,0,24,0,1,93,65,3,0,105,0,24,0,1,93,65,3,0,38,0,24,0,1,93,186,0,25,0,27,0,37,17,18,57,186,0,44,0,27,0,37,17,18,57,65,3,0,102,0,44,0,1,93,65,3,0,134,0,44,0,1,93,186,0,45,0,37,0,27,17,18,57,48,49,1,65,3,0,92,0,6,0,1,93,65,3,0,90,0,10,0,1,93,65,3,0,86,0,17,0,1,93,65,3,0,85,0,22,0,1,93,65,3,0,73,0,24,0,1,93,65,3,0,70,0,25,0,1,93,65,3,0,87,0,25,0,1,93,65,3,0,74,0,30,0,1,93,65,3,0,69,0,39,0,1,93,65,5,0,73,0,45,0,89,0,45,0,2,93,0,65,3,0,85,0,10,0,1,93,65,3,0,86,0,17,0,1,93,65,3,0,91,0,22,0,1,93,65,3,0,87,0,25,0,1,93,5,34,39,7,35,55,38,53,52,62,2,51,50,23,55,51,7,22,21,20,14,2,19,3,22,51,50,62,2,53,52,46,2,39,34,14,2,21,20,23,19,38,1,30,33,53,19,71,32,109,35,66,93,58,36,48,19,74,34,111,35,66,94,51,163,42,13,37,58,39,21,6,12,17,123,36,57,40,21,46,161,38,13,11,38,66,81,137,54,94,69,40,12,40,66,84,136,54,94,69,39,1,150,254,182,6,29,50,68,39,21,46,41,33,47,28,50,69,41,68,80,1,73,7,255,255,0,56,255,246,1,207,2,220,2,38,0,86,0,0,1,6,0,65,127,0,0,37,65,3,0,255,0,17,0,1,93,65,7,0,48,0,17,0,64,0,17,0,80,0,17,0,3,93,65,3,0,176,0,17,0,1,93,48,49,0,0,0,255,255,0,56,255,246,1,207,2,220,2,38,0,86,0,0,1,6,0,115,127,0,0,59,65,3,0,255,0,17,0,1,93,65,3,0,15,0,17,0,1,113,65,5,0,15,0,17,0,31,0,17,0,2,93,65,3,0,223,0,17,0,1,93,65,7,0,143,0,17,0,159,0,17,0,175,0,17,0,3,93,48,49,0,255,255,0,56,255,246,1,207,2,233,2,38,0,86,0,0,1,6,0,203,56,0,0,56,65,3,0,32,0,19,0,1,113,65,3,0,223,0,19,0,1,93,65,3,0,143,0,19,0,1,93,65,3,0,32,0,19,0,1,93,65,3,0,144,0,19,0,1,93,65,3,0,80,0,19,0,1,93,48,49,255,255,0,56,255,246,1,207,2,188,2,38,0,86,0,0,1,6,0,104,68,0,0,46,184,0,21,47,65,3,0,32,0,21,0,1,93,65,3,0,143,0,21,0,1,93,65,3,0,0,0,21,0,1,113,65,3,0,224,0,21,0,1,93,184,0,17,208,48,49,0,0,255,255,0,7,255,14,1,242,2,220,2,38,0,90,0,0,1,6,0,115,101,0,0,11,65,3,0,79,0,9,0,1,93,48,49,0,0,2,0,60,255,15,2,36,2,238,0,18,0,30,1,158,186,0,14,0,4,0,3,43,65,3,0,255,0,4,0,1,93,65,3,0,223,0,4,0,1,93,65,3,0,31,0,4,0,1,113,65,3,0,0,0,4,0,1,93,65,3,0,32,0,4,0,1,93,184,0,4,16,185,0,3,0,4,244,184,0,6,208,65,17,0,0,0,14,0,16,0,14,0,32,0,14,0,48,0,14,0,64,0,14,0,80,0,14,0,96,0,14,0,112,0,14,0,8,93,65,3,0,0,0,14,0,1,113,65,3,0,144,0,14,0,1,93,65,5,0,32,0,14,0,48,0,14,0,2,113,65,3,0,80,0,14,0,1,113,184,0,3,16,184,0,19,208,184,0,14,16,185,0,25,0,4,244,65,3,0,64,0,32,0,1,93,65,3,0,96,0,32,0,1,93,65,3,0,128,0,32,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,18,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,8,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,2,0,0,0,9,17,18,57,186,0,7,0,9,0,0,17,18,57,185,0,22,0,1,244,184,0,9,16,185,0,28,0,2,244,48,49,1,65,3,0,105,0,1,0,1,93,65,3,0,102,0,11,0,1,93,65,3,0,87,0,11,0,1,93,65,3,0,102,0,17,0,1,93,65,3,0,87,0,17,0,1,93,0,65,3,0,105,0,1,0,1,93,65,3,0,91,0,1,0,1,93,65,5,0,85,0,8,0,101,0,8,0,2,93,65,3,0,86,0,11,0,1,93,65,3,0,103,0,11,0,1,93,65,5,0,89,0,17,0,105,0,17,0,2,93,65,3,0,149,0,29,0,1,93,5,34,39,17,35,17,51,17,54,51,50,30,2,21,20,14,2,39,20,22,51,50,54,53,52,38,35,34,6,1,46,103,49,90,90,62,96,55,88,63,34,33,63,92,217,74,77,78,85,85,78,78,73,10,66,254,215,3,223,254,200,62,40,69,93,53,53,93,69,40,255,82,101,101,82,81,94,94,255,255,0,7,255,14,1,242,2,188,2,38,0,90,0,0,1,6,0,104,40,0,0,28,184,0,13,47,65,3,0,15,0,13,0,1,93,65,3,0,63,0,13,0,1,93,184,0,9,208,48,49,255,255,0,39,255,242,2,71,3,181,2,38,0,36,0,0,1,7,0,204,0,178,0,209,0,34,65,5,0,0,0,41,0,16,0,41,0,2,93,65,3,0,176,0,41,0,1,93,0,65,3,0,47,0,40,0,1,93,48,49,255,255,0,33,255,246,1,171,2,228,2,38,0,68,0,0,1,6,0,204,45,0,0,20,65,3,0,31,0,28,0,1,93,65,3,0,32,0,28,0,1,93,48,49,0,1,0,61,0,0,0,151,1,234,0,3,0,119,187,0,3,0,4,0,2,0,4,43,65,3,0,63,0,2,0,1,113,65,3,0,143,0,2,0,1,93,65,3,0,223,0,2,0,1,93,65,3,0,32,0,2,0,1,93,65,3,0,63,0,3,0,1,113,65,3,0,143,0,3,0,1,93,65,3,0,223,0,3,0,1,93,65,3,0,32,0,3,0,1,93,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,51,35,17,51,151,90,90,1,234,0,0,0,2,0,40,255,242,4,10,2,202,0,28,0,48,2,150,186,0,28,0,1,0,3,43,65,3,0,176,0,1,0,1,93,184,0,1,16,184,0,10,208,184,0,10,47,65,5,0,63,0,10,0,79,0,10,0,2,93,65,3,0,159,0,10,0,1,93,65,3,0,47,0,10,0,1,113,65,3,0,111,0,10,0,1,93,65,3,0,15,0,10,0,1,93,65,3,0,191,0,10,0,1,93,184,0,1,16,184,0,18,208,65,3,0,176,0,28,0,1,93,184,0,28,16,184,0,21,208,184,0,21,47,184,0,1,16,185,0,27,0,4,244,184,0,23,208,184,0,28,16,184,0,25,208,184,0,25,47,184,0,10,16,185,0,34,0,4,244,184,0,1,16,184,0,44,208,65,3,0,137,0,44,0,1,93,65,7,0,9,0,44,0,25,0,44,0,41,0,44,0,3,113,65,3,0,169,0,44,0,1,93,65,3,0,72,0,44,0,1,93,0,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,2,0,5,0,15,17,18,57,65,3,0,92,0,2,0,1,93,65,7,0,12,0,2,0,28,0,2,0,44,0,2,0,3,113,65,3,0,107,0,2,0,1,93,65,5,0,122,0,2,0,138,0,2,0,2,93,65,3,0,66,0,10,0,1,93,186,0,18,0,15,0,5,17,18,57,65,3,0,100,0,18,0,1,93,65,3,0,118,0,18,0,1,93,65,3,0,133,0,18,0,1,93,65,3,0,83,0,18,0,1,93,65,7,0,3,0,18,0,19,0,18,0,35,0,18,0,3,113,184,0,19,16,185,0,22,0,2,244,186,0,23,0,19,0,1,17,18,57,184,0,23,47,185,0,26,0,2,244,184,0,1,16,185,0,27,0,2,244,184,0,15,16,185,0,29,0,2,244,184,0,5,16,185,0,39,0,2,244,48,49,1,65,3,0,120,0,3,0,1,93,65,7,0,89,0,7,0,105,0,7,0,121,0,7,0,3,93,65,3,0,90,0,8,0,1,93,65,3,0,89,0,12,0,1,93,65,3,0,121,0,12,0,1,93,65,3,0,104,0,13,0,1,93,65,3,0,89,0,13,0,1,93,65,3,0,120,0,17,0,1,93,0,65,5,0,89,0,3,0,105,0,3,0,2,93,65,3,0,122,0,3,0,1,93,65,5,0,104,0,7,0,120,0,7,0,2,93,65,3,0,89,0,7,0,1,93,65,3,0,88,0,8,0,1,93,65,3,0,86,0,12,0,1,93,65,3,0,118,0,12,0,1,93,65,5,0,86,0,13,0,102,0,13,0,2,93,65,3,0,84,0,17,0,1,93,65,5,0,102,0,17,0,118,0,17,0,2,93,65,3,0,114,0,18,0,1,93,41,1,53,14,1,35,34,46,2,53,52,62,2,51,50,22,23,53,33,21,33,21,51,21,35,21,33,1,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,4,10,254,102,69,115,62,75,124,90,49,50,90,124,74,62,115,69,1,145,254,202,238,238,1,63,253,112,58,89,60,31,30,60,89,59,58,89,60,30,31,60,89,83,53,44,52,96,134,82,82,135,95,52,44,53,82,85,205,86,237,2,30,41,74,102,61,60,102,74,42,42,74,102,60,61,102,74,41,0,3,0,32,255,246,3,104,1,244,0,43,0,49,0,61,3,73,186,0,42,0,22,0,3,43,65,9,0,63,0,22,0,79,0,22,0,95,0,22,0,111,0,22,0,4,93,65,3,0,207,0,22,0,1,93,65,5,0,96,0,42,0,112,0,42,0,2,93,65,3,0,240,0,42,0,1,93,65,7,0,16,0,42,0,32,0,42,0,48,0,42,0,3,113,65,7,0,144,0,42,0,160,0,42,0,176,0,42,0,3,93,65,3,0,64,0,42,0,1,93,65,5,0,0,0,42,0,16,0,42,0,2,93,186,0,59,0,22,0,42,17,18,57,184,0,59,47,185,0,1,0,4,244,184,0,42,16,184,0,9,208,184,0,9,47,186,0,14,0,1,0,59,17,18,57,186,0,32,0,59,0,1,17,18,57,184,0,1,16,184,0,46,208,184,0,42,16,185,0,47,0,4,244,184,0,22,16,185,0,53,0,4,244,65,3,0,64,0,63,0,1,93,65,3,0,96,0,63,0,1,93,65,3,0,240,0,63,0,1,93,0,184,0,0,69,88,184,0,27,47,27,185,0,27,0,12,62,89,184,0,0,69,88,184,0,37,47,27,185,0,37,0,12,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,6,62,89,184,0,0,69,88,184,0,11,47,27,185,0,11,0,6,62,89,186,0,1,0,37,0,11,17,18,57,184,0,1,47,65,5,0,16,0,1,0,32,0,1,0,2,93,65,5,0,144,0,1,0,160,0,1,0,2,93,184,0,11,16,185,0,6,0,1,244,184,0,11,16,184,0,8,220,186,0,14,0,11,0,37,17,18,57,186,0,32,0,37,0,11,17,18,57,184,0,37,16,185,0,44,0,2,244,184,0,1,16,184,0,46,220,65,15,0,159,0,46,0,175,0,46,0,191,0,46,0,207,0,46,0,223,0,46,0,239,0,46,0,255,0,46,0,7,93,184,0,27,16,185,0,50,0,2,244,184,0,17,16,185,0,56,0,2,244,48,49,1,65,3,0,54,0,3,0,1,93,65,3,0,71,0,3,0,1,93,65,3,0,89,0,13,0,1,93,65,3,0,106,0,13,0,1,93,65,3,0,123,0,13,0,1,93,65,3,0,84,0,15,0,1,93,65,3,0,102,0,15,0,1,93,65,3,0,105,0,19,0,1,93,65,3,0,90,0,19,0,1,93,65,3,0,105,0,25,0,1,93,65,3,0,90,0,25,0,1,93,65,3,0,85,0,30,0,1,93,65,3,0,102,0,30,0,1,93,65,3,0,104,0,34,0,1,93,65,3,0,121,0,34,0,1,93,65,3,0,118,0,39,0,1,93,65,3,0,135,0,39,0,1,93,65,3,0,118,0,40,0,1,93,65,3,0,135,0,40,0,1,93,65,3,0,105,0,45,0,1,93,0,65,5,0,55,0,3,0,71,0,3,0,2,93,65,9,0,91,0,9,0,107,0,9,0,123,0,9,0,139,0,9,0,4,93,65,5,0,104,0,13,0,120,0,13,0,2,93,65,3,0,89,0,13,0,1,93,65,5,0,90,0,14,0,106,0,14,0,2,93,65,3,0,104,0,15,0,1,93,65,3,0,89,0,15,0,1,93,65,5,0,89,0,19,0,105,0,19,0,2,93,65,3,0,85,0,25,0,1,93,65,3,0,102,0,25,0,1,93,65,3,0,85,0,30,0,1,93,65,3,0,102,0,30,0,1,93,65,3,0,101,0,32,0,1,93,65,5,0,118,0,32,0,134,0,32,0,2,93,65,3,0,100,0,34,0,1,93,65,3,0,118,0,34,0,1,93,65,5,0,118,0,39,0,134,0,39,0,2,93,65,3,0,118,0,40,0,1,93,65,3,0,135,0,40,0,1,93,65,3,0,102,0,45,0,1,93,37,33,20,30,2,51,50,55,23,6,35,34,38,39,14,1,35,34,46,2,53,52,62,2,51,50,30,2,23,62,3,51,50,30,2,21,20,39,34,7,51,46,1,33,34,6,21,20,22,51,50,54,53,52,38,3,100,254,169,32,48,55,23,84,71,10,72,81,93,102,23,22,110,67,57,91,64,34,35,65,93,57,28,59,53,40,11,13,42,49,55,27,48,79,55,31,214,107,24,253,4,64,254,82,78,80,79,78,75,77,79,245,57,71,41,14,37,77,32,53,54,51,56,40,70,95,55,54,92,66,38,13,26,38,25,24,38,26,14,28,53,75,48,31,155,113,54,59,91,84,85,90,99,79,78,94,0,255,255,0,40,255,242,2,41,3,181,2,38,0,52,0,0,1,7,0,204,0,69,0,209,0,38,65,3,0,79,0,60,0,1,93,65,7,0,0,0,60,0,16,0,60,0,32,0,60,0,3,93,0,65,3,0,47,0,59,0,1,93,48,49,255,255,0,32,255,246,1,131,2,228,2,38,0,84,0,0,1,6,0,204,232,0,0,29,65,3,0,79,0,42,0,1,93,65,3,0,63,0,43,0,1,93,65,3,0,0,0,43,0,1,93,48,49,0,0,0,255,255,255,253,0,0,2,57,3,141,2,38,0,58,0,0,1,7,0,104,0,85,0,209,0,68,184,0,14,47,65,5,0,16,0,14,0,32,0,14,0,2,93,65,3,0,80,0,14,0,1,113,65,3,0,144,0,14,0,1,93,184,0,10,208,0,184,0,13,47,65,3,0,47,0,13,0,1,93,65,3,0,175,0,13,0,1,93,184,0,10,208,48,49,0,0,255,255,0,9,0,0,2,30,3,181,2,38,0,59,0,0,1,7,0,204,0,60,0,209,0,34,65,5,0,0,0,10,0,16,0,10,0,2,93,65,3,0,32,0,10,0,1,113,0,65,3,0,47,0,9,0,1,93,48,49,255,255,0,22,0,0,1,190,2,228,2,38,0,91,0,0,1,6,0,204,14,0,0,33,65,5,0,111,0,10,0,127,0,10,0,2,93,65,3,0,223,0,10,0,1,93,65,3,0,0,0,10,0,1,93,48,49,0,0,0,0,1,255,222,255,15,1,115,2,202,0,32,1,43,187,0,11,0,5,0,22,0,4,43,184,0,22,16,184,0,25,208,184,0,0,208,184,0,0,47,184,0,11,16,184,0,8,208,184,0,9,208,184,0,9,47,184,0,11,16,184,0,12,208,184,0,19,208,184,0,19,47,184,0,22,16,184,0,21,208,184,0,25,16,184,0,24,208,184,0,24,47,0,184,0,0,69,88,184,0,31,47,27,185,0,31,0,14,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,12,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,8,62,89,184,0,31,16,185,0,3,0,3,244,184,0,8,16,185,0,11,0,3,244,184,0,17,16,185,0,19,0,3,244,184,0,11,16,184,0,22,208,184,0,8,16,184,0,25,208,48,49,1,65,3,0,133,0,6,0,1,93,65,7,0,38,0,6,0,54,0,6,0,70,0,6,0,3,93,65,3,0,102,0,6,0,1,93,65,5,0,119,0,15,0,135,0,15,0,2,93,65,3,0,89,0,28,0,1,93,65,3,0,122,0,28,0,1,93,0,65,3,0,135,0,6,0,1,93,65,5,0,57,0,6,0,73,0,6,0,2,93,65,5,0,121,0,15,0,137,0,15,0,2,93,65,3,0,116,0,28,0,1,93,65,3,0,87,0,28,0,1,93,1,7,38,35,34,14,2,7,51,7,35,3,14,3,43,1,39,54,55,19,35,55,51,55,62,3,51,50,1,115,7,13,19,30,43,30,20,8,148,6,153,86,6,27,32,34,13,13,13,57,14,80,94,7,96,9,6,33,49,61,35,17,2,191,55,8,16,39,64,47,56,253,242,40,56,36,17,63,12,89,1,255,56,61,39,60,42,22,0,0,0,0,1,255,244,255,14,0,151,1,234,0,14,0,163,187,0,9,0,4,0,8,0,4,43,65,3,0,63,0,8,0,1,113,65,3,0,143,0,8,0,1,93,65,3,0,223,0,8,0,1,93,65,3,0,32,0,8,0,1,93,184,0,8,16,184,0,2,208,184,0,2,47,65,3,0,143,0,9,0,1,93,65,3,0,223,0,9,0,1,93,65,3,0,63,0,9,0,1,113,65,3,0,32,0,9,0,1,93,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,8,62,89,185,0,2,0,1,244,48,49,1,65,11,0,5,0,12,0,21,0,12,0,37,0,12,0,53,0,12,0,69,0,12,0,5,93,23,7,39,62,3,53,17,51,17,20,14,2,28,30,10,22,28,16,7,90,20,33,45,237,5,69,2,10,21,37,30,2,51,253,171,32,45,31,18,0,1,0,76,2,91,1,114,2,233,0,5,0,130,25,184,0,4,47,24,65,3,0,0,0,4,0,1,93,184,0,1,208,184,0,4,16,184,0,3,208,184,0,3,47,184,0,4,16,184,0,5,208,184,0,5,47,0,184,0,2,47,65,3,0,64,0,2,0,1,93,65,3,0,32,0,2,0,1,93,184,0,0,208,184,0,2,16,184,0,4,220,65,5,0,15,0,4,0,31,0,4,0,2,93,65,9,0,95,0,4,0,111,0,4,0,127,0,4,0,143,0,4,0,4,93,184,0,1,220,184,0,2,16,184,0,3,220,184,0,5,208,48,49,1,39,7,53,55,23,1,114,147,147,147,147,2,91,82,82,36,106,106,0,0,1,0,76,2,88,1,114,2,228,0,5,0,130,25,184,0,1,47,24,184,0,0,208,184,0,0,47,184,0,1,16,184,0,2,208,184,0,2,47,184,0,1,16,184,0,4,208,0,184,0,1,47,65,3,0,64,0,1,0,1,93,65,3,0,32,0,1,0,1,93,184,0,3,220,65,9,0,95,0,3,0,111,0,3,0,127,0,3,0,143,0,3,0,4,93,65,5,0,15,0,3,0,31,0,3,0,2,93,184,0,2,220,184,0,0,208,184,0,1,16,184,0,4,220,65,3,0,240,0,4,0,1,93,184,0,3,16,184,0,5,208,48,49,1,7,39,53,23,55,1,114,147,147,147,147,2,187,99,99,41,76,76,0,0,2,0,42,2,64,0,249,2,243,0,14,0,26,1,101,184,0,3,47,184,0,11,220,65,3,0,32,0,11,0,1,113,65,3,0,208,0,11,0,1,93,184,0,3,16,184,0,15,220,184,0,11,16,184,0,21,220,0,184,0,14,47,65,3,0,95,0,14,0,1,113,65,3,0,239,0,14,0,1,93,65,3,0,207,0,14,0,1,93,65,3,0,128,0,14,0,1,93,65,3,0,96,0,14,0,1,93,184,0,6,220,65,3,0,15,0,6,0,1,113,65,7,0,143,0,6,0,159,0,6,0,175,0,6,0,3,93,65,3,0,79,0,6,0,1,93,184,0,14,16,184,0,18,220,184,0,6,16,184,0,24,220,48,49,1,65,9,0,74,0,2,0,90,0,2,0,106,0,2,0,122,0,2,0,4,93,65,9,0,73,0,4,0,89,0,4,0,105,0,4,0,121,0,4,0,4,93,65,9,0,70,0,9,0,86,0,9,0,102,0,9,0,118,0,9,0,4,93,65,9,0,70,0,12,0,86,0,12,0,102,0,12,0,118,0,12,0,4,93,0,65,9,0,73,0,1,0,89,0,1,0,105,0,1,0,121,0,1,0,4,93,65,9,0,70,0,5,0,86,0,5,0,102,0,5,0,118,0,5,0,4,93,65,9,0,70,0,8,0,86,0,8,0,102,0,8,0,118,0,8,0,4,93,65,9,0,72,0,12,0,88,0,12,0,104,0,12,0,120,0,12,0,4,93,65,9,0,73,0,13,0,89,0,13,0,105,0,13,0,121,0,13,0,4,93,65,7,0,53,0,16,0,69,0,16,0,85,0,16,0,3,113,19,34,38,53,52,54,51,50,30,2,21,20,6,35,39,20,22,51,50,54,53,52,38,35,34,6,146,49,55,58,52,24,37,24,12,48,48,67,36,24,24,36,35,25,25,35,2,64,52,37,39,51,15,26,32,17,34,55,89,27,33,33,27,26,33,33,0,0,1,0,92,2,87,1,182,2,190,0,23,1,42,184,0,8,47,65,3,0,0,0,8,0,1,93,184,0,7,220,184,0,8,16,184,0,21,220,184,0,20,220,0,184,0,0,47,65,3,0,64,0,0,0,1,93,65,3,0,32,0,0,0,1,93,184,0,13,220,65,9,0,47,0,13,0,63,0,13,0,79,0,13,0,95,0,13,0,4,93,184,0,5,220,65,5,0,48,0,5,0,64,0,5,0,2,113,184,0,0,16,184,0,7,208,184,0,7,47,184,0,0,16,184,0,18,220,65,3,0,63,0,18,0,1,113,184,0,13,16,184,0,20,208,184,0,20,47,48,49,1,65,7,0,6,0,6,0,22,0,6,0,38,0,6,0,3,113,65,5,0,40,0,10,0,56,0,10,0,2,93,65,5,0,40,0,11,0,56,0,11,0,2,93,65,7,0,11,0,19,0,27,0,19,0,43,0,19,0,3,113,65,5,0,37,0,22,0,53,0,22,0,2,93,0,65,7,0,9,0,6,0,25,0,6,0,41,0,6,0,3,113,65,5,0,37,0,10,0,53,0,10,0,2,93,65,5,0,38,0,11,0,54,0,11,0,2,93,65,7,0,7,0,19,0,23,0,19,0,39,0,19,0,3,113,65,5,0,40,0,22,0,56,0,22,0,2,93,65,5,0,41,0,23,0,57,0,23,0,2,93,1,34,46,2,35,34,7,39,62,3,51,50,30,2,51,50,55,23,14,1,1,75,12,36,41,32,11,53,18,36,6,20,30,32,15,13,36,46,35,10,42,27,34,11,58,2,87,16,19,16,49,9,22,34,23,11,15,19,15,51,9,43,51,0,0,1,0,57,0,238,1,189,1,68,0,3,0,19,184,0,1,47,184,0,0,220,0,184,0,1,47,184,0,2,220,48,49,37,33,53,33,1,189,254,124,1,132,238,86,0,0,0,0,1,0,57,0,238,2,25,1,68,0,3,0,28,184,0,1,47,65,3,0,0,0,1,0,1,93,184,0,0,220,0,184,0,1,47,184,0,2,220,48,49,37,33,53,33,2,25,254,32,1,224,238,86,0,0,0,1,0,43,2,43,0,144,2,238,0,6,0,58,184,0,0,47,184,0,4,220,184,0,2,208,186,0,3,0,0,0,4,17,18,57,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,18,62,89,184,0,4,220,184,0,0,208,184,0,4,16,184,0,5,220,48,49,19,55,23,7,23,21,35,43,78,23,35,34,100,2,129,109,13,87,9,86,0,1,0,42,2,43,0,143,2,238,0,6,0,58,184,0,0,47,184,0,4,220,184,0,2,208,186,0,3,0,4,0,0,17,18,57,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,18,62,89,184,0,4,220,184,0,0,208,184,0,4,16,184,0,1,220,48,49,19,7,39,55,39,53,51,143,78,23,35,34,100,2,152,109,13,87,9,86,0,1,0,57,255,147,0,158,0,86,0,6,0,62,184,0,0,47,184,0,4,220,184,0,2,208,186,0,3,0,4,0,0,17,18,57,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,208,184,0,4,16,184,0,1,220,184,0,4,16,184,0,5,220,48,49,51,7,39,55,39,53,51,158,78,23,35,34,100,109,13,87,9,86,0,0,0,2,0,43,2,43,1,98,2,238,0,6,0,13,0,116,184,0,6,47,184,0,5,220,184,0,2,208,186,0,3,0,6,0,5,17,18,57,184,0,6,16,184,0,13,220,184,0,12,220,184,0,9,208,186,0,10,0,13,0,12,17,18,57,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,18,62,89,184,0,4,220,184,0,0,208,184,0,4,16,184,0,5,220,184,0,4,16,184,0,7,208,184,0,1,16,184,0,8,208,184,0,7,16,184,0,11,208,184,0,5,16,184,0,13,208,48,49,19,55,23,7,23,21,35,63,1,23,7,23,21,35,43,78,23,35,34,100,210,78,23,35,34,100,2,129,109,13,87,9,86,86,109,13,87,9,86,0,0,2,0,42,2,43,1,97,2,238,0,6,0,13,0,118,184,0,6,47,184,0,5,220,184,0,2,208,186,0,3,0,5,0,6,17,18,57,184,0,6,16,184,0,13,220,184,0,12,220,184,0,9,208,186,0,10,0,12,0,13,17,18,57,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,18,62,89,184,0,11,220,184,0,4,208,184,0,0,208,184,0,11,16,184,0,8,220,184,0,1,208,184,0,12,16,184,0,5,208,184,0,11,16,184,0,7,208,48,49,1,65,3,0,89,0,1,0,1,93,1,7,39,55,39,53,51,15,1,39,55,39,53,51,1,97,78,23,35,34,100,210,78,23,35,34,100,2,152,109,13,87,9,86,86,109,13,87,9,86,0,0,0,2,0,57,255,147,1,132,0,86,0,6,0,13,0,138,184,0,7,47,65,3,0,80,0,7,0,1,113,184,0,0,220,65,5,0,79,0,0,0,95,0,0,0,2,113,184,0,4,220,184,0,2,208,186,0,3,0,4,0,0,17,18,57,184,0,7,16,184,0,11,220,184,0,9,208,186,0,10,0,11,0,7,17,18,57,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,208,184,0,4,16,184,0,1,220,184,0,4,16,184,0,5,220,184,0,4,16,184,0,11,208,184,0,7,208,184,0,1,16,184,0,8,208,184,0,5,16,184,0,12,208,48,49,51,7,39,55,39,53,51,23,7,39,55,39,53,51,158,78,23,35,34,100,230,78,23,35,34,100,109,13,87,9,86,86,109,13,87,9,86,0,0,1,0,35,0,0,1,133,2,95,0,13,0,196,184,0,10,47,65,3,0,16,0,10,0,1,93,184,0,11,220,65,9,0,80,0,11,0,96,0,11,0,112,0,11,0,128,0,11,0,4,93,186,0,12,0,11,0,10,17,18,57,184,0,12,16,184,0,1,208,184,0,11,16,184,0,2,208,184,0,10,16,184,0,5,208,186,0,9,0,10,0,11,17,18,57,184,0,9,16,184,0,6,208,184,0,10,16,184,0,8,220,184,0,11,16,184,0,13,220,0,184,0,10,47,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,186,0,8,0,10,0,4,17,18,57,184,0,8,47,184,0,7,220,184,0,0,208,186,0,6,0,7,0,8,17,18,57,184,0,6,16,184,0,1,208,186,0,9,0,8,0,7,17,18,57,184,0,9,16,184,0,12,208,184,0,8,16,184,0,13,208,48,49,1,39,23,7,35,39,55,7,53,23,39,51,7,55,1,133,158,41,31,58,31,41,158,156,34,110,34,156,1,117,30,151,252,252,151,30,85,31,180,180,31,0,0,1,0,53,255,197,1,151,2,95,0,21,1,61,184,0,13,47,65,3,0,0,0,13,0,1,93,184,0,14,220,65,9,0,80,0,14,0,96,0,14,0,112,0,14,0,128,0,14,0,4,93,186,0,15,0,14,0,13,17,18,57,184,0,15,16,184,0,1,208,184,0,14,16,184,0,2,208,184,0,13,16,184,0,3,208,186,0,12,0,13,0,14,17,18,57,184,0,12,16,184,0,4,208,184,0,13,16,184,0,11,220,184,0,6,208,184,0,4,16,184,0,7,208,184,0,13,16,184,0,8,208,184,0,12,16,184,0,9,208,184,0,14,16,184,0,16,220,184,0,15,16,184,0,18,208,184,0,14,16,184,0,19,208,184,0,1,16,184,0,20,208,184,0,16,16,184,0,21,208,0,184,0,14,47,184,0,3,47,186,0,0,0,3,0,14,17,18,57,184,0,0,47,184,0,21,220,186,0,1,0,0,0,21,17,18,57,184,0,1,16,184,0,4,208,184,0,0,16,184,0,5,208,184,0,21,16,184,0,6,208,186,0,20,0,21,0,0,17,18,57,184,0,20,16,184,0,7,208,186,0,16,0,14,0,3,17,18,57,184,0,16,47,184,0,17,220,186,0,18,0,17,0,16,17,18,57,184,0,18,16,184,0,9,208,184,0,17,16,184,0,10,208,184,0,16,16,184,0,11,208,186,0,15,0,16,0,17,17,18,57,184,0,15,16,184,0,12,208,48,49,37,39,23,35,55,7,53,23,39,55,7,53,23,39,51,7,55,21,39,23,7,55,1,151,156,34,110,34,156,160,43,43,160,156,34,110,34,156,160,43,43,160,88,30,177,177,30,84,30,132,133,30,84,30,176,176,30,84,30,133,132,30,0,0,0,0,1,0,44,0,169,1,6,1,131,0,20,0,19,184,0,8,47,184,0,18,220,0,184,0,3,47,184,0,13,220,48,49,55,14,1,35,34,46,2,53,52,62,2,51,50,30,2,21,20,6,230,17,39,21,22,39,30,18,18,30,39,22,22,39,30,18,16,201,17,15,18,30,39,22,22,39,30,18,18,30,39,22,21,40,0,0,0,0,3,0,57,0,0,2,107,0,86,0,3,0,7,0,11,0,121,184,0,1,47,65,3,0,0,0,1,0,1,93,65,3,0,32,0,1,0,1,93,185,0,0,0,4,244,184,0,1,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,9,220,185,0,8,0,4,244,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,220,65,3,0,63,0,2,0,1,113,184,0,1,16,184,0,5,208,184,0,2,16,184,0,6,208,184,0,5,16,184,0,9,208,184,0,6,16,184,0,10,208,48,49,51,35,53,51,23,35,53,51,23,35,53,51,147,90,90,236,90,90,236,90,90,86,86,86,86,86,0,0,0,0,7,0,36,255,242,4,141,2,193,0,3,0,21,0,37,0,55,0,71,0,89,0,105,3,55,184,0,7,47,184,0,41,47,65,7,0,0,0,41,0,16,0,41,0,32,0,41,0,3,93,184,0,51,220,186,0,1,0,7,0,51,17,18,57,184,0,1,47,184,0,0,220,184,0,1,16,184,0,3,220,184,0,2,220,184,0,7,16,184,0,17,220,184,0,7,16,184,0,27,220,65,3,0,31,0,27,0,1,113,184,0,17,16,184,0,33,220,65,3,0,16,0,33,0,1,113,184,0,41,16,184,0,61,220,65,3,0,31,0,61,0,1,113,184,0,51,16,184,0,67,220,65,3,0,16,0,67,0,1,113,184,0,41,16,184,0,75,220,184,0,85,220,184,0,75,16,184,0,95,220,65,3,0,31,0,95,0,1,113,184,0,85,16,184,0,101,220,65,3,0,16,0,101,0,1,113,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,38,47,27,185,0,38,0,6,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,12,16,184,0,4,220,184,0,12,16,184,0,22,220,184,0,4,16,184,0,30,220,184,0,38,16,184,0,46,220,184,0,56,220,184,0,38,16,184,0,64,220,184,0,38,16,184,0,72,208,184,0,46,16,184,0,80,208,184,0,56,16,184,0,90,208,184,0,64,16,184,0,98,208,48,49,1,65,3,0,87,0,0,0,1,93,65,3,0,202,0,5,0,1,93,65,7,0,10,0,6,0,26,0,6,0,42,0,6,0,3,93,65,7,0,10,0,9,0,26,0,9,0,42,0,9,0,3,93,65,3,0,202,0,10,0,1,93,65,3,0,198,0,14,0,1,93,65,7,0,6,0,15,0,22,0,15,0,38,0,15,0,3,93,65,7,0,5,0,19,0,21,0,19,0,37,0,19,0,3,93,65,3,0,198,0,20,0,1,93,65,5,0,118,0,24,0,134,0,24,0,2,93,65,7,0,10,0,40,0,26,0,40,0,42,0,40,0,3,93,65,7,0,9,0,43,0,25,0,43,0,41,0,43,0,3,93,65,3,0,201,0,44,0,1,93,65,3,0,197,0,48,0,1,93,65,7,0,5,0,49,0,21,0,49,0,37,0,49,0,3,93,65,7,0,5,0,53,0,21,0,53,0,37,0,53,0,3,93,65,3,0,198,0,54,0,1,93,65,5,0,118,0,58,0,134,0,58,0,2,93,65,3,0,200,0,73,0,1,93,65,7,0,10,0,74,0,26,0,74,0,42,0,74,0,3,93,65,7,0,10,0,77,0,26,0,77,0,42,0,77,0,3,93,65,3,0,201,0,78,0,1,93,65,3,0,197,0,82,0,1,93,65,7,0,5,0,83,0,21,0,83,0,37,0,83,0,3,93,65,7,0,5,0,87,0,21,0,87,0,37,0,87,0,3,93,65,3,0,198,0,88,0,1,93,65,5,0,118,0,92,0,134,0,92,0,2,93,0,65,3,0,202,0,5,0,1,93,65,7,0,5,0,9,0,21,0,9,0,37,0,9,0,3,93,65,3,0,197,0,10,0,1,93,65,3,0,198,0,14,0,1,93,65,7,0,7,0,15,0,23,0,15,0,39,0,15,0,3,93,65,3,0,200,0,20,0,1,93,65,3,0,202,0,39,0,1,93,65,3,0,198,0,44,0,1,93,65,3,0,198,0,48,0,1,93,65,3,0,203,0,54,0,1,93,65,3,0,201,0,73,0,1,93,65,3,0,199,0,78,0,1,93,65,3,0,198,0,82,0,1,93,65,3,0,202,0,88,0,1,93,23,35,1,51,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,238,75,1,165,74,254,36,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,1,195,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,1,81,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,12,2,200,254,145,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,253,101,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,254,192,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,0,0,1,0,14,0,78,1,26,1,234,0,5,0,219,184,0,2,47,65,9,0,95,0,2,0,111,0,2,0,127,0,2,0,143,0,2,0,4,93,65,3,0,255,0,2,0,1,93,184,0,4,220,65,3,0,128,0,4,0,1,93,65,3,0,80,0,4,0,1,93,184,0,0,208,184,0,4,16,184,0,3,220,65,9,0,95,0,3,0,111,0,3,0,127,0,3,0,143,0,3,0,4,93,65,5,0,239,0,3,0,255,0,3,0,2,93,65,7,0,15,0,3,0,31,0,3,0,47,0,3,0,3,113,184,0,1,208,184,0,2,16,184,0,5,220,65,9,0,80,0,5,0,96,0,5,0,112,0,5,0,128,0,5,0,4,93,65,5,0,224,0,5,0,240,0,5,0,2,93,65,7,0,0,0,5,0,16,0,5,0,32,0,5,0,3,113,0,25,184,0,2,47,24,184,0,1,208,184,0,1,47,184,0,2,16,184,0,3,208,184,0,3,47,184,0,2,16,184,0,5,208,48,49,37,35,39,55,51,7,1,26,109,159,159,109,159,78,206,206,206,0,0,0,1,0,41,0,78,1,53,1,234,0,5,0,207,184,0,0,47,65,3,0,0,0,0,0,1,93,65,3,0,160,0,0,0,1,93,184,0,4,220,65,3,0,143,0,4,0,1,93,65,3,0,95,0,4,0,1,93,184,0,5,220,65,9,0,80,0,5,0,96,0,5,0,112,0,5,0,128,0,5,0,4,93,65,5,0,224,0,5,0,240,0,5,0,2,93,65,7,0,0,0,5,0,16,0,5,0,32,0,5,0,3,113,184,0,1,208,184,0,4,16,184,0,2,208,184,0,0,16,184,0,3,220,65,9,0,95,0,3,0,111,0,3,0,127,0,3,0,143,0,3,0,4,93,65,5,0,239,0,3,0,255,0,3,0,2,93,65,7,0,15,0,3,0,31,0,3,0,47,0,3,0,3,113,0,25,184,0,0,47,24,184,0,1,208,184,0,1,47,184,0,0,16,184,0,3,208,184,0,0,16,184,0,5,208,184,0,5,47,48,49,1,7,35,55,39,51,1,53,159,109,159,159,109,1,28,206,206,206,0,0,2,0,33,1,56,1,118,2,194,0,19,0,31,2,137,186,0,15,0,5,0,3,43,65,3,0,223,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,64,0,5,0,1,93,65,3,0,176,0,15,0,1,93,65,3,0,0,0,15,0,1,113,65,3,0,48,0,15,0,1,113,65,3,0,224,0,15,0,1,93,65,3,0,64,0,15,0,1,93,65,5,0,16,0,15,0,32,0,15,0,2,93,184,0,5,16,185,0,20,0,5,244,184,0,15,16,185,0,26,0,5,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,65,3,0,135,0,5,0,1,93,185,0,23,0,1,244,184,0,10,16,185,0,29,0,1,244,48,49,1,65,3,0,152,0,1,0,1,93,65,3,0,184,0,2,0,1,93,65,3,0,169,0,2,0,1,93,65,3,0,24,0,3,0,1,93,65,3,0,9,0,3,0,1,93,65,3,0,41,0,3,0,1,93,65,5,0,74,0,3,0,90,0,3,0,2,113,65,5,0,73,0,7,0,89,0,7,0,2,113,65,3,0,10,0,7,0,1,93,65,5,0,166,0,12,0,182,0,12,0,2,93,65,3,0,39,0,12,0,1,93,65,3,0,151,0,12,0,1,93,65,5,0,68,0,13,0,84,0,13,0,2,113,65,5,0,6,0,13,0,22,0,13,0,2,93,65,3,0,6,0,18,0,1,93,65,3,0,182,0,18,0,1,93,65,5,0,23,0,18,0,39,0,18,0,2,93,65,5,0,151,0,18,0,167,0,18,0,2,93,65,3,0,217,0,21,0,1,93,65,3,0,234,0,21,0,1,93,65,5,0,75,0,21,0,91,0,21,0,2,113,65,3,0,138,0,24,0,1,93,65,3,0,138,0,28,0,1,93,65,3,0,132,0,30,0,1,93,65,5,0,71,0,30,0,87,0,30,0,2,113,0,65,3,0,153,0,1,0,1,93,65,3,0,168,0,2,0,1,93,65,3,0,186,0,2,0,1,93,65,5,0,71,0,3,0,87,0,3,0,2,113,65,7,0,8,0,3,0,24,0,3,0,40,0,3,0,3,93,65,3,0,7,0,7,0,1,93,65,3,0,181,0,12,0,1,93,65,3,0,38,0,12,0,1,93,65,5,0,150,0,12,0,166,0,12,0,2,93,65,5,0,7,0,13,0,23,0,13,0,2,93,65,5,0,71,0,13,0,87,0,13,0,2,113,65,5,0,72,0,17,0,88,0,17,0,2,113,65,3,0,184,0,18,0,1,93,65,7,0,9,0,18,0,25,0,18,0,41,0,18,0,3,93,65,5,0,153,0,18,0,169,0,18,0,2,93,65,3,0,231,0,21,0,1,93,65,3,0,216,0,21,0,1,93,65,3,0,135,0,24,0,1,93,19,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,39,20,22,51,50,54,53,52,38,35,34,6,200,38,61,44,24,27,46,64,37,36,61,45,25,25,46,64,132,52,42,45,55,55,40,40,59,1,56,27,50,71,43,44,74,54,31,29,52,71,42,45,74,52,29,191,64,62,66,69,63,67,72,0,2,0,5,1,64,1,47,2,186,0,9,0,12,0,160,186,0,2,0,5,0,3,43,65,3,0,159,0,2,0,1,93,65,3,0,16,0,2,0,1,93,184,0,2,16,185,0,3,0,5,244,184,0,10,208,184,0,2,16,184,0,8,208,186,0,6,0,10,0,8,17,18,57,184,0,9,208,184,0,9,47,184,0,5,16,184,0,12,208,65,3,0,70,0,12,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,10,62,89,186,0,1,0,6,0,2,17,18,57,184,0,1,47,184,0,4,208,184,0,1,16,185,0,8,0,3,244,184,0,10,208,184,0,6,16,184,0,11,208,48,49,1,35,21,35,53,35,19,51,21,51,35,53,7,1,47,49,74,175,187,62,49,123,74,1,167,103,103,1,19,218,110,110,0,1,0,24,1,57,1,22,2,186,0,24,1,71,186,0,20,0,4,0,3,43,65,5,0,111,0,4,0,127,0,4,0,2,93,65,5,0,159,0,4,0,175,0,4,0,2,93,65,3,0,80,0,20,0,1,113,65,3,0,127,0,20,0,1,93,65,5,0,16,0,20,0,32,0,20,0,2,93,65,3,0,32,0,20,0,1,113,65,3,0,80,0,20,0,1,93,184,0,20,16,185,0,9,0,5,244,186,0,12,0,4,0,20,17,18,57,184,0,12,47,184,0,11,208,184,0,12,16,184,0,13,208,186,0,14,0,4,0,20,17,18,57,184,0,14,47,184,0,11,16,184,0,16,208,186,0,17,0,16,0,11,17,18,57,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,5,220,65,5,0,112,0,5,0,128,0,5,0,2,93,184,0,0,16,185,0,7,0,1,244,186,0,17,0,14,0,0,17,18,57,184,0,17,47,185,0,11,0,3,244,184,0,14,16,185,0,15,0,1,244,48,49,1,65,5,0,52,0,19,0,68,0,19,0,2,93,65,5,0,86,0,19,0,102,0,19,0,2,93,65,3,0,68,0,22,0,1,93,65,3,0,52,0,23,0,1,93,65,3,0,22,0,23,0,1,93,65,3,0,39,0,23,0,1,93,0,65,3,0,41,0,23,0,1,93,65,3,0,26,0,23,0,1,93,19,34,46,1,39,55,22,51,50,53,52,43,1,55,51,7,35,7,30,1,21,20,14,2,130,17,36,31,22,17,35,52,78,99,62,25,187,8,123,10,85,77,24,41,53,1,57,7,10,15,65,29,61,55,201,70,71,1,54,58,32,48,34,17,0,0,0,0,2,0,32,1,56,1,44,2,186,0,23,0,35,1,231,186,0,19,0,3,0,3,43,65,3,0,207,0,3,0,1,93,65,3,0,111,0,3,0,1,93,65,5,0,143,0,3,0,159,0,3,0,2,93,65,3,0,64,0,3,0,1,93,65,3,0,64,0,19,0,1,93,65,3,0,207,0,19,0,1,93,65,3,0,111,0,19,0,1,93,65,3,0,159,0,19,0,1,93,65,3,0,16,0,19,0,1,93,65,5,0,48,0,19,0,64,0,19,0,2,113,65,3,0,0,0,19,0,1,113,186,0,9,0,19,0,3,17,18,57,184,0,9,47,184,0,3,16,185,0,27,0,5,244,184,0,14,208,65,7,0,39,0,14,0,55,0,14,0,71,0,14,0,3,93,184,0,19,16,185,0,33,0,5,244,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,8,16,185,0,11,0,3,244,184,0,0,16,184,0,16,220,65,3,0,95,0,16,0,1,93,65,3,0,47,0,16,0,1,113,186,0,14,0,16,0,0,17,18,57,185,0,24,0,3,244,184,0,0,16,185,0,30,0,1,244,48,49,1,65,7,0,42,0,2,0,58,0,2,0,74,0,2,0,3,93,65,3,0,104,0,6,0,1,93,65,3,0,136,0,6,0,1,93,65,3,0,89,0,6,0,1,93,65,3,0,121,0,6,0,1,93,65,5,0,87,0,17,0,103,0,17,0,2,93,65,7,0,37,0,18,0,53,0,18,0,69,0,18,0,3,93,65,3,0,118,0,18,0,1,93,65,3,0,135,0,18,0,1,93,65,7,0,37,0,21,0,53,0,21,0,69,0,21,0,3,93,0,65,3,0,116,0,6,0,1,93,65,3,0,101,0,6,0,1,93,65,3,0,87,0,6,0,1,93,65,3,0,135,0,6,0,1,93,65,3,0,86,0,7,0,1,93,65,7,0,37,0,17,0,53,0,17,0,69,0,17,0,3,93,65,3,0,102,0,17,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,118,0,18,0,1,93,65,3,0,135,0,18,0,1,93,19,34,38,53,52,62,2,51,23,34,14,2,7,54,51,50,22,21,20,14,2,39,34,6,21,20,22,51,50,54,53,52,38,158,57,69,36,53,61,24,49,16,49,45,32,3,18,50,54,68,21,37,53,16,31,38,39,23,29,36,30,1,56,71,75,48,87,66,39,28,29,43,49,21,19,55,54,26,45,35,20,177,30,29,24,29,37,26,19,30,0,0,0,0,1,0,23,1,64,1,34,2,186,0,5,0,150,186,0,0,0,5,0,3,43,65,3,0,175,0,0,0,1,93,65,5,0,10,0,0,0,26,0,0,0,2,93,65,3,0,118,0,0,0,1,93,184,0,0,16,184,0,1,208,184,0,0,16,184,0,3,208,65,3,0,138,0,3,0,1,93,65,5,0,105,0,3,0,121,0,3,0,2,93,65,5,0,73,0,3,0,89,0,3,0,2,113,184,0,2,208,65,3,0,175,0,5,0,1,93,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,10,62,89,184,0,5,16,185,0,4,0,1,244,48,49,1,3,35,19,35,53,1,34,170,77,139,159,2,186,254,134,1,52,70,0,0,3,0,31,1,56,1,59,2,194,0,22,0,30,0,42,2,97,186,0,18,0,3,0,3,43,65,5,0,127,0,3,0,143,0,3,0,2,93,65,3,0,191,0,3,0,1,93,65,3,0,48,0,3,0,1,93,65,3,0,80,0,18,0,1,113,65,5,0,0,0,18,0,16,0,18,0,2,93,65,3,0,192,0,18,0,1,93,65,3,0,48,0,18,0,1,93,186,0,7,0,3,0,18,17,18,57,184,0,7,47,186,0,13,0,18,0,3,17,18,57,184,0,13,47,186,0,5,0,7,0,13,17,18,57,65,3,0,25,0,5,0,1,113,65,7,0,40,0,5,0,56,0,5,0,72,0,5,0,3,93,186,0,15,0,13,0,7,17,18,57,184,0,7,16,185,0,25,0,5,244,184,0,13,16,185,0,29,0,5,244,184,0,3,16,185,0,34,0,5,244,184,0,18,16,185,0,40,0,5,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,186,0,27,0,10,0,0,17,18,57,184,0,27,47,65,5,0,223,0,27,0,239,0,27,0,2,93,65,3,0,31,0,27,0,1,93,185,0,31,0,3,244,186,0,5,0,27,0,31,17,18,57,186,0,15,0,27,0,31,17,18,57,184,0,10,16,185,0,23,0,3,244,184,0,0,16,185,0,37,0,3,244,48,49,1,65,3,0,104,0,1,0,1,93,65,3,0,89,0,2,0,1,93,65,7,0,42,0,2,0,58,0,2,0,74,0,2,0,3,93,65,7,0,41,0,8,0,57,0,8,0,73,0,8,0,3,93,65,5,0,105,0,8,0,121,0,8,0,2,93,65,3,0,90,0,8,0,1,93,65,3,0,103,0,9,0,1,93,65,7,0,40,0,9,0,56,0,9,0,72,0,9,0,3,93,65,3,0,103,0,11,0,1,93,65,3,0,116,0,12,0,1,93,65,9,0,37,0,12,0,53,0,12,0,69,0,12,0,85,0,12,0,4,93,65,7,0,39,0,21,0,55,0,21,0,71,0,21,0,3,93,0,65,7,0,42,0,1,0,58,0,1,0,74,0,1,0,3,93,65,7,0,106,0,1,0,122,0,1,0,138,0,1,0,3,93,65,3,0,100,0,9,0,1,93,65,3,0,133,0,9,0,1,93,65,7,0,38,0,9,0,54,0,9,0,70,0,9,0,3,93,65,3,0,118,0,9,0,1,93,65,7,0,37,0,11,0,53,0,11,0,69,0,11,0,3,93,65,3,0,101,0,11,0,1,93,65,3,0,133,0,11,0,1,93,65,3,0,87,0,12,0,1,93,65,7,0,41,0,21,0,57,0,21,0,73,0,21,0,3,93,19,34,38,53,52,55,38,53,52,54,51,50,22,21,20,7,30,1,21,20,14,2,3,34,21,20,23,54,53,52,7,14,1,21,20,22,51,50,54,53,52,38,167,67,69,63,40,57,64,63,55,50,32,40,19,37,56,30,54,51,55,50,30,43,36,32,34,38,38,1,56,62,46,60,44,28,58,42,54,49,39,54,36,13,52,32,23,43,33,20,1,82,47,41,12,13,42,45,151,4,39,30,27,30,32,27,29,36,0,0,2,0,22,1,64,1,35,2,194,0,23,0,34,1,99,186,0,3,0,19,0,3,43,65,3,0,16,0,3,0,1,93,65,3,0,111,0,3,0,1,93,65,3,0,159,0,3,0,1,93,65,3,0,64,0,3,0,1,113,65,3,0,64,0,3,0,1,93,65,3,0,15,0,19,0,1,113,65,3,0,63,0,19,0,1,113,65,5,0,143,0,19,0,159,0,19,0,2,93,65,3,0,111,0,19,0,1,93,186,0,9,0,19,0,3,17,18,57,184,0,9,47,184,0,3,16,185,0,27,0,5,244,184,0,14,208,184,0,19,16,185,0,32,0,5,244,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,14,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,10,62,89,185,0,11,0,3,244,184,0,0,16,184,0,16,220,65,3,0,80,0,16,0,1,93,65,3,0,32,0,16,0,1,113,186,0,14,0,0,0,16,17,18,57,185,0,24,0,3,244,184,0,0,16,185,0,29,0,1,244,48,49,1,65,7,0,41,0,18,0,57,0,18,0,73,0,18,0,3,93,65,9,0,90,0,18,0,106,0,18,0,122,0,18,0,138,0,18,0,4,93,65,7,0,41,0,22,0,57,0,22,0,73,0,22,0,3,93,0,65,7,0,36,0,1,0,52,0,1,0,68,0,1,0,3,93,65,9,0,90,0,7,0,106,0,7,0,122,0,7,0,138,0,7,0,4,93,65,7,0,42,0,17,0,58,0,17,0,74,0,17,0,3,93,65,7,0,37,0,22,0,53,0,22,0,69,0,22,0,3,93,19,50,22,21,20,14,2,35,39,50,62,2,55,6,35,34,38,53,52,62,2,23,50,54,53,52,35,34,6,21,20,22,164,57,70,31,53,62,29,47,16,49,46,33,2,19,52,55,67,21,38,52,18,31,38,61,30,34,27,2,194,72,73,47,87,67,40,28,25,40,51,26,19,55,52,27,46,35,20,177,29,29,54,36,24,22,30,0,0,255,255,0,45,255,249,1,130,1,131,1,7,0,222,0,12,254,193,0,24,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,23,208,48,49,255,255,0,38,0,1,0,170,1,123,1,7,0,120,0,15,254,193,0,20,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,255,255,0,38,0,1,1,30,1,131,1,7,0,113,0,13,254,193,0,20,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,255,255,0,32,255,249,1,34,1,131,1,7,0,114,0,13,254,193,0,20,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,255,255,0,18,0,1,1,60,1,123,1,7,0,223,0,13,254,193,0,24,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,10,208,48,49,255,255,0,35,255,250,1,33,1,123,1,7,0,224,0,11,254,193,0,20,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,255,255,0,45,255,249,1,57,1,123,1,7,0,225,0,13,254,193,0,24,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,30,208,48,49,255,255,0,42,0,1,1,53,1,123,1,7,0,226,0,19,254,193,0,20,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,255,255,0,44,255,249,1,72,1,131,1,7,0,227,0,13,254,193,0,32,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,27,208,184,0,0,16,184,0,37,208,48,49,255,255,0,32,0,1,1,45,1,131,1,7,0,228,0,10,254,193,0,24,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,24,208,48,49,0,1,0,33,0,17,2,134,2,171,0,41,2,76,186,0,17,0,6,0,3,43,65,5,0,127,0,6,0,143,0,6,0,2,93,65,3,0,95,0,6,0,1,113,65,3,0,0,0,6,0,1,93,184,0,6,16,184,0,0,208,184,0,6,16,184,0,1,208,184,0,1,47,184,0,6,16,184,0,8,208,184,0,8,47,65,3,0,112,0,8,0,1,93,184,0,6,16,184,0,10,208,65,3,0,0,0,17,0,1,93,184,0,6,16,184,0,26,220,65,3,0,208,0,26,0,1,93,65,11,0,64,0,26,0,80,0,26,0,96,0,26,0,112,0,26,0,128,0,26,0,5,93,184,0,22,208,186,0,23,0,26,0,17,17,18,57,184,0,23,47,186,0,30,0,17,0,26,17,18,57,184,0,30,47,184,0,26,16,184,0,32,208,65,3,0,7,0,32,0,1,93,65,5,0,22,0,32,0,38,0,32,0,2,93,65,7,0,69,0,32,0,85,0,32,0,101,0,32,0,3,93,65,3,0,56,0,34,0,1,113,184,0,17,16,184,0,37,208,0,184,0,15,47,184,0,39,47,186,0,23,0,15,0,39,17,18,57,184,0,23,47,65,3,0,175,0,23,0,1,93,65,3,0,31,0,23,0,1,93,65,7,0,223,0,23,0,239,0,23,0,255,0,23,0,3,93,65,3,0,47,0,23,0,1,113,184,0,30,220,65,3,0,95,0,30,0,1,113,185,0,31,0,1,244,184,0,0,208,184,0,30,16,184,0,3,208,184,0,23,16,185,0,24,0,1,244,184,0,7,208,184,0,23,16,184,0,10,208,184,0,15,16,184,0,18,220,65,5,0,47,0,18,0,63,0,18,0,2,113,184,0,15,16,184,0,20,220,65,5,0,127,0,20,0,143,0,20,0,2,93,65,5,0,47,0,20,0,63,0,20,0,2,113,184,0,39,16,184,0,34,220,65,5,0,32,0,34,0,48,0,34,0,2,113,65,5,0,112,0,34,0,128,0,34,0,2,93,184,0,39,16,184,0,36,220,65,5,0,32,0,36,0,48,0,36,0,2,113,48,49,1,65,3,0,105,0,12,0,1,93,65,3,0,90,0,12,0,1,93,0,65,5,0,117,0,12,0,133,0,12,0,2,93,65,5,0,86,0,12,0,102,0,12,0,2,93,65,11,0,53,0,16,0,69,0,16,0,85,0,16,0,101,0,16,0,117,0,16,0,5,93,65,11,0,53,0,17,0,69,0,17,0,85,0,17,0,101,0,17,0,117,0,17,0,5,93,65,11,0,59,0,37,0,75,0,37,0,91,0,37,0,107,0,37,0,123,0,37,0,5,93,55,35,55,51,46,1,61,1,35,55,51,62,3,51,50,23,7,38,35,34,7,33,7,35,21,20,22,23,51,7,35,22,51,50,55,23,6,35,34,38,174,141,24,99,2,2,89,22,76,14,57,80,101,57,104,72,12,91,73,146,46,1,2,24,244,3,2,243,24,198,59,117,73,91,12,72,104,102,156,215,69,19,33,14,19,69,57,91,63,34,34,98,38,151,69,19,17,33,16,69,104,38,98,34,104,0,0,2,0,31,1,81,2,156,2,188,0,12,0,20,1,63,184,0,17,47,184,0,4,220,184,0,10,220,65,3,0,16,0,10,0,1,93,65,3,0,32,0,10,0,1,113,186,0,7,0,4,0,10,17,18,57,184,0,7,16,184,0,1,208,184,0,4,16,184,0,3,220,65,3,0,63,0,3,0,1,113,184,0,2,208,184,0,4,16,184,0,5,208,186,0,6,0,2,0,5,17,18,57,184,0,10,16,184,0,11,220,184,0,12,208,184,0,10,16,184,0,9,208,65,3,0,56,0,9,0,1,93,186,0,8,0,12,0,9,17,18,57,184,0,17,16,184,0,16,220,65,5,0,63,0,16,0,79,0,16,0,2,113,184,0,14,220,184,0,17,16,184,0,19,220,0,184,0,0,69,88,184,0,20,47,27,185,0,20,0,14,62,89,184,0,5,208,184,0,20,16,184,0,17,220,184,0,4,208,186,0,1,0,5,0,4,17,18,57,184,0,1,47,184,0,5,16,184,0,2,208,65,3,0,85,0,2,0,1,93,65,3,0,67,0,2,0,1,93,184,0,1,16,184,0,7,208,65,3,0,77,0,7,0,1,93,65,3,0,92,0,7,0,1,93,184,0,5,16,184,0,8,208,184,0,4,16,184,0,11,208,184,0,2,16,184,0,12,208,184,0,20,16,184,0,19,220,65,5,0,48,0,19,0,64,0,19,0,2,113,184,0,15,208,48,49,65,3,0,107,0,7,0,1,93,1,35,39,3,35,19,51,23,55,51,19,35,3,37,7,35,17,35,17,35,53,1,233,6,92,33,52,47,29,105,104,29,48,54,31,254,219,6,100,51,102,1,187,163,254,243,1,107,179,179,254,149,1,12,95,50,254,199,1,57,50,0,3,0,74,0,0,1,242,2,48,0,17,0,25,0,33,1,115,186,0,13,0,1,0,3,43,65,3,0,16,0,1,0,1,93,65,3,0,176,0,1,0,1,93,65,3,0,64,0,13,0,1,93,65,5,0,0,0,13,0,16,0,13,0,2,93,65,3,0,0,0,13,0,1,113,65,3,0,224,0,13,0,1,93,186,0,8,0,13,0,1,17,18,57,184,0,8,47,184,0,1,16,185,0,28,0,4,244,184,0,20,208,186,0,10,0,20,0,8,17,18,57,65,5,0,4,0,10,0,20,0,10,0,2,93,184,0,8,16,185,0,23,0,4,244,184,0,13,16,185,0,32,0,4,244,65,3,0,79,0,35,0,1,113,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,20,0,3,0,0,17,18,57,184,0,20,47,185,0,27,0,2,244,186,0,10,0,20,0,27,17,18,57,184,0,3,16,185,0,18,0,2,244,184,0,0,16,185,0,29,0,2,244,48,49,1,65,3,0,4,0,6,0,1,93,65,7,0,22,0,6,0,38,0,6,0,54,0,6,0,3,93,65,3,0,71,0,6,0,1,93,65,7,0,89,0,10,0,105,0,10,0,121,0,10,0,3,93,65,3,0,135,0,11,0,1,93,65,3,0,5,0,15,0,1,93,65,3,0,133,0,15,0,1,93,0,65,3,0,70,0,6,0,1,93,65,9,0,7,0,6,0,23,0,6,0,39,0,6,0,55,0,6,0,4,93,65,3,0,133,0,11,0,1,93,65,3,0,8,0,15,0,1,93,65,3,0,138,0,15,0,1,93,33,35,17,51,50,30,2,21,20,7,30,1,21,20,14,2,3,35,21,51,50,53,52,38,7,35,21,51,50,54,53,52,1,34,216,146,57,85,56,28,49,54,47,36,59,75,75,86,103,85,52,16,120,95,70,69,2,48,12,32,55,43,80,39,19,63,52,49,64,37,15,1,224,148,74,44,30,224,175,36,49,90,0,0,1,0,39,255,245,1,245,2,59,0,29,1,180,186,0,12,0,5,0,3,43,65,3,0,15,0,5,0,1,93,65,3,0,47,0,5,0,1,93,65,3,0,128,0,5,0,1,93,65,3,0,128,0,12,0,1,93,65,3,0,192,0,12,0,1,93,65,3,0,0,0,12,0,1,113,65,3,0,224,0,12,0,1,93,65,3,0,160,0,12,0,1,93,65,3,0,48,0,12,0,1,93,65,3,0,16,0,12,0,1,93,184,0,5,16,185,0,20,0,4,244,184,0,12,16,184,0,28,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,65,3,0,95,0,13,0,1,113,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,25,0,2,244,184,0,0,16,184,0,27,220,65,3,0,80,0,27,0,1,113,48,49,1,65,3,0,137,0,2,0,1,93,65,3,0,56,0,8,0,1,93,65,3,0,136,0,8,0,1,93,65,11,0,71,0,11,0,87,0,11,0,103,0,11,0,119,0,11,0,135,0,11,0,5,93,65,5,0,23,0,11,0,39,0,11,0,2,113,0,65,3,0,56,0,2,0,1,93,65,3,0,138,0,2,0,1,93,65,3,0,131,0,8,0,1,93,65,3,0,54,0,8,0,1,93,65,5,0,17,0,11,0,33,0,11,0,2,113,65,11,0,70,0,11,0,86,0,11,0,102,0,11,0,118,0,11,0,134,0,11,0,5,93,65,11,0,70,0,12,0,86,0,12,0,102,0,12,0,118,0,12,0,134,0,12,0,5,93,65,11,0,73,0,28,0,89,0,28,0,105,0,28,0,121,0,28,0,137,0,28,0,5,93,65,11,0,74,0,29,0,90,0,29,0,106,0,29,0,122,0,29,0,138,0,29,0,5,93,65,5,0,27,0,29,0,43,0,29,0,2,113,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,14,2,21,20,30,2,51,50,55,23,6,1,79,65,109,78,44,44,78,109,65,97,69,10,91,65,47,72,49,26,26,49,73,47,64,91,10,73,11,42,76,108,65,65,107,77,42,33,87,32,30,53,75,45,45,75,53,30,32,88,32,0,0,0,2,0,74,0,0,2,78,2,48,0,12,0,21,0,235,186,0,8,0,1,0,3,43,65,3,0,207,0,1,0,1,93,65,3,0,15,0,1,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,16,0,1,0,1,93,65,3,0,96,0,8,0,1,93,65,3,0,224,0,8,0,1,93,65,3,0,32,0,8,0,1,113,65,3,0,0,0,8,0,1,113,65,3,0,176,0,8,0,1,93,65,3,0,64,0,8,0,1,93,65,5,0,16,0,8,0,32,0,8,0,2,93,184,0,1,16,185,0,15,0,4,244,184,0,8,16,185,0,19,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,16,185,0,13,0,2,244,184,0,0,16,185,0,16,0,2,244,48,49,1,65,3,0,135,0,5,0,1,93,65,3,0,133,0,10,0,1,93,0,65,3,0,133,0,5,0,1,93,65,3,0,136,0,10,0,1,93,65,3,0,138,0,11,0,1,93,33,35,17,51,50,30,2,21,20,14,2,3,35,17,51,50,54,53,52,38,1,39,221,221,64,110,78,43,44,78,109,64,128,128,94,99,99,2,48,39,72,104,65,66,104,72,38,1,216,254,128,102,90,90,102,0,0,0,1,0,74,0,0,1,197,2,48,0,11,0,152,186,0,0,0,1,0,3,43,65,3,0,16,0,0,0,1,93,65,3,0,224,0,0,0,1,93,65,3,0,16,0,1,0,1,93,184,0,0,16,184,0,4,208,184,0,4,47,184,0,1,16,185,0,10,0,4,244,184,0,6,208,186,0,8,0,0,0,1,17,18,57,184,0,8,47,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,16,185,0,5,0,2,244,186,0,6,0,2,0,1,17,18,57,184,0,6,47,185,0,9,0,2,244,184,0,1,16,185,0,10,0,2,244,48,49,41,1,17,33,21,33,21,51,21,35,21,33,1,197,254,133,1,115,254,236,217,217,1,28,2,48,88,136,88,160,0,1,0,74,0,0,1,182,2,48,0,9,0,166,186,0,0,0,7,0,3,43,65,3,0,175,0,0,0,1,93,65,3,0,16,0,0,0,1,93,65,3,0,176,0,0,0,1,93,65,3,0,175,0,7,0,1,93,65,3,0,16,0,7,0,1,93,65,3,0,176,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,184,0,2,208,186,0,3,0,0,0,7,17,18,57,184,0,3,47,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,16,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,8,16,185,0,1,0,2,244,186,0,2,0,8,0,6,17,18,57,184,0,2,47,185,0,5,0,2,244,65,3,0,165,0,7,0,1,93,48,49,1,33,21,51,21,35,21,35,17,33,1,182,254,241,210,210,93,1,108,1,216,136,88,248,2,48,0,0,0,1,0,39,255,245,2,22,2,59,0,32,1,48,186,0,27,0,5,0,3,43,65,3,0,80,0,27,0,1,93,65,3,0,112,0,27,0,1,93,186,0,12,0,27,0,5,17,18,57,184,0,12,47,184,0,5,16,185,0,18,0,4,244,184,0,27,16,185,0,24,0,4,244,184,0,27,16,184,0,26,208,184,0,26,47,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,21,0,2,244,186,0,26,0,10,0,0,17,18,57,184,0,26,47,185,0,25,0,2,244,48,49,1,65,3,0,137,0,2,0,1,93,65,3,0,136,0,7,0,1,93,65,3,0,136,0,8,0,1,93,65,5,0,21,0,16,0,37,0,16,0,2,93,65,3,0,21,0,20,0,1,93,65,3,0,38,0,20,0,1,93,0,65,3,0,138,0,2,0,1,93,65,3,0,135,0,7,0,1,93,65,3,0,134,0,8,0,1,93,65,9,0,85,0,11,0,101,0,11,0,117,0,11,0,133,0,11,0,4,93,65,3,0,69,0,12,0,1,93,65,9,0,86,0,12,0,102,0,12,0,118,0,12,0,134,0,12,0,4,93,65,3,0,23,0,16,0,1,93,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,6,21,20,22,51,50,55,53,35,53,51,21,14,3,1,74,63,107,77,44,43,79,110,66,102,75,9,87,79,98,100,105,103,49,42,81,175,17,49,56,57,11,42,76,108,66,65,107,76,42,32,87,31,111,90,94,111,11,114,79,250,8,15,12,7,0,0,0,1,0,74,0,0,2,60,2,48,0,11,0,127,186,0,0,0,5,0,3,43,65,3,0,16,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,16,0,5,0,1,93,184,0,5,16,185,0,4,0,4,244,184,0,8,208,184,0,1,16,184,0,9,208,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,8,0,7,0,4,17,18,57,184,0,8,47,185,0,3,0,2,244,184,0,7,16,184,0,10,208,48,49,33,35,53,33,21,35,17,51,21,33,53,51,2,60,93,254,200,93,93,1,56,93,248,248,2,48,223,223,0,0,0,0,1,0,74,0,0,0,167,2,48,0,3,0,109,187,0,0,0,4,0,1,0,4,43,65,3,0,175,0,0,0,1,93,65,5,0,0,0,0,0,16,0,0,0,2,93,65,3,0,128,0,0,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,128,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,51,35,17,51,167,93,93,2,48,0,1,255,254,255,118,0,167,2,48,0,10,0,119,187,0,8,0,4,0,7,0,4,43,65,3,0,175,0,7,0,1,93,65,3,0,16,0,7,0,1,93,65,3,0,128,0,7,0,1,93,184,0,7,16,184,0,2,208,184,0,2,47,65,3,0,175,0,8,0,1,93,65,3,0,16,0,8,0,1,93,65,3,0,128,0,8,0,1,93,65,3,0,15,0,12,0,1,93,0,184,0,1,47,184,0,0,69,88,184,0,8,47,27,185,0,8,0,16,62,89,184,0,1,16,185,0,2,0,1,244,48,49,23,35,39,51,50,54,53,17,51,17,20,28,21,9,12,37,27,93,138,66,34,39,2,47,253,186,116,0,2,0,74,0,0,2,0,2,48,0,5,0,9,1,0,186,0,0,0,7,0,3,43,65,5,0,96,0,0,0,112,0,0,0,2,93,65,3,0,32,0,0,0,1,113,65,3,0,217,0,0,0,1,93,65,3,0,240,0,0,0,1,93,65,3,0,0,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,5,0,16,0,0,0,32,0,0,0,2,93,184,0,0,16,185,0,1,0,4,244,65,11,0,182,0,1,0,198,0,1,0,214,0,1,0,230,0,1,0,246,0,1,0,5,93,65,7,0,6,0,1,0,22,0,1,0,38,0,1,0,3,113,184,0,2,208,184,0,1,16,184,0,3,208,184,0,0,16,184,0,4,208,184,0,0,16,184,0,5,208,65,3,0,223,0,7,0,1,93,65,3,0,16,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,16,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,1,208,184,0,9,16,184,0,3,208,186,0,2,0,3,0,1,17,18,57,25,184,0,2,47,24,184,0,5,208,48,49,33,35,3,19,51,11,1,35,17,51,2,0,102,215,215,102,215,130,93,93,1,40,1,8,254,248,254,216,2,48,0,0,0,2,0,8,0,0,2,14,2,48,0,7,0,10,2,64,187,0,7,0,4,0,6,0,4,43,65,3,0,255,0,7,0,1,93,65,3,0,0,0,7,0,1,113,65,3,0,96,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,136,0,0,0,1,93,65,3,0,23,0,0,0,1,113,65,3,0,55,0,0,0,1,93,185,0,1,0,4,244,65,3,0,255,0,6,0,1,93,65,3,0,0,0,6,0,1,113,65,3,0,96,0,6,0,1,93,186,0,9,0,6,0,7,17,18,57,186,0,2,0,1,0,9,17,18,57,184,0,6,16,184,0,5,208,65,3,0,56,0,5,0,1,93,65,3,0,24,0,5,0,1,113,65,3,0,135,0,5,0,1,93,185,0,4,0,4,244,186,0,3,0,4,0,9,17,18,57,186,0,8,0,9,0,1,17,18,57,186,0,10,0,9,0,4,17,18,57,65,3,0,63,0,12,0,1,93,65,3,0,31,0,12,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,10,0,6,0,4,17,18,57,184,0,10,47,185,0,3,0,2,244,184,0,6,16,184,0,9,208,65,3,0,42,0,9,0,1,113,48,49,1,65,3,0,167,0,1,0,1,93,65,3,0,120,0,3,0,1,93,65,3,0,168,0,4,0,1,93,65,3,0,136,0,6,0,1,93,65,7,0,216,0,6,0,232,0,6,0,248,0,6,0,3,93,65,13,0,8,0,6,0,24,0,6,0,40,0,6,0,56,0,6,0,72,0,6,0,88,0,6,0,6,113,65,7,0,89,0,6,0,105,0,6,0,121,0,6,0,3,93,65,5,0,86,0,7,0,102,0,7,0,2,93,65,5,0,119,0,7,0,135,0,7,0,2,93,65,7,0,215,0,7,0,231,0,7,0,247,0,7,0,3,93,65,13,0,7,0,7,0,23,0,7,0,39,0,7,0,55,0,7,0,71,0,7,0,87,0,7,0,6,113,65,3,0,136,0,8,0,1,93,65,3,0,89,0,8,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,135,0,10,0,1,93,0,65,3,0,41,0,9,0,1,93,65,3,0,74,0,9,0,1,93,65,7,0,218,0,9,0,234,0,9,0,250,0,9,0,3,93,65,5,0,10,0,9,0,26,0,9,0,2,113,65,3,0,59,0,9,0,1,93,65,3,0,43,0,9,0,1,113,65,3,0,140,0,9,0,1,93,33,35,39,35,7,35,19,51,19,39,7,2,14,97,55,214,54,98,213,93,29,76,76,141,141,2,48,254,181,189,189,0,0,1,0,46,0,0,2,154,2,48,0,11,2,50,186,0,0,0,6,0,3,43,65,3,0,0,0,0,0,1,113,65,3,0,47,0,0,0,1,93,65,3,0,16,0,0,0,1,93,65,5,0,112,0,0,0,128,0,0,0,2,93,65,3,0,64,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,184,0,2,208,65,3,0,87,0,2,0,1,93,65,5,0,31,0,6,0,47,0,6,0,2,113,65,3,0,47,0,6,0,1,93,65,3,0,16,0,6,0,1,93,186,0,3,0,6,0,0,17,18,57,184,0,6,16,185,0,5,0,4,244,184,0,4,208,65,3,0,88,0,4,0,1,93,184,0,6,16,184,0,7,208,186,0,8,0,7,0,4,17,18,57,65,3,0,39,0,8,0,1,93,65,3,0,102,0,8,0,1,93,184,0,3,16,184,0,9,208,65,3,0,232,0,9,0,1,93,184,0,0,16,184,0,11,208,186,0,10,0,2,0,11,17,18,57,65,3,0,40,0,10,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,1,208,184,0,7,16,184,0,4,208,65,5,0,27,0,4,0,43,0,4,0,2,113,65,3,0,139,0,4,0,1,93,65,3,0,12,0,4,0,1,113,65,5,0,108,0,4,0,124,0,4,0,2,93,65,5,0,76,0,4,0,92,0,4,0,2,113,65,3,0,251,0,4,0,1,93,65,3,0,91,0,4,0,1,93,65,3,0,234,0,4,0,1,93,65,3,0,73,0,4,0,1,93,184,0,2,208,186,0,3,0,7,0,5,17,18,57,184,0,3,47,184,0,9,208,65,5,0,66,0,9,0,82,0,9,0,2,113,65,7,0,83,0,9,0,99,0,9,0,115,0,9,0,3,93,65,3,0,52,0,9,0,1,113,65,5,0,53,0,9,0,69,0,9,0,2,93,65,3,0,230,0,9,0,1,93,65,5,0,197,0,9,0,213,0,9,0,2,93,65,3,0,132,0,9,0,1,93,65,3,0,4,0,9,0,1,113,65,3,0,243,0,9,0,1,93,65,3,0,18,0,9,0,1,113,65,3,0,33,0,9,0,1,113,184,0,7,16,184,0,10,208,48,49,1,65,3,0,200,0,7,0,1,93,65,3,0,54,0,8,0,1,93,65,3,0,57,0,10,0,1,93,65,3,0,199,0,11,0,1,93,0,65,3,0,38,0,9,0,1,113,33,35,11,3,35,19,51,27,1,51,2,154,98,54,157,159,54,98,81,78,152,150,78,1,136,254,243,1,13,254,120,2,48,254,249,1,7,0,0,0,0,1,0,74,0,0,2,28,2,48,0,9,2,14,186,0,9,0,4,0,3,43,65,3,0,16,0,9,0,1,93,65,5,0,80,0,9,0,96,0,9,0,2,93,65,3,0,176,0,9,0,1,93,65,3,0,175,0,9,0,1,93,65,3,0,224,0,9,0,1,93,65,5,0,128,0,9,0,144,0,9,0,2,93,65,3,0,48,0,9,0,1,93,65,3,0,32,0,9,0,1,113,65,3,0,0,0,9,0,1,113,184,0,9,16,185,0,8,0,4,244,184,0,1,208,65,3,0,176,0,4,0,1,93,65,3,0,207,0,4,0,1,93,65,3,0,175,0,4,0,1,93,65,3,0,16,0,4,0,1,93,65,3,0,144,0,4,0,1,93,184,0,4,16,185,0,3,0,4,244,184,0,6,208,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,184,0,6,16,184,0,2,208,65,3,0,74,0,2,0,1,113,65,3,0,27,0,2,0,1,113,65,3,0,44,0,2,0,1,113,65,3,0,142,0,2,0,1,93,65,5,0,108,0,2,0,124,0,2,0,2,93,65,3,0,91,0,2,0,1,113,65,5,0,74,0,2,0,90,0,2,0,2,93,65,3,0,250,0,2,0,1,93,65,3,0,10,0,2,0,1,113,65,5,0,41,0,2,0,57,0,2,0,2,93,65,3,0,167,0,4,0,1,93,184,0,1,16,184,0,7,208,65,3,0,83,0,7,0,1,113,65,3,0,68,0,7,0,1,93,65,3,0,85,0,7,0,1,93,65,3,0,53,0,7,0,1,93,65,3,0,38,0,7,0,1,93,65,3,0,245,0,7,0,1,93,65,7,0,4,0,7,0,20,0,7,0,36,0,7,0,3,113,65,3,0,68,0,7,0,1,113,65,3,0,131,0,7,0,1,93,65,5,0,98,0,7,0,114,0,7,0,2,93,184,0,6,16,184,0,8,208,48,49,1,65,3,0,85,0,6,0,1,93,65,3,0,71,0,6,0,1,93,0,65,5,0,122,0,2,0,138,0,2,0,2,93,65,3,0,43,0,2,0,1,113,65,3,0,69,0,7,0,1,93,65,3,0,117,0,7,0,1,93,65,3,0,37,0,7,0,1,113,65,3,0,87,0,7,0,1,93,33,35,1,17,35,17,51,1,17,51,2,28,78,254,217,93,96,1,20,94,1,149,254,107,2,48,254,130,1,126,0,0,0,2,0,39,255,245,2,114,2,59,0,18,0,37,2,43,186,0,17,0,7,0,3,43,65,3,0,79,0,7,0,1,93,65,3,0,159,0,7,0,1,93,65,3,0,111,0,7,0,1,93,65,3,0,15,0,7,0,1,93,65,3,0,128,0,7,0,1,93,65,3,0,0,0,17,0,1,113,65,3,0,128,0,17,0,1,93,65,3,0,32,0,17,0,1,113,65,3,0,224,0,17,0,1,93,65,3,0,176,0,17,0,1,93,184,0,7,16,185,0,26,0,4,244,184,0,17,16,185,0,36,0,4,244,65,3,0,47,0,39,0,1,93,65,3,0,95,0,39,0,1,93,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,16,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,12,16,185,0,21,0,2,244,184,0,2,16,185,0,31,0,2,244,48,49,1,65,3,0,134,0,0,0,1,93,65,3,0,138,0,5,0,1,93,65,3,0,137,0,9,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,135,0,15,0,1,93,65,3,0,181,0,19,0,1,93,65,3,0,166,0,19,0,1,93,65,5,0,24,0,19,0,40,0,19,0,2,93,65,3,0,121,0,19,0,1,93,65,5,0,23,0,23,0,39,0,23,0,2,93,65,3,0,168,0,24,0,1,93,65,3,0,185,0,24,0,1,93,65,5,0,22,0,29,0,38,0,29,0,2,93,65,3,0,168,0,29,0,1,93,65,3,0,185,0,29,0,1,93,65,3,0,120,0,33,0,1,93,65,5,0,25,0,33,0,41,0,33,0,2,93,65,3,0,165,0,34,0,1,93,65,3,0,182,0,34,0,1,93,0,65,3,0,137,0,0,0,1,93,65,3,0,136,0,5,0,1,93,65,3,0,134,0,9,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,134,0,15,0,1,93,65,3,0,166,0,19,0,1,93,65,3,0,183,0,19,0,1,93,65,5,0,24,0,19,0,40,0,19,0,2,93,65,3,0,182,0,24,0,1,93,65,3,0,167,0,24,0,1,93,65,5,0,24,0,24,0,40,0,24,0,2,93,65,5,0,23,0,29,0,39,0,29,0,2,93,65,3,0,169,0,29,0,1,93,65,3,0,186,0,29,0,1,93,65,5,0,22,0,33,0,38,0,33,0,2,93,65,3,0,118,0,33,0,1,93,65,5,0,168,0,34,0,184,0,34,0,2,93,37,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,3,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,2,31,83,128,64,108,78,43,43,78,108,64,64,108,78,44,153,50,91,46,71,49,25,25,49,71,46,46,71,49,25,69,80,42,76,108,65,65,107,77,42,42,77,107,65,131,1,22,56,29,54,75,45,45,75,54,29,30,53,75,45,91,0,0,0,0,2,255,248,0,0,2,193,2,48,0,15,0,18,1,118,186,0,0,0,1,0,3,43,65,3,0,16,0,0,0,1,93,65,3,0,15,0,0,0,1,113,65,3,0,144,0,0,0,1,93,65,3,0,96,0,0,0,1,93,65,3,0,15,0,1,0,1,113,65,3,0,127,0,1,0,1,93,184,0,1,16,184,0,5,208,65,3,0,170,0,5,0,1,93,65,3,0,26,0,5,0,1,93,65,3,0,38,0,5,0,1,93,185,0,4,0,4,244,184,0,1,16,184,0,16,208,186,0,3,0,4,0,16,17,18,57,65,3,0,250,0,3,0,1,93,184,0,6,208,65,5,0,234,0,6,0,250,0,6,0,2,93,65,7,0,106,0,6,0,122,0,6,0,138,0,6,0,3,93,65,5,0,25,0,6,0,41,0,6,0,2,113,65,3,0,89,0,6,0,1,93,184,0,0,16,184,0,8,208,184,0,8,47,184,0,1,16,185,0,14,0,4,244,184,0,10,208,184,0,0,16,184,0,12,208,184,0,12,47,186,0,18,0,16,0,4,17,18,57,65,3,0,86,0,18,0,1,93,65,3,0,38,0,18,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,16,0,1,0,6,17,18,57,184,0,16,47,185,0,2,0,2,244,184,0,1,16,184,0,4,208,184,0,6,16,185,0,9,0,2,244,186,0,10,0,6,0,1,17,18,57,184,0,10,47,185,0,13,0,2,244,184,0,1,16,185,0,14,0,2,244,184,0,9,16,184,0,17,208,65,3,0,42,0,17,0,1,113,48,49,41,1,53,35,7,35,1,33,21,33,21,51,21,35,21,33,37,53,7,2,193,254,142,175,74,94,1,34,1,159,254,253,200,200,1,11,254,142,132,138,138,2,48,89,135,88,160,140,241,241,0,2,0,74,0,0,1,227,2,48,0,14,0,23,1,63,186,0,10,0,3,0,3,43,65,3,0,16,0,3,0,1,93,65,3,0,207,0,3,0,1,93,65,3,0,176,0,3,0,1,93,65,3,0,48,0,3,0,1,93,184,0,3,16,185,0,2,0,4,244,65,3,0,48,0,10,0,1,93,65,3,0,176,0,10,0,1,93,65,3,0,112,0,10,0,1,93,65,3,0,16,0,10,0,1,93,65,5,0,16,0,10,0,32,0,10,0,2,113,184,0,17,208,184,0,10,16,185,0,21,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,16,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,186,0,1,0,4,0,2,17,18,57,184,0,1,47,184,0,4,16,185,0,16,0,2,244,184,0,1,16,185,0,17,0,2,244,48,49,1,65,3,0,135,0,7,0,1,93,65,5,0,165,0,8,0,181,0,8,0,2,93,65,3,0,6,0,8,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,198,0,8,0,1,93,65,3,0,23,0,8,0,1,93,65,3,0,6,0,12,0,1,93,0,65,3,0,134,0,7,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,198,0,8,0,1,93,65,5,0,7,0,8,0,23,0,8,0,2,93,65,5,0,167,0,8,0,183,0,8,0,2,93,65,3,0,9,0,12,0,1,93,37,35,21,35,17,51,50,30,2,21,20,14,2,3,35,21,51,50,54,53,52,38,1,33,119,96,180,54,86,60,29,36,56,69,62,90,104,60,53,55,188,188,2,48,15,39,68,54,56,75,45,20,1,37,207,51,57,54,45,0,0,0,2,0,39,255,245,2,114,2,59,0,21,0,43,2,248,186,0,19,0,9,0,3,43,65,3,0,224,0,19,0,1,93,65,3,0,32,0,19,0,1,113,65,3,0,0,0,19,0,1,113,65,3,0,176,0,19,0,1,93,65,3,0,128,0,19,0,1,93,65,3,0,111,0,9,0,1,93,65,3,0,15,0,9,0,1,93,65,3,0,159,0,9,0,1,93,65,3,0,79,0,9,0,1,93,65,3,0,128,0,9,0,1,93,186,0,21,0,19,0,9,17,18,57,184,0,21,16,184,0,0,208,184,0,0,47,186,0,2,0,9,0,19,17,18,57,184,0,9,16,185,0,27,0,4,244,184,0,19,16,185,0,39,0,4,244,186,0,34,0,27,0,39,17,18,57,65,3,0,106,0,34,0,1,93,65,3,0,121,0,34,0,1,93,184,0,34,16,184,0,35,208,184,0,35,47,65,3,0,47,0,35,0,1,113,65,3,0,127,0,35,0,1,93,65,5,0,31,0,35,0,47,0,35,0,2,93,186,0,37,0,39,0,27,17,18,57,65,3,0,47,0,45,0,1,93,65,3,0,95,0,45,0,1,93,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,186,0,2,0,4,0,14,17,18,57,184,0,2,16,184,0,1,208,184,0,1,47,186,0,21,0,14,0,4,17,18,57,65,3,0,135,0,21,0,1,93,184,0,14,16,185,0,22,0,2,244,184,0,4,16,185,0,32,0,2,244,186,0,34,0,32,0,22,17,18,57,186,0,37,0,22,0,32,17,18,57,184,0,37,16,184,0,36,208,184,0,36,47,48,49,1,65,5,0,23,0,2,0,39,0,2,0,2,113,65,3,0,137,0,2,0,1,93,65,3,0,136,0,3,0,1,93,65,3,0,137,0,6,0,1,93,65,3,0,137,0,7,0,1,93,65,3,0,138,0,11,0,1,93,65,3,0,133,0,17,0,1,93,65,3,0,19,0,21,0,1,113,65,3,0,36,0,21,0,1,113,65,5,0,20,0,24,0,36,0,24,0,2,93,65,5,0,22,0,29,0,38,0,29,0,2,93,65,3,0,117,0,30,0,1,93,65,3,0,184,0,30,0,1,93,65,3,0,169,0,30,0,1,93,65,3,0,24,0,34,0,1,113,65,3,0,43,0,34,0,1,113,65,3,0,138,0,35,0,1,93,65,3,0,23,0,37,0,1,113,65,3,0,40,0,37,0,1,113,65,3,0,121,0,42,0,1,93,65,5,0,26,0,42,0,42,0,42,0,2,93,0,65,3,0,25,0,2,0,1,113,65,3,0,42,0,2,0,1,113,65,3,0,138,0,3,0,1,93,65,3,0,136,0,7,0,1,93,65,3,0,134,0,11,0,1,93,65,3,0,134,0,16,0,1,93,65,3,0,39,0,21,0,1,113,65,3,0,182,0,24,0,1,93,65,3,0,167,0,24,0,1,93,65,5,0,24,0,24,0,40,0,24,0,2,93,65,3,0,118,0,30,0,1,93,65,5,0,168,0,30,0,184,0,30,0,2,93,65,5,0,24,0,34,0,40,0,34,0,2,113,65,3,0,37,0,36,0,1,113,65,3,0,20,0,37,0,1,113,65,3,0,117,0,37,0,1,93,65,3,0,37,0,37,0,1,113,65,3,0,121,0,42,0,1,93,37,7,39,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,7,3,34,14,2,21,20,30,2,51,50,55,39,55,23,54,53,52,46,2,2,107,52,57,78,100,64,108,78,43,43,78,108,64,64,108,78,44,59,235,46,71,49,25,25,49,71,46,65,44,80,51,83,33,26,51,73,58,62,44,51,42,76,108,65,65,107,77,42,42,77,107,65,101,80,1,128,29,54,75,45,45,75,54,29,23,60,64,65,46,75,45,75,54,29,0,0,0,0,2,0,74,0,0,2,3,2,48,0,11,0,19,1,143,186,0,9,0,5,0,3,43,65,7,0,16,0,9,0,32,0,9,0,48,0,9,0,3,93,65,3,0,144,0,9,0,1,93,65,3,0,176,0,9,0,1,93,65,3,0,112,0,9,0,1,93,65,3,0,240,0,9,0,1,93,65,5,0,16,0,9,0,32,0,9,0,2,113,65,3,0,16,0,5,0,1,93,65,3,0,175,0,5,0,1,93,65,3,0,48,0,5,0,1,93,65,3,0,176,0,5,0,1,93,65,3,0,144,0,5,0,1,93,186,0,11,0,9,0,5,17,18,57,65,3,0,54,0,11,0,1,93,65,9,0,86,0,11,0,102,0,11,0,118,0,11,0,134,0,11,0,4,93,184,0,11,16,184,0,0,208,65,3,0,70,0,0,0,1,93,184,0,11,16,185,0,2,0,4,244,184,0,1,208,184,0,5,16,185,0,4,0,4,244,184,0,14,208,184,0,9,16,185,0,18,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,3,0,7,0,4,17,18,57,184,0,3,47,186,0,11,0,3,0,7,17,18,57,184,0,7,16,185,0,12,0,2,244,184,0,3,16,185,0,14,0,2,244,48,49,1,65,3,0,132,0,8,0,1,93,65,7,0,7,0,8,0,23,0,8,0,39,0,8,0,3,93,65,3,0,133,0,10,0,1,93,65,3,0,118,0,10,0,1,93,65,3,0,122,0,19,0,1,93,0,65,3,0,5,0,8,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,23,0,8,0,1,93,65,3,0,138,0,10,0,1,93,65,3,0,120,0,19,0,1,93,33,35,39,35,21,35,17,51,50,21,20,7,39,35,21,51,50,54,53,52,2,3,99,128,118,96,204,205,105,112,96,106,52,58,212,212,2,48,162,110,52,247,183,48,45,90,0,0,0,0,1,0,41,255,245,1,221,2,59,0,48,2,215,186,0,44,0,16,0,3,43,65,3,0,47,0,16,0,1,93,65,3,0,111,0,16,0,1,93,65,3,0,15,0,16,0,1,93,65,3,0,79,0,16,0,1,93,65,3,0,16,0,16,0,1,93,65,3,0,48,0,16,0,1,93,65,3,0,80,0,44,0,1,93,65,3,0,176,0,44,0,1,93,65,3,0,208,0,44,0,1,93,65,7,0,112,0,44,0,128,0,44,0,144,0,44,0,3,93,65,3,0,48,0,44,0,1,93,65,3,0,16,0,44,0,1,93,186,0,2,0,16,0,44,17,18,57,184,0,2,47,184,0,44,16,185,0,7,0,4,244,186,0,26,0,44,0,16,17,18,57,184,0,26,47,184,0,16,16,185,0,34,0,4,244,0,184,0,0,69,88,184,0,21,47,27,185,0,21,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,220,65,3,0,32,0,3,0,1,93,184,0,0,16,185,0,5,0,2,244,186,0,11,0,0,0,21,17,18,57,65,3,0,138,0,11,0,1,93,65,7,0,89,0,11,0,105,0,11,0,121,0,11,0,3,93,184,0,21,16,184,0,27,220,65,3,0,47,0,27,0,1,93,65,3,0,144,0,27,0,1,93,184,0,21,16,185,0,29,0,2,244,186,0,37,0,21,0,0,17,18,57,48,49,1,65,3,0,121,0,9,0,1,93,65,3,0,25,0,14,0,1,93,65,3,0,121,0,14,0,1,93,65,3,0,43,0,14,0,1,93,65,3,0,9,0,19,0,1,93,65,13,0,55,0,25,0,71,0,25,0,87,0,25,0,103,0,25,0,119,0,25,0,135,0,25,0,6,93,65,3,0,133,0,36,0,1,93,65,3,0,135,0,39,0,1,93,65,3,0,6,0,41,0,1,93,65,3,0,38,0,41,0,1,93,65,3,0,23,0,41,0,1,93,65,3,0,87,0,41,0,1,93,65,3,0,37,0,42,0,1,93,65,3,0,101,0,42,0,1,93,65,3,0,22,0,42,0,1,93,65,5,0,6,0,47,0,22,0,47,0,2,93,0,65,15,0,58,0,1,0,74,0,1,0,90,0,1,0,106,0,1,0,122,0,1,0,138,0,1,0,154,0,1,0,7,93,65,3,0,43,0,1,0,1,113,65,3,0,28,0,1,0,1,113,65,13,0,58,0,2,0,74,0,2,0,90,0,2,0,106,0,2,0,122,0,2,0,138,0,2,0,6,93,65,3,0,121,0,9,0,1,93,65,3,0,41,0,14,0,1,93,65,3,0,121,0,14,0,1,93,65,3,0,26,0,14,0,1,93,65,3,0,5,0,19,0,1,93,65,13,0,53,0,25,0,69,0,25,0,85,0,25,0,101,0,25,0,117,0,25,0,133,0,25,0,6,93,65,3,0,134,0,39,0,1,93,65,3,0,84,0,41,0,1,93,65,3,0,6,0,41,0,1,93,65,5,0,23,0,41,0,39,0,41,0,2,93,65,3,0,22,0,42,0,1,93,65,3,0,102,0,42,0,1,93,65,3,0,39,0,42,0,1,93,65,3,0,40,0,47,0,1,93,65,5,0,10,0,47,0,26,0,47,0,2,93,23,34,39,55,22,51,50,53,52,46,2,47,1,46,1,53,52,62,2,51,50,30,2,23,7,38,35,34,14,2,21,20,30,2,23,30,3,21,20,14,2,246,129,67,12,71,115,126,29,53,75,46,48,35,47,26,52,81,56,27,55,49,42,15,10,102,70,24,45,34,20,26,53,78,53,23,46,36,23,15,49,91,11,39,107,58,70,24,34,26,23,14,21,15,54,48,31,60,46,28,7,11,15,8,96,50,8,16,26,18,24,26,20,22,20,9,24,35,51,36,24,56,48,32,0,0,0,0,1,0,17,0,0,1,197,2,48,0,7,0,113,187,0,1,0,4,0,4,0,4,43,65,3,0,176,0,1,0,1,93,184,0,1,16,184,0,0,220,65,3,0,176,0,4,0,1,93,184,0,4,16,184,0,5,220,65,3,0,15,0,9,0,1,93,65,3,0,112,0,9,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,6,16,185,0,5,0,2,244,184,0,1,208,48,49,1,35,17,35,17,35,53,33,1,197,171,94,171,1,180,1,216,254,40,1,216,88,0,0,0,0,1,0,67,255,245,2,48,2,48,0,21,1,39,186,0,18,0,4,0,3,43,65,3,0,175,0,4,0,1,93,65,3,0,223,0,4,0,1,93,65,3,0,16,0,4,0,1,93,184,0,4,16,185,0,5,0,4,244,65,3,0,240,0,18,0,1,93,65,3,0,223,0,18,0,1,93,65,3,0,175,0,18,0,1,93,65,3,0,16,0,18,0,1,93,65,3,0,16,0,18,0,1,113,184,0,18,16,185,0,17,0,4,244,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,185,0,11,0,2,244,184,0,5,16,184,0,17,208,48,49,1,65,3,0,88,0,1,0,1,93,65,5,0,55,0,9,0,71,0,9,0,2,93,65,5,0,57,0,13,0,73,0,13,0,2,93,65,3,0,85,0,20,0,1,93,65,3,0,103,0,20,0,1,93,65,5,0,88,0,21,0,104,0,21,0,2,93,0,65,3,0,105,0,1,0,1,93,65,3,0,90,0,1,0,1,93,65,3,0,54,0,9,0,1,93,65,3,0,71,0,9,0,1,93,65,3,0,70,0,13,0,1,93,65,3,0,55,0,13,0,1,93,65,3,0,104,0,20,0,1,93,65,5,0,89,0,21,0,105,0,21,0,2,93,5,34,38,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,6,1,58,123,124,93,14,36,59,45,47,60,34,12,93,123,11,133,117,1,65,254,226,46,73,51,27,30,53,72,42,1,30,254,191,118,132,0,0,0,0,1,0,6,0,0,2,42,2,48,0,6,1,51,187,0,1,0,4,0,2,0,4,43,65,3,0,176,0,1,0,1,93,65,3,0,96,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,56,0,0,0,1,93,65,3,0,118,0,0,0,1,93,65,3,0,96,0,2,0,1,93,65,3,0,176,0,2,0,1,93,184,0,2,16,184,0,3,208,65,3,0,121,0,3,0,1,93,65,3,0,55,0,3,0,1,93,185,0,4,0,4,244,186,0,5,0,2,0,1,17,18,57,184,0,0,16,185,0,6,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,16,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,208,65,3,0,70,0,5,0,1,93,65,5,0,85,0,5,0,101,0,5,0,2,93,184,0,4,16,184,0,6,208,48,49,1,65,13,0,167,0,1,0,183,0,1,0,199,0,1,0,215,0,1,0,231,0,1,0,247,0,1,0,6,93,65,7,0,7,0,1,0,23,0,1,0,39,0,1,0,3,113,65,13,0,168,0,2,0,184,0,2,0,200,0,2,0,216,0,2,0,232,0,2,0,248,0,2,0,6,93,65,7,0,8,0,2,0,24,0,2,0,40,0,2,0,3,113,0,65,3,0,130,0,5,0,1,93,65,3,0,116,0,5,0,1,93,1,3,35,3,51,27,1,2,42,220,106,222,98,177,175,2,48,253,208,2,48,254,70,1,186,0,0,0,1,0,17,0,0,3,54,2,48,0,12,2,97,186,0,10,0,9,0,3,43,65,3,0,175,0,10,0,1,93,65,3,0,39,0,10,0,1,93,65,3,0,16,0,10,0,1,93,184,0,10,16,184,0,1,220,184,0,0,208,65,3,0,103,0,0,0,1,93,65,3,0,6,0,0,0,1,93,184,0,1,16,185,0,2,0,4,244,65,3,0,41,0,2,0,1,93,65,3,0,175,0,9,0,1,93,65,3,0,16,0,9,0,1,93,186,0,3,0,9,0,10,17,18,57,184,0,9,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,6,208,65,3,0,9,0,6,0,1,93,65,3,0,104,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,4,17,18,57,186,0,11,0,2,0,1,17,18,57,184,0,0,16,185,0,12,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,2,208,184,0,7,16,184,0,9,208,184,0,9,47,184,0,3,208,65,9,0,74,0,3,0,90,0,3,0,106,0,3,0,122,0,3,0,4,93,184,0,4,16,184,0,8,208,65,3,0,70,0,8,0,1,93,65,3,0,85,0,8,0,1,93,65,3,0,37,0,8,0,1,113,184,0,11,208,184,0,7,16,184,0,12,208,48,49,1,65,3,0,69,0,1,0,1,113,65,3,0,246,0,1,0,1,93,65,7,0,6,0,1,0,22,0,1,0,38,0,1,0,3,113,65,3,0,200,0,2,0,1,93,65,7,0,73,0,2,0,89,0,2,0,105,0,2,0,3,93,65,3,0,70,0,4,0,1,93,65,3,0,102,0,4,0,1,93,65,3,0,87,0,4,0,1,93,65,3,0,199,0,4,0,1,93,65,3,0,249,0,5,0,1,93,65,7,0,9,0,5,0,25,0,5,0,41,0,5,0,3,113,65,3,0,74,0,5,0,1,113,65,3,0,135,0,7,0,1,93,65,3,0,135,0,8,0,1,93,65,5,0,232,0,9,0,248,0,9,0,2,93,65,7,0,8,0,9,0,24,0,9,0,40,0,9,0,3,113,65,5,0,231,0,10,0,247,0,10,0,2,93,65,7,0,7,0,10,0,23,0,10,0,39,0,10,0,3,113,65,3,0,136,0,12,0,1,93,0,65,5,0,74,0,3,0,90,0,3,0,2,93,65,3,0,138,0,3,0,1,93,65,3,0,107,0,3,0,1,93,65,3,0,251,0,3,0,1,93,65,7,0,11,0,3,0,27,0,3,0,43,0,3,0,3,113,65,3,0,75,0,3,0,1,113,65,3,0,125,0,3,0,1,93,1,3,35,11,1,35,3,51,27,1,51,27,1,3,54,174,93,136,140,95,167,98,126,141,74,145,123,2,48,253,208,1,148,254,108,2,48,254,87,1,165,254,98,1,162,0,1,0,14,0,0,2,17,2,48,0,11,1,176,187,0,11,0,4,0,5,0,4,43,65,5,0,87,0,11,0,103,0,11,0,2,93,65,3,0,48,0,11,0,1,93,184,0,11,16,184,0,0,208,65,3,0,5,0,0,0,1,113,65,3,0,166,0,0,0,1,93,65,3,0,135,0,0,0,1,93,65,3,0,89,0,0,0,1,93,65,3,0,8,0,0,0,1,93,65,3,0,55,0,0,0,1,93,65,3,0,214,0,0,0,1,93,65,3,0,181,0,0,0,1,93,65,3,0,69,0,0,0,1,93,185,0,1,0,4,244,65,3,0,7,0,1,0,1,113,65,3,0,48,0,5,0,1,93,186,0,2,0,5,0,11,17,18,57,184,0,5,16,184,0,4,208,65,3,0,103,0,4,0,1,93,65,3,0,40,0,4,0,1,113,65,3,0,73,0,4,0,1,93,65,3,0,185,0,4,0,1,93,65,3,0,168,0,4,0,1,93,65,3,0,6,0,4,0,1,93,65,3,0,86,0,4,0,1,93,185,0,3,0,4,244,184,0,4,16,184,0,6,208,184,0,3,16,184,0,7,208,186,0,8,0,5,0,11,17,18,57,184,0,1,16,184,0,9,208,184,0,0,16,184,0,10,208,65,3,0,31,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,186,0,2,0,3,0,7,17,18,57,186,0,8,0,7,0,3,17,18,57,65,3,0,54,0,8,0,1,93,65,3,0,69,0,8,0,1,93,186,0,5,0,8,0,2,17,18,57,184,0,7,16,184,0,9,208,186,0,11,0,2,0,8,17,18,57,48,49,1,65,3,0,119,0,11,0,1,93,0,65,3,0,122,0,2,0,1,93,65,3,0,139,0,2,0,1,93,65,5,0,117,0,8,0,133,0,8,0,2,93,33,35,39,7,35,19,3,51,23,55,51,3,2,17,104,159,149,103,204,200,108,146,148,103,205,214,214,1,23,1,25,205,205,254,242,0,0,0,0,1,0,1,0,0,1,247,2,48,0,8,1,20,187,0,1,0,4,0,4,0,4,43,65,3,0,48,0,1,0,1,93,65,3,0,144,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,9,0,0,0,1,93,65,3,0,89,0,0,0,1,93,65,3,0,135,0,0,0,1,93,65,3,0,70,0,0,0,1,93,65,3,0,144,0,4,0,1,93,65,3,0,48,0,4,0,1,93,184,0,4,16,184,0,5,208,65,3,0,136,0,5,0,1,93,65,3,0,73,0,5,0,1,93,65,3,0,6,0,5,0,1,93,65,3,0,86,0,5,0,1,93,185,0,6,0,4,244,186,0,7,0,4,0,1,17,18,57,184,0,0,16,185,0,8,0,4,244,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,186,0,7,0,6,0,3,17,18,57,65,3,0,38,0,7,0,1,93,184,0,6,16,184,0,8,208,48,49,65,3,0,132,0,7,0,1,93,65,7,0,85,0,7,0,101,0,7,0,117,0,7,0,3,93,65,3,0,246,0,7,0,1,93,65,7,0,6,0,7,0,22,0,7,0,38,0,7,0,3,113,1,3,21,35,53,3,51,23,55,1,247,203,96,203,99,152,152,2,48,254,204,252,252,1,52,225,225,0,0,0,0,1,0,15,0,0,1,212,2,48,0,7,1,79,186,0,2,0,6,0,3,43,65,3,0,64,0,2,0,1,93,65,3,0,223,0,2,0,1,93,65,3,0,176,0,2,0,1,93,65,3,0,96,0,2,0,1,93,184,0,2,16,184,0,0,208,184,0,6,16,184,0,4,208,184,0,1,208,65,3,0,99,0,1,0,1,93,65,3,0,36,0,1,0,1,113,65,3,0,85,0,1,0,1,113,65,3,0,70,0,1,0,1,113,65,3,0,154,0,1,0,1,93,65,3,0,246,0,1,0,1,93,65,5,0,5,0,1,0,21,0,1,0,2,113,65,5,0,68,0,1,0,84,0,1,0,2,93,65,3,0,114,0,1,0,1,93,65,3,0,128,0,1,0,1,93,184,0,0,16,184,0,5,208,65,3,0,249,0,5,0,1,93,65,3,0,90,0,5,0,1,113,65,3,0,43,0,5,0,1,113,65,3,0,108,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,125,0,5,0,1,93,65,3,0,91,0,5,0,1,93,65,3,0,74,0,5,0,1,93,65,5,0,10,0,5,0,26,0,5,0,2,113,65,3,0,73,0,5,0,1,113,65,3,0,149,0,5,0,1,93,65,3,0,47,0,9,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,2,0,2,244,184,0,7,16,185,0,6,0,2,244,48,49,9,1,33,21,33,1,33,53,1,212,254,213,1,5,254,97,1,43,254,251,2,48,254,40,88,1,216,88,0,0,0,0,2,0,39,255,245,3,116,2,59,0,26,0,45,2,173,186,0,0,0,1,0,3,43,65,3,0,95,0,0,0,1,93,65,5,0,0,0,0,0,16,0,0,0,2,93,65,3,0,176,0,0,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,255,0,1,0,1,93,65,3,0,95,0,1,0,1,93,65,3,0,176,0,1,0,1,93,65,3,0,144,0,1,0,1,93,184,0,1,16,184,0,9,220,65,3,0,159,0,9,0,1,93,65,3,0,191,0,9,0,1,93,65,3,0,127,0,9,0,1,93,65,5,0,15,0,9,0,31,0,9,0,2,93,184,0,1,16,184,0,16,208,184,0,0,16,184,0,19,208,184,0,19,47,184,0,1,16,185,0,25,0,4,244,184,0,21,208,186,0,23,0,0,0,1,17,18,57,184,0,23,47,184,0,9,16,185,0,34,0,4,244,184,0,1,16,184,0,44,208,65,5,0,121,0,44,0,137,0,44,0,2,93,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,16,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,2,0,4,0,14,17,18,57,65,5,0,27,0,2,0,43,0,2,0,2,113,65,5,0,58,0,2,0,74,0,2,0,2,113,186,0,16,0,14,0,4,17,18,57,65,9,0,20,0,16,0,36,0,16,0,52,0,16,0,68,0,16,0,4,113,184,0,17,16,185,0,20,0,2,244,186,0,21,0,17,0,1,17,18,57,184,0,21,47,185,0,24,0,2,244,184,0,1,16,185,0,25,0,2,244,184,0,14,16,185,0,29,0,2,244,184,0,4,16,185,0,39,0,2,244,48,49,1,65,3,0,136,0,6,0,1,93,65,3,0,138,0,7,0,1,93,65,3,0,137,0,11,0,1,93,65,3,0,136,0,12,0,1,93,65,3,0,56,0,15,0,1,93,65,3,0,41,0,27,0,1,93,65,3,0,137,0,27,0,1,93,65,3,0,169,0,27,0,1,93,65,3,0,38,0,31,0,1,93,65,3,0,39,0,37,0,1,93,65,3,0,40,0,41,0,1,93,65,3,0,136,0,41,0,1,93,65,3,0,168,0,41,0,1,93,65,3,0,169,0,42,0,1,93,0,65,3,0,73,0,3,0,1,93,65,3,0,58,0,3,0,1,93,65,3,0,137,0,6,0,1,93,65,3,0,136,0,7,0,1,93,65,3,0,134,0,11,0,1,93,65,3,0,134,0,12,0,1,93,65,3,0,51,0,15,0,1,93,65,3,0,69,0,15,0,1,93,65,3,0,168,0,27,0,1,93,65,3,0,41,0,27,0,1,93,65,3,0,137,0,27,0,1,93,65,3,0,40,0,31,0,1,93,65,3,0,38,0,37,0,1,93,65,3,0,38,0,41,0,1,93,65,3,0,134,0,41,0,1,93,65,3,0,166,0,41,0,1,93,41,1,53,6,35,34,46,2,53,52,62,2,51,50,23,53,33,21,33,21,51,21,35,21,33,1,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,3,116,254,153,98,98,64,106,77,43,43,77,106,64,98,98,1,95,254,254,199,199,1,10,254,97,48,92,46,71,48,25,25,48,71,46,46,71,48,24,52,63,42,76,108,65,65,107,77,42,63,52,88,136,88,160,1,83,56,29,54,75,45,45,75,54,29,30,53,75,45,92,0,0,0,1,0,74,0,0,1,172,2,48,0,5,0,124,186,0,5,0,1,0,3,43,65,3,0,16,0,1,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,176,0,1,0,1,93,65,3,0,144,0,1,0,1,93,184,0,1,16,185,0,4,0,4,244,65,3,0,144,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,176,0,5,0,1,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,185,0,4,0,2,244,48,49,41,1,17,51,17,33,1,172,254,158,93,1,5,2,48,254,40,0,0,1,0,0,0,1,1,72,59,245,254,62,95,15,60,245,0,31,3,232,0,0,0,0,202,233,78,152,0,0,0,0,202,233,79,52,255,217,255,6,4,141,3,196,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,3,197,255,6,0,0,4,177,255,217,255,213,4,141,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,13,0,250,0,72,0,225,0,0,0,242,0,59,1,146,0,40,2,192,0,33,2,2,0,42,3,72,0,35,2,99,0,36,0,182,0,41,1,5,0,42,1,5,0,24,1,170,0,33,1,207,0,46,0,216,0,57,1,168,0,57,0,204,0,57,2,20,0,19,2,202,0,63,1,99,0,34,2,12,0,50,2,35,0,40,2,47,0,14,2,29,0,51,2,56,0,62,1,246,0,39,2,97,0,59,2,58,0,45,0,204,0,57,0,216,0,57,1,149,0,33,1,246,0,66,1,148,0,60,1,185,0,30,2,210,0,49,2,104,0,7,2,85,0,80,2,104,0,39,2,215,0,80,2,42,0,80,2,11,0,80,2,160,0,39,2,234,0,80,0,255,0,80,0,255,255,239,2,65,0,80,1,245,0,80,3,44,0,48,2,192,0,80,3,0,0,39,2,60,0,80,3,0,0,39,2,91,0,80,2,72,0,40,2,21,0,15,2,212,0,72,2,132,0,4,3,203,0,14,2,87,0,9,2,55,255,253,2,37,0,9,1,71,0,70,2,13,0,35,1,71,0,0,1,255,0,49,2,54,0,3,1,47,0,58,1,224,0,24,2,43,0,60,1,198,0,33,2,43,0,32,2,0,0,31,1,75,0,10,1,242,0,26,2,30,0,60,0,212,0,61,0,212,255,244,1,192,0,60,0,236,0,60,3,109,0,61,2,47,0,61,2,38,0,32,2,45,0,61,2,45,0,33,1,65,0,61,1,158,0,32,1,81,0,18,2,12,0,56,1,236,0,9,2,213,0,12,1,218,0,11,1,249,0,7,1,215,0,22,1,43,0,19,0,229,0,70,1,43,0,2,1,199,0,54,0,225,0,0,0,224,0,50,1,221,0,34,1,244,0,34,2,114,0,61,2,162,0,30,0,232,0,72,1,200,0,37,1,166,0,87,2,208,0,49,1,93,0,33,2,51,0,15,2,84,0,66,1,168,0,57,2,208,0,49,1,77,0,34,1,242,0,64,1,48,0,25,1,54,0,19,1,47,0,58,2,79,0,73,2,110,0,33,0,238,0,57,1,47,0,144,0,216,0,23,1,114,0,33,2,51,0,41,2,205,0,39,2,217,0,36,3,117,0,32,1,193,0,62,2,104,0,7,2,104,0,7,2,104,0,7,2,104,0,7,2,104,0,7,2,104,0,7,3,97,255,249,2,104,0,39,2,42,0,80,2,42,0,80,2,42,0,80,2,42,0,80,0,255,0,35,0,255,0,36,0,255,255,240,0,255,0,5,2,215,255,245,2,192,0,80,3,0,0,39,3,0,0,39,3,0,0,39,3,0,0,39,3,0,0,39,1,183,0,61,3,0,0,39,2,214,0,72,2,214,0,72,2,214,0,72,2,214,0,72,2,55,255,253,2,58,0,80,2,45,0,16,1,224,0,24,1,224,0,24,1,224,0,24,1,224,0,24,1,224,0,24,1,224,0,24,3,30,0,22,1,198,0,33,2,0,0,31,2,0,0,31,2,0,0,31,2,0,0,31,0,212,0,13,0,212,0,14,0,212,255,217,0,212,255,239,2,5,0,28,2,47,0,61,2,38,0,32,2,38,0,32,2,38,0,32,2,38,0,32,2,38,0,32,2,80,0,66,2,58,0,33,2,12,0,56,2,12,0,56,2,12,0,56,2,12,0,56,1,249,0,7,2,68,0,60,1,249,0,7,2,104,0,39,1,198,0,33,0,212,0,61,4,47,0,40,3,134,0,32,2,72,0,40,1,158,0,32,2,55,255,253,2,37,0,9,1,215,0,22,1,95,255,222,0,212,255,244,1,190,0,76,1,190,0,76,1,36,0,42,2,16,0,92,1,246,0,57,2,82,0,57,0,186,0,43,0,169,0,42,0,216,0,57,1,140,0,43,1,123,0,42,1,190,0,57,1,168,0,35,1,204,0,53,1,50,0,44,2,164,0,57,4,177,0,36,1,66,0,14,1,67,0,41,1,151,0,33,1,74,0,5,1,51,0,24,1,66,0,32,1,34,0,23,1,90,0,31,1,68,0,22,1,175,0,45,0,237,0,38,1,76,0,38,1,81,0,32,1,101,0,18,1,76,0,35,1,91,0,45,1,76,0,42,1,116,0,44,1,90,0,32,2,191,0,33,2,215,0,31,2,22,0,74,2,25,0,39,2,117,0,74,1,234,0,74,1,203,0,74,2,71,0,39,2,134,0,74,0,241,0,74,0,241,255,254,2,13,0,74,2,22,0,8,2,200,0,46,2,102,0,74,2,153,0,39,2,230,255,248,1,254,0,74,2,153,0,39,2,25,0,74,1,255,0,41,1,214,0,17,2,115,0,67,2,49,0,6,3,67,0,17,2,28,0,14,1,248,0,1,1,227,0,15,3,153,0,39,1,184,0,74,0,0,0,1,0,0,248,0,0,1,41,83,192,0,0,13,55,242,0,3,0,7,255,248,0,3,0,13,255,146,0,3,0,14,255,234,0,3,0,15,255,146,0,3,0,16,255,220,0,3,0,21,255,237,0,3,0,23,255,245,0,3,0,33,255,234,0,3,0,34,255,213,0,3,0,46,255,238,0,3,0,66,255,243,0,3,0,68,255,236,0,3,0,69,255,236,0,3,0,70,255,236,0,3,0,72,255,241,0,3,0,80,255,236,0,3,0,82,255,236,0,3,0,84,255,244,0,3,0,107,255,241,0,3,0,127,255,213,0,3,0,128,255,213,0,3,0,129,255,213,0,3,0,130,255,213,0,3,0,131,255,213,0,3,0,132,255,213,0,3,0,133,255,203,0,3,0,159,255,243,0,3,0,160,255,243,0,3,0,161,255,243,0,3,0,162,255,243,0,3,0,163,255,243,0,3,0,164,255,243,0,3,0,165,255,243,0,3,0,166,255,236,0,3,0,167,255,236,0,3,0,168,255,236,0,3,0,169,255,236,0,3,0,170,255,236,0,3,0,173,0,29,0,3,0,175,255,237,0,3,0,177,255,236,0,3,0,178,255,236,0,3,0,179,255,236,0,3,0,180,255,236,0,3,0,181,255,236,0,3,0,183,255,236,0,3,0,195,255,236,0,3,0,197,255,244,0,3,0,207,255,234,0,3,0,208,255,234,0,3,0,211,255,146,0,3,0,214,255,146,0,3,0,218,255,146,0,3,0,220,255,241,0,7,0,3,255,210,0,7,0,8,255,210,0,7,0,53,255,202,0,7,0,55,255,217,0,7,0,56,255,233,0,7,0,58,255,203,0,7,0,71,255,242,0,7,0,77,255,251,0,7,0,85,255,235,0,7,0,86,255,250,0,7,0,87,255,243,0,7,0,88,255,247,0,7,0,90,255,240,0,7,0,156,255,203,0,7,0,158,255,243,0,7,0,184,255,250,0,7,0,185,255,250,0,7,0,186,255,250,0,7,0,187,255,250,0,7,0,188,255,240,0,7,0,190,255,240,0,7,0,198,255,203,0,7,0,210,255,210,0,7,0,213,255,210,0,8,0,173,0,29,0,9,0,17,255,230,0,9,0,21,255,234,0,9,0,23,255,229,0,9,0,25,255,237,0,9,0,26,255,245,0,9,0,35,255,243,0,9,0,36,255,229,0,9,0,37,255,243,0,9,0,38,255,243,0,9,0,39,255,243,0,9,0,40,255,229,0,9,0,41,255,243,0,9,0,42,255,243,0,9,0,43,0,22,0,9,0,44,255,243,0,9,0,45,255,243,0,9,0,46,255,239,0,9,0,47,255,243,0,9,0,48,255,229,0,9,0,49,255,243,0,9,0,50,255,229,0,9,0,51,255,243,0,9,0,52,255,245,0,9,0,54,255,243,0,9,0,66,255,231,0,9,0,68,255,224,0,9,0,69,255,224,0,9,0,70,255,224,0,9,0,71,255,239,0,9,0,72,255,232,0,9,0,78,255,233,0,9,0,79,255,233,0,9,0,80,255,224,0,9,0,81,255,233,0,9,0,82,255,224,0,9,0,83,255,233,0,9,0,84,255,233,0,9,0,85,255,231,0,9,0,86,255,227,0,9,0,87,255,231,0,9,0,88,255,232,0,9,0,90,255,231,0,9,0,91,255,247,0,9,0,134,255,229,0,9,0,135,255,243,0,9,0,136,255,243,0,9,0,137,255,243,0,9,0,138,255,243,0,9,0,139,255,243,0,9,0,140,255,243,0,9,0,141,255,243,0,9,0,142,255,243,0,9,0,143,255,243,0,9,0,144,255,243,0,9,0,145,255,229,0,9,0,146,255,229,0,9,0,147,255,229,0,9,0,148,255,229,0,9,0,149,255,229,0,9,0,151,255,229,0,9,0,152,255,243,0,9,0,153,255,243,0,9,0,154,255,243,0,9,0,155,255,243,0,9,0,157,255,243,0,9,0,158,255,236,0,9,0,159,255,231,0,9,0,160,255,231,0,9,0,161,255,231,0,9,0,162,255,231,0,9,0,163,255,231,0,9,0,164,255,231,0,9,0,165,255,231,0,9,0,166,255,224,0,9,0,167,255,224,0,9,0,168,255,224,0,9,0,169,255,224,0,9,0,170,255,224,0,9,0,175,255,232,0,9,0,176,255,233,0,9,0,177,255,224,0,9,0,178,255,224,0,9,0,179,255,224,0,9,0,180,255,224,0,9,0,181,255,224,0,9,0,183,255,224,0,9,0,184,255,227,0,9,0,185,255,227,0,9,0,186,255,227,0,9,0,187,255,227,0,9,0,188,255,231,0,9,0,189,255,233,0,9,0,190,255,231,0,9,0,194,255,229,0,9,0,195,255,224,0,9,0,196,255,245,0,9,0,197,255,244,0,9,0,200,255,247,0,11,0,46,255,238,0,11,0,53,0,11,0,11,0,55,0,16,0,11,0,56,0,9,0,11,0,72,255,238,0,11,0,133,255,203,0,11,0,171,0,16,0,11,0,172,0,12,0,11,0,173,0,65,0,11,0,174,0,43,0,11,0,175,255,232,0,12,0,18,255,229,0,12,0,19,255,218,0,12,0,20,255,238,0,12,0,24,255,216,0,13,0,3,255,146,0,13,0,8,255,146,0,13,0,17,255,239,0,13,0,18,255,242,0,13,0,209,255,124,0,13,0,210,255,121,0,13,0,212,255,124,0,13,0,213,255,121,0,14,0,3,255,234,0,14,0,8,255,234,0,14,0,52,255,243,0,14,0,53,255,216,0,14,0,55,255,238,0,14,0,56,255,248,0,14,0,57,255,242,0,14,0,58,255,222,0,14,0,59,255,237,0,14,0,71,255,247,0,14,0,85,255,248,0,14,0,89,255,247,0,14,0,91,255,231,0,14,0,156,255,222,0,14,0,158,255,248,0,14,0,196,255,243,0,14,0,198,255,222,0,14,0,199,255,237,0,14,0,200,255,231,0,14,0,210,255,193,0,14,0,213,255,193,0,15,0,3,255,146,0,15,0,8,255,146,0,15,0,17,255,239,0,15,0,18,255,242,0,15,0,36,255,242,0,15,0,40,255,242,0,15,0,48,255,242,0,15,0,50,255,242,0,15,0,53,255,214,0,15,0,54,255,243,0,15,0,55,255,213,0,15,0,56,255,226,0,15,0,58,255,215,0,15,0,71,255,241,0,15,0,85,255,239,0,15,0,87,255,227,0,15,0,88,255,236,0,15,0,90,255,222,0,15,0,134,255,242,0,15,0,145,255,242,0,15,0,146,255,242,0,15,0,147,255,242,0,15,0,148,255,242,0,15,0,149,255,242,0,15,0,151,255,242,0,15,0,152,255,243,0,15,0,153,255,243,0,15,0,154,255,243,0,15,0,155,255,243,0,15,0,156,255,215,0,15,0,158,255,243,0,15,0,188,255,222,0,15,0,190,255,222,0,15,0,194,255,242,0,15,0,198,255,215,0,15,0,209,255,124,0,15,0,210,255,121,0,15,0,212,255,124,0,15,0,213,255,121,0,16,0,16,255,197,0,16,0,17,255,246,0,16,0,21,255,217,0,16,0,23,255,228,0,16,0,34,255,208,0,16,0,36,255,243,0,16,0,40,255,243,0,16,0,46,255,237,0,16,0,48,255,243,0,16,0,50,255,243,0,16,0,58,0,7,0,16,0,66,255,218,0,16,0,68,255,214,0,16,0,69,255,214,0,16,0,70,255,214,0,16,0,72,255,218,0,16,0,78,255,228,0,16,0,79,255,228,0,16,0,80,255,214,0,16,0,81,255,228,0,16,0,82,255,214,0,16,0,83,255,228,0,16,0,84,255,221,0,16,0,86,255,230,0,16,0,91,255,241,0,16,0,127,255,208,0,16,0,128,255,208,0,16,0,129,255,208,0,16,0,130,255,208,0,16,0,131,255,208,0,16,0,132,255,208,0,16,0,133,255,202,0,16,0,134,255,243,0,16,0,145,255,243,0,16,0,146,255,243,0,16,0,147,255,243,0,16,0,148,255,243,0,16,0,149,255,243,0,16,0,151,255,243,0,16,0,156,0,7,0,16,0,159,255,218,0,16,0,160,255,218,0,16,0,161,255,218,0,16,0,162,255,218,0,16,0,163,255,218,0,16,0,164,255,218,0,16,0,165,255,218,0,16,0,166,255,214,0,16,0,167,255,214,0,16,0,168,255,214,0,16,0,169,255,214,0,16,0,170,255,214,0,16,0,173,0,13,0,16,0,174,0,14,0,16,0,175,255,234,0,16,0,176,255,228,0,16,0,177,255,214,0,16,0,178,255,214,0,16,0,179,255,214,0,16,0,180,255,214,0,16,0,181,255,214,0,16,0,183,255,214,0,16,0,184,255,230,0,16,0,185,255,230,0,16,0,186,255,230,0,16,0,187,255,230,0,16,0,189,255,228,0,16,0,194,255,243,0,16,0,195,255,214,0,16,0,197,255,231,0,16,0,198,0,7,0,16,0,200,255,241,0,17,0,10,255,230,0,17,0,13,255,238,0,17,0,15,255,238,0,17,0,16,255,243,0,17,0,24,255,245,0,17,0,34,255,246,0,17,0,53,255,236,0,17,0,55,255,246,0,17,0,57,255,246,0,17,0,58,255,233,0,17,0,59,255,241,0,17,0,61,255,248,0,17,0,62,255,237,0,17,0,94,255,240,0,17,0,127,255,246,0,17,0,128,255,246,0,17,0,129,255,246,0,17,0,130,255,246,0,17,0,131,255,246,0,17,0,132,255,246,0,17,0,156,255,233,0,17,0,198,255,233,0,17,0,199,255,241,0,17,0,218,255,238,0,18,0,10,255,245,0,18,0,12,255,248,0,19,0,12,255,239,0,20,0,10,255,239,0,21,0,3,255,244,0,21,0,8,255,244,0,21,0,10,255,235,0,21,0,13,255,240,0,21,0,15,255,241,0,21,0,53,255,238,0,21,0,55,255,244,0,21,0,56,255,245,0,21,0,58,255,242,0,21,0,59,255,248,0,21,0,61,255,247,0,21,0,91,255,247,0,21,0,111,255,245,0,21,0,156,255,242,0,21,0,198,255,242,0,21,0,199,255,248,0,21,0,200,255,247,0,21,0,218,255,241,0,23,0,10,255,239,0,23,0,18,255,248,0,23,0,24,255,248,0,23,0,53,255,231,0,23,0,55,255,240,0,23,0,56,255,244,0,23,0,58,255,235,0,23,0,61,255,244,0,23,0,90,255,247,0,23,0,111,255,245,0,23,0,156,255,235,0,23,0,188,255,247,0,23,0,190,255,247,0,23,0,198,255,235,0,24,0,4,255,228,0,24,0,12,255,220,0,24,0,13,255,217,0,24,0,15,255,217,0,24,0,16,255,200,0,24,0,17,255,247,0,24,0,21,255,221,0,24,0,23,255,232,0,24,0,34,255,210,0,24,0,36,255,246,0,24,0,40,255,246,0,24,0,46,255,236,0,24,0,48,255,246,0,24,0,50,255,246,0,24,0,53,0,17,0,24,0,55,0,30,0,24,0,56,0,19,0,24,0,57,0,22,0,24,0,58,0,33,0,24,0,62,0,25,0,24,0,66,255,223,0,24,0,68,255,218,0,24,0,69,255,218,0,24,0,70,255,218,0,24,0,72,255,222,0,24,0,78,255,232,0,24,0,79,255,232,0,24,0,80,255,218,0,24,0,81,255,232,0,24,0,82,255,218,0,24,0,83,255,232,0,24,0,84,255,224,0,24,0,86,255,233,0,24,0,91,255,245,0,24,0,94,0,28,0,24,0,127,255,210,0,24,0,128,255,210,0,24,0,129,255,210,0,24,0,130,255,210,0,24,0,131,255,210,0,24,0,132,255,210,0,24,0,134,255,246,0,24,0,145,255,246,0,24,0,146,255,246,0,24,0,147,255,246,0,24,0,148,255,246,0,24,0,149,255,246,0,24,0,151,255,246,0,24,0,156,0,33,0,24,0,159,255,223,0,24,0,160,255,223,0,24,0,161,255,223,0,24,0,162,255,223,0,24,0,163,255,223,0,24,0,164,255,223,0,24,0,165,255,223,0,24,0,166,255,218,0,24,0,167,255,218,0,24,0,168,255,218,0,24,0,169,255,218,0,24,0,170,255,218,0,24,0,176,255,232,0,24,0,177,255,218,0,24,0,178,255,218,0,24,0,179,255,218,0,24,0,180,255,218,0,24,0,181,255,218,0,24,0,183,255,218,0,24,0,184,255,233,0,24,0,185,255,233,0,24,0,186,255,233,0,24,0,187,255,233,0,24,0,189,255,232,0,24,0,194,255,246,0,24,0,195,255,218,0,24,0,197,255,224,0,24,0,198,0,33,0,24,0,200,255,245,0,24,0,218,255,217,0,25,0,10,255,238,0,25,0,53,255,248,0,25,0,58,255,246,0,25,0,156,255,246,0,25,0,198,255,246,0,26,0,10,255,236,0,26,0,13,255,234,0,26,0,15,255,234,0,26,0,16,255,225,0,26,0,34,255,232,0,26,0,46,255,246,0,26,0,59,255,246,0,26,0,127,255,232,0,26,0,128,255,232,0,26,0,129,255,232,0,26,0,130,255,232,0,26,0,131,255,232,0,26,0,132,255,232,0,26,0,199,255,246,0,26,0,218,255,234,0,30,0,19,255,246,0,30,0,24,255,238,0,33,0,3,255,247,0,33,0,8,255,247,0,33,0,53,255,203,0,33,0,55,255,227,0,33,0,56,255,236,0,33,0,57,255,240,0,33,0,58,255,211,0,33,0,59,255,236,0,33,0,156,255,211,0,33,0,198,255,211,0,33,0,199,255,236,0,33,0,210,255,236,0,33,0,213,255,236,0,34,0,3,255,213,0,34,0,8,255,213,0,34,0,11,255,212,0,34,0,18,255,239,0,34,0,26,255,242,0,34,0,32,255,239,0,34,0,36,255,245,0,34,0,40,255,245,0,34,0,48,255,245,0,34,0,50,255,245,0,34,0,53,255,202,0,34,0,54,255,240,0,34,0,55,255,207,0,34,0,56,255,219,0,34,0,58,255,192,0,34,0,61,255,208,0,34,0,68,255,245,0,34,0,69,255,245,0,34,0,70,255,245,0,34,0,71,255,241,0,34,0,72,255,248,0,34,0,77,255,249,0,34,0,80,255,245,0,34,0,82,255,245,0,34,0,85,255,229,0,34,0,86,255,244,0,34,0,87,255,221,0,34,0,88,255,228,0,34,0,90,255,217,0,34,0,94,255,246,0,34,0,107,255,247,0,34,0,110,255,241,0,34,0,134,255,245,0,34,0,145,255,245,0,34,0,146,255,245,0,34,0,147,255,245,0,34,0,148,255,245,0,34,0,149,255,245,0,34,0,151,255,245,0,34,0,152,255,240,0,34,0,153,255,240,0,34,0,154,255,240,0,34,0,155,255,240,0,34,0,156,255,192,0,34,0,158,255,242,0,34,0,166,255,245,0,34,0,167,255,245,0,34,0,168,255,245,0,34,0,169,255,245,0,34,0,170,255,245,0,34,0,175,255,250,0,34,0,177,255,245,0,34,0,178,255,245,0,34,0,179,255,245,0,34,0,180,255,245,0,34,0,181,255,245,0,34,0,183,255,245,0,34,0,184,255,244,0,34,0,185,255,244,0,34,0,186,255,244,0,34,0,187,255,244,0,34,0,188,255,217,0,34,0,190,255,217,0,34,0,194,255,245,0,34,0,195,255,245,0,34,0,198,255,192,0,34,0,209,255,205,0,34,0,210,255,204,0,34,0,212,255,205,0,34,0,213,255,204,0,34,0,220,255,247,0,34,0,240,255,212,0,35,0,10,255,231,0,35,0,11,255,247,0,35,0,19,255,247,0,35,0,24,255,243,0,35,0,32,255,240,0,35,0,52,255,251,0,35,0,53,255,228,0,35,0,55,255,240,0,35,0,56,255,245,0,35,0,57,255,241,0,35,0,58,255,229,0,35,0,59,255,248,0,35,0,61,255,241,0,35,0,62,255,227,0,35,0,67,255,250,0,35,0,71,255,242,0,35,0,72,255,249,0,35,0,73,255,250,0,35,0,74,255,250,0,35,0,75,255,250,0,35,0,76,255,250,0,35,0,77,255,250,0,35,0,78,255,250,0,35,0,79,255,250,0,35,0,81,255,250,0,35,0,83,255,250,0,35,0,84,255,251,0,35,0,85,255,239,0,35,0,86,255,251,0,35,0,87,255,239,0,35,0,88,255,243,0,35,0,89,255,234,0,35,0,90,255,236,0,35,0,91,255,242,0,35,0,94,255,231,0,35,0,133,255,248,0,35,0,156,255,229,0,35,0,158,255,242,0,35,0,171,255,250,0,35,0,172,255,250,0,35,0,173,255,250,0,35,0,174,255,250,0,35,0,176,255,250,0,35,0,184,255,251,0,35,0,185,255,251,0,35,0,186,255,251,0,35,0,187,255,251,0,35,0,188,255,236,0,35,0,189,255,250,0,35,0,190,255,236,0,35,0,193,255,250,0,35,0,196,255,251,0,35,0,197,255,251,0,35,0,198,255,229,0,35,0,199,255,248,0,35,0,200,255,242,0,35,0,240,255,244,0,36,0,14,255,195,0,36,0,21,255,207,0,36,0,36,255,242,0,36,0,40,255,242,0,36,0,48,255,242,0,36,0,50,255,242,0,36,0,68,255,242,0,36,0,69,255,242,0,36,0,70,255,242,0,36,0,71,255,249,0,36,0,72,255,241,0,36,0,78,255,249,0,36,0,79,255,249,0,36,0,80,255,242,0,36,0,81,255,249,0,36,0,82,255,242,0,36,0,83,255,249,0,36,0,85,255,249,0,36,0,86,255,241,0,36,0,87,255,249,0,36,0,88,255,250,0,36,0,90,255,249,0,36,0,107,255,226,0,36,0,134,255,242,0,36,0,145,255,242,0,36,0,146,255,242,0,36,0,147,255,242,0,36,0,148,255,242,0,36,0,149,255,242,0,36,0,151,255,242,0,36,0,158,255,250,0,36,0,166,255,242,0,36,0,167,255,242,0,36,0,168,255,242,0,36,0,169,255,242,0,36,0,170,255,242,0,36,0,173,0,31,0,36,0,174,0,12,0,36,0,175,255,249,0,36,0,176,255,249,0,36,0,177,255,242,0,36,0,178,255,242,0,36,0,179,255,242,0,36,0,180,255,242,0,36,0,181,255,242,0,36,0,183,255,242,0,36,0,184,255,241,0,36,0,185,255,241,0,36,0,186,255,241,0,36,0,187,255,241,0,36,0,188,255,249,0,36,0,189,255,249,0,36,0,190,255,249,0,36,0,194,255,242,0,36,0,195,255,242,0,36,0,207,255,195,0,36,0,208,255,195,0,36,0,220,255,226,0,37,0,10,255,228,0,37,0,13,255,241,0,37,0,15,255,242,0,37,0,16,255,237,0,37,0,20,255,248,0,37,0,24,255,240,0,37,0,32,255,237,0,37,0,34,255,244,0,37,0,46,255,250,0,37,0,53,255,228,0,37,0,55,255,243,0,37,0,56,255,248,0,37,0,57,255,225,0,37,0,58,255,227,0,37,0,59,255,235,0,37,0,61,255,244,0,37,0,62,255,224,0,37,0,66,255,248,0,37,0,67,255,249,0,37,0,68,255,250,0,37,0,69,255,250,0,37,0,70,255,250,0,37,0,72,255,250,0,37,0,73,255,249,0,37,0,74,255,249,0,37,0,75,255,249,0,37,0,76,255,249,0,37,0,77,255,249,0,37,0,78,255,249,0,37,0,79,255,249,0,37,0,80,255,250,0,37,0,81,255,249,0,37,0,82,255,250,0,37,0,83,255,249,0,37,0,84,255,250,0,37,0,86,255,250,0,37,0,89,255,244,0,37,0,91,255,250,0,37,0,94,255,229,0,37,0,127,255,244,0,37,0,128,255,244,0,37,0,129,255,244,0,37,0,130,255,244,0,37,0,131,255,244,0,37,0,132,255,244,0,37,0,133,255,226,0,37,0,156,255,227,0,37,0,158,255,250,0,37,0,159,255,248,0,37,0,160,255,248,0,37,0,161,255,248,0,37,0,162,255,248,0,37,0,163,255,248,0,37,0,164,255,248,0,37,0,165,255,248,0,37,0,166,255,250,0,37,0,167,255,250,0,37,0,168,255,250,0,37,0,169,255,250,0,37,0,170,255,250,0,37,0,171,255,249,0,37,0,172,255,249,0,37,0,173,255,249,0,37,0,174,255,249,0,37,0,175,255,249,0,37,0,176,255,249,0,37,0,177,255,250,0,37,0,178,255,250,0,37,0,179,255,250,0,37,0,180,255,250,0,37,0,181,255,250,0,37,0,183,255,250,0,37,0,184,255,250,0,37,0,185,255,250,0,37,0,186,255,250,0,37,0,187,255,250,0,37,0,189,255,249,0,37,0,193,255,249,0,37,0,195,255,250,0,37,0,197,255,250,0,37,0,198,255,227,0,37,0,199,255,235,0,37,0,200,255,250,0,37,0,210,255,247,0,37,0,211,255,241,0,37,0,213,255,247,0,37,0,214,255,241,0,37,0,218,255,242,0,37,0,240,255,246,0,38,0,14,255,244,0,38,0,21,255,220,0,38,0,36,255,245,0,38,0,40,255,245,0,38,0,48,255,245,0,38,0,50,255,245,0,38,0,68,255,240,0,38,0,69,255,240,0,38,0,70,255,240,0,38,0,71,255,243,0,38,0,72,255,241,0,38,0,78,255,247,0,38,0,79,255,247,0,38,0,80,255,240,0,38,0,81,255,247,0,38,0,82,255,240,0,38,0,83,255,247,0,38,0,84,255,251,0,38,0,85,255,242,0,38,0,86,255,238,0,38,0,87,255,241,0,38,0,88,255,243,0,38,0,90,255,240,0,38,0,107,255,235,0,38,0,110,255,248,0,38,0,134,255,245,0,38,0,145,255,245,0,38,0,146,255,245,0,38,0,147,255,245,0,38,0,148,255,245,0,38,0,149,255,245,0,38,0,151,255,245,0,38,0,158,255,243,0,38,0,166,255,240,0,38,0,167,255,240,0,38,0,168,255,240,0,38,0,169,255,240,0,38,0,170,255,240,0,38,0,173,0,21,0,38,0,175,255,246,0,38,0,176,255,247,0,38,0,177,255,240,0,38,0,178,255,240,0,38,0,179,255,240,0,38,0,180,255,240,0,38,0,181,255,240,0,38,0,183,255,240,0,38,0,184,255,238,0,38,0,185,255,238,0,38,0,186,255,238,0,38,0,187,255,238,0,38,0,188,255,240,0,38,0,189,255,247,0,38,0,190,255,240,0,38,0,194,255,245,0,38,0,195,255,240,0,38,0,197,255,251,0,38,0,207,255,244,0,38,0,208,255,244,0,38,0,220,255,235,0,39,0,7,255,245,0,39,0,11,0,11,0,39,0,13,255,186,0,39,0,15,255,186,0,39,0,16,255,199,0,39,0,21,255,223,0,39,0,23,255,243,0,39,0,27,255,243,0,39,0,28,255,243,0,39,0,33,255,222,0,39,0,34,255,203,0,39,0,36,255,248,0,39,0,40,255,248,0,39,0,46,255,239,0,39,0,48,255,248,0,39,0,50,255,248,0,39,0,53,0,5,0,39,0,62,0,16,0,39,0,66,255,199,0,39,0,67,255,251,0,39,0,68,255,212,0,39,0,69,255,212,0,39,0,70,255,212,0,39,0,71,255,244,0,39,0,72,255,216,0,39,0,73,255,251,0,39,0,74,255,249,0,39,0,75,255,249,0,39,0,76,255,251,0,39,0,78,255,211,0,39,0,79,255,211,0,39,0,80,255,212,0,39,0,81,255,211,0,39,0,82,255,212,0,39,0,83,255,211,0,39,0,84,255,217,0,39,0,85,255,247,0,39,0,86,255,217,0,39,0,87,255,247,0,39,0,88,255,248,0,39,0,89,255,239,0,39,0,90,255,248,0,39,0,91,255,236,0,39,0,94,0,19,0,39,0,107,255,236,0,39,0,122,255,217,0,39,0,127,255,203,0,39,0,128,255,203,0,39,0,129,255,203,0,39,0,130,255,203,0,39,0,131,255,203,0,39,0,132,255,203,0,39,0,133,255,155,0,39,0,134,255,248,0,39,0,145,255,248,0,39,0,146,255,248,0,39,0,147,255,248,0,39,0,148,255,248,0,39,0,149,255,248,0,39,0,151,255,248,0,39,0,158,255,241,0,39,0,159,255,199,0,39,0,160,255,199,0,39,0,161,255,199,0,39,0,162,255,206,0,39,0,163,255,199,0,39,0,164,255,199,0,39,0,165,255,199,0,39,0,166,255,212,0,39,0,167,255,212,0,39,0,168,255,212,0,39,0,169,255,212,0,39,0,170,255,212,0,39,0,171,255,249,0,39,0,172,255,249,0,39,0,173,0,52,0,39,0,174,0,28,0,39,0,175,255,222,0,39,0,176,255,211,0,39,0,177,255,212,0,39,0,178,255,212,0,39,0,179,255,212,0,39,0,180,255,212,0,39,0,181,255,212,0,39,0,183,255,212,0,39,0,184,255,217,0,39,0,185,255,217,0,39,0,186,255,217,0,39,0,187,255,217,0,39,0,188,255,248,0,39,0,189,255,211,0,39,0,190,255,248,0,39,0,193,255,249,0,39,0,194,255,248,0,39,0,195,255,212,0,39,0,197,255,217,0,39,0,200,255,236,0,39,0,211,255,186,0,39,0,214,255,186,0,39,0,218,255,186,0,39,0,220,255,236,0,39,0,221,255,217,0,39,0,240,0,16,0,40,0,10,255,248,0,40,0,53,255,251,0,40,0,67,255,250,0,40,0,68,255,251,0,40,0,69,255,251,0,40,0,70,255,251,0,40,0,71,255,246,0,40,0,72,255,250,0,40,0,73,255,250,0,40,0,74,255,250,0,40,0,75,255,250,0,40,0,76,255,250,0,40,0,77,255,250,0,40,0,78,255,250,0,40,0,79,255,250,0,40,0,80,255,251,0,40,0,81,255,250,0,40,0,82,255,251,0,40,0,83,255,250,0,40,0,85,255,244,0,40,0,86,255,249,0,40,0,87,255,244,0,40,0,88,255,247,0,40,0,90,255,242,0,40,0,91,255,249,0,40,0,158,255,244,0,40,0,166,255,251,0,40,0,167,255,251,0,40,0,168,255,251,0,40,0,169,255,251,0,40,0,170,255,251,0,40,0,171,255,250,0,40,0,172,255,250,0,40,0,173,255,250,0,40,0,174,255,250,0,40,0,176,255,250,0,40,0,177,255,251,0,40,0,178,255,251,0,40,0,179,255,251,0,40,0,180,255,251,0,40,0,181,255,251,0,40,0,183,255,251,0,40,0,184,255,249,0,40,0,185,255,249,0,40,0,186,255,249,0,40,0,187,255,249,0,40,0,188,255,242,0,40,0,189,255,250,0,40,0,190,255,242,0,40,0,193,255,250,0,40,0,195,255,251,0,40,0,200,255,249,0,41,0,10,255,246,0,41,0,46,255,251,0,41,0,66,255,246,0,41,0,67,255,247,0,41,0,68,255,242,0,41,0,69,255,242,0,41,0,70,255,242,0,41,0,71,255,247,0,41,0,72,255,241,0,41,0,73,255,247,0,41,0,74,255,247,0,41,0,75,255,247,0,41,0,76,255,247,0,41,0,77,255,246,0,41,0,78,255,247,0,41,0,79,255,247,0,41,0,80,255,242,0,41,0,81,255,247,0,41,0,82,255,242,0,41,0,83,255,247,0,41,0,84,255,246,0,41,0,85,255,247,0,41,0,86,255,245,0,41,0,87,255,247,0,41,0,88,255,248,0,41,0,90,255,247,0,41,0,91,255,246,0,41,0,158,255,244,0,41,0,159,255,246,0,41,0,160,255,246,0,41,0,161,255,246,0,41,0,162,255,246,0,41,0,163,255,246,0,41,0,164,255,246,0,41,0,165,255,246,0,41,0,166,255,242,0,41,0,167,255,242,0,41,0,168,255,242,0,41,0,169,255,242,0,41,0,170,255,242,0,41,0,171,255,247,0,41,0,172,255,247,0,41,0,173,255,247,0,41,0,174,255,247,0,41,0,175,255,243,0,41,0,176,255,247,0,41,0,177,255,242,0,41,0,178,255,242,0,41,0,179,255,242,0,41,0,180,255,242,0,41,0,181,255,242,0,41,0,183,255,242,0,41,0,184,255,245,0,41,0,185,255,245,0,41,0,186,255,245,0,41,0,187,255,245,0,41,0,188,255,247,0,41,0,189,255,247,0,41,0,190,255,247,0,41,0,193,255,247,0,41,0,195,255,242,0,41,0,197,255,246,0,41,0,200,255,246,0,42,0,10,255,246,0,42,0,46,255,251,0,42,0,66,255,246,0,42,0,67,255,247,0,42,0,68,255,242,0,42,0,69,255,242,0,42,0,70,255,242,0,42,0,71,255,247,0,42,0,72,255,241,0,42,0,73,255,247,0,42,0,74,255,247,0,42,0,75,255,247,0,42,0,76,255,247,0,42,0,77,255,246,0,42,0,78,255,247,0,42,0,79,255,247,0,42,0,80,255,242,0,42,0,81,255,247,0,42,0,82,255,242,0,42,0,83,255,247,0,42,0,84,255,246,0,42,0,85,255,247,0,42,0,86,255,245,0,42,0,87,255,247,0,42,0,88,255,248,0,42,0,90,255,247,0,42,0,91,255,246,0,42,0,158,255,244,0,42,0,159,255,246,0,42,0,160,255,246,0,42,0,161,255,246,0,42,0,162,255,246,0,42,0,163,255,246,0,42,0,164,255,246,0,42,0,165,255,246,0,42,0,166,255,242,0,42,0,167,255,242,0,42,0,168,255,242,0,42,0,169,255,242,0,42,0,170,255,242,0,42,0,171,255,247,0,42,0,172,255,247,0,42,0,173,255,247,0,42,0,174,255,247,0,42,0,175,255,243,0,42,0,176,255,247,0,42,0,177,255,242,0,42,0,178,255,242,0,42,0,179,255,242,0,42,0,180,255,242,0,42,0,181,255,242,0,42,0,183,255,242,0,42,0,184,255,245,0,42,0,185,255,245,0,42,0,186,255,245,0,42,0,187,255,245,0,42,0,188,255,247,0,42,0,189,255,247,0,42,0,190,255,247,0,42,0,193,255,247,0,42,0,195,255,242,0,42,0,197,255,246,0,42,0,200,255,246,0,43,0,10,255,246,0,43,0,46,255,251,0,43,0,66,255,246,0,43,0,67,255,247,0,43,0,68,255,242,0,43,0,69,255,242,0,43,0,70,255,242,0,43,0,71,255,247,0,43,0,72,255,241,0,43,0,73,255,247,0,43,0,74,255,247,0,43,0,75,255,247,0,43,0,76,255,247,0,43,0,77,255,246,0,43,0,78,255,247,0,43,0,79,255,247,0,43,0,80,255,242,0,43,0,81,255,247,0,43,0,82,255,242,0,43,0,83,255,247,0,43,0,84,255,246,0,43,0,85,255,247,0,43,0,86,255,245,0,43,0,87,255,247,0,43,0,88,255,248,0,43,0,90,255,247,0,43,0,91,255,246,0,43,0,158,255,244,0,43,0,159,255,246,0,43,0,160,255,246,0,43,0,161,255,246,0,43,0,162,255,246,0,43,0,163,255,246,0,43,0,164,255,246,0,43,0,165,255,246,0,43,0,166,255,242,0,43,0,167,255,242,0,43,0,168,255,242,0,43,0,169,255,242,0,43,0,170,255,242,0,43,0,171,255,247,0,43,0,172,255,247,0,43,0,173,255,247,0,43,0,174,255,247,0,43,0,175,255,243,0,43,0,176,255,247,0,43,0,177,255,242,0,43,0,178,255,242,0,43,0,179,255,242,0,43,0,180,255,242,0,43,0,181,255,242,0,43,0,183,255,242,0,43,0,184,255,245,0,43,0,185,255,245,0,43,0,186,255,245,0,43,0,187,255,245,0,43,0,188,255,247,0,43,0,189,255,247,0,43,0,190,255,247,0,43,0,193,255,247,0,43,0,195,255,242,0,43,0,197,255,246,0,43,0,200,255,246,0,44,0,7,255,247,0,44,0,11,0,9,0,44,0,14,255,244,0,44,0,36,255,228,0,44,0,40,255,228,0,44,0,48,255,228,0,44,0,50,255,228,0,44,0,52,255,250,0,44,0,62,0,33,0,44,0,68,255,222,0,44,0,69,255,222,0,44,0,70,255,222,0,44,0,71,255,246,0,44,0,72,255,238,0,44,0,80,255,222,0,44,0,82,255,222,0,44,0,85,255,229,0,44,0,86,255,232,0,44,0,87,255,201,0,44,0,88,255,211,0,44,0,90,255,199,0,44,0,94,0,33,0,44,0,107,255,227,0,44,0,110,255,238,0,44,0,134,255,228,0,44,0,145,255,228,0,44,0,146,255,228,0,44,0,147,255,228,0,44,0,148,255,228,0,44,0,149,255,228,0,44,0,151,255,228,0,44,0,158,255,245,0,44,0,166,255,222,0,44,0,167,255,222,0,44,0,168,255,222,0,44,0,169,255,222,0,44,0,170,255,222,0,44,0,171,0,10,0,44,0,173,0,24,0,44,0,174,0,41,0,44,0,175,255,239,0,44,0,177,255,222,0,44,0,178,255,222,0,44,0,179,255,222,0,44,0,180,255,222,0,44,0,181,255,222,0,44,0,183,255,222,0,44,0,184,255,232,0,44,0,185,255,232,0,44,0,186,255,232,0,44,0,187,255,232,0,44,0,188,255,199,0,44,0,190,255,199,0,44,0,194,255,228,0,44,0,195,255,222,0,44,0,196,255,250,0,44,0,207,255,244,0,44,0,208,255,244,0,44,0,220,255,227,0,44,0,240,0,27,0,45,0,3,255,166,0,45,0,8,255,166,0,45,0,11,255,166,0,45,0,14,255,196,0,45,0,17,255,243,0,45,0,18,255,236,0,45,0,21,255,194,0,45,0,26,255,227,0,45,0,32,255,231,0,45,0,36,255,232,0,45,0,40,255,232,0,45,0,48,255,232,0,45,0,50,255,232,0,45,0,53,255,189,0,45,0,54,255,238,0,45,0,55,255,154,0,45,0,56,255,203,0,45,0,58,255,158,0,45,0,61,255,187,0,45,0,62,255,240,0,45,0,68,255,246,0,45,0,69,255,246,0,45,0,70,255,246,0,45,0,71,255,241,0,45,0,72,255,249,0,45,0,80,255,246,0,45,0,82,255,246,0,45,0,85,255,232,0,45,0,86,255,249,0,45,0,87,255,199,0,45,0,88,255,212,0,45,0,90,255,181,0,45,0,94,255,241,0,45,0,107,255,222,0,45,0,110,255,220,0,45,0,134,255,232,0,45,0,145,255,232,0,45,0,146,255,232,0,45,0,147,255,232,0,45,0,148,255,232,0,45,0,149,255,232,0,45,0,151,255,232,0,45,0,152,255,238,0,45,0,153,255,238,0,45,0,154,255,238,0,45,0,155,255,238,0,45,0,156,255,158,0,45,0,158,255,243,0,45,0,166,255,246,0,45,0,167,255,246,0,45,0,168,255,246,0,45,0,169,255,246,0,45,0,170,255,246,0,45,0,177,255,246,0,45,0,178,255,246,0,45,0,179,255,246,0,45,0,180,255,246,0,45,0,181,255,246,0,45,0,183,255,246,0,45,0,184,255,249,0,45,0,185,255,249,0,45,0,186,255,249,0,45,0,187,255,249,0,45,0,188,255,181,0,45,0,190,255,181,0,45,0,194,255,232,0,45,0,195,255,246,0,45,0,198,255,158,0,45,0,207,255,196,0,45,0,208,255,196,0,45,0,209,255,167,0,45,0,210,255,167,0,45,0,212,255,167,0,45,0,213,255,167,0,45,0,220,255,222,0,45,0,240,255,166,0,46,0,3,255,238,0,46,0,8,255,238,0,46,0,10,255,242,0,46,0,11,255,238,0,46,0,18,255,247,0,46,0,32,255,242,0,46,0,35,255,251,0,46,0,36,255,251,0,46,0,37,255,251,0,46,0,38,255,251,0,46,0,39,255,251,0,46,0,40,255,251,0,46,0,41,255,251,0,46,0,42,255,251,0,46,0,43,255,251,0,46,0,44,255,251,0,46,0,45,255,251,0,46,0,47,255,251,0,46,0,48,255,251,0,46,0,49,255,251,0,46,0,50,255,251,0,46,0,51,255,251,0,46,0,53,255,231,0,46,0,54,255,248,0,46,0,55,255,236,0,46,0,56,255,238,0,46,0,58,255,233,0,46,0,61,255,239,0,46,0,66,255,250,0,46,0,67,255,245,0,46,0,68,255,244,0,46,0,69,255,244,0,46,0,70,255,244,0,46,0,71,255,240,0,46,0,72,255,243,0,46,0,73,255,245,0,46,0,74,255,246,0,46,0,75,255,246,0,46,0,76,255,245,0,46,0,77,255,245,0,46,0,78,255,246,0,46,0,79,255,246,0,46,0,80,255,244,0,46,0,81,255,246,0,46,0,82,255,244,0,46,0,83,255,246,0,46,0,84,255,250,0,46,0,85,255,236,0,46,0,86,255,244,0,46,0,87,255,234,0,46,0,88,255,236,0,46,0,90,255,233,0,46,0,91,255,249,0,46,0,134,255,251,0,46,0,135,255,251,0,46,0,136,255,251,0,46,0,137,255,251,0,46,0,138,255,251,0,46,0,139,255,251,0,46,0,140,255,251,0,46,0,141,255,251,0,46,0,142,255,251,0,46,0,143,255,251,0,46,0,144,255,251,0,46,0,145,255,251,0,46,0,146,255,251,0,46,0,147,255,251,0,46,0,148,255,251,0,46,0,149,255,251,0,46,0,151,255,251,0,46,0,152,255,248,0,46,0,153,255,248,0,46,0,154,255,248,0,46,0,155,255,248,0,46,0,156,255,233,0,46,0,157,255,251,0,46,0,158,255,238,0,46,0,159,255,250,0,46,0,160,255,250,0,46,0,161,255,250,0,46,0,162,255,250,0,46,0,163,255,250,0,46,0,164,255,250,0,46,0,165,255,250,0,46,0,166,255,244,0,46,0,167,255,244,0,46,0,168,255,244,0,46,0,169,255,244,0,46,0,170,255,244,0,46,0,171,255,246,0,46,0,172,255,246,0,46,0,173,255,246,0,46,0,174,255,246,0,46,0,175,255,247,0,46,0,176,255,246,0,46,0,177,255,244,0,46,0,178,255,244,0,46,0,179,255,244,0,46,0,180,255,244,0,46,0,181,255,244,0,46,0,183,255,244,0,46,0,184,255,244,0,46,0,185,255,244,0,46,0,186,255,244,0,46,0,187,255,244,0,46,0,188,255,233,0,46,0,189,255,246,0,46,0,190,255,233,0,46,0,193,255,246,0,46,0,194,255,251,0,46,0,195,255,244,0,46,0,197,255,250,0,46,0,198,255,233,0,46,0,200,255,249,0,46,0,209,255,236,0,46,0,210,255,236,0,46,0,212,255,236,0,46,0,213,255,236,0,46,0,240,255,237,0,47,0,10,255,246,0,47,0,46,255,251,0,47,0,66,255,246,0,47,0,67,255,247,0,47,0,68,255,242,0,47,0,69,255,242,0,47,0,70,255,242,0,47,0,71,255,247,0,47,0,72,255,241,0,47,0,73,255,247,0,47,0,74,255,247,0,47,0,75,255,247,0,47,0,76,255,247,0,47,0,77,255,246,0,47,0,78,255,247,0,47,0,79,255,247,0,47,0,80,255,242,0,47,0,81,255,247,0,47,0,82,255,242,0,47,0,83,255,247,0,47,0,84,255,246,0,47,0,85,255,247,0,47,0,86,255,245,0,47,0,87,255,247,0,47,0,88,255,248,0,47,0,90,255,247,0,47,0,91,255,246,0,47,0,158,255,244,0,47,0,159,255,246,0,47,0,160,255,246,0,47,0,161,255,246,0,47,0,162,255,246,0,47,0,163,255,246,0,47,0,164,255,246,0,47,0,165,255,246,0,47,0,166,255,242,0,47,0,167,255,242,0,47,0,168,255,242,0,47,0,169,255,242,0,47,0,170,255,242,0,47,0,171,255,247,0,47,0,172,255,247,0,47,0,173,255,247,0,47,0,174,255,247,0,47,0,175,255,243,0,47,0,176,255,247,0,47,0,177,255,242,0,47,0,178,255,242,0,47,0,179,255,242,0,47,0,180,255,242,0,47,0,181,255,242,0,47,0,183,255,242,0,47,0,184,255,245,0,47,0,185,255,245,0,47,0,186,255,245,0,47,0,187,255,245,0,47,0,188,255,247,0,47,0,189,255,247,0,47,0,190,255,247,0,47,0,193,255,247,0,47,0,195,255,242,0,47,0,197,255,246,0,47,0,200,255,246,0,48,0,10,255,229,0,48,0,13,255,242,0,48,0,15,255,242,0,48,0,16,255,239,0,48,0,24,255,243,0,48,0,32,255,240,0,48,0,34,255,245,0,48,0,46,255,251,0,48,0,53,255,232,0,48,0,55,255,244,0,48,0,56,255,248,0,48,0,57,255,229,0,48,0,58,255,230,0,48,0,59,255,238,0,48,0,61,255,245,0,48,0,62,255,227,0,48,0,66,255,247,0,48,0,67,255,250,0,48,0,68,255,250,0,48,0,69,255,250,0,48,0,70,255,250,0,48,0,72,255,250,0,48,0,73,255,250,0,48,0,74,255,249,0,48,0,75,255,249,0,48,0,76,255,250,0,48,0,77,255,250,0,48,0,78,255,249,0,48,0,79,255,249,0,48,0,80,255,250,0,48,0,81,255,249,0,48,0,82,255,250,0,48,0,83,255,249,0,48,0,84,255,250,0,48,0,86,255,251,0,48,0,89,255,245,0,48,0,91,255,250,0,48,0,94,255,231,0,48,0,127,255,245,0,48,0,128,255,245,0,48,0,129,255,245,0,48,0,130,255,245,0,48,0,131,255,245,0,48,0,132,255,245,0,48,0,133,255,229,0,48,0,156,255,230,0,48,0,158,255,251,0,48,0,159,255,247,0,48,0,160,255,247,0,48,0,161,255,247,0,48,0,162,255,247,0,48,0,163,255,247,0,48,0,164,255,247,0,48,0,165,255,247,0,48,0,166,255,250,0,48,0,167,255,250,0,48,0,168,255,250,0,48,0,169,255,250,0,48,0,170,255,250,0,48,0,171,255,249,0,48,0,172,255,249,0,48,0,173,255,249,0,48,0,174,255,249,0,48,0,175,255,250,0,48,0,176,255,249,0,48,0,177,255,250,0,48,0,178,255,250,0,48,0,179,255,250,0,48,0,180,255,250,0,48,0,181,255,250,0,48,0,183,255,250,0,48,0,184,255,251,0,48,0,185,255,251,0,48,0,186,255,251,0,48,0,187,255,251,0,48,0,189,255,249,0,48,0,193,255,249,0,48,0,195,255,250,0,48,0,197,255,250,0,48,0,198,255,230,0,48,0,199,255,238,0,48,0,200,255,250,0,48,0,210,255,247,0,48,0,211,255,242,0,48,0,213,255,247,0,48,0,214,255,242,0,48,0,218,255,242,0,48,0,240,255,246,0,49,0,7,255,250,0,49,0,10,255,241,0,49,0,13,255,175,0,49,0,15,255,175,0,49,0,16,255,210,0,49,0,20,255,248,0,49,0,21,255,242,0,49,0,33,255,241,0,49,0,34,255,216,0,49,0,46,255,246,0,49,0,57,255,242,0,49,0,59,255,248,0,49,0,66,255,242,0,49,0,67,255,251,0,49,0,68,255,243,0,49,0,69,255,243,0,49,0,70,255,243,0,49,0,72,255,246,0,49,0,73,255,251,0,49,0,74,255,250,0,49,0,75,255,250,0,49,0,76,255,251,0,49,0,77,255,251,0,49,0,78,255,248,0,49,0,79,255,248,0,49,0,80,255,243,0,49,0,81,255,248,0,49,0,82,255,243,0,49,0,83,255,248,0,49,0,84,255,248,0,49,0,86,255,250,0,49,0,127,255,216,0,49,0,128,255,216,0,49,0,129,255,216,0,49,0,130,255,216,0,49,0,131,255,216,0,49,0,132,255,216,0,49,0,133,255,187,0,49,0,159,255,242,0,49,0,160,255,242,0,49,0,161,255,242,0,49,0,162,255,242,0,49,0,163,255,242,0,49,0,164,255,242,0,49,0,165,255,242,0,49,0,166,255,243,0,49,0,167,255,243,0,49,0,168,255,243,0,49,0,169,255,243,0,49,0,170,255,243,0,49,0,171,255,250,0,49,0,172,255,250,0,49,0,173,0,25,0,49,0,174,0,4,0,49,0,175,255,234,0,49,0,176,255,248,0,49,0,177,255,243,0,49,0,178,255,243,0,49,0,179,255,243,0,49,0,180,255,243,0,49,0,181,255,243,0,49,0,183,255,243,0,49,0,184,255,250,0,49,0,185,255,250,0,49,0,186,255,250,0,49,0,187,255,250,0,49,0,189,255,248,0,49,0,193,255,250,0,49,0,195,255,243,0,49,0,197,255,248,0,49,0,199,255,248,0,49,0,211,255,175,0,49,0,214,255,175,0,49,0,218,255,175,0,50,0,10,255,229,0,50,0,13,255,242,0,50,0,15,255,242,0,50,0,16,255,239,0,50,0,24,255,243,0,50,0,32,255,240,0,50,0,34,255,245,0,50,0,46,255,251,0,50,0,53,255,232,0,50,0,55,255,244,0,50,0,56,255,248,0,50,0,57,255,229,0,50,0,58,255,230,0,50,0,59,255,238,0,50,0,61,255,245,0,50,0,62,255,227,0,50,0,66,255,247,0,50,0,67,255,250,0,50,0,68,255,250,0,50,0,69,255,250,0,50,0,70,255,250,0,50,0,72,255,250,0,50,0,73,255,250,0,50,0,74,255,249,0,50,0,75,255,249,0,50,0,76,255,250,0,50,0,77,255,250,0,50,0,78,255,249,0,50,0,79,255,249,0,50,0,80,255,250,0,50,0,81,255,249,0,50,0,82,255,250,0,50,0,83,255,249,0,50,0,84,255,250,0,50,0,86,255,251,0,50,0,89,255,245,0,50,0,91,255,250,0,50,0,94,255,231,0,50,0,127,255,245,0,50,0,128,255,245,0,50,0,129,255,245,0,50,0,130,255,245,0,50,0,131,255,245,0,50,0,132,255,245,0,50,0,133,255,229,0,50,0,156,255,230,0,50,0,158,255,251,0,50,0,159,255,247,0,50,0,160,255,247,0,50,0,161,255,247,0,50,0,162,255,247,0,50,0,163,255,247,0,50,0,164,255,247,0,50,0,165,255,247,0,50,0,166,255,250,0,50,0,167,255,250,0,50,0,168,255,250,0,50,0,169,255,250,0,50,0,170,255,250,0,50,0,171,255,249,0,50,0,172,255,249,0,50,0,173,255,249,0,50,0,174,255,249,0,50,0,175,255,250,0,50,0,176,255,249,0,50,0,177,255,250,0,50,0,178,255,250,0,50,0,179,255,250,0,50,0,180,255,250,0,50,0,181,255,250,0,50,0,183,255,250,0,50,0,184,255,251,0,50,0,185,255,251,0,50,0,186,255,251,0,50,0,187,255,251,0,50,0,189,255,249,0,50,0,193,255,249,0,50,0,195,255,250,0,50,0,197,255,250,0,50,0,198,255,230,0,50,0,199,255,238,0,50,0,200,255,250,0,50,0,210,255,247,0,50,0,211,255,242,0,50,0,213,255,247,0,50,0,214,255,242,0,50,0,218,255,242,0,50,0,240,255,246,0,51,0,21,255,234,0,51,0,53,255,243,0,51,0,55,255,251,0,51,0,58,255,245,0,51,0,62,255,240,0,51,0,66,255,251,0,51,0,67,255,250,0,51,0,68,255,237,0,51,0,69,255,237,0,51,0,70,255,237,0,51,0,71,255,249,0,51,0,72,255,243,0,51,0,73,255,250,0,51,0,74,255,249,0,51,0,75,255,249,0,51,0,76,255,250,0,51,0,77,255,248,0,51,0,78,255,248,0,51,0,79,255,248,0,51,0,80,255,237,0,51,0,81,255,248,0,51,0,82,255,237,0,51,0,83,255,248,0,51,0,85,255,248,0,51,0,86,255,244,0,51,0,87,255,248,0,51,0,88,255,250,0,51,0,90,255,248,0,51,0,94,255,247,0,51,0,107,255,242,0,51,0,156,255,245,0,51,0,158,255,247,0,51,0,159,255,251,0,51,0,160,255,251,0,51,0,161,255,251,0,51,0,162,255,251,0,51,0,163,255,251,0,51,0,164,255,251,0,51,0,165,255,251,0,51,0,166,255,237,0,51,0,167,255,237,0,51,0,168,255,237,0,51,0,169,255,237,0,51,0,170,255,237,0,51,0,171,255,249,0,51,0,172,255,249,0,51,0,173,255,249,0,51,0,174,255,249,0,51,0,175,255,242,0,51,0,176,255,248,0,51,0,177,255,237,0,51,0,178,255,237,0,51,0,179,255,237,0,51,0,180,255,237,0,51,0,181,255,237,0,51,0,183,255,237,0,51,0,184,255,244,0,51,0,185,255,244,0,51,0,186,255,244,0,51,0,187,255,244,0,51,0,188,255,248,0,51,0,189,255,248,0,51,0,190,255,248,0,51,0,193,255,249,0,51,0,195,255,237,0,51,0,198,255,245,0,51,0,220,255,242,0,52,0,10,255,246,0,52,0,57,255,251,0,52,0,67,255,250,0,52,0,71,255,243,0,52,0,72,255,250,0,52,0,73,255,250,0,52,0,74,255,250,0,52,0,75,255,250,0,52,0,76,255,250,0,52,0,77,255,250,0,52,0,78,255,250,0,52,0,79,255,250,0,52,0,81,255,250,0,52,0,83,255,250,0,52,0,84,255,251,0,52,0,85,255,241,0,52,0,86,255,250,0,52,0,87,255,241,0,52,0,88,255,244,0,52,0,89,255,242,0,52,0,90,255,240,0,52,0,91,255,244,0,52,0,158,255,244,0,52,0,171,255,250,0,52,0,172,255,250,0,52,0,173,255,250,0,52,0,174,255,250,0,52,0,176,255,250,0,52,0,184,255,250,0,52,0,185,255,250,0,52,0,186,255,250,0,52,0,187,255,250,0,52,0,188,255,240,0,52,0,189,255,250,0,52,0,190,255,240,0,52,0,193,255,250,0,52,0,197,255,251,0,52,0,200,255,244,0,53,0,7,255,241,0,53,0,11,0,12,0,53,0,13,255,213,0,53,0,14,255,216,0,53,0,15,255,214,0,53,0,16,255,205,0,53,0,17,255,235,0,53,0,21,255,211,0,53,0,23,255,218,0,53,0,25,255,248,0,53,0,27,255,222,0,53,0,28,255,222,0,53,0,33,255,197,0,53,0,34,255,202,0,53,0,36,255,232,0,53,0,40,255,232,0,53,0,46,255,230,0,53,0,48,255,232,0,53,0,50,255,232,0,53,0,62,0,18,0,53,0,66,255,195,0,53,0,67,255,250,0,53,0,68,255,177,0,53,0,69,255,177,0,53,0,70,255,177,0,53,0,71,255,231,0,53,0,72,255,175,0,53,0,73,255,250,0,53,0,74,255,247,0,53,0,75,255,247,0,53,0,76,255,250,0,53,0,77,255,250,0,53,0,78,255,168,0,53,0,79,255,168,0,53,0,80,255,177,0,53,0,81,255,168,0,53,0,82,255,177,0,53,0,83,255,168,0,53,0,84,255,197,0,53,0,85,255,230,0,53,0,86,255,169,0,53,0,87,255,173,0,53,0,88,255,182,0,53,0,89,255,170,0,53,0,90,255,171,0,53,0,91,255,208,0,53,0,94,0,21,0,53,0,107,255,195,0,53,0,110,255,232,0,53,0,122,255,197,0,53,0,127,255,202,0,53,0,128,255,202,0,53,0,129,255,202,0,53,0,130,255,202,0,53,0,131,255,202,0,53,0,132,255,202,0,53,0,133,255,183,0,53,0,134,255,232,0,53,0,145,255,232,0,53,0,146,255,232,0,53,0,147,255,232,0,53,0,148,255,232,0,53,0,149,255,232,0,53,0,151,255,232,0,53,0,158,255,227,0,53,0,159,255,195,0,53,0,160,255,195,0,53,0,161,255,195,0,53,0,162,255,203,0,53,0,163,255,195,0,53,0,164,255,195,0,53,0,165,255,195,0,53,0,166,255,177,0,53,0,167,255,177,0,53,0,168,255,177,0,53,0,169,255,177,0,53,0,170,255,177,0,53,0,171,255,254,0,53,0,172,255,254,0,53,0,173,0,52,0,53,0,174,0,30,0,53,0,175,255,215,0,53,0,176,255,168,0,53,0,177,255,177,0,53,0,178,255,177,0,53,0,179,255,177,0,53,0,180,255,177,0,53,0,181,255,177,0,53,0,183,255,177,0,53,0,184,255,169,0,53,0,185,255,169,0,53,0,186,255,169,0,53,0,187,255,169,0,53,0,188,255,171,0,53,0,189,255,208,0,53,0,190,255,171,0,53,0,193,255,247,0,53,0,194,255,232,0,53,0,195,255,177,0,53,0,197,255,216,0,53,0,200,255,208,0,53,0,207,255,216,0,53,0,208,255,216,0,53,0,211,255,213,0,53,0,214,255,213,0,53,0,218,255,214,0,53,0,220,255,195,0,53,0,221,255,197,0,53,0,240,0,16,0,54,0,10,255,245,0,54,0,13,255,243,0,54,0,15,255,243,0,54,0,16,255,234,0,54,0,34,255,240,0,54,0,46,255,248,0,54,0,59,255,251,0,54,0,66,255,242,0,54,0,67,255,245,0,54,0,68,255,243,0,54,0,69,255,243,0,54,0,70,255,243,0,54,0,71,255,250,0,54,0,72,255,242,0,54,0,73,255,245,0,54,0,74,255,243,0,54,0,75,255,243,0,54,0,76,255,245,0,54,0,77,255,244,0,54,0,78,255,240,0,54,0,79,255,240,0,54,0,80,255,243,0,54,0,81,255,240,0,54,0,82,255,243,0,54,0,83,255,240,0,54,0,84,255,243,0,54,0,85,255,249,0,54,0,86,255,242,0,54,0,87,255,250,0,54,0,88,255,250,0,54,0,89,255,250,0,54,0,90,255,250,0,54,0,91,255,244,0,54,0,127,255,240,0,54,0,128,255,240,0,54,0,129,255,240,0,54,0,130,255,240,0,54,0,131,255,240,0,54,0,132,255,240,0,54,0,133,255,240,0,54,0,158,255,248,0,54,0,159,255,242,0,54,0,160,255,242,0,54,0,161,255,242,0,54,0,162,255,242,0,54,0,163,255,242,0,54,0,164,255,242,0,54,0,165,255,242,0,54,0,166,255,243,0,54,0,167,255,243,0,54,0,168,255,243,0,54,0,169,255,243,0,54,0,170,255,243,0,54,0,171,255,243,0,54,0,172,255,243,0,54,0,173,255,251,0,54,0,174,255,243,0,54,0,175,255,242,0,54,0,176,255,240,0,54,0,177,255,243,0,54,0,178,255,243,0,54,0,179,255,243,0,54,0,180,255,243,0,54,0,181,255,243,0,54,0,183,255,243,0,54,0,184,255,242,0,54,0,185,255,242,0,54,0,186,255,242,0,54,0,187,255,242,0,54,0,188,255,250,0,54,0,189,255,240,0,54,0,190,255,250,0,54,0,193,255,243,0,54,0,195,255,243,0,54,0,197,255,243,0,54,0,199,255,251,0,54,0,200,255,244,0,54,0,211,255,243,0,54,0,214,255,243,0,54,0,218,255,243,0,55,0,7,255,243,0,55,0,11,0,16,0,55,0,13,255,213,0,55,0,14,255,238,0,55,0,15,255,213,0,55,0,16,255,201,0,55,0,17,255,246,0,55,0,21,255,220,0,55,0,23,255,230,0,55,0,28,255,248,0,55,0,33,255,213,0,55,0,34,255,207,0,55,0,36,255,244,0,55,0,40,255,244,0,55,0,46,255,235,0,55,0,48,255,244,0,55,0,50,255,244,0,55,0,62,0,29,0,55,0,66,255,216,0,55,0,68,255,196,0,55,0,69,255,196,0,55,0,70,255,196,0,55,0,71,255,244,0,55,0,72,255,203,0,55,0,78,255,220,0,55,0,79,255,220,0,55,0,80,255,196,0,55,0,81,255,220,0,55,0,82,255,196,0,55,0,83,255,220,0,55,0,84,255,217,0,55,0,85,255,239,0,55,0,86,255,220,0,55,0,87,255,242,0,55,0,88,255,241,0,55,0,89,255,243,0,55,0,90,255,243,0,55,0,91,255,243,0,55,0,94,0,29,0,55,0,107,255,220,0,55,0,110,255,245,0,55,0,122,255,244,0,55,0,127,255,207,0,55,0,128,255,207,0,55,0,129,255,207,0,55,0,130,255,207,0,55,0,131,255,207,0,55,0,132,255,207,0,55,0,133,255,196,0,55,0,134,255,244,0,55,0,145,255,244,0,55,0,146,255,244,0,55,0,147,255,244,0,55,0,148,255,244,0,55,0,149,255,244,0,55,0,151,255,244,0,55,0,158,255,242,0,55,0,159,255,216,0,55,0,160,255,216,0,55,0,161,255,216,0,55,0,162,255,216,0,55,0,163,255,216,0,55,0,164,255,216,0,55,0,165,255,216,0,55,0,166,255,196,0,55,0,167,255,196,0,55,0,168,255,196,0,55,0,169,255,196,0,55,0,170,255,196,0,55,0,171,0,9,0,55,0,173,0,44,0,55,0,174,0,40,0,55,0,175,255,216,0,55,0,176,255,220,0,55,0,177,255,196,0,55,0,178,255,196,0,55,0,179,255,196,0,55,0,180,255,196,0,55,0,181,255,196,0,55,0,183,255,196,0,55,0,184,255,220,0,55,0,185,255,220,0,55,0,186,255,220,0,55,0,187,255,220,0,55,0,188,255,243,0,55,0,189,255,220,0,55,0,190,255,243,0,55,0,194,255,244,0,55,0,195,255,196,0,55,0,197,255,227,0,55,0,200,255,243,0,55,0,207,255,238,0,55,0,208,255,238,0,55,0,211,255,213,0,55,0,214,255,213,0,55,0,218,255,213,0,55,0,220,255,220,0,55,0,221,255,244,0,55,0,240,0,26,0,56,0,7,255,247,0,56,0,11,0,17,0,56,0,13,255,225,0,56,0,14,255,248,0,56,0,15,255,226,0,56,0,16,255,215,0,56,0,21,255,233,0,56,0,23,255,241,0,56,0,33,255,223,0,56,0,34,255,219,0,56,0,36,255,249,0,56,0,40,255,249,0,56,0,46,255,239,0,56,0,48,255,249,0,56,0,50,255,249,0,56,0,62,0,26,0,56,0,66,255,216,0,56,0,68,255,217,0,56,0,69,255,217,0,56,0,70,255,217,0,56,0,71,255,247,0,56,0,72,255,216,0,56,0,74,255,251,0,56,0,75,255,251,0,56,0,78,255,224,0,56,0,79,255,224,0,56,0,80,255,217,0,56,0,81,255,224,0,56,0,82,255,217,0,56,0,83,255,224,0,56,0,84,255,219,0,56,0,85,255,243,0,56,0,86,255,227,0,56,0,87,255,247,0,56,0,88,255,247,0,56,0,89,255,249,0,56,0,90,255,248,0,56,0,91,255,247,0,56,0,94,0,28,0,56,0,107,255,230,0,56,0,127,255,219,0,56,0,128,255,219,0,56,0,129,255,219,0,56,0,130,255,219,0,56,0,131,255,219,0,56,0,132,255,219,0,56,0,133,255,209,0,56,0,134,255,249,0,56,0,145,255,249,0,56,0,146,255,249,0,56,0,147,255,249,0,56,0,148,255,249,0,56,0,149,255,249,0,56,0,151,255,249,0,56,0,158,255,245,0,56,0,159,255,216,0,56,0,160,255,216,0,56,0,161,255,216,0,56,0,162,255,216,0,56,0,163,255,216,0,56,0,164,255,216,0,56,0,165,255,216,0,56,0,166,255,217,0,56,0,167,255,217,0,56,0,168,255,217,0,56,0,169,255,217,0,56,0,170,255,217,0,56,0,171,0,4,0,56,0,172,255,251,0,56,0,173,0,44,0,56,0,174,0,36,0,56,0,175,255,222,0,56,0,176,255,224,0,56,0,177,255,217,0,56,0,178,255,217,0,56,0,179,255,217,0,56,0,180,255,217,0,56,0,181,255,217,0,56,0,183,255,217,0,56,0,184,255,227,0,56,0,185,255,227,0,56,0,186,255,227,0,56,0,187,255,227,0,56,0,188,255,248,0,56,0,189,255,224,0,56,0,190,255,248,0,56,0,193,255,251,0,56,0,194,255,249,0,56,0,195,255,217,0,56,0,197,255,219,0,56,0,200,255,247,0,56,0,207,255,248,0,56,0,208,255,248,0,56,0,211,255,225,0,56,0,214,255,225,0,56,0,218,255,226,0,56,0,220,255,230,0,56,0,240,0,23,0,57,0,7,255,246,0,57,0,14,255,243,0,57,0,36,255,229,0,57,0,40,255,229,0,57,0,48,255,229,0,57,0,50,255,229,0,57,0,52,255,251,0,57,0,62,0,31,0,57,0,68,255,223,0,57,0,69,255,223,0,57,0,70,255,223,0,57,0,71,255,245,0,57,0,72,255,238,0,57,0,80,255,223,0,57,0,82,255,223,0,57,0,85,255,228,0,57,0,86,255,232,0,57,0,87,255,207,0,57,0,88,255,213,0,57,0,90,255,206,0,57,0,94,0,31,0,57,0,107,255,226,0,57,0,110,255,238,0,57,0,134,255,229,0,57,0,145,255,229,0,57,0,146,255,229,0,57,0,147,255,229,0,57,0,148,255,229,0,57,0,149,255,229,0,57,0,151,255,229,0,57,0,158,255,243,0,57,0,166,255,223,0,57,0,167,255,223,0,57,0,168,255,223,0,57,0,169,255,223,0,57,0,170,255,223,0,57,0,171,0,7,0,57,0,173,0,23,0,57,0,174,0,38,0,57,0,175,255,239,0,57,0,177,255,223,0,57,0,178,255,223,0,57,0,179,255,223,0,57,0,180,255,223,0,57,0,181,255,223,0,57,0,183,255,223,0,57,0,184,255,232,0,57,0,185,255,232,0,57,0,186,255,232,0,57,0,187,255,232,0,57,0,188,255,206,0,57,0,190,255,206,0,57,0,194,255,229,0,57,0,195,255,223,0,57,0,196,255,251,0,57,0,207,255,243,0,57,0,208,255,243,0,57,0,220,255,226,0,57,0,240,0,24,0,58,0,7,255,237,0,58,0,11,0,13,0,58,0,13,255,215,0,58,0,14,255,222,0,58,0,15,255,215,0,58,0,16,255,201,0,58,0,17,255,233,0,58,0,21,255,206,0,58,0,23,255,218,0,58,0,25,255,246,0,58,0,27,255,235,0,58,0,28,255,235,0,58,0,32,0,13,0,58,0,33,255,198,0,58,0,34,255,192,0,58,0,36,255,230,0,58,0,40,255,230,0,58,0,46,255,232,0,58,0,48,255,230,0,58,0,50,255,230,0,58,0,61,0,7,0,58,0,62,0,31,0,58,0,66,255,189,0,58,0,68,255,171,0,58,0,69,255,171,0,58,0,70,255,171,0,58,0,71,255,237,0,58,0,72,255,180,0,58,0,78,255,187,0,58,0,79,255,187,0,58,0,80,255,171,0,58,0,81,255,187,0,58,0,82,255,171,0,58,0,83,255,187,0,58,0,84,255,186,0,58,0,85,255,221,0,58,0,86,255,190,0,58,0,87,255,215,0,58,0,88,255,216,0,58,0,89,255,214,0,58,0,90,255,217,0,58,0,91,255,229,0,58,0,94,0,33,0,58,0,107,255,198,0,58,0,110,255,230,0,58,0,122,255,225,0,58,0,127,255,192,0,58,0,128,255,192,0,58,0,129,255,192,0,58,0,130,255,192,0,58,0,131,255,192,0,58,0,132,255,192,0,58,0,133,255,180,0,58,0,134,255,230,0,58,0,145,255,230,0,58,0,146,255,230,0,58,0,147,255,230,0,58,0,148,255,230,0,58,0,149,255,230,0,58,0,151,255,230,0,58,0,158,255,230,0,58,0,159,255,189,0,58,0,160,255,189,0,58,0,161,255,189,0,58,0,162,255,189,0,58,0,163,255,189,0,58,0,164,255,189,0,58,0,165,255,189,0,58,0,166,255,171,0,58,0,167,255,171,0,58,0,168,255,171,0,58,0,169,255,171,0,58,0,170,255,171,0,58,0,171,0,16,0,58,0,173,0,38,0,58,0,174,0,47,0,58,0,175,255,216,0,58,0,176,255,187,0,58,0,177,255,171,0,58,0,178,255,171,0,58,0,179,255,171,0,58,0,180,255,171,0,58,0,181,255,171,0,58,0,183,255,171,0,58,0,184,255,190,0,58,0,185,255,190,0,58,0,186,255,190,0,58,0,187,255,190,0,58,0,188,255,217,0,58,0,189,255,225,0,58,0,190,255,217,0,58,0,194,255,230,0,58,0,195,255,171,0,58,0,197,255,234,0,58,0,200,255,229,0,58,0,207,255,222,0,58,0,208,255,222,0,58,0,211,255,215,0,58,0,214,255,215,0,58,0,218,255,215,0,58,0,220,255,198,0,58,0,221,255,225,0,58,0,240,0,33,0,59,0,14,255,217,0,59,0,17,255,243,0,59,0,21,255,199,0,59,0,23,255,247,0,59,0,36,255,238,0,59,0,40,255,238,0,59,0,48,255,238,0,59,0,50,255,238,0,59,0,62,0,23,0,59,0,66,255,246,0,59,0,68,255,227,0,59,0,69,255,227,0,59,0,70,255,227,0,59,0,71,255,241,0,59,0,72,255,229,0,59,0,74,255,250,0,59,0,75,255,250,0,59,0,78,255,235,0,59,0,79,255,235,0,59,0,80,255,227,0,59,0,81,255,235,0,59,0,82,255,227,0,59,0,83,255,235,0,59,0,84,255,245,0,59,0,85,255,241,0,59,0,86,255,224,0,59,0,87,255,241,0,59,0,88,255,241,0,59,0,90,255,242,0,59,0,91,255,248,0,59,0,94,0,23,0,59,0,107,255,214,0,59,0,110,255,233,0,59,0,134,255,238,0,59,0,145,255,238,0,59,0,146,255,238,0,59,0,147,255,238,0,59,0,148,255,238,0,59,0,149,255,238,0,59,0,151,255,238,0,59,0,158,255,239,0,59,0,159,255,246,0,59,0,160,255,246,0,59,0,161,255,246,0,59,0,162,255,246,0,59,0,163,255,246,0,59,0,164,255,246,0,59,0,165,255,246,0,59,0,166,255,227,0,59,0,167,255,227,0,59,0,168,255,227,0,59,0,169,255,227,0,59,0,170,255,227,0,59,0,171,0,6,0,59,0,172,255,250,0,59,0,173,0,29,0,59,0,174,0,37,0,59,0,175,255,235,0,59,0,176,255,235,0,59,0,177,255,227,0,59,0,178,255,227,0,59,0,179,255,227,0,59,0,180,255,227,0,59,0,181,255,227,0,59,0,183,255,227,0,59,0,184,255,224,0,59,0,185,255,224,0,59,0,186,255,224,0,59,0,187,255,224,0,59,0,188,255,242,0,59,0,189,255,235,0,59,0,190,255,242,0,59,0,193,255,250,0,59,0,194,255,238,0,59,0,195,255,227,0,59,0,197,255,245,0,59,0,200,255,248,0,59,0,207,255,217,0,59,0,208,255,217,0,59,0,220,255,214,0,59,0,240,0,24,0,60,0,17,255,232,0,60,0,21,255,228,0,60,0,23,255,229,0,60,0,25,255,248,0,60,0,34,255,227,0,60,0,36,255,226,0,60,0,40,255,226,0,60,0,43,0,49,0,60,0,46,255,244,0,60,0,48,255,226,0,60,0,50,255,226,0,60,0,53,0,22,0,60,0,55,0,31,0,60,0,56,0,27,0,60,0,57,0,28,0,60,0,58,0,36,0,60,0,66,255,218,0,60,0,68,255,213,0,60,0,69,255,213,0,60,0,70,255,213,0,60,0,75,0,7,0,60,0,78,255,214,0,60,0,79,255,214,0,60,0,80,255,213,0,60,0,81,255,223,0,60,0,82,255,213,0,60,0,83,255,214,0,60,0,84,255,218,0,60,0,85,255,224,0,60,0,86,255,215,0,60,0,87,255,216,0,60,0,88,255,218,0,60,0,89,255,226,0,60,0,90,255,216,0,60,0,91,255,219,0,60,0,127,255,227,0,60,0,128,255,227,0,60,0,129,255,227,0,60,0,130,255,227,0,60,0,131,255,227,0,60,0,132,255,227,0,60,0,133,255,243,0,60,0,134,255,226,0,60,0,145,255,226,0,60,0,146,255,226,0,60,0,147,255,226,0,60,0,148,255,226,0,60,0,149,255,226,0,60,0,151,255,226,0,60,0,156,0,36,0,60,0,158,255,244,0,60,0,159,255,218,0,60,0,160,255,218,0,60,0,161,255,218,0,60,0,162,255,228,0,60,0,163,255,218,0,60,0,164,255,218,0,60,0,165,255,218,0,60,0,166,255,213,0,60,0,167,255,213,0,60,0,168,255,213,0,60,0,169,255,213,0,60,0,170,255,213,0,60,0,171,0,15,0,60,0,173,0,34,0,60,0,174,0,45,0,60,0,175,255,231,0,60,0,176,255,214,0,60,0,177,255,213,0,60,0,178,255,213,0,60,0,179,255,213,0,60,0,180,255,213,0,60,0,181,255,213,0,60,0,183,255,213,0,60,0,184,255,215,0,60,0,185,255,215,0,60,0,186,255,215,0,60,0,187,255,215,0,60,0,188,255,216,0,60,0,189,255,252,0,60,0,190,255,216,0,60,0,194,255,226,0,60,0,195,255,213,0,60,0,197,255,232,0,60,0,198,0,36,0,60,0,200,255,246,0,61,0,3,255,220,0,61,0,8,255,220,0,61,0,17,255,244,0,61,0,18,255,241,0,61,0,26,255,242,0,61,0,36,255,236,0,61,0,40,255,236,0,61,0,43,0,16,0,61,0,48,255,236,0,61,0,50,255,236,0,61,0,53,255,205,0,61,0,54,255,234,0,61,0,55,255,201,0,61,0,56,255,216,0,61,0,58,255,201,0,61,0,85,255,240,0,61,0,87,255,222,0,61,0,88,255,231,0,61,0,90,255,219,0,61,0,134,255,236,0,61,0,145,255,236,0,61,0,146,255,236,0,61,0,147,255,236,0,61,0,148,255,236,0,61,0,149,255,236,0,61,0,151,255,236,0,61,0,152,255,234,0,61,0,153,255,234,0,61,0,154,255,234,0,61,0,155,255,234,0,61,0,156,255,201,0,61,0,188,255,219,0,61,0,190,255,219,0,61,0,194,255,236,0,61,0,198,255,201,0,61,0,210,255,214,0,61,0,213,255,214,0,66,0,3,255,234,0,66,0,7,255,245,0,66,0,8,255,234,0,66,0,10,255,246,0,66,0,11,255,231,0,66,0,18,255,234,0,66,0,26,255,247,0,66,0,32,255,229,0,66,0,35,255,240,0,66,0,36,255,237,0,66,0,37,255,240,0,66,0,38,255,240,0,66,0,39,255,240,0,66,0,40,255,237,0,66,0,41,255,240,0,66,0,42,255,240,0,66,0,43,255,240,0,66,0,44,255,240,0,66,0,45,255,240,0,66,0,46,255,248,0,66,0,47,255,240,0,66,0,48,255,237,0,66,0,49,255,240,0,66,0,50,255,237,0,66,0,51,255,240,0,66,0,52,255,250,0,66,0,53,255,173,0,66,0,54,255,227,0,66,0,55,255,193,0,66,0,56,255,210,0,66,0,58,255,165,0,66,0,61,255,210,0,66,0,62,255,227,0,66,0,71,255,251,0,66,0,85,255,246,0,66,0,87,255,238,0,66,0,88,255,243,0,66,0,90,255,236,0,66,0,94,255,231,0,66,0,110,255,248,0,66,0,134,255,237,0,66,0,135,255,240,0,66,0,136,255,240,0,66,0,137,255,240,0,66,0,138,255,240,0,66,0,139,255,240,0,66,0,140,255,240,0,66,0,141,255,240,0,66,0,142,255,240,0,66,0,143,255,240,0,66,0,144,255,240,0,66,0,145,255,237,0,66,0,146,255,237,0,66,0,147,255,237,0,66,0,148,255,237,0,66,0,149,255,237,0,66,0,151,255,237,0,66,0,152,255,227,0,66,0,153,255,227,0,66,0,154,255,227,0,66,0,155,255,227,0,66,0,156,255,165,0,66,0,157,255,240,0,66,0,158,255,249,0,66,0,188,255,236,0,66,0,190,255,236,0,66,0,194,255,237,0,66,0,196,255,250,0,66,0,198,255,165,0,66,0,209,255,186,0,66,0,210,255,183,0,66,0,212,255,186,0,66,0,213,255,183,0,66,0,240,255,230,0,67,0,3,255,234,0,67,0,7,255,246,0,67,0,8,255,234,0,67,0,10,255,227,0,67,0,11,255,232,0,67,0,13,255,246,0,67,0,15,255,247,0,67,0,18,255,235,0,67,0,19,255,232,0,67,0,24,255,226,0,67,0,32,255,224,0,67,0,34,255,240,0,67,0,35,255,237,0,67,0,36,255,246,0,67,0,37,255,237,0,67,0,38,255,237,0,67,0,39,255,237,0,67,0,40,255,246,0,67,0,41,255,237,0,67,0,42,255,237,0,67,0,43,255,237,0,67,0,44,255,237,0,67,0,45,255,237,0,67,0,46,255,239,0,67,0,47,255,237,0,67,0,48,255,246,0,67,0,49,255,237,0,67,0,50,255,246,0,67,0,51,255,237,0,67,0,52,255,237,0,67,0,53,255,171,0,67,0,54,255,238,0,67,0,55,255,193,0,67,0,56,255,212,0,67,0,57,255,217,0,67,0,58,255,167,0,67,0,59,255,227,0,67,0,61,255,217,0,67,0,62,255,217,0,67,0,71,255,251,0,67,0,85,255,250,0,67,0,87,255,247,0,67,0,88,255,251,0,67,0,89,255,238,0,67,0,90,255,245,0,67,0,91,255,246,0,67,0,94,255,226,0,67,0,122,255,247,0,67,0,127,255,240,0,67,0,128,255,240,0,67,0,129,255,240,0,67,0,130,255,240,0,67,0,131,255,240,0,67,0,132,255,240,0,67,0,134,255,246,0,67,0,135,255,237,0,67,0,136,255,237,0,67,0,137,255,237,0,67,0,138,255,237,0,67,0,139,255,237,0,67,0,140,255,237,0,67,0,141,255,237,0,67,0,142,255,237,0,67,0,143,255,237,0,67,0,144,255,237,0,67,0,145,255,246,0,67,0,146,255,246,0,67,0,147,255,246,0,67,0,148,255,246,0,67,0,149,255,246,0,67,0,151,255,246,0,67,0,152,255,238,0,67,0,153,255,238,0,67,0,154,255,238,0,67,0,155,255,238,0,67,0,156,255,167,0,67,0,157,255,237,0,67,0,158,255,248,0,67,0,188,255,245,0,67,0,190,255,245,0,67,0,194,255,246,0,67,0,196,255,237,0,67,0,198,255,167,0,67,0,199,255,227,0,67,0,200,255,246,0,67,0,209,255,181,0,67,0,210,255,178,0,67,0,211,255,246,0,67,0,212,255,181,0,67,0,213,255,178,0,67,0,214,255,246,0,67,0,218,255,247,0,67,0,221,255,247,0,67,0,240,255,234,0,68,0,7,255,240,0,68,0,10,255,244,0,68,0,14,255,219,0,68,0,21,255,231,0,68,0,24,255,245,0,68,0,32,255,228,0,68,0,35,255,247,0,68,0,36,255,244,0,68,0,37,255,247,0,68,0,38,255,247,0,68,0,39,255,247,0,68,0,40,255,244,0,68,0,41,255,247,0,68,0,42,255,247,0,68,0,43,255,247,0,68,0,44,255,247,0,68,0,45,255,247,0,68,0,46,255,251,0,68,0,47,255,247,0,68,0,48,255,244,0,68,0,49,255,247,0,68,0,50,255,244,0,68,0,51,255,247,0,68,0,52,255,244,0,68,0,53,255,190,0,68,0,54,255,243,0,68,0,55,255,236,0,68,0,56,255,241,0,68,0,58,255,218,0,68,0,61,255,240,0,68,0,62,255,232,0,68,0,68,255,249,0,68,0,69,255,249,0,68,0,70,255,249,0,68,0,80,255,249,0,68,0,82,255,249,0,68,0,94,255,239,0,68,0,107,255,243,0,68,0,134,255,244,0,68,0,135,255,247,0,68,0,136,255,247,0,68,0,137,255,247,0,68,0,138,255,247,0,68,0,139,255,247,0,68,0,140,255,247,0,68,0,141,255,247,0,68,0,142,255,247,0,68,0,143,255,247,0,68,0,144,255,247,0,68,0,145,255,244,0,68,0,146,255,244,0,68,0,147,255,244,0,68,0,148,255,244,0,68,0,149,255,244,0,68,0,151,255,244,0,68,0,152,255,243,0,68,0,153,255,243,0,68,0,154,255,243,0,68,0,155,255,243,0,68,0,156,255,218,0,68,0,157,255,247,0,68,0,166,255,249,0,68,0,167,255,249,0,68,0,168,255,249,0,68,0,169,255,249,0,68,0,170,255,249,0,68,0,175,255,251,0,68,0,177,255,249,0,68,0,178,255,249,0,68,0,179,255,249,0,68,0,180,255,249,0,68,0,181,255,249,0,68,0,183,255,249,0,68,0,194,255,244,0,68,0,195,255,249,0,68,0,196,255,244,0,68,0,198,255,218,0,68,0,207,255,219,0,68,0,208,255,219,0,68,0,209,255,216,0,68,0,210,255,213,0,68,0,212,255,216,0,68,0,213,255,213,0,68,0,220,255,243,0,68,0,240,255,245,0,69,0,7,255,244,0,69,0,34,255,249,0,69,0,35,255,242,0,69,0,36,255,245,0,69,0,37,255,242,0,69,0,38,255,242,0,69,0,39,255,242,0,69,0,40,255,245,0,69,0,41,255,242,0,69,0,42,255,242,0,69,0,43,255,242,0,69,0,44,255,242,0,69,0,45,255,242,0,69,0,46,255,240,0,69,0,47,255,242,0,69,0,48,255,245,0,69,0,49,255,242,0,69,0,50,255,245,0,69,0,51,255,242,0,69,0,52,255,246,0,69,0,53,255,245,0,69,0,54,255,240,0,69,0,55,255,250,0,69,0,56,255,248,0,69,0,58,255,251,0,69,0,59,255,245,0,69,0,127,255,249,0,69,0,128,255,249,0,69,0,129,255,249,0,69,0,130,255,249,0,69,0,131,255,249,0,69,0,132,255,249,0,69,0,134,255,245,0,69,0,135,255,242,0,69,0,136,255,242,0,69,0,137,255,242,0,69,0,138,255,242,0,69,0,139,255,242,0,69,0,140,255,242,0,69,0,141,255,242,0,69,0,142,255,242,0,69,0,143,255,242,0,69,0,144,255,242,0,69,0,145,255,245,0,69,0,146,255,245,0,69,0,147,255,245,0,69,0,148,255,245,0,69,0,149,255,245,0,69,0,151,255,245,0,69,0,152,255,240,0,69,0,153,255,240,0,69,0,154,255,240,0,69,0,155,255,240,0,69,0,156,255,251,0,69,0,157,255,242,0,69,0,194,255,245,0,69,0,196,255,246,0,69,0,198,255,251,0,69,0,199,255,245,0,70,0,3,255,241,0,70,0,7,255,246,0,70,0,8,255,241,0,70,0,10,255,230,0,70,0,11,255,238,0,70,0,18,255,235,0,70,0,19,255,245,0,70,0,24,255,230,0,70,0,32,255,223,0,70,0,34,255,251,0,70,0,35,255,241,0,70,0,36,255,250,0,70,0,37,255,241,0,70,0,38,255,241,0,70,0,39,255,241,0,70,0,40,255,250,0,70,0,41,255,241,0,70,0,42,255,241,0,70,0,43,255,241,0,70,0,44,255,241,0,70,0,45,255,241,0,70,0,46,255,243,0,70,0,47,255,241,0,70,0,48,255,250,0,70,0,49,255,241,0,70,0,50,255,250,0,70,0,51,255,241,0,70,0,52,255,241,0,70,0,53,255,187,0,70,0,54,255,240,0,70,0,55,255,209,0,70,0,56,255,213,0,70,0,57,255,243,0,70,0,58,255,174,0,70,0,59,255,243,0,70,0,61,255,220,0,70,0,62,255,220,0,70,0,87,255,252,0,70,0,89,255,251,0,70,0,90,255,251,0,70,0,94,255,227,0,70,0,127,255,251,0,70,0,128,255,251,0,70,0,129,255,251,0,70,0,130,255,251,0,70,0,131,255,251,0,70,0,132,255,251,0,70,0,134,255,250,0,70,0,135,255,241,0,70,0,136,255,241,0,70,0,137,255,241,0,70,0,138,255,241,0,70,0,139,255,241,0,70,0,140,255,241,0,70,0,141,255,241,0,70,0,142,255,241,0,70,0,143,255,241,0,70,0,144,255,241,0,70,0,145,255,250,0,70,0,146,255,250,0,70,0,147,255,250,0,70,0,148,255,250,0,70,0,149,255,250,0,70,0,151,255,250,0,70,0,152,255,240,0,70,0,153,255,240,0,70,0,154,255,240,0,70,0,155,255,240,0,70,0,156,255,174,0,70,0,157,255,241,0,70,0,188,255,251,0,70,0,190,255,251,0,70,0,194,255,250,0,70,0,196,255,241,0,70,0,198,255,174,0,70,0,199,255,243,0,70,0,209,255,189,0,70,0,210,255,186,0,70,0,212,255,189,0,70,0,213,255,186,0,70,0,240,255,237,0,71,0,7,255,235,0,71,0,13,255,229,0,71,0,14,255,232,0,71,0,15,255,229,0,71,0,16,255,234,0,71,0,21,255,244,0,71,0,33,255,239,0,71,0,34,255,211,0,71,0,35,255,244,0,71,0,37,255,244,0,71,0,38,255,244,0,71,0,39,255,244,0,71,0,41,255,244,0,71,0,42,255,244,0,71,0,43,255,244,0,71,0,44,255,244,0,71,0,45,255,244,0,71,0,46,255,229,0,71,0,47,255,244,0,71,0,49,255,244,0,71,0,51,255,244,0,71,0,54,255,247,0,71,0,59,255,243,0,71,0,66,255,251,0,71,0,68,255,246,0,71,0,69,255,246,0,71,0,70,255,246,0,71,0,72,255,252,0,71,0,80,255,246,0,71,0,82,255,246,0,71,0,94,0,8,0,71,0,107,255,239,0,71,0,127,255,211,0,71,0,128,255,211,0,71,0,129,255,211,0,71,0,130,255,211,0,71,0,131,255,211,0,71,0,132,255,211,0,71,0,135,255,244,0,71,0,136,255,244,0,71,0,137,255,244,0,71,0,138,255,244,0,71,0,139,255,244,0,71,0,140,255,244,0,71,0,141,255,244,0,71,0,142,255,244,0,71,0,143,255,244,0,71,0,144,255,244,0,71,0,152,255,247,0,71,0,153,255,247,0,71,0,154,255,247,0,71,0,155,255,247,0,71,0,157,255,244,0,71,0,159,255,251,0,71,0,160,255,251,0,71,0,161,255,251,0,71,0,162,255,251,0,71,0,163,255,251,0,71,0,164,255,251,0,71,0,165,255,251,0,71,0,166,255,246,0,71,0,167,255,246,0,71,0,168,255,246,0,71,0,169,255,246,0,71,0,170,255,246,0,71,0,175,255,224,0,71,0,177,255,246,0,71,0,178,255,246,0,71,0,179,255,246,0,71,0,180,255,246,0,71,0,181,255,246,0,71,0,183,255,246,0,71,0,195,255,246,0,71,0,199,255,243,0,71,0,207,255,232,0,71,0,208,255,232,0,71,0,211,255,229,0,71,0,214,255,229,0,71,0,218,255,229,0,71,0,220,255,239,0,72,0,7,255,244,0,72,0,10,0,5,0,72,0,16,0,14,0,72,0,24,255,225,0,72,0,32,255,217,0,72,0,34,255,249,0,72,0,35,255,245,0,72,0,37,255,245,0,72,0,38,255,245,0,72,0,39,255,245,0,72,0,41,255,245,0,72,0,42,255,245,0,72,0,43,0,45,0,72,0,44,255,245,0,72,0,45,255,245,0,72,0,46,255,242,0,72,0,47,255,245,0,72,0,49,255,245,0,72,0,51,255,245,0,72,0,53,255,208,0,72,0,54,255,246,0,72,0,55,255,247,0,72,0,56,255,250,0,72,0,57,255,250,0,72,0,58,255,238,0,72,0,59,255,245,0,72,0,62,0,25,0,72,0,75,0,19,0,72,0,94,0,29,0,72,0,127,255,249,0,72,0,128,255,249,0,72,0,129,255,249,0,72,0,130,255,249,0,72,0,131,255,249,0,72,0,132,255,249,0,72,0,135,255,245,0,72,0,136,255,245,0,72,0,137,255,245,0,72,0,138,255,245,0,72,0,139,255,245,0,72,0,140,255,245,0,72,0,141,255,245,0,72,0,142,255,245,0,72,0,143,255,245,0,72,0,144,255,245,0,72,0,152,255,246,0,72,0,153,255,246,0,72,0,154,255,246,0,72,0,155,255,246,0,72,0,156,255,238,0,72,0,157,255,245,0,72,0,175,255,250,0,72,0,198,255,238,0,72,0,199,255,245,0,72,0,209,255,223,0,72,0,210,255,221,0,72,0,212,255,223,0,72,0,213,255,221,0,73,0,2,255,248,0,73,0,3,255,238,0,73,0,7,255,245,0,73,0,8,255,238,0,73,0,10,255,232,0,73,0,11,255,235,0,73,0,18,255,231,0,73,0,24,255,233,0,73,0,32,255,224,0,73,0,34,255,250,0,73,0,35,255,238,0,73,0,36,255,243,0,73,0,37,255,238,0,73,0,38,255,238,0,73,0,39,255,238,0,73,0,40,255,243,0,73,0,41,255,238,0,73,0,42,255,238,0,73,0,43,255,238,0,73,0,44,255,238,0,73,0,45,255,238,0,73,0,46,255,241,0,73,0,47,255,238,0,73,0,48,255,243,0,73,0,49,255,238,0,73,0,50,255,243,0,73,0,51,255,238,0,73,0,52,255,241,0,73,0,53,255,162,0,73,0,54,255,231,0,73,0,55,255,198,0,73,0,56,255,214,0,73,0,57,255,249,0,73,0,58,255,163,0,73,0,59,255,245,0,73,0,61,255,214,0,73,0,62,255,216,0,73,0,71,255,251,0,73,0,85,255,248,0,73,0,87,255,243,0,73,0,88,255,248,0,73,0,90,255,242,0,73,0,94,255,225,0,73,0,127,255,250,0,73,0,128,255,250,0,73,0,129,255,250,0,73,0,130,255,250,0,73,0,131,255,250,0,73,0,132,255,250,0,73,0,134,255,243,0,73,0,135,255,238,0,73,0,136,255,238,0,73,0,137,255,238,0,73,0,138,255,238,0,73,0,139,255,238,0,73,0,140,255,238,0,73,0,141,255,238,0,73,0,142,255,238,0,73,0,143,255,238,0,73,0,144,255,238,0,73,0,145,255,243,0,73,0,146,255,243,0,73,0,147,255,243,0,73,0,148,255,243,0,73,0,149,255,243,0,73,0,151,255,243,0,73,0,152,255,231,0,73,0,153,255,231,0,73,0,154,255,231,0,73,0,155,255,231,0,73,0,156,255,163,0,73,0,157,255,238,0,73,0,158,255,248,0,73,0,188,255,242,0,73,0,190,255,242,0,73,0,194,255,243,0,73,0,196,255,241,0,73,0,198,255,163,0,73,0,199,255,245,0,73,0,209,255,187,0,73,0,210,255,184,0,73,0,212,255,187,0,73,0,213,255,184,0,73,0,240,255,235,0,74,0,7,255,244,0,74,0,34,255,248,0,74,0,35,255,242,0,74,0,36,255,244,0,74,0,37,255,242,0,74,0,38,255,242,0,74,0,39,255,242,0,74,0,40,255,244,0,74,0,41,255,242,0,74,0,42,255,242,0,74,0,43,255,242,0,74,0,44,255,242,0,74,0,45,255,242,0,74,0,46,255,241,0,74,0,47,255,242,0,74,0,48,255,244,0,74,0,49,255,242,0,74,0,50,255,244,0,74,0,51,255,242,0,74,0,52,255,244,0,74,0,53,255,242,0,74,0,54,255,238,0,74,0,55,255,247,0,74,0,56,255,246,0,74,0,58,255,247,0,74,0,59,255,245,0,74,0,127,255,248,0,74,0,128,255,248,0,74,0,129,255,248,0,74,0,130,255,248,0,74,0,131,255,248,0,74,0,132,255,248,0,74,0,134,255,244,0,74,0,135,255,242,0,74,0,136,255,242,0,74,0,137,255,242,0,74,0,138,255,242,0,74,0,139,255,242,0,74,0,140,255,242,0,74,0,141,255,242,0,74,0,142,255,242,0,74,0,143,255,242,0,74,0,144,255,242,0,74,0,145,255,244,0,74,0,146,255,244,0,74,0,147,255,244,0,74,0,148,255,244,0,74,0,149,255,244,0,74,0,151,255,244,0,74,0,152,255,238,0,74,0,153,255,238,0,74,0,154,255,238,0,74,0,155,255,238,0,74,0,156,255,247,0,74,0,157,255,242,0,74,0,194,255,244,0,74,0,196,255,244,0,74,0,198,255,247,0,74,0,199,255,245,0,75,0,7,255,244,0,75,0,34,255,248,0,75,0,35,255,242,0,75,0,36,255,244,0,75,0,37,255,242,0,75,0,38,255,242,0,75,0,39,255,242,0,75,0,40,255,244,0,75,0,41,255,242,0,75,0,42,255,242,0,75,0,43,255,242,0,75,0,44,255,242,0,75,0,45,255,242,0,75,0,46,255,241,0,75,0,47,255,242,0,75,0,48,255,244,0,75,0,49,255,242,0,75,0,50,255,244,0,75,0,51,255,242,0,75,0,52,255,244,0,75,0,53,255,242,0,75,0,54,255,238,0,75,0,55,255,247,0,75,0,56,255,246,0,75,0,58,255,247,0,75,0,59,255,245,0,75,0,127,255,248,0,75,0,128,255,248,0,75,0,129,255,248,0,75,0,130,255,248,0,75,0,131,255,248,0,75,0,132,255,248,0,75,0,134,255,244,0,75,0,135,255,242,0,75,0,136,255,242,0,75,0,137,255,242,0,75,0,138,255,242,0,75,0,139,255,242,0,75,0,140,255,242,0,75,0,141,255,242,0,75,0,142,255,242,0,75,0,143,255,242,0,75,0,144,255,242,0,75,0,145,255,244,0,75,0,146,255,244,0,75,0,147,255,244,0,75,0,148,255,244,0,75,0,149,255,244,0,75,0,151,255,244,0,75,0,152,255,238,0,75,0,153,255,238,0,75,0,154,255,238,0,75,0,155,255,238,0,75,0,156,255,247,0,75,0,157,255,242,0,75,0,194,255,244,0,75,0,196,255,244,0,75,0,198,255,247,0,75,0,199,255,245,0,76,0,7,255,242,0,76,0,14,255,241,0,76,0,32,255,237,0,76,0,36,255,234,0,76,0,40,255,234,0,76,0,48,255,234,0,76,0,50,255,234,0,76,0,53,255,166,0,76,0,54,255,251,0,76,0,55,255,245,0,76,0,56,255,251,0,76,0,58,255,217,0,76,0,62,255,239,0,76,0,66,255,251,0,76,0,68,255,234,0,76,0,69,255,234,0,76,0,70,255,234,0,76,0,72,255,238,0,76,0,80,255,234,0,76,0,82,255,234,0,76,0,107,255,238,0,76,0,134,255,234,0,76,0,145,255,234,0,76,0,146,255,234,0,76,0,147,255,234,0,76,0,148,255,234,0,76,0,149,255,234,0,76,0,151,255,234,0,76,0,152,255,251,0,76,0,153,255,251,0,76,0,154,255,251,0,76,0,155,255,251,0,76,0,156,255,217,0,76,0,159,255,251,0,76,0,160,255,251,0,76,0,161,255,251,0,76,0,162,255,251,0,76,0,163,255,251,0,76,0,164,255,251,0,76,0,165,255,251,0,76,0,166,255,234,0,76,0,167,255,234,0,76,0,168,255,234,0,76,0,169,255,234,0,76,0,170,255,234,0,76,0,175,255,230,0,76,0,177,255,234,0,76,0,178,255,234,0,76,0,179,255,234,0,76,0,180,255,234,0,76,0,181,255,234,0,76,0,183,255,234,0,76,0,194,255,234,0,76,0,195,255,234,0,76,0,198,255,217,0,76,0,207,255,241,0,76,0,208,255,241,0,76,0,209,255,229,0,76,0,210,255,227,0,76,0,212,255,229,0,76,0,213,255,227,0,76,0,220,255,238,0,77,0,3,255,247,0,77,0,7,255,244,0,77,0,8,255,247,0,77,0,11,255,246,0,77,0,35,255,240,0,77,0,36,255,237,0,77,0,37,255,240,0,77,0,38,255,240,0,77,0,39,255,240,0,77,0,40,255,237,0,77,0,41,255,240,0,77,0,42,255,240,0,77,0,43,255,240,0,77,0,44,255,240,0,77,0,45,255,240,0,77,0,46,255,248,0,77,0,47,255,240,0,77,0,48,255,237,0,77,0,49,255,240,0,77,0,50,255,237,0,77,0,51,255,240,0,77,0,53,255,234,0,77,0,54,255,228,0,77,0,55,255,239,0,77,0,56,255,237,0,77,0,58,255,241,0,77,0,68,255,251,0,77,0,69,255,251,0,77,0,70,255,251,0,77,0,80,255,251,0,77,0,82,255,251,0,77,0,85,255,251,0,77,0,87,255,249,0,77,0,88,255,251,0,77,0,90,255,249,0,77,0,107,255,247,0,77,0,134,255,237,0,77,0,135,255,240,0,77,0,136,255,240,0,77,0,137,255,240,0,77,0,138,255,240,0,77,0,139,255,240,0,77,0,140,255,240,0,77,0,141,255,240,0,77,0,142,255,240,0,77,0,143,255,240,0,77,0,144,255,240,0,77,0,145,255,237,0,77,0,146,255,237,0,77,0,147,255,237,0,77,0,148,255,237,0,77,0,149,255,237,0,77,0,151,255,237,0,77,0,152,255,228,0,77,0,153,255,228,0,77,0,154,255,228,0,77,0,155,255,228,0,77,0,156,255,241,0,77,0,157,255,240,0,77,0,166,255,251,0,77,0,167,255,251,0,77,0,168,255,251,0,77,0,169,255,251,0,77,0,170,255,251,0,77,0,177,255,251,0,77,0,178,255,251,0,77,0,179,255,251,0,77,0,180,255,251,0,77,0,181,255,251,0,77,0,183,255,251,0,77,0,188,255,249,0,77,0,190,255,249,0,77,0,194,255,237,0,77,0,195,255,251,0,77,0,198,255,241,0,77,0,209,255,245,0,77,0,210,255,246,0,77,0,212,255,245,0,77,0,213,255,246,0,77,0,220,255,247,0,78,0,2,255,248,0,78,0,3,255,238,0,78,0,7,255,245,0,78,0,8,255,238,0,78,0,10,255,232,0,78,0,11,255,235,0,78,0,18,255,231,0,78,0,24,255,233,0,78,0,32,255,224,0,78,0,34,255,250,0,78,0,35,255,238,0,78,0,36,255,243,0,78,0,37,255,238,0,78,0,38,255,238,0,78,0,39,255,238,0,78,0,40,255,243,0,78,0,41,255,238,0,78,0,42,255,238,0,78,0,43,255,238,0,78,0,44,255,238,0,78,0,45,255,238,0,78,0,46,255,241,0,78,0,47,255,238,0,78,0,48,255,243,0,78,0,49,255,238,0,78,0,50,255,243,0,78,0,51,255,238,0,78,0,52,255,241,0,78,0,53,255,162,0,78,0,54,255,231,0,78,0,55,255,198,0,78,0,56,255,214,0,78,0,57,255,249,0,78,0,58,255,163,0,78,0,59,255,245,0,78,0,61,255,214,0,78,0,62,255,216,0,78,0,71,255,251,0,78,0,85,255,248,0,78,0,87,255,243,0,78,0,88,255,248,0,78,0,90,255,242,0,78,0,94,255,225,0,78,0,127,255,250,0,78,0,128,255,250,0,78,0,129,255,250,0,78,0,130,255,250,0,78,0,131,255,250,0,78,0,132,255,250,0,78,0,134,255,243,0,78,0,135,255,238,0,78,0,136,255,238,0,78,0,137,255,238,0,78,0,138,255,238,0,78,0,139,255,238,0,78,0,140,255,238,0,78,0,141,255,238,0,78,0,142,255,238,0,78,0,143,255,238,0,78,0,144,255,238,0,78,0,145,255,243,0,78,0,146,255,243,0,78,0,147,255,243,0,78,0,148,255,243,0,78,0,149,255,243,0,78,0,151,255,243,0,78,0,152,255,231,0,78,0,153,255,231,0,78,0,154,255,231,0,78,0,155,255,231,0,78,0,156,255,163,0,78,0,157,255,238,0,78,0,158,255,248,0,78,0,188,255,242,0,78,0,190,255,242,0,78,0,194,255,243,0,78,0,196,255,241,0,78,0,198,255,163,0,78,0,199,255,245,0,78,0,209,255,187,0,78,0,210,255,184,0,78,0,212,255,187,0,78,0,213,255,184,0,78,0,240,255,235,0,79,0,2,255,248,0,79,0,3,255,238,0,79,0,7,255,245,0,79,0,8,255,238,0,79,0,10,255,232,0,79,0,11,255,235,0,79,0,18,255,231,0,79,0,24,255,233,0,79,0,32,255,224,0,79,0,34,255,250,0,79,0,35,255,238,0,79,0,36,255,243,0,79,0,37,255,238,0,79,0,38,255,238,0,79,0,39,255,238,0,79,0,40,255,243,0,79,0,41,255,238,0,79,0,42,255,238,0,79,0,43,255,238,0,79,0,44,255,238,0,79,0,45,255,238,0,79,0,46,255,241,0,79,0,47,255,238,0,79,0,48,255,243,0,79,0,49,255,238,0,79,0,50,255,243,0,79,0,51,255,238,0,79,0,52,255,241,0,79,0,53,255,162,0,79,0,54,255,231,0,79,0,55,255,198,0,79,0,56,255,214,0,79,0,57,255,249,0,79,0,58,255,163,0,79,0,59,255,245,0,79,0,61,255,214,0,79,0,62,255,216,0,79,0,71,255,251,0,79,0,85,255,248,0,79,0,87,255,243,0,79,0,88,255,248,0,79,0,90,255,242,0,79,0,94,255,225,0,79,0,127,255,250,0,79,0,128,255,250,0,79,0,129,255,250,0,79,0,130,255,250,0,79,0,131,255,250,0,79,0,132,255,250,0,79,0,134,255,243,0,79,0,135,255,238,0,79,0,136,255,238,0,79,0,137,255,238,0,79,0,138,255,238,0,79,0,139,255,238,0,79,0,140,255,238,0,79,0,141,255,238,0,79,0,142,255,238,0,79,0,143,255,238,0,79,0,144,255,238,0,79,0,145,255,243,0,79,0,146,255,243,0,79,0,147,255,243,0,79,0,148,255,243,0,79,0,149,255,243,0,79,0,151,255,243,0,79,0,152,255,231,0,79,0,153,255,231,0,79,0,154,255,231,0,79,0,155,255,231,0,79,0,156,255,163,0,79,0,157,255,238,0,79,0,158,255,248,0,79,0,188,255,242,0,79,0,190,255,242,0,79,0,194,255,243,0,79,0,196,255,241,0,79,0,198,255,163,0,79,0,199,255,245,0,79,0,209,255,187,0,79,0,210,255,184,0,79,0,212,255,187,0,79,0,213,255,184,0,79,0,240,255,235,0,80,0,3,255,236,0,80,0,7,255,246,0,80,0,8,255,236,0,80,0,10,255,224,0,80,0,11,255,234,0,80,0,18,255,230,0,80,0,19,255,229,0,80,0,24,255,223,0,80,0,32,255,222,0,80,0,34,255,240,0,80,0,35,255,237,0,80,0,36,255,246,0,80,0,37,255,237,0,80,0,38,255,237,0,80,0,39,255,237,0,80,0,40,255,246,0,80,0,41,255,237,0,80,0,42,255,237,0,80,0,43,255,237,0,80,0,44,255,237,0,80,0,45,255,237,0,80,0,46,255,239,0,80,0,47,255,237,0,80,0,48,255,246,0,80,0,49,255,237,0,80,0,50,255,246,0,80,0,51,255,237,0,80,0,52,255,238,0,80,0,53,255,173,0,80,0,54,255,238,0,80,0,55,255,192,0,80,0,56,255,212,0,80,0,57,255,218,0,80,0,58,255,167,0,80,0,59,255,227,0,80,0,61,255,214,0,80,0,62,255,213,0,80,0,71,255,251,0,80,0,85,255,249,0,80,0,87,255,247,0,80,0,88,255,251,0,80,0,89,255,237,0,80,0,90,255,245,0,80,0,91,255,246,0,80,0,94,255,222,0,80,0,122,255,247,0,80,0,127,255,240,0,80,0,128,255,240,0,80,0,129,255,240,0,80,0,130,255,240,0,80,0,131,255,240,0,80,0,132,255,240,0,80,0,134,255,246,0,80,0,135,255,237,0,80,0,136,255,237,0,80,0,137,255,237,0,80,0,138,255,237,0,80,0,139,255,237,0,80,0,140,255,237,0,80,0,141,255,237,0,80,0,142,255,237,0,80,0,143,255,237,0,80,0,144,255,237,0,80,0,145,255,246,0,80,0,146,255,246,0,80,0,147,255,246,0,80,0,148,255,246,0,80,0,149,255,246,0,80,0,151,255,246,0,80,0,152,255,238,0,80,0,153,255,238,0,80,0,154,255,238,0,80,0,155,255,238,0,80,0,156,255,167,0,80,0,157,255,237,0,80,0,158,255,248,0,80,0,188,255,245,0,80,0,190,255,245,0,80,0,194,255,246,0,80,0,196,255,238,0,80,0,198,255,167,0,80,0,199,255,227,0,80,0,200,255,246,0,80,0,209,255,182,0,80,0,210,255,179,0,80,0,212,255,182,0,80,0,213,255,179,0,80,0,221,255,247,0,80,0,240,255,236,0,81,0,3,255,236,0,81,0,7,255,246,0,81,0,8,255,236,0,81,0,10,255,224,0,81,0,11,255,234,0,81,0,18,255,230,0,81,0,19,255,229,0,81,0,24,255,223,0,81,0,32,255,222,0,81,0,34,255,240,0,81,0,35,255,237,0,81,0,36,255,246,0,81,0,37,255,237,0,81,0,38,255,237,0,81,0,39,255,237,0,81,0,40,255,246,0,81,0,41,255,237,0,81,0,42,255,237,0,81,0,43,255,237,0,81,0,44,255,237,0,81,0,45,255,237,0,81,0,46,255,239,0,81,0,47,255,237,0,81,0,48,255,246,0,81,0,49,255,237,0,81,0,50,255,246,0,81,0,51,255,237,0,81,0,52,255,238,0,81,0,53,255,173,0,81,0,54,255,238,0,81,0,55,255,192,0,81,0,56,255,212,0,81,0,57,255,218,0,81,0,58,255,167,0,81,0,59,255,227,0,81,0,61,255,214,0,81,0,62,255,213,0,81,0,71,255,251,0,81,0,85,255,249,0,81,0,87,255,247,0,81,0,88,255,251,0,81,0,89,255,237,0,81,0,90,255,245,0,81,0,91,255,246,0,81,0,94,255,222,0,81,0,122,255,247,0,81,0,127,255,240,0,81,0,128,255,240,0,81,0,129,255,240,0,81,0,130,255,240,0,81,0,131,255,240,0,81,0,132,255,240,0,81,0,134,255,246,0,81,0,135,255,237,0,81,0,136,255,237,0,81,0,137,255,237,0,81,0,138,255,237,0,81,0,139,255,237,0,81,0,140,255,237,0,81,0,141,255,237,0,81,0,142,255,237,0,81,0,143,255,237,0,81,0,144,255,237,0,81,0,145,255,246,0,81,0,146,255,246,0,81,0,147,255,246,0,81,0,148,255,246,0,81,0,149,255,246,0,81,0,151,255,246,0,81,0,152,255,238,0,81,0,153,255,238,0,81,0,154,255,238,0,81,0,155,255,238,0,81,0,156,255,167,0,81,0,157,255,237,0,81,0,158,255,248,0,81,0,188,255,245,0,81,0,190,255,245,0,81,0,194,255,246,0,81,0,196,255,238,0,81,0,198,255,167,0,81,0,199,255,227,0,81,0,200,255,246,0,81,0,209,255,182,0,81,0,210,255,179,0,81,0,212,255,182,0,81,0,213,255,179,0,81,0,221,255,247,0,81,0,240,255,236,0,82,0,7,255,244,0,82,0,10,255,233,0,82,0,11,255,244,0,82,0,24,255,232,0,82,0,32,255,223,0,82,0,34,255,248,0,82,0,35,255,242,0,82,0,36,255,244,0,82,0,37,255,242,0,82,0,38,255,242,0,82,0,39,255,242,0,82,0,40,255,244,0,82,0,41,255,242,0,82,0,42,255,242,0,82,0,43,255,242,0,82,0,44,255,242,0,82,0,45,255,242,0,82,0,46,255,241,0,82,0,47,255,242,0,82,0,48,255,244,0,82,0,49,255,242,0,82,0,50,255,244,0,82,0,51,255,242,0,82,0,52,255,243,0,82,0,53,255,164,0,82,0,54,255,235,0,82,0,55,255,216,0,82,0,56,255,218,0,82,0,57,255,246,0,82,0,58,255,183,0,82,0,59,255,242,0,82,0,61,255,228,0,82,0,62,255,215,0,82,0,94,255,226,0,82,0,127,255,248,0,82,0,128,255,248,0,82,0,129,255,248,0,82,0,130,255,248,0,82,0,131,255,248,0,82,0,132,255,248,0,82,0,134,255,244,0,82,0,135,255,242,0,82,0,136,255,242,0,82,0,137,255,242,0,82,0,138,255,242,0,82,0,139,255,242,0,82,0,140,255,242,0,82,0,141,255,242,0,82,0,142,255,242,0,82,0,143,255,242,0,82,0,144,255,242,0,82,0,145,255,244,0,82,0,146,255,244,0,82,0,147,255,244,0,82,0,148,255,244,0,82,0,149,255,244,0,82,0,151,255,244,0,82,0,152,255,235,0,82,0,153,255,235,0,82,0,154,255,235,0,82,0,155,255,235,0,82,0,156,255,183,0,82,0,157,255,242,0,82,0,194,255,244,0,82,0,196,255,243,0,82,0,198,255,183,0,82,0,199,255,242,0,82,0,209,255,211,0,82,0,210,255,209,0,82,0,212,255,211,0,82,0,213,255,209,0,82,0,240,255,239,0,83,0,7,255,237,0,83,0,10,255,232,0,83,0,13,255,227,0,83,0,14,255,234,0,83,0,15,255,227,0,83,0,16,255,225,0,83,0,20,255,231,0,83,0,21,255,238,0,83,0,24,255,200,0,83,0,32,255,202,0,83,0,33,255,232,0,83,0,34,255,211,0,83,0,35,255,243,0,83,0,37,255,243,0,83,0,38,255,243,0,83,0,39,255,243,0,83,0,41,255,243,0,83,0,42,255,243,0,83,0,43,255,243,0,83,0,44,255,243,0,83,0,45,255,243,0,83,0,46,255,230,0,83,0,47,255,243,0,83,0,49,255,243,0,83,0,51,255,243,0,83,0,53,255,163,0,83,0,54,255,247,0,83,0,55,255,243,0,83,0,56,255,247,0,83,0,57,255,214,0,83,0,58,255,225,0,83,0,59,255,227,0,83,0,62,255,217,0,83,0,66,255,249,0,83,0,68,255,243,0,83,0,69,255,243,0,83,0,70,255,243,0,83,0,72,255,250,0,83,0,80,255,243,0,83,0,82,255,243,0,83,0,94,255,228,0,83,0,107,255,237,0,83,0,127,255,211,0,83,0,128,255,211,0,83,0,129,255,211,0,83,0,130,255,211,0,83,0,131,255,211,0,83,0,132,255,211,0,83,0,135,255,243,0,83,0,136,255,243,0,83,0,137,255,243,0,83,0,138,255,243,0,83,0,139,255,243,0,83,0,140,255,243,0,83,0,141,255,243,0,83,0,142,255,243,0,83,0,143,255,243,0,83,0,144,255,243,0,83,0,152,255,247,0,83,0,153,255,247,0,83,0,154,255,247,0,83,0,155,255,247,0,83,0,156,255,225,0,83,0,157,255,243,0,83,0,159,255,249,0,83,0,160,255,249,0,83,0,161,255,249,0,83,0,162,255,249,0,83,0,163,255,249,0,83,0,164,255,249,0,83,0,165,255,249,0,83,0,166,255,243,0,83,0,167,255,243,0,83,0,168,255,243,0,83,0,169,255,243,0,83,0,170,255,243,0,83,0,175,255,218,0,83,0,177,255,243,0,83,0,178,255,243,0,83,0,179,255,243,0,83,0,180,255,243,0,83,0,181,255,243,0,83,0,183,255,243,0,83,0,195,255,243,0,83,0,198,255,225,0,83,0,199,255,227,0,83,0,207,255,234,0,83,0,208,255,234,0,83,0,209,255,233,0,83,0,210,255,230,0,83,0,211,255,227,0,83,0,212,255,233,0,83,0,213,255,230,0,83,0,214,255,227,0,83,0,218,255,227,0,83,0,220,255,237,0,84,0,10,255,231,0,84,0,11,255,241,0,84,0,24,255,234,0,84,0,32,255,224,0,84,0,35,255,241,0,84,0,36,255,244,0,84,0,37,255,241,0,84,0,38,255,241,0,84,0,39,255,241,0,84,0,40,255,244,0,84,0,41,255,241,0,84,0,42,255,241,0,84,0,43,255,241,0,84,0,44,255,241,0,84,0,45,255,241,0,84,0,46,255,245,0,84,0,47,255,241,0,84,0,48,255,244,0,84,0,49,255,241,0,84,0,50,255,244,0,84,0,51,255,241,0,84,0,52,255,248,0,84,0,53,255,202,0,84,0,54,255,238,0,84,0,55,255,216,0,84,0,56,255,224,0,84,0,57,255,244,0,84,0,58,255,209,0,84,0,59,255,245,0,84,0,61,255,225,0,84,0,62,255,220,0,84,0,94,255,229,0,84,0,134,255,244,0,84,0,135,255,241,0,84,0,136,255,241,0,84,0,137,255,241,0,84,0,138,255,241,0,84,0,139,255,241,0,84,0,140,255,241,0,84,0,141,255,241,0,84,0,142,255,241,0,84,0,143,255,241,0,84,0,144,255,241,0,84,0,145,255,244,0,84,0,146,255,244,0,84,0,147,255,244,0,84,0,148,255,244,0,84,0,149,255,244,0,84,0,151,255,244,0,84,0,152,255,238,0,84,0,153,255,238,0,84,0,154,255,238,0,84,0,155,255,238,0,84,0,156,255,209,0,84,0,157,255,241,0,84,0,194,255,244,0,84,0,196,255,248,0,84,0,198,255,209,0,84,0,199,255,245,0,84,0,209,255,203,0,84,0,210,255,200,0,84,0,212,255,203,0,84,0,213,255,200,0,84,0,240,255,235,0,85,0,7,255,246,0,85,0,21,255,234,0,85,0,24,255,246,0,85,0,32,255,229,0,85,0,35,255,248,0,85,0,37,255,248,0,85,0,38,255,248,0,85,0,39,255,248,0,85,0,41,255,248,0,85,0,42,255,248,0,85,0,43,255,248,0,85,0,44,255,248,0,85,0,45,255,248,0,85,0,46,255,248,0,85,0,47,255,248,0,85,0,49,255,248,0,85,0,51,255,248,0,85,0,53,255,209,0,85,0,54,255,246,0,85,0,55,255,237,0,85,0,56,255,243,0,85,0,58,255,211,0,85,0,62,255,230,0,85,0,68,255,252,0,85,0,69,255,252,0,85,0,70,255,252,0,85,0,80,255,252,0,85,0,82,255,252,0,85,0,94,255,242,0,85,0,107,255,244,0,85,0,135,255,248,0,85,0,136,255,248,0,85,0,137,255,248,0,85,0,138,255,248,0,85,0,139,255,248,0,85,0,140,255,248,0,85,0,141,255,248,0,85,0,142,255,248,0,85,0,143,255,248,0,85,0,144,255,248,0,85,0,152,255,246,0,85,0,153,255,246,0,85,0,154,255,246,0,85,0,155,255,246,0,85,0,156,255,211,0,85,0,157,255,248,0,85,0,166,255,252,0,85,0,167,255,252,0,85,0,168,255,252,0,85,0,169,255,252,0,85,0,170,255,252,0,85,0,175,255,251,0,85,0,177,255,252,0,85,0,178,255,252,0,85,0,179,255,252,0,85,0,180,255,252,0,85,0,181,255,252,0,85,0,183,255,252,0,85,0,195,255,252,0,85,0,198,255,211,0,85,0,209,255,234,0,85,0,210,255,233,0,85,0,212,255,234,0,85,0,213,255,233,0,85,0,220,255,244,0,86,0,7,255,244,0,86,0,10,255,233,0,86,0,11,255,244,0,86,0,24,255,232,0,86,0,32,255,223,0,86,0,34,255,248,0,86,0,35,255,242,0,86,0,36,255,244,0,86,0,37,255,242,0,86,0,38,255,242,0,86,0,39,255,242,0,86,0,40,255,244,0,86,0,41,255,242,0,86,0,42,255,242,0,86,0,43,255,242,0,86,0,44,255,242,0,86,0,45,255,242,0,86,0,46,255,241,0,86,0,47,255,242,0,86,0,48,255,244,0,86,0,49,255,242,0,86,0,50,255,244,0,86,0,51,255,242,0,86,0,52,255,243,0,86,0,53,255,164,0,86,0,54,255,235,0,86,0,55,255,216,0,86,0,56,255,218,0,86,0,57,255,246,0,86,0,58,255,183,0,86,0,59,255,242,0,86,0,61,255,228,0,86,0,62,255,215,0,86,0,94,255,226,0,86,0,127,255,248,0,86,0,128,255,248,0,86,0,129,255,248,0,86,0,130,255,248,0,86,0,131,255,248,0,86,0,132,255,248,0,86,0,134,255,244,0,86,0,135,255,242,0,86,0,136,255,242,0,86,0,137,255,242,0,86,0,138,255,242,0,86,0,139,255,242,0,86,0,140,255,242,0,86,0,141,255,242,0,86,0,142,255,242,0,86,0,143,255,242,0,86,0,144,255,242,0,86,0,145,255,244,0,86,0,146,255,244,0,86,0,147,255,244,0,86,0,148,255,244,0,86,0,149,255,244,0,86,0,151,255,244,0,86,0,152,255,235,0,86,0,153,255,235,0,86,0,154,255,235,0,86,0,155,255,235,0,86,0,156,255,183,0,86,0,157,255,242,0,86,0,194,255,244,0,86,0,196,255,243,0,86,0,198,255,183,0,86,0,199,255,242,0,86,0,209,255,211,0,86,0,210,255,209,0,86,0,212,255,211,0,86,0,213,255,209,0,86,0,240,255,239,0,87,0,7,255,238,0,87,0,10,255,231,0,87,0,13,255,227,0,87,0,15,255,227,0,87,0,16,255,223,0,87,0,20,255,231,0,87,0,24,255,200,0,87,0,32,255,206,0,87,0,33,255,240,0,87,0,34,255,216,0,87,0,35,255,242,0,87,0,37,255,242,0,87,0,38,255,242,0,87,0,39,255,242,0,87,0,41,255,242,0,87,0,42,255,242,0,87,0,43,255,242,0,87,0,44,255,242,0,87,0,45,255,242,0,87,0,46,255,229,0,87,0,47,255,242,0,87,0,49,255,242,0,87,0,51,255,242,0,87,0,53,255,170,0,87,0,54,255,245,0,87,0,55,255,237,0,87,0,56,255,242,0,87,0,57,255,208,0,87,0,58,255,210,0,87,0,59,255,224,0,87,0,62,255,214,0,87,0,66,255,250,0,87,0,68,255,247,0,87,0,69,255,247,0,87,0,70,255,247,0,87,0,72,255,250,0,87,0,80,255,247,0,87,0,82,255,247,0,87,0,84,255,252,0,87,0,94,255,227,0,87,0,127,255,216,0,87,0,128,255,216,0,87,0,129,255,216,0,87,0,130,255,216,0,87,0,131,255,216,0,87,0,132,255,216,0,87,0,135,255,242,0,87,0,136,255,242,0,87,0,137,255,242,0,87,0,138,255,242,0,87,0,139,255,242,0,87,0,140,255,242,0,87,0,141,255,242,0,87,0,142,255,242,0,87,0,143,255,242,0,87,0,144,255,242,0,87,0,152,255,245,0,87,0,153,255,245,0,87,0,154,255,245,0,87,0,155,255,245,0,87,0,156,255,210,0,87,0,157,255,242,0,87,0,159,255,250,0,87,0,160,255,250,0,87,0,161,255,250,0,87,0,162,255,250,0,87,0,163,255,250,0,87,0,164,255,250,0,87,0,165,255,250,0,87,0,166,255,247,0,87,0,167,255,247,0,87,0,168,255,247,0,87,0,169,255,247,0,87,0,170,255,247,0,87,0,175,255,238,0,87,0,177,255,247,0,87,0,178,255,247,0,87,0,179,255,247,0,87,0,180,255,247,0,87,0,181,255,247,0,87,0,183,255,247,0,87,0,195,255,247,0,87,0,197,255,252,0,87,0,198,255,210,0,87,0,199,255,224,0,87,0,209,255,226,0,87,0,210,255,224,0,87,0,211,255,227,0,87,0,212,255,226,0,87,0,213,255,224,0,87,0,214,255,227,0,87,0,218,255,227,0,88,0,7,255,240,0,88,0,10,255,232,0,88,0,13,255,235,0,88,0,15,255,236,0,88,0,16,255,231,0,88,0,20,255,240,0,88,0,24,255,207,0,88,0,32,255,211,0,88,0,33,255,247,0,88,0,34,255,223,0,88,0,35,255,243,0,88,0,37,255,243,0,88,0,38,255,243,0,88,0,39,255,243,0,88,0,41,255,243,0,88,0,42,255,243,0,88,0,43,255,243,0,88,0,44,255,243,0,88,0,45,255,243,0,88,0,46,255,232,0,88,0,47,255,243,0,88,0,49,255,243,0,88,0,51,255,243,0,88,0,53,255,178,0,88,0,54,255,246,0,88,0,55,255,236,0,88,0,56,255,242,0,88,0,57,255,213,0,88,0,58,255,211,0,88,0,59,255,228,0,88,0,62,255,218,0,88,0,66,255,252,0,88,0,68,255,251,0,88,0,69,255,251,0,88,0,70,255,251,0,88,0,80,255,251,0,88,0,82,255,251,0,88,0,94,255,229,0,88,0,127,255,223,0,88,0,128,255,223,0,88,0,129,255,223,0,88,0,130,255,223,0,88,0,131,255,223,0,88,0,132,255,223,0,88,0,135,255,243,0,88,0,136,255,243,0,88,0,137,255,243,0,88,0,138,255,243,0,88,0,139,255,243,0,88,0,140,255,243,0,88,0,141,255,243,0,88,0,142,255,243,0,88,0,143,255,243,0,88,0,144,255,243,0,88,0,152,255,246,0,88,0,153,255,246,0,88,0,154,255,246,0,88,0,155,255,246,0,88,0,156,255,211,0,88,0,157,255,243,0,88,0,159,255,252,0,88,0,160,255,252,0,88,0,161,255,252,0,88,0,162,255,252,0,88,0,163,255,252,0,88,0,164,255,252,0,88,0,165,255,252,0,88,0,166,255,251,0,88,0,167,255,251,0,88,0,168,255,251,0,88,0,169,255,251,0,88,0,170,255,251,0,88,0,175,255,246,0,88,0,177,255,251,0,88,0,178,255,251,0,88,0,179,255,251,0,88,0,180,255,251,0,88,0,181,255,251,0,88,0,183,255,251,0,88,0,195,255,251,0,88,0,198,255,211,0,88,0,199,255,228,0,88,0,209,255,227,0,88,0,210,255,225,0,88,0,211,255,235,0,88,0,212,255,227,0,88,0,213,255,225,0,88,0,214,255,235,0,88,0,218,255,236,0,89,0,7,255,238,0,89,0,14,255,247,0,89,0,32,255,227,0,89,0,35,255,247,0,89,0,36,255,240,0,89,0,37,255,247,0,89,0,38,255,247,0,89,0,39,255,247,0,89,0,40,255,240,0,89,0,41,255,247,0,89,0,42,255,247,0,89,0,43,255,247,0,89,0,44,255,247,0,89,0,45,255,247,0,89,0,46,255,250,0,89,0,47,255,247,0,89,0,48,255,240,0,89,0,49,255,247,0,89,0,50,255,240,0,89,0,51,255,247,0,89,0,52,255,248,0,89,0,53,255,167,0,89,0,54,255,244,0,89,0,55,255,236,0,89,0,56,255,242,0,89,0,58,255,208,0,89,0,61,255,247,0,89,0,62,255,230,0,89,0,66,255,252,0,89,0,68,255,238,0,89,0,69,255,238,0,89,0,70,255,238,0,89,0,72,255,247,0,89,0,80,255,238,0,89,0,82,255,238,0,89,0,94,255,237,0,89,0,107,255,236,0,89,0,134,255,240,0,89,0,135,255,247,0,89,0,136,255,247,0,89,0,137,255,247,0,89,0,138,255,247,0,89,0,139,255,247,0,89,0,140,255,247,0,89,0,141,255,247,0,89,0,142,255,247,0,89,0,143,255,247,0,89,0,144,255,247,0,89,0,145,255,240,0,89,0,146,255,240,0,89,0,147,255,240,0,89,0,148,255,240,0,89,0,149,255,240,0,89,0,151,255,240,0,89,0,152,255,244,0,89,0,153,255,244,0,89,0,154,255,244,0,89,0,155,255,244,0,89,0,156,255,208,0,89,0,157,255,247,0,89,0,159,255,252,0,89,0,160,255,252,0,89,0,161,255,252,0,89,0,162,255,252,0,89,0,163,255,252,0,89,0,164,255,252,0,89,0,165,255,252,0,89,0,166,255,238,0,89,0,167,255,238,0,89,0,168,255,238,0,89,0,169,255,238,0,89,0,170,255,238,0,89,0,175,255,240,0,89,0,177,255,238,0,89,0,178,255,238,0,89,0,179,255,238,0,89,0,180,255,238,0,89,0,181,255,238,0,89,0,183,255,238,0,89,0,194,255,240,0,89,0,195,255,238,0,89,0,196,255,248,0,89,0,198,255,208,0,89,0,207,255,247,0,89,0,208,255,247,0,89,0,209,255,224,0,89,0,210,255,222,0,89,0,212,255,224,0,89,0,213,255,222,0,89,0,220,255,236,0,89,0,240,255,248,0,90,0,7,255,238,0,90,0,10,255,231,0,90,0,13,255,225,0,90,0,15,255,225,0,90,0,16,255,220,0,90,0,19,255,227,0,90,0,20,255,230,0,90,0,24,255,198,0,90,0,32,255,205,0,90,0,33,255,238,0,90,0,34,255,214,0,90,0,35,255,243,0,90,0,37,255,243,0,90,0,38,255,243,0,90,0,39,255,243,0,90,0,41,255,243,0,90,0,42,255,243,0,90,0,43,255,243,0,90,0,44,255,243,0,90,0,45,255,243,0,90,0,46,255,229,0,90,0,47,255,243,0,90,0,49,255,243,0,90,0,51,255,243,0,90,0,53,255,168,0,90,0,54,255,245,0,90,0,55,255,238,0,90,0,56,255,242,0,90,0,57,255,208,0,90,0,58,255,211,0,90,0,59,255,225,0,90,0,62,255,214,0,90,0,66,255,250,0,90,0,68,255,246,0,90,0,69,255,246,0,90,0,70,255,246,0,90,0,72,255,250,0,90,0,80,255,246,0,90,0,82,255,246,0,90,0,84,255,252,0,90,0,94,255,227,0,90,0,127,255,214,0,90,0,128,255,214,0,90,0,129,255,214,0,90,0,130,255,214,0,90,0,131,255,214,0,90,0,132,255,214,0,90,0,135,255,243,0,90,0,136,255,243,0,90,0,137,255,243,0,90,0,138,255,243,0,90,0,139,255,243,0,90,0,140,255,243,0,90,0,141,255,243,0,90,0,142,255,243,0,90,0,143,255,243,0,90,0,144,255,243,0,90,0,152,255,245,0,90,0,153,255,245,0,90,0,154,255,245,0,90,0,155,255,245,0,90,0,156,255,211,0,90,0,157,255,243,0,90,0,159,255,250,0,90,0,160,255,250,0,90,0,161,255,250,0,90,0,162,255,250,0,90,0,163,255,250,0,90,0,164,255,250,0,90,0,165,255,250,0,90,0,166,255,246,0,90,0,167,255,246,0,90,0,168,255,246,0,90,0,169,255,246,0,90,0,170,255,246,0,90,0,175,255,236,0,90,0,177,255,246,0,90,0,178,255,246,0,90,0,179,255,246,0,90,0,180,255,246,0,90,0,181,255,246,0,90,0,183,255,246,0,90,0,195,255,246,0,90,0,197,255,252,0,90,0,198,255,211,0,90,0,199,255,225,0,90,0,209,255,227,0,90,0,210,255,225,0,90,0,211,255,225,0,90,0,212,255,227,0,90,0,213,255,225,0,90,0,214,255,225,0,90,0,218,255,225,0,91,0,7,255,245,0,91,0,10,255,246,0,91,0,14,255,240,0,91,0,21,255,225,0,91,0,24,255,244,0,91,0,32,255,221,0,91,0,35,255,242,0,91,0,36,255,244,0,91,0,37,255,242,0,91,0,38,255,242,0,91,0,39,255,242,0,91,0,40,255,244,0,91,0,41,255,242,0,91,0,42,255,242,0,91,0,43,255,242,0,91,0,44,255,242,0,91,0,45,255,242,0,91,0,46,255,245,0,91,0,47,255,242,0,91,0,48,255,244,0,91,0,49,255,242,0,91,0,50,255,244,0,91,0,51,255,242,0,91,0,53,255,203,0,91,0,54,255,239,0,91,0,55,255,240,0,91,0,56,255,243,0,91,0,58,255,227,0,91,0,61,255,242,0,91,0,62,255,222,0,91,0,68,255,245,0,91,0,69,255,245,0,91,0,70,255,245,0,91,0,72,255,251,0,91,0,80,255,245,0,91,0,82,255,245,0,91,0,94,255,232,0,91,0,107,255,232,0,91,0,134,255,244,0,91,0,135,255,242,0,91,0,136,255,242,0,91,0,137,255,242,0,91,0,138,255,242,0,91,0,139,255,242,0,91,0,140,255,242,0,91,0,141,255,242,0,91,0,142,255,242,0,91,0,143,255,242,0,91,0,144,255,242,0,91,0,145,255,244,0,91,0,146,255,244,0,91,0,147,255,244,0,91,0,148,255,244,0,91,0,149,255,244,0,91,0,151,255,244,0,91,0,152,255,239,0,91,0,153,255,239,0,91,0,154,255,239,0,91,0,155,255,239,0,91,0,156,255,227,0,91,0,157,255,242,0,91,0,166,255,245,0,91,0,167,255,245,0,91,0,168,255,245,0,91,0,169,255,245,0,91,0,170,255,245,0,91,0,175,255,247,0,91,0,177,255,245,0,91,0,178,255,245,0,91,0,179,255,245,0,91,0,180,255,245,0,91,0,181,255,245,0,91,0,183,255,245,0,91,0,194,255,244,0,91,0,195,255,245,0,91,0,198,255,227,0,91,0,207,255,240,0,91,0,208,255,240,0,91,0,209,255,219,0,91,0,210,255,216,0,91,0,212,255,219,0,91,0,213,255,216,0,91,0,220,255,232,0,91,0,240,255,242,0,92,0,17,255,238,0,92,0,21,255,238,0,92,0,23,255,235,0,92,0,34,255,244,0,92,0,36,255,231,0,92,0,40,255,231,0,92,0,43,0,47,0,92,0,46,255,247,0,92,0,48,255,231,0,92,0,50,255,231,0,92,0,53,0,21,0,92,0,55,0,29,0,92,0,56,0,25,0,92,0,57,0,28,0,92,0,58,0,34,0,92,0,66,255,229,0,92,0,68,255,222,0,92,0,69,255,222,0,92,0,70,255,222,0,92,0,78,255,227,0,92,0,79,255,227,0,92,0,80,255,222,0,92,0,81,255,227,0,92,0,82,255,222,0,92,0,83,255,227,0,92,0,84,255,229,0,92,0,85,255,231,0,92,0,86,255,225,0,92,0,87,255,227,0,92,0,88,255,228,0,92,0,89,255,238,0,92,0,90,255,227,0,92,0,91,255,232,0,92,0,127,255,244,0,92,0,128,255,244,0,92,0,129,255,244,0,92,0,130,255,244,0,92,0,131,255,244,0,92,0,132,255,244,0,92,0,134,255,231,0,92,0,145,255,231,0,92,0,146,255,231,0,92,0,147,255,231,0,92,0,148,255,231,0,92,0,149,255,231,0,92,0,151,255,231,0,92,0,156,0,34,0,92,0,158,255,247,0,92,0,159,255,229,0,92,0,160,255,229,0,92,0,161,255,229,0,92,0,162,255,229,0,92,0,163,255,229,0,92,0,164,255,229,0,92,0,165,255,229,0,92,0,166,255,222,0,92,0,167,255,222,0,92,0,168,255,222,0,92,0,169,255,222,0,92,0,170,255,222,0,92,0,171,0,12,0,92,0,173,0,33,0,92,0,174,0,44,0,92,0,175,255,234,0,92,0,176,255,227,0,92,0,177,255,222,0,92,0,178,255,222,0,92,0,179,255,222,0,92,0,180,255,222,0,92,0,181,255,222,0,92,0,183,255,222,0,92,0,184,255,225,0,92,0,185,255,225,0,92,0,186,255,225,0,92,0,187,255,225,0,92,0,188,255,227,0,92,0,189,255,249,0,92,0,190,255,227,0,92,0,194,255,231,0,92,0,195,255,222,0,92,0,197,255,229,0,92,0,198,0,34,0,92,0,200,255,232,0,97,0,53,255,200,0,97,0,55,255,236,0,97,0,56,255,244,0,97,0,58,255,224,0,97,0,156,255,224,0,97,0,198,255,224,0,107,0,53,255,197,0,107,0,55,255,245,0,107,0,58,255,226,0,107,0,68,255,247,0,107,0,69,255,247,0,107,0,70,255,247,0,107,0,80,255,247,0,107,0,82,255,247,0,107,0,156,255,226,0,107,0,166,255,247,0,107,0,167,255,247,0,107,0,168,255,247,0,107,0,169,255,247,0,107,0,170,255,247,0,107,0,177,255,247,0,107,0,178,255,247,0,107,0,179,255,247,0,107,0,180,255,247,0,107,0,181,255,247,0,107,0,183,255,247,0,107,0,195,255,247,0,107,0,198,255,226,0,107,0,210,255,229,0,107,0,213,255,229,0,110,0,34,255,237,0,110,0,46,255,247,0,110,0,53,255,230,0,110,0,55,255,243,0,110,0,56,255,248,0,110,0,57,255,236,0,110,0,58,255,229,0,110,0,59,255,231,0,110,0,127,255,237,0,110,0,128,255,237,0,110,0,129,255,237,0,110,0,130,255,237,0,110,0,131,255,237,0,110,0,132,255,237,0,110,0,133,255,236,0,110,0,156,255,229,0,110,0,198,255,229,0,110,0,199,255,231,0,111,0,21,255,229,0,111,0,23,255,239,0,122,0,3,255,241,0,122,0,8,255,241,0,122,0,34,255,247,0,122,0,52,255,234,0,122,0,53,255,195,0,122,0,55,255,220,0,122,0,56,255,230,0,122,0,57,255,224,0,122,0,58,255,198,0,122,0,59,255,223,0,122,0,85,255,247,0,122,0,89,255,236,0,122,0,90,255,248,0,122,0,91,255,233,0,122,0,127,255,247,0,122,0,128,255,247,0,122,0,129,255,247,0,122,0,130,255,247,0,122,0,131,255,247,0,122,0,132,255,247,0,122,0,133,255,243,0,122,0,156,255,198,0,122,0,158,255,248,0,122,0,188,255,248,0,122,0,190,255,248,0,122,0,196,255,234,0,122,0,198,255,198,0,122,0,199,255,223,0,122,0,200,255,233,0,122,0,210,255,204,0,122,0,213,255,204,0,126,0,34,255,233,0,126,0,35,255,247,0,126,0,37,255,247,0,126,0,38,255,247,0,126,0,39,255,247,0,126,0,41,255,247,0,126,0,42,255,247,0,126,0,43,0,19,0,126,0,44,255,247,0,126,0,45,255,247,0,126,0,46,255,238,0,126,0,47,255,247,0,126,0,49,255,247,0,126,0,51,255,247,0,126,0,53,255,192,0,126,0,54,255,245,0,126,0,55,255,233,0,126,0,56,255,241,0,126,0,57,255,231,0,126,0,58,255,219,0,126,0,59,255,220,0,126,0,66,255,241,0,126,0,67,255,247,0,126,0,68,255,243,0,126,0,69,255,243,0,126,0,70,255,243,0,126,0,72,255,243,0,126,0,73,255,247,0,126,0,74,255,242,0,126,0,75,0,20,0,126,0,76,255,247,0,126,0,77,255,247,0,126,0,78,255,241,0,126,0,79,255,241,0,126,0,80,255,243,0,126,0,81,255,241,0,126,0,82,255,243,0,126,0,83,255,241,0,126,0,84,255,241,0,126,0,86,255,243,0,126,0,89,255,248,0,126,0,91,255,241,0,126,0,127,255,233,0,126,0,128,255,233,0,126,0,129,255,233,0,126,0,130,255,233,0,126,0,131,255,233,0,126,0,132,255,233,0,126,0,133,255,235,0,126,0,135,255,247,0,126,0,136,255,247,0,126,0,137,255,247,0,126,0,138,255,247,0,126,0,139,255,247,0,126,0,140,255,247,0,126,0,141,255,247,0,126,0,142,255,247,0,126,0,143,255,247,0,126,0,144,255,247,0,126,0,152,255,245,0,126,0,153,255,245,0,126,0,154,255,245,0,126,0,155,255,245,0,126,0,156,255,219,0,126,0,157,255,247,0,126,0,159,255,241,0,126,0,160,255,241,0,126,0,161,255,241,0,126,0,162,255,241,0,126,0,163,255,241,0,126,0,164,255,241,0,126,0,165,255,241,0,126,0,166,255,243,0,126,0,167,255,243,0,126,0,168,255,243,0,126,0,169,255,243,0,126,0,170,255,243,0,126,0,171,255,242,0,126,0,172,255,242,0,126,0,173,255,242,0,126,0,174,255,242,0,126,0,175,255,240,0,126,0,176,255,241,0,126,0,177,255,243,0,126,0,178,255,243,0,126,0,179,255,243,0,126,0,180,255,243,0,126,0,181,255,243,0,126,0,183,255,243,0,126,0,184,255,243,0,126,0,185,255,243,0,126,0,186,255,243,0,126,0,187,255,243,0,126,0,189,255,241,0,126,0,193,255,242,0,126,0,195,255,243,0,126,0,197,255,241,0,126,0,198,255,219,0,126,0,199,255,220,0,126,0,200,255,241,0,127,0,3,255,213,0,127,0,8,255,213,0,127,0,11,255,212,0,127,0,18,255,239,0,127,0,26,255,242,0,127,0,32,255,239,0,127,0,36,255,245,0,127,0,40,255,245,0,127,0,48,255,245,0,127,0,50,255,245,0,127,0,53,255,202,0,127,0,54,255,240,0,127,0,55,255,207,0,127,0,56,255,219,0,127,0,58,255,192,0,127,0,61,255,208,0,127,0,68,255,245,0,127,0,69,255,245,0,127,0,70,255,245,0,127,0,71,255,241,0,127,0,72,255,248,0,127,0,77,255,249,0,127,0,80,255,245,0,127,0,82,255,245,0,127,0,85,255,229,0,127,0,86,255,244,0,127,0,87,255,221,0,127,0,88,255,228,0,127,0,90,255,217,0,127,0,94,255,246,0,127,0,107,255,247,0,127,0,110,255,241,0,127,0,134,255,245,0,127,0,145,255,245,0,127,0,146,255,245,0,127,0,147,255,245,0,127,0,148,255,245,0,127,0,149,255,245,0,127,0,151,255,245,0,127,0,152,255,240,0,127,0,153,255,240,0,127,0,154,255,240,0,127,0,155,255,240,0,127,0,156,255,192,0,127,0,158,255,242,0,127,0,166,255,245,0,127,0,167,255,245,0,127,0,168,255,245,0,127,0,169,255,245,0,127,0,170,255,245,0,127,0,175,255,250,0,127,0,177,255,245,0,127,0,178,255,245,0,127,0,179,255,245,0,127,0,180,255,245,0,127,0,181,255,245,0,127,0,183,255,245,0,127,0,184,255,244,0,127,0,185,255,244,0,127,0,186,255,244,0,127,0,187,255,244,0,127,0,188,255,217,0,127,0,190,255,217,0,127,0,194,255,245,0,127,0,195,255,245,0,127,0,198,255,192,0,127,0,209,255,205,0,127,0,210,255,204,0,127,0,212,255,205,0,127,0,213,255,204,0,127,0,220,255,247,0,127,0,240,255,212,0,128,0,3,255,213,0,128,0,8,255,213,0,128,0,11,255,212,0,128,0,18,255,239,0,128,0,26,255,242,0,128,0,32,255,239,0,128,0,36,255,245,0,128,0,40,255,245,0,128,0,48,255,245,0,128,0,50,255,245,0,128,0,53,255,202,0,128,0,54,255,240,0,128,0,55,255,207,0,128,0,56,255,219,0,128,0,58,255,192,0,128,0,61,255,208,0,128,0,68,255,245,0,128,0,69,255,245,0,128,0,70,255,245,0,128,0,71,255,241,0,128,0,72,255,248,0,128,0,77,255,249,0,128,0,80,255,245,0,128,0,82,255,245,0,128,0,85,255,229,0,128,0,86,255,244,0,128,0,87,255,221,0,128,0,88,255,228,0,128,0,90,255,217,0,128,0,94,255,246,0,128,0,107,255,247,0,128,0,110,255,241,0,128,0,134,255,245,0,128,0,145,255,245,0,128,0,146,255,245,0,128,0,147,255,245,0,128,0,148,255,245,0,128,0,149,255,245,0,128,0,151,255,245,0,128,0,152,255,240,0,128,0,153,255,240,0,128,0,154,255,240,0,128,0,155,255,240,0,128,0,156,255,192,0,128,0,158,255,242,0,128,0,166,255,245,0,128,0,167,255,245,0,128,0,168,255,245,0,128,0,169,255,245,0,128,0,170,255,245,0,128,0,175,255,250,0,128,0,177,255,245,0,128,0,178,255,245,0,128,0,179,255,245,0,128,0,180,255,245,0,128,0,181,255,245,0,128,0,183,255,245,0,128,0,184,255,244,0,128,0,185,255,244,0,128,0,186,255,244,0,128,0,187,255,244,0,128,0,188,255,217,0,128,0,190,255,217,0,128,0,194,255,245,0,128,0,195,255,245,0,128,0,198,255,192,0,128,0,209,255,205,0,128,0,210,255,204,0,128,0,212,255,205,0,128,0,213,255,204,0,128,0,220,255,247,0,128,0,240,255,212,0,129,0,3,255,213,0,129,0,8,255,213,0,129,0,11,255,212,0,129,0,18,255,239,0,129,0,26,255,242,0,129,0,32,255,239,0,129,0,36,255,245,0,129,0,40,255,245,0,129,0,48,255,245,0,129,0,50,255,245,0,129,0,53,255,202,0,129,0,54,255,240,0,129,0,55,255,207,0,129,0,56,255,219,0,129,0,58,255,192,0,129,0,61,255,208,0,129,0,68,255,245,0,129,0,69,255,245,0,129,0,70,255,245,0,129,0,71,255,241,0,129,0,72,255,248,0,129,0,77,255,249,0,129,0,80,255,245,0,129,0,82,255,245,0,129,0,85,255,229,0,129,0,86,255,244,0,129,0,87,255,221,0,129,0,88,255,228,0,129,0,90,255,217,0,129,0,94,255,246,0,129,0,107,255,247,0,129,0,110,255,241,0,129,0,134,255,245,0,129,0,145,255,245,0,129,0,146,255,245,0,129,0,147,255,245,0,129,0,148,255,245,0,129,0,149,255,245,0,129,0,151,255,245,0,129,0,152,255,240,0,129,0,153,255,240,0,129,0,154,255,240,0,129,0,155,255,240,0,129,0,156,255,192,0,129,0,158,255,242,0,129,0,166,255,245,0,129,0,167,255,245,0,129,0,168,255,245,0,129,0,169,255,245,0,129,0,170,255,245,0,129,0,175,255,250,0,129,0,177,255,245,0,129,0,178,255,245,0,129,0,179,255,245,0,129,0,180,255,245,0,129,0,181,255,245,0,129,0,183,255,245,0,129,0,184,255,244,0,129,0,185,255,244,0,129,0,186,255,244,0,129,0,187,255,244,0,129,0,188,255,217,0,129,0,190,255,217,0,129,0,194,255,245,0,129,0,195,255,245,0,129,0,198,255,192,0,129,0,209,255,205,0,129,0,210,255,204,0,129,0,212,255,205,0,129,0,213,255,204,0,129,0,220,255,247,0,129,0,240,255,212,0,130,0,3,255,213,0,130,0,8,255,213,0,130,0,11,255,212,0,130,0,18,255,239,0,130,0,26,255,242,0,130,0,32,255,239,0,130,0,36,255,245,0,130,0,40,255,245,0,130,0,48,255,245,0,130,0,50,255,245,0,130,0,53,255,202,0,130,0,54,255,240,0,130,0,55,255,207,0,130,0,56,255,219,0,130,0,58,255,192,0,130,0,61,255,208,0,130,0,68,255,245,0,130,0,69,255,245,0,130,0,70,255,245,0,130,0,71,255,241,0,130,0,72,255,248,0,130,0,77,255,249,0,130,0,80,255,245,0,130,0,82,255,245,0,130,0,85,255,229,0,130,0,86,255,244,0,130,0,87,255,221,0,130,0,88,255,228,0,130,0,90,255,217,0,130,0,94,255,246,0,130,0,107,255,247,0,130,0,110,255,241,0,130,0,134,255,245,0,130,0,145,255,245,0,130,0,146,255,245,0,130,0,147,255,245,0,130,0,148,255,245,0,130,0,149,255,245,0,130,0,151,255,245,0,130,0,152,255,240,0,130,0,153,255,240,0,130,0,154,255,240,0,130,0,155,255,240,0,130,0,156,255,192,0,130,0,158,255,242,0,130,0,166,255,245,0,130,0,167,255,245,0,130,0,168,255,245,0,130,0,169,255,245,0,130,0,170,255,245,0,130,0,175,255,250,0,130,0,177,255,245,0,130,0,178,255,245,0,130,0,179,255,245,0,130,0,180,255,245,0,130,0,181,255,245,0,130,0,183,255,245,0,130,0,184,255,244,0,130,0,185,255,244,0,130,0,186,255,244,0,130,0,187,255,244,0,130,0,188,255,217,0,130,0,190,255,217,0,130,0,194,255,245,0,130,0,195,255,245,0,130,0,198,255,192,0,130,0,209,255,205,0,130,0,210,255,204,0,130,0,212,255,205,0,130,0,213,255,204,0,130,0,220,255,247,0,130,0,240,255,212,0,131,0,3,255,213,0,131,0,8,255,213,0,131,0,11,255,212,0,131,0,18,255,239,0,131,0,26,255,242,0,131,0,32,255,239,0,131,0,36,255,245,0,131,0,40,255,245,0,131,0,48,255,245,0,131,0,50,255,245,0,131,0,53,255,202,0,131,0,54,255,240,0,131,0,55,255,207,0,131,0,56,255,219,0,131,0,58,255,192,0,131,0,61,255,208,0,131,0,68,255,245,0,131,0,69,255,245,0,131,0,70,255,245,0,131,0,71,255,241,0,131,0,72,255,248,0,131,0,77,255,249,0,131,0,80,255,245,0,131,0,82,255,245,0,131,0,85,255,229,0,131,0,86,255,244,0,131,0,87,255,221,0,131,0,88,255,228,0,131,0,90,255,217,0,131,0,94,255,246,0,131,0,107,255,247,0,131,0,110,255,241,0,131,0,134,255,245,0,131,0,145,255,245,0,131,0,146,255,245,0,131,0,147,255,245,0,131,0,148,255,245,0,131,0,149,255,245,0,131,0,151,255,245,0,131,0,152,255,240,0,131,0,153,255,240,0,131,0,154,255,240,0,131,0,155,255,240,0,131,0,156,255,192,0,131,0,158,255,242,0,131,0,166,255,245,0,131,0,167,255,245,0,131,0,168,255,245,0,131,0,169,255,245,0,131,0,170,255,245,0,131,0,175,255,250,0,131,0,177,255,245,0,131,0,178,255,245,0,131,0,179,255,245,0,131,0,180,255,245,0,131,0,181,255,245,0,131,0,183,255,245,0,131,0,184,255,244,0,131,0,185,255,244,0,131,0,186,255,244,0,131,0,187,255,244,0,131,0,188,255,217,0,131,0,190,255,217,0,131,0,194,255,245,0,131,0,195,255,245,0,131,0,198,255,192,0,131,0,209,255,205,0,131,0,210,255,204,0,131,0,212,255,205,0,131,0,213,255,204,0,131,0,220,255,247,0,131,0,240,255,212,0,132,0,3,255,213,0,132,0,8,255,213,0,132,0,11,255,212,0,132,0,18,255,239,0,132,0,26,255,242,0,132,0,32,255,239,0,132,0,36,255,245,0,132,0,40,255,245,0,132,0,48,255,245,0,132,0,50,255,245,0,132,0,53,255,202,0,132,0,54,255,240,0,132,0,55,255,207,0,132,0,56,255,219,0,132,0,58,255,192,0,132,0,61,255,208,0,132,0,68,255,245,0,132,0,69,255,245,0,132,0,70,255,245,0,132,0,71,255,241,0,132,0,72,255,248,0,132,0,77,255,249,0,132,0,80,255,245,0,132,0,82,255,245,0,132,0,85,255,229,0,132,0,86,255,244,0,132,0,87,255,221,0,132,0,88,255,228,0,132,0,90,255,217,0,132,0,94,255,246,0,132,0,107,255,247,0,132,0,110,255,241,0,132,0,134,255,245,0,132,0,145,255,245,0,132,0,146,255,245,0,132,0,147,255,245,0,132,0,148,255,245,0,132,0,149,255,245,0,132,0,151,255,245,0,132,0,152,255,240,0,132,0,153,255,240,0,132,0,154,255,240,0,132,0,155,255,240,0,132,0,156,255,192,0,132,0,158,255,242,0,132,0,166,255,245,0,132,0,167,255,245,0,132,0,168,255,245,0,132,0,169,255,245,0,132,0,170,255,245,0,132,0,175,255,250,0,132,0,177,255,245,0,132,0,178,255,245,0,132,0,179,255,245,0,132,0,180,255,245,0,132,0,181,255,245,0,132,0,183,255,245,0,132,0,184,255,244,0,132,0,185,255,244,0,132,0,186,255,244,0,132,0,187,255,244,0,132,0,188,255,217,0,132,0,190,255,217,0,132,0,194,255,245,0,132,0,195,255,245,0,132,0,198,255,192,0,132,0,209,255,205,0,132,0,210,255,204,0,132,0,212,255,205,0,132,0,213,255,204,0,132,0,220,255,247,0,132,0,240,255,212,0,133,0,14,255,244,0,133,0,21,255,220,0,133,0,36,255,245,0,133,0,40,255,245,0,133,0,48,255,245,0,133,0,50,255,245,0,133,0,68,255,240,0,133,0,69,255,240,0,133,0,70,255,240,0,133,0,71,255,243,0,133,0,72,255,241,0,133,0,78,255,247,0,133,0,79,255,247,0,133,0,80,255,240,0,133,0,81,255,247,0,133,0,82,255,240,0,133,0,83,255,247,0,133,0,84,255,251,0,133,0,85,255,242,0,133,0,86,255,238,0,133,0,87,255,241,0,133,0,88,255,243,0,133,0,90,255,240,0,133,0,107,255,235,0,133,0,110,255,248,0,133,0,134,255,245,0,133,0,145,255,245,0,133,0,146,255,245,0,133,0,147,255,245,0,133,0,148,255,245,0,133,0,149,255,245,0,133,0,151,255,245,0,133,0,158,255,243,0,133,0,166,255,240,0,133,0,167,255,240,0,133,0,168,255,240,0,133,0,169,255,240,0,133,0,170,255,240,0,133,0,173,0,21,0,133,0,175,255,246,0,133,0,176,255,247,0,133,0,177,255,240,0,133,0,178,255,240,0,133,0,179,255,240,0,133,0,180,255,240,0,133,0,181,255,240,0,133,0,183,255,240,0,133,0,184,255,238,0,133,0,185,255,238,0,133,0,186,255,238,0,133,0,187,255,238,0,133,0,188,255,240,0,133,0,189,255,247,0,133,0,190,255,240,0,133,0,194,255,245,0,133,0,195,255,240,0,133,0,197,255,251,0,133,0,207,255,244,0,133,0,208,255,244,0,133,0,220,255,235,0,134,0,14,255,195,0,134,0,21,255,207,0,134,0,36,255,242,0,134,0,40,255,242,0,134,0,48,255,242,0,134,0,50,255,242,0,134,0,68,255,242,0,134,0,69,255,242,0,134,0,70,255,242,0,134,0,71,255,249,0,134,0,72,255,241,0,134,0,78,255,249,0,134,0,79,255,249,0,134,0,80,255,242,0,134,0,81,255,249,0,134,0,82,255,242,0,134,0,83,255,249,0,134,0,85,255,249,0,134,0,86,255,241,0,134,0,87,255,249,0,134,0,88,255,250,0,134,0,90,255,249,0,134,0,107,255,226,0,134,0,134,255,242,0,134,0,145,255,242,0,134,0,146,255,242,0,134,0,147,255,242,0,134,0,148,255,242,0,134,0,149,255,242,0,134,0,151,255,242,0,134,0,158,255,250,0,134,0,166,255,242,0,134,0,167,255,242,0,134,0,168,255,242,0,134,0,169,255,242,0,134,0,170,255,242,0,134,0,173,0,31,0,134,0,174,0,12,0,134,0,175,255,249,0,134,0,176,255,249,0,134,0,177,255,242,0,134,0,178,255,242,0,134,0,179,255,242,0,134,0,180,255,242,0,134,0,181,255,242,0,134,0,183,255,242,0,134,0,184,255,241,0,134,0,185,255,241,0,134,0,186,255,241,0,134,0,187,255,241,0,134,0,188,255,249,0,134,0,189,255,249,0,134,0,190,255,249,0,134,0,194,255,242,0,134,0,195,255,242,0,134,0,207,255,195,0,134,0,208,255,195,0,134,0,220,255,226,0,135,0,14,255,244,0,135,0,21,255,220,0,135,0,36,255,245,0,135,0,40,255,245,0,135,0,48,255,245,0,135,0,50,255,245,0,135,0,68,255,240,0,135,0,69,255,240,0,135,0,70,255,240,0,135,0,71,255,243,0,135,0,72,255,241,0,135,0,78,255,247,0,135,0,79,255,247,0,135,0,80,255,240,0,135,0,81,255,247,0,135,0,82,255,240,0,135,0,83,255,247,0,135,0,84,255,251,0,135,0,85,255,242,0,135,0,86,255,238,0,135,0,87,255,241,0,135,0,88,255,243,0,135,0,90,255,240,0,135,0,107,255,235,0,135,0,110,255,248,0,135,0,134,255,245,0,135,0,145,255,245,0,135,0,146,255,245,0,135,0,147,255,245,0,135,0,148,255,245,0,135,0,149,255,245,0,135,0,151,255,245,0,135,0,158,255,243,0,135,0,166,255,240,0,135,0,167,255,240,0,135,0,168,255,240,0,135,0,169,255,240,0,135,0,170,255,240,0,135,0,173,0,21,0,135,0,175,255,246,0,135,0,176,255,247,0,135,0,177,255,240,0,135,0,178,255,240,0,135,0,179,255,240,0,135,0,180,255,240,0,135,0,181,255,240,0,135,0,183,255,240,0,135,0,184,255,238,0,135,0,185,255,238,0,135,0,186,255,238,0,135,0,187,255,238,0,135,0,188,255,240,0,135,0,189,255,247,0,135,0,190,255,240,0,135,0,194,255,245,0,135,0,195,255,240,0,135,0,197,255,251,0,135,0,207,255,244,0,135,0,208,255,244,0,135,0,220,255,235,0,136,0,14,255,244,0,136,0,21,255,220,0,136,0,36,255,245,0,136,0,40,255,245,0,136,0,48,255,245,0,136,0,50,255,245,0,136,0,68,255,240,0,136,0,69,255,240,0,136,0,70,255,240,0,136,0,71,255,243,0,136,0,72,255,241,0,136,0,78,255,247,0,136,0,79,255,247,0,136,0,80,255,240,0,136,0,81,255,247,0,136,0,82,255,240,0,136,0,83,255,247,0,136,0,84,255,251,0,136,0,85,255,242,0,136,0,86,255,238,0,136,0,87,255,241,0,136,0,88,255,243,0,136,0,90,255,240,0,136,0,107,255,235,0,136,0,110,255,248,0,136,0,134,255,245,0,136,0,145,255,245,0,136,0,146,255,245,0,136,0,147,255,245,0,136,0,148,255,245,0,136,0,149,255,245,0,136,0,151,255,245,0,136,0,158,255,243,0,136,0,166,255,240,0,136,0,167,255,240,0,136,0,168,255,240,0,136,0,169,255,240,0,136,0,170,255,240,0,136,0,173,0,21,0,136,0,175,255,246,0,136,0,176,255,247,0,136,0,177,255,240,0,136,0,178,255,240,0,136,0,179,255,240,0,136,0,180,255,240,0,136,0,181,255,240,0,136,0,183,255,240,0,136,0,184,255,238,0,136,0,185,255,238,0,136,0,186,255,238,0,136,0,187,255,238,0,136,0,188,255,240,0,136,0,189,255,247,0,136,0,190,255,240,0,136,0,194,255,245,0,136,0,195,255,240,0,136,0,197,255,251,0,136,0,207,255,244,0,136,0,208,255,244,0,136,0,220,255,235,0,137,0,14,255,244,0,137,0,21,255,220,0,137,0,36,255,245,0,137,0,40,255,245,0,137,0,48,255,245,0,137,0,50,255,245,0,137,0,68,255,240,0,137,0,69,255,240,0,137,0,70,255,240,0,137,0,71,255,243,0,137,0,72,255,241,0,137,0,78,255,247,0,137,0,79,255,247,0,137,0,80,255,240,0,137,0,81,255,247,0,137,0,82,255,240,0,137,0,83,255,247,0,137,0,84,255,251,0,137,0,85,255,242,0,137,0,86,255,238,0,137,0,87,255,241,0,137,0,88,255,243,0,137,0,90,255,240,0,137,0,107,255,235,0,137,0,110,255,248,0,137,0,134,255,245,0,137,0,145,255,245,0,137,0,146,255,245,0,137,0,147,255,245,0,137,0,148,255,245,0,137,0,149,255,245,0,137,0,151,255,245,0,137,0,158,255,243,0,137,0,166,255,240,0,137,0,167,255,240,0,137,0,168,255,240,0,137,0,169,255,240,0,137,0,170,255,240,0,137,0,173,0,21,0,137,0,175,255,246,0,137,0,176,255,247,0,137,0,177,255,240,0,137,0,178,255,240,0,137,0,179,255,240,0,137,0,180,255,240,0,137,0,181,255,240,0,137,0,183,255,240,0,137,0,184,255,238,0,137,0,185,255,238,0,137,0,186,255,238,0,137,0,187,255,238,0,137,0,188,255,240,0,137,0,189,255,247,0,137,0,190,255,240,0,137,0,194,255,245,0,137,0,195,255,240,0,137,0,197,255,251,0,137,0,207,255,244,0,137,0,208,255,244,0,137,0,220,255,235,0,138,0,14,255,244,0,138,0,21,255,220,0,138,0,36,255,245,0,138,0,40,255,245,0,138,0,48,255,245,0,138,0,50,255,245,0,138,0,68,255,240,0,138,0,69,255,240,0,138,0,70,255,240,0,138,0,71,255,243,0,138,0,72,255,241,0,138,0,78,255,247,0,138,0,79,255,247,0,138,0,80,255,240,0,138,0,81,255,247,0,138,0,82,255,240,0,138,0,83,255,247,0,138,0,84,255,251,0,138,0,85,255,242,0,138,0,86,255,238,0,138,0,87,255,241,0,138,0,88,255,243,0,138,0,90,255,240,0,138,0,107,255,235,0,138,0,110,255,248,0,138,0,134,255,245,0,138,0,145,255,245,0,138,0,146,255,245,0,138,0,147,255,245,0,138,0,148,255,245,0,138,0,149,255,245,0,138,0,151,255,245,0,138,0,158,255,243,0,138,0,166,255,240,0,138,0,167,255,240,0,138,0,168,255,240,0,138,0,169,255,240,0,138,0,170,255,240,0,138,0,173,0,21,0,138,0,175,255,246,0,138,0,176,255,247,0,138,0,177,255,240,0,138,0,178,255,240,0,138,0,179,255,240,0,138,0,180,255,240,0,138,0,181,255,240,0,138,0,183,255,240,0,138,0,184,255,238,0,138,0,185,255,238,0,138,0,186,255,238,0,138,0,187,255,238,0,138,0,188,255,240,0,138,0,189,255,247,0,138,0,190,255,240,0,138,0,194,255,245,0,138,0,195,255,240,0,138,0,197,255,251,0,138,0,207,255,244,0,138,0,208,255,244,0,138,0,220,255,235,0,139,0,10,255,246,0,139,0,46,255,251,0,139,0,66,255,246,0,139,0,67,255,247,0,139,0,68,255,242,0,139,0,69,255,242,0,139,0,70,255,242,0,139,0,71,255,247,0,139,0,72,255,241,0,139,0,73,255,247,0,139,0,74,255,247,0,139,0,75,255,247,0,139,0,76,255,247,0,139,0,77,255,246,0,139,0,78,255,247,0,139,0,79,255,247,0,139,0,80,255,242,0,139,0,81,255,247,0,139,0,82,255,242,0,139,0,83,255,247,0,139,0,84,255,246,0,139,0,85,255,247,0,139,0,86,255,245,0,139,0,87,255,247,0,139,0,88,255,248,0,139,0,90,255,247,0,139,0,91,255,246,0,139,0,158,255,244,0,139,0,159,255,246,0,139,0,160,255,246,0,139,0,161,255,246,0,139,0,162,255,246,0,139,0,163,255,246,0,139,0,164,255,246,0,139,0,165,255,246,0,139,0,166,255,242,0,139,0,167,255,242,0,139,0,168,255,242,0,139,0,169,255,242,0,139,0,170,255,242,0,139,0,171,255,247,0,139,0,172,255,247,0,139,0,173,255,247,0,139,0,174,255,247,0,139,0,175,255,243,0,139,0,176,255,247,0,139,0,177,255,242,0,139,0,178,255,242,0,139,0,179,255,242,0,139,0,180,255,242,0,139,0,181,255,242,0,139,0,183,255,242,0,139,0,184,255,245,0,139,0,185,255,245,0,139,0,186,255,245,0,139,0,187,255,245,0,139,0,188,255,247,0,139,0,189,255,247,0,139,0,190,255,247,0,139,0,193,255,247,0,139,0,195,255,242,0,139,0,197,255,246,0,139,0,200,255,246,0,140,0,10,255,246,0,140,0,46,255,251,0,140,0,66,255,246,0,140,0,67,255,247,0,140,0,68,255,242,0,140,0,69,255,242,0,140,0,70,255,242,0,140,0,71,255,247,0,140,0,72,255,241,0,140,0,73,255,247,0,140,0,74,255,247,0,140,0,75,255,247,0,140,0,76,255,247,0,140,0,77,255,246,0,140,0,78,255,247,0,140,0,79,255,247,0,140,0,80,255,242,0,140,0,81,255,247,0,140,0,82,255,242,0,140,0,83,255,247,0,140,0,84,255,246,0,140,0,85,255,247,0,140,0,86,255,245,0,140,0,87,255,247,0,140,0,88,255,248,0,140,0,90,255,247,0,140,0,91,255,246,0,140,0,158,255,244,0,140,0,159,255,246,0,140,0,160,255,246,0,140,0,161,255,246,0,140,0,162,255,246,0,140,0,163,255,246,0,140,0,164,255,246,0,140,0,165,255,246,0,140,0,166,255,242,0,140,0,167,255,242,0,140,0,168,255,242,0,140,0,169,255,242,0,140,0,170,255,242,0,140,0,171,255,247,0,140,0,172,255,247,0,140,0,173,255,247,0,140,0,174,255,247,0,140,0,175,255,243,0,140,0,176,255,247,0,140,0,177,255,242,0,140,0,178,255,242,0,140,0,179,255,242,0,140,0,180,255,242,0,140,0,181,255,242,0,140,0,183,255,242,0,140,0,184,255,245,0,140,0,185,255,245,0,140,0,186,255,245,0,140,0,187,255,245,0,140,0,188,255,247,0,140,0,189,255,247,0,140,0,190,255,247,0,140,0,193,255,247,0,140,0,195,255,242,0,140,0,197,255,246,0,140,0,200,255,246,0,141,0,10,255,246,0,141,0,46,255,251,0,141,0,66,255,246,0,141,0,67,255,247,0,141,0,68,255,242,0,141,0,69,255,242,0,141,0,70,255,242,0,141,0,71,255,247,0,141,0,72,255,241,0,141,0,73,255,247,0,141,0,74,255,247,0,141,0,75,255,247,0,141,0,76,255,247,0,141,0,77,255,246,0,141,0,78,255,247,0,141,0,79,255,247,0,141,0,80,255,242,0,141,0,81,255,247,0,141,0,82,255,242,0,141,0,83,255,247,0,141,0,84,255,246,0,141,0,85,255,247,0,141,0,86,255,245,0,141,0,87,255,247,0,141,0,88,255,248,0,141,0,90,255,247,0,141,0,91,255,246,0,141,0,158,255,244,0,141,0,159,255,246,0,141,0,160,255,246,0,141,0,161,255,246,0,141,0,162,255,246,0,141,0,163,255,246,0,141,0,164,255,246,0,141,0,165,255,246,0,141,0,166,255,242,0,141,0,167,255,242,0,141,0,168,255,242,0,141,0,169,255,242,0,141,0,170,255,242,0,141,0,171,255,247,0,141,0,172,255,247,0,141,0,173,255,247,0,141,0,174,255,247,0,141,0,175,255,243,0,141,0,176,255,247,0,141,0,177,255,242,0,141,0,178,255,242,0,141,0,179,255,242,0,141,0,180,255,242,0,141,0,181,255,242,0,141,0,183,255,242,0,141,0,184,255,245,0,141,0,185,255,245,0,141,0,186,255,245,0,141,0,187,255,245,0,141,0,188,255,247,0,141,0,189,255,247,0,141,0,190,255,247,0,141,0,193,255,247,0,141,0,195,255,242,0,141,0,197,255,246,0,141,0,200,255,246,0,142,0,10,255,246,0,142,0,46,255,251,0,142,0,66,255,246,0,142,0,67,255,247,0,142,0,68,255,242,0,142,0,69,255,242,0,142,0,70,255,242,0,142,0,71,255,247,0,142,0,72,255,241,0,142,0,73,255,247,0,142,0,74,255,247,0,142,0,75,255,247,0,142,0,76,255,247,0,142,0,77,255,246,0,142,0,78,255,247,0,142,0,79,255,247,0,142,0,80,255,242,0,142,0,81,255,247,0,142,0,82,255,242,0,142,0,83,255,247,0,142,0,84,255,246,0,142,0,85,255,247,0,142,0,86,255,245,0,142,0,87,255,247,0,142,0,88,255,248,0,142,0,90,255,247,0,142,0,91,255,246,0,142,0,158,255,244,0,142,0,159,255,246,0,142,0,160,255,246,0,142,0,161,255,246,0,142,0,162,255,246,0,142,0,163,255,246,0,142,0,164,255,246,0,142,0,165,255,246,0,142,0,166,255,242,0,142,0,167,255,242,0,142,0,168,255,242,0,142,0,169,255,242,0,142,0,170,255,242,0,142,0,171,255,247,0,142,0,172,255,247,0,142,0,173,255,247,0,142,0,174,255,247,0,142,0,175,255,243,0,142,0,176,255,247,0,142,0,177,255,242,0,142,0,178,255,242,0,142,0,179,255,242,0,142,0,180,255,242,0,142,0,181,255,242,0,142,0,183,255,242,0,142,0,184,255,245,0,142,0,185,255,245,0,142,0,186,255,245,0,142,0,187,255,245,0,142,0,188,255,247,0,142,0,189,255,247,0,142,0,190,255,247,0,142,0,193,255,247,0,142,0,195,255,242,0,142,0,197,255,246,0,142,0,200,255,246,0,143,0,10,255,228,0,143,0,13,255,241,0,143,0,15,255,242,0,143,0,16,255,237,0,143,0,20,255,248,0,143,0,24,255,240,0,143,0,32,255,237,0,143,0,34,255,244,0,143,0,46,255,250,0,143,0,53,255,228,0,143,0,55,255,243,0,143,0,56,255,248,0,143,0,57,255,225,0,143,0,58,255,227,0,143,0,59,255,235,0,143,0,61,255,244,0,143,0,62,255,224,0,143,0,66,255,248,0,143,0,67,255,249,0,143,0,68,255,250,0,143,0,69,255,250,0,143,0,70,255,250,0,143,0,72,255,250,0,143,0,73,255,249,0,143,0,74,255,249,0,143,0,75,255,249,0,143,0,76,255,249,0,143,0,77,255,249,0,143,0,78,255,249,0,143,0,79,255,249,0,143,0,80,255,250,0,143,0,81,255,249,0,143,0,82,255,250,0,143,0,83,255,249,0,143,0,84,255,250,0,143,0,86,255,250,0,143,0,89,255,244,0,143,0,91,255,250,0,143,0,94,255,229,0,143,0,127,255,244,0,143,0,128,255,244,0,143,0,129,255,244,0,143,0,130,255,244,0,143,0,131,255,244,0,143,0,132,255,244,0,143,0,133,255,226,0,143,0,156,255,227,0,143,0,158,255,250,0,143,0,159,255,248,0,143,0,160,255,248,0,143,0,161,255,248,0,143,0,162,255,248,0,143,0,163,255,248,0,143,0,164,255,248,0,143,0,165,255,248,0,143,0,166,255,250,0,143,0,167,255,250,0,143,0,168,255,250,0,143,0,169,255,250,0,143,0,170,255,250,0,143,0,171,255,249,0,143,0,172,255,249,0,143,0,173,255,249,0,143,0,174,255,249,0,143,0,175,255,249,0,143,0,176,255,249,0,143,0,177,255,250,0,143,0,178,255,250,0,143,0,179,255,250,0,143,0,180,255,250,0,143,0,181,255,250,0,143,0,183,255,250,0,143,0,184,255,250,0,143,0,185,255,250,0,143,0,186,255,250,0,143,0,187,255,250,0,143,0,189,255,249,0,143,0,193,255,249,0,143,0,195,255,250,0,143,0,197,255,250,0,143,0,198,255,227,0,143,0,199,255,235,0,143,0,200,255,250,0,143,0,210,255,247,0,143,0,211,255,241,0,143,0,213,255,247,0,143,0,214,255,241,0,143,0,218,255,242,0,143,0,240,255,246,0,144,0,10,255,246,0,144,0,46,255,251,0,144,0,66,255,246,0,144,0,67,255,247,0,144,0,68,255,242,0,144,0,69,255,242,0,144,0,70,255,242,0,144,0,71,255,247,0,144,0,72,255,241,0,144,0,73,255,247,0,144,0,74,255,247,0,144,0,75,255,247,0,144,0,76,255,247,0,144,0,77,255,246,0,144,0,78,255,247,0,144,0,79,255,247,0,144,0,80,255,242,0,144,0,81,255,247,0,144,0,82,255,242,0,144,0,83,255,247,0,144,0,84,255,246,0,144,0,85,255,247,0,144,0,86,255,245,0,144,0,87,255,247,0,144,0,88,255,248,0,144,0,90,255,247,0,144,0,91,255,246,0,144,0,158,255,244,0,144,0,159,255,246,0,144,0,160,255,246,0,144,0,161,255,246,0,144,0,162,255,246,0,144,0,163,255,246,0,144,0,164,255,246,0,144,0,165,255,246,0,144,0,166,255,242,0,144,0,167,255,242,0,144,0,168,255,242,0,144,0,169,255,242,0,144,0,170,255,242,0,144,0,171,255,247,0,144,0,172,255,247,0,144,0,173,255,247,0,144,0,174,255,247,0,144,0,175,255,243,0,144,0,176,255,247,0,144,0,177,255,242,0,144,0,178,255,242,0,144,0,179,255,242,0,144,0,180,255,242,0,144,0,181,255,242,0,144,0,183,255,242,0,144,0,184,255,245,0,144,0,185,255,245,0,144,0,186,255,245,0,144,0,187,255,245,0,144,0,188,255,247,0,144,0,189,255,247,0,144,0,190,255,247,0,144,0,193,255,247,0,144,0,195,255,242,0,144,0,197,255,246,0,144,0,200,255,246,0,145,0,10,255,229,0,145,0,13,255,242,0,145,0,15,255,242,0,145,0,16,255,239,0,145,0,24,255,243,0,145,0,32,255,240,0,145,0,34,255,245,0,145,0,46,255,251,0,145,0,53,255,232,0,145,0,55,255,244,0,145,0,56,255,248,0,145,0,57,255,229,0,145,0,58,255,230,0,145,0,59,255,238,0,145,0,61,255,245,0,145,0,62,255,227,0,145,0,66,255,247,0,145,0,67,255,250,0,145,0,68,255,250,0,145,0,69,255,250,0,145,0,70,255,250,0,145,0,72,255,250,0,145,0,73,255,250,0,145,0,74,255,249,0,145,0,75,255,249,0,145,0,76,255,250,0,145,0,77,255,250,0,145,0,78,255,249,0,145,0,79,255,249,0,145,0,80,255,250,0,145,0,81,255,249,0,145,0,82,255,250,0,145,0,83,255,249,0,145,0,84,255,250,0,145,0,86,255,251,0,145,0,89,255,245,0,145,0,91,255,250,0,145,0,94,255,231,0,145,0,127,255,245,0,145,0,128,255,245,0,145,0,129,255,245,0,145,0,130,255,245,0,145,0,131,255,245,0,145,0,132,255,245,0,145,0,133,255,229,0,145,0,156,255,230,0,145,0,158,255,251,0,145,0,159,255,247,0,145,0,160,255,247,0,145,0,161,255,247,0,145,0,162,255,247,0,145,0,163,255,247,0,145,0,164,255,247,0,145,0,165,255,247,0,145,0,166,255,250,0,145,0,167,255,250,0,145,0,168,255,250,0,145,0,169,255,250,0,145,0,170,255,250,0,145,0,171,255,249,0,145,0,172,255,249,0,145,0,173,255,249,0,145,0,174,255,249,0,145,0,175,255,250,0,145,0,176,255,249,0,145,0,177,255,250,0,145,0,178,255,250,0,145,0,179,255,250,0,145,0,180,255,250,0,145,0,181,255,250,0,145,0,183,255,250,0,145,0,184,255,251,0,145,0,185,255,251,0,145,0,186,255,251,0,145,0,187,255,251,0,145,0,189,255,249,0,145,0,193,255,249,0,145,0,195,255,250,0,145,0,197,255,250,0,145,0,198,255,230,0,145,0,199,255,238,0,145,0,200,255,250,0,145,0,210,255,247,0,145,0,211,255,242,0,145,0,213,255,247,0,145,0,214,255,242,0,145,0,218,255,242,0,145,0,240,255,246,0,146,0,10,255,229,0,146,0,13,255,242,0,146,0,15,255,242,0,146,0,16,255,239,0,146,0,24,255,243,0,146,0,32,255,240,0,146,0,34,255,245,0,146,0,46,255,251,0,146,0,53,255,232,0,146,0,55,255,244,0,146,0,56,255,248,0,146,0,57,255,229,0,146,0,58,255,230,0,146,0,59,255,238,0,146,0,61,255,245,0,146,0,62,255,227,0,146,0,66,255,247,0,146,0,67,255,250,0,146,0,68,255,250,0,146,0,69,255,250,0,146,0,70,255,250,0,146,0,72,255,250,0,146,0,73,255,250,0,146,0,74,255,249,0,146,0,75,255,249,0,146,0,76,255,250,0,146,0,77,255,250,0,146,0,78,255,249,0,146,0,79,255,249,0,146,0,80,255,250,0,146,0,81,255,249,0,146,0,82,255,250,0,146,0,83,255,249,0,146,0,84,255,250,0,146,0,86,255,251,0,146,0,89,255,245,0,146,0,91,255,250,0,146,0,94,255,231,0,146,0,127,255,245,0,146,0,128,255,245,0,146,0,129,255,245,0,146,0,130,255,245,0,146,0,131,255,245,0,146,0,132,255,245,0,146,0,133,255,229,0,146,0,156,255,230,0,146,0,158,255,251,0,146,0,159,255,247,0,146,0,160,255,247,0,146,0,161,255,247,0,146,0,162,255,247,0,146,0,163,255,247,0,146,0,164,255,247,0,146,0,165,255,247,0,146,0,166,255,250,0,146,0,167,255,250,0,146,0,168,255,250,0,146,0,169,255,250,0,146,0,170,255,250,0,146,0,171,255,249,0,146,0,172,255,249,0,146,0,173,255,249,0,146,0,174,255,249,0,146,0,175,255,250,0,146,0,176,255,249,0,146,0,177,255,250,0,146,0,178,255,250,0,146,0,179,255,250,0,146,0,180,255,250,0,146,0,181,255,250,0,146,0,183,255,250,0,146,0,184,255,251,0,146,0,185,255,251,0,146,0,186,255,251,0,146,0,187,255,251,0,146,0,189,255,249,0,146,0,193,255,249,0,146,0,195,255,250,0,146,0,197,255,250,0,146,0,198,255,230,0,146,0,199,255,238,0,146,0,200,255,250,0,146,0,210,255,247,0,146,0,211,255,242,0,146,0,213,255,247,0,146,0,214,255,242,0,146,0,218,255,242,0,146,0,240,255,246,0,147,0,10,255,229,0,147,0,13,255,242,0,147,0,15,255,242,0,147,0,16,255,239,0,147,0,24,255,243,0,147,0,32,255,240,0,147,0,34,255,245,0,147,0,46,255,251,0,147,0,53,255,232,0,147,0,55,255,244,0,147,0,56,255,248,0,147,0,57,255,229,0,147,0,58,255,230,0,147,0,59,255,238,0,147,0,61,255,245,0,147,0,62,255,227,0,147,0,66,255,247,0,147,0,67,255,250,0,147,0,68,255,250,0,147,0,69,255,250,0,147,0,70,255,250,0,147,0,72,255,250,0,147,0,73,255,250,0,147,0,74,255,249,0,147,0,75,255,249,0,147,0,76,255,250,0,147,0,77,255,250,0,147,0,78,255,249,0,147,0,79,255,249,0,147,0,80,255,250,0,147,0,81,255,249,0,147,0,82,255,250,0,147,0,83,255,249,0,147,0,84,255,250,0,147,0,86,255,251,0,147,0,89,255,245,0,147,0,91,255,250,0,147,0,94,255,231,0,147,0,127,255,245,0,147,0,128,255,245,0,147,0,129,255,245,0,147,0,130,255,245,0,147,0,131,255,245,0,147,0,132,255,245,0,147,0,133,255,229,0,147,0,156,255,230,0,147,0,158,255,251,0,147,0,159,255,247,0,147,0,160,255,247,0,147,0,161,255,247,0,147,0,162,255,247,0,147,0,163,255,247,0,147,0,164,255,247,0,147,0,165,255,247,0,147,0,166,255,250,0,147,0,167,255,250,0,147,0,168,255,250,0,147,0,169,255,250,0,147,0,170,255,250,0,147,0,171,255,249,0,147,0,172,255,249,0,147,0,173,255,249,0,147,0,174,255,249,0,147,0,175,255,250,0,147,0,176,255,249,0,147,0,177,255,250,0,147,0,178,255,250,0,147,0,179,255,250,0,147,0,180,255,250,0,147,0,181,255,250,0,147,0,183,255,250,0,147,0,184,255,251,0,147,0,185,255,251,0,147,0,186,255,251,0,147,0,187,255,251,0,147,0,189,255,249,0,147,0,193,255,249,0,147,0,195,255,250,0,147,0,197,255,250,0,147,0,198,255,230,0,147,0,199,255,238,0,147,0,200,255,250,0,147,0,210,255,247,0,147,0,211,255,242,0,147,0,213,255,247,0,147,0,214,255,242,0,147,0,218,255,242,0,147,0,240,255,246,0,148,0,10,255,229,0,148,0,13,255,242,0,148,0,15,255,242,0,148,0,16,255,239,0,148,0,24,255,243,0,148,0,32,255,240,0,148,0,34,255,245,0,148,0,46,255,251,0,148,0,53,255,232,0,148,0,55,255,244,0,148,0,56,255,248,0,148,0,57,255,229,0,148,0,58,255,230,0,148,0,59,255,238,0,148,0,61,255,245,0,148,0,62,255,227,0,148,0,66,255,247,0,148,0,67,255,250,0,148,0,68,255,250,0,148,0,69,255,250,0,148,0,70,255,250,0,148,0,72,255,250,0,148,0,73,255,250,0,148,0,74,255,249,0,148,0,75,255,249,0,148,0,76,255,250,0,148,0,77,255,250,0,148,0,78,255,249,0,148,0,79,255,249,0,148,0,80,255,250,0,148,0,81,255,249,0,148,0,82,255,250,0,148,0,83,255,249,0,148,0,84,255,250,0,148,0,86,255,251,0,148,0,89,255,245,0,148,0,91,255,250,0,148,0,94,255,231,0,148,0,127,255,245,0,148,0,128,255,245,0,148,0,129,255,245,0,148,0,130,255,245,0,148,0,131,255,245,0,148,0,132,255,245,0,148,0,133,255,229,0,148,0,156,255,230,0,148,0,158,255,251,0,148,0,159,255,247,0,148,0,160,255,247,0,148,0,161,255,247,0,148,0,162,255,247,0,148,0,163,255,247,0,148,0,164,255,247,0,148,0,165,255,247,0,148,0,166,255,250,0,148,0,167,255,250,0,148,0,168,255,250,0,148,0,169,255,250,0,148,0,170,255,250,0,148,0,171,255,249,0,148,0,172,255,249,0,148,0,173,255,249,0,148,0,174,255,249,0,148,0,175,255,250,0,148,0,176,255,249,0,148,0,177,255,250,0,148,0,178,255,250,0,148,0,179,255,250,0,148,0,180,255,250,0,148,0,181,255,250,0,148,0,183,255,250,0,148,0,184,255,251,0,148,0,185,255,251,0,148,0,186,255,251,0,148,0,187,255,251,0,148,0,189,255,249,0,148,0,193,255,249,0,148,0,195,255,250,0,148,0,197,255,250,0,148,0,198,255,230,0,148,0,199,255,238,0,148,0,200,255,250,0,148,0,210,255,247,0,148,0,211,255,242,0,148,0,213,255,247,0,148,0,214,255,242,0,148,0,218,255,242,0,148,0,240,255,246,0,149,0,10,255,229,0,149,0,13,255,242,0,149,0,15,255,242,0,149,0,16,255,239,0,149,0,24,255,243,0,149,0,32,255,240,0,149,0,34,255,245,0,149,0,46,255,251,0,149,0,53,255,232,0,149,0,55,255,244,0,149,0,56,255,248,0,149,0,57,255,229,0,149,0,58,255,230,0,149,0,59,255,238,0,149,0,61,255,245,0,149,0,62,255,227,0,149,0,66,255,247,0,149,0,67,255,250,0,149,0,68,255,250,0,149,0,69,255,250,0,149,0,70,255,250,0,149,0,72,255,250,0,149,0,73,255,250,0,149,0,74,255,249,0,149,0,75,255,249,0,149,0,76,255,250,0,149,0,77,255,250,0,149,0,78,255,249,0,149,0,79,255,249,0,149,0,80,255,250,0,149,0,81,255,249,0,149,0,82,255,250,0,149,0,83,255,249,0,149,0,84,255,250,0,149,0,86,255,251,0,149,0,89,255,245,0,149,0,91,255,250,0,149,0,94,255,231,0,149,0,127,255,245,0,149,0,128,255,245,0,149,0,129,255,245,0,149,0,130,255,245,0,149,0,131,255,245,0,149,0,132,255,245,0,149,0,133,255,229,0,149,0,156,255,230,0,149,0,158,255,251,0,149,0,159,255,247,0,149,0,160,255,247,0,149,0,161,255,247,0,149,0,162,255,247,0,149,0,163,255,247,0,149,0,164,255,247,0,149,0,165,255,247,0,149,0,166,255,250,0,149,0,167,255,250,0,149,0,168,255,250,0,149,0,169,255,250,0,149,0,170,255,250,0,149,0,171,255,249,0,149,0,172,255,249,0,149,0,173,255,249,0,149,0,174,255,249,0,149,0,175,255,250,0,149,0,176,255,249,0,149,0,177,255,250,0,149,0,178,255,250,0,149,0,179,255,250,0,149,0,180,255,250,0,149,0,181,255,250,0,149,0,183,255,250,0,149,0,184,255,251,0,149,0,185,255,251,0,149,0,186,255,251,0,149,0,187,255,251,0,149,0,189,255,249,0,149,0,193,255,249,0,149,0,195,255,250,0,149,0,197,255,250,0,149,0,198,255,230,0,149,0,199,255,238,0,149,0,200,255,250,0,149,0,210,255,247,0,149,0,211,255,242,0,149,0,213,255,247,0,149,0,214,255,242,0,149,0,218,255,242,0,149,0,240,255,246,0,151,0,10,255,229,0,151,0,13,255,242,0,151,0,15,255,242,0,151,0,16,255,239,0,151,0,24,255,243,0,151,0,32,255,240,0,151,0,34,255,245,0,151,0,46,255,251,0,151,0,53,255,232,0,151,0,55,255,244,0,151,0,56,255,248,0,151,0,57,255,229,0,151,0,58,255,230,0,151,0,59,255,238,0,151,0,61,255,245,0,151,0,62,255,227,0,151,0,66,255,247,0,151,0,67,255,250,0,151,0,68,255,250,0,151,0,69,255,250,0,151,0,70,255,250,0,151,0,72,255,250,0,151,0,73,255,250,0,151,0,74,255,249,0,151,0,75,255,249,0,151,0,76,255,250,0,151,0,77,255,250,0,151,0,78,255,249,0,151,0,79,255,249,0,151,0,80,255,250,0,151,0,81,255,249,0,151,0,82,255,250,0,151,0,83,255,249,0,151,0,84,255,250,0,151,0,86,255,251,0,151,0,89,255,245,0,151,0,91,255,250,0,151,0,94,255,231,0,151,0,127,255,245,0,151,0,128,255,245,0,151,0,129,255,245,0,151,0,130,255,245,0,151,0,131,255,245,0,151,0,132,255,245,0,151,0,133,255,229,0,151,0,156,255,230,0,151,0,158,255,251,0,151,0,159,255,247,0,151,0,160,255,247,0,151,0,161,255,247,0,151,0,162,255,247,0,151,0,163,255,247,0,151,0,164,255,247,0,151,0,165,255,247,0,151,0,166,255,250,0,151,0,167,255,250,0,151,0,168,255,250,0,151,0,169,255,250,0,151,0,170,255,250,0,151,0,171,255,249,0,151,0,172,255,249,0,151,0,173,255,249,0,151,0,174,255,249,0,151,0,175,255,250,0,151,0,176,255,249,0,151,0,177,255,250,0,151,0,178,255,250,0,151,0,179,255,250,0,151,0,180,255,250,0,151,0,181,255,250,0,151,0,183,255,250,0,151,0,184,255,251,0,151,0,185,255,251,0,151,0,186,255,251,0,151,0,187,255,251,0,151,0,189,255,249,0,151,0,193,255,249,0,151,0,195,255,250,0,151,0,197,255,250,0,151,0,198,255,230,0,151,0,199,255,238,0,151,0,200,255,250,0,151,0,210,255,247,0,151,0,211,255,242,0,151,0,213,255,247,0,151,0,214,255,242,0,151,0,218,255,242,0,151,0,240,255,246,0,152,0,10,255,245,0,152,0,13,255,243,0,152,0,15,255,243,0,152,0,16,255,234,0,152,0,34,255,240,0,152,0,46,255,248,0,152,0,59,255,251,0,152,0,66,255,242,0,152,0,67,255,245,0,152,0,68,255,243,0,152,0,69,255,243,0,152,0,70,255,243,0,152,0,71,255,250,0,152,0,72,255,242,0,152,0,73,255,245,0,152,0,74,255,243,0,152,0,75,255,243,0,152,0,76,255,245,0,152,0,77,255,244,0,152,0,78,255,240,0,152,0,79,255,240,0,152,0,80,255,243,0,152,0,81,255,240,0,152,0,82,255,243,0,152,0,83,255,240,0,152,0,84,255,243,0,152,0,85,255,249,0,152,0,86,255,242,0,152,0,87,255,250,0,152,0,88,255,250,0,152,0,89,255,250,0,152,0,90,255,250,0,152,0,91,255,244,0,152,0,127,255,240,0,152,0,128,255,240,0,152,0,129,255,240,0,152,0,130,255,240,0,152,0,131,255,240,0,152,0,132,255,240,0,152,0,133,255,240,0,152,0,158,255,248,0,152,0,159,255,242,0,152,0,160,255,242,0,152,0,161,255,242,0,152,0,162,255,242,0,152,0,163,255,242,0,152,0,164,255,242,0,152,0,165,255,242,0,152,0,166,255,243,0,152,0,167,255,243,0,152,0,168,255,243,0,152,0,169,255,243,0,152,0,170,255,243,0,152,0,171,255,243,0,152,0,172,255,243,0,152,0,173,255,251,0,152,0,174,255,243,0,152,0,175,255,242,0,152,0,176,255,240,0,152,0,177,255,243,0,152,0,178,255,243,0,152,0,179,255,243,0,152,0,180,255,243,0,152,0,181,255,243,0,152,0,183,255,243,0,152,0,184,255,242,0,152,0,185,255,242,0,152,0,186,255,242,0,152,0,187,255,242,0,152,0,188,255,250,0,152,0,189,255,240,0,152,0,190,255,250,0,152,0,193,255,243,0,152,0,195,255,243,0,152,0,197,255,243,0,152,0,199,255,251,0,152,0,200,255,244,0,152,0,211,255,243,0,152,0,214,255,243,0,152,0,218,255,243,0,153,0,10,255,245,0,153,0,13,255,243,0,153,0,15,255,243,0,153,0,16,255,234,0,153,0,34,255,240,0,153,0,46,255,248,0,153,0,59,255,251,0,153,0,66,255,242,0,153,0,67,255,245,0,153,0,68,255,243,0,153,0,69,255,243,0,153,0,70,255,243,0,153,0,71,255,250,0,153,0,72,255,242,0,153,0,73,255,245,0,153,0,74,255,243,0,153,0,75,255,243,0,153,0,76,255,245,0,153,0,77,255,244,0,153,0,78,255,240,0,153,0,79,255,240,0,153,0,80,255,243,0,153,0,81,255,240,0,153,0,82,255,243,0,153,0,83,255,240,0,153,0,84,255,243,0,153,0,85,255,249,0,153,0,86,255,242,0,153,0,87,255,250,0,153,0,88,255,250,0,153,0,89,255,250,0,153,0,90,255,250,0,153,0,91,255,244,0,153,0,127,255,240,0,153,0,128,255,240,0,153,0,129,255,240,0,153,0,130,255,240,0,153,0,131,255,240,0,153,0,132,255,240,0,153,0,133,255,240,0,153,0,158,255,248,0,153,0,159,255,242,0,153,0,160,255,242,0,153,0,161,255,242,0,153,0,162,255,242,0,153,0,163,255,242,0,153,0,164,255,242,0,153,0,165,255,242,0,153,0,166,255,243,0,153,0,167,255,243,0,153,0,168,255,243,0,153,0,169,255,243,0,153,0,170,255,243,0,153,0,171,255,243,0,153,0,172,255,243,0,153,0,173,255,251,0,153,0,174,255,243,0,153,0,175,255,242,0,153,0,176,255,240,0,153,0,177,255,243,0,153,0,178,255,243,0,153,0,179,255,243,0,153,0,180,255,243,0,153,0,181,255,243,0,153,0,183,255,243,0,153,0,184,255,242,0,153,0,185,255,242,0,153,0,186,255,242,0,153,0,187,255,242,0,153,0,188,255,250,0,153,0,189,255,240,0,153,0,190,255,250,0,153,0,193,255,243,0,153,0,195,255,243,0,153,0,197,255,243,0,153,0,199,255,251,0,153,0,200,255,244,0,153,0,211,255,243,0,153,0,214,255,243,0,153,0,218,255,243,0,154,0,10,255,245,0,154,0,13,255,243,0,154,0,15,255,243,0,154,0,16,255,234,0,154,0,34,255,240,0,154,0,46,255,248,0,154,0,59,255,251,0,154,0,66,255,242,0,154,0,67,255,245,0,154,0,68,255,243,0,154,0,69,255,243,0,154,0,70,255,243,0,154,0,71,255,250,0,154,0,72,255,242,0,154,0,73,255,245,0,154,0,74,255,243,0,154,0,75,255,243,0,154,0,76,255,245,0,154,0,77,255,244,0,154,0,78,255,240,0,154,0,79,255,240,0,154,0,80,255,243,0,154,0,81,255,240,0,154,0,82,255,243,0,154,0,83,255,240,0,154,0,84,255,243,0,154,0,85,255,249,0,154,0,86,255,242,0,154,0,87,255,250,0,154,0,88,255,250,0,154,0,89,255,250,0,154,0,90,255,250,0,154,0,91,255,244,0,154,0,127,255,240,0,154,0,128,255,240,0,154,0,129,255,240,0,154,0,130,255,240,0,154,0,131,255,240,0,154,0,132,255,240,0,154,0,133,255,240,0,154,0,158,255,248,0,154,0,159,255,242,0,154,0,160,255,242,0,154,0,161,255,242,0,154,0,162,255,242,0,154,0,163,255,242,0,154,0,164,255,242,0,154,0,165,255,242,0,154,0,166,255,243,0,154,0,167,255,243,0,154,0,168,255,243,0,154,0,169,255,243,0,154,0,170,255,243,0,154,0,171,255,243,0,154,0,172,255,243,0,154,0,173,255,251,0,154,0,174,255,243,0,154,0,175,255,242,0,154,0,176,255,240,0,154,0,177,255,243,0,154,0,178,255,243,0,154,0,179,255,243,0,154,0,180,255,243,0,154,0,181,255,243,0,154,0,183,255,243,0,154,0,184,255,242,0,154,0,185,255,242,0,154,0,186,255,242,0,154,0,187,255,242,0,154,0,188,255,250,0,154,0,189,255,240,0,154,0,190,255,250,0,154,0,193,255,243,0,154,0,195,255,243,0,154,0,197,255,243,0,154,0,199,255,251,0,154,0,200,255,244,0,154,0,211,255,243,0,154,0,214,255,243,0,154,0,218,255,243,0,155,0,10,255,245,0,155,0,13,255,243,0,155,0,15,255,243,0,155,0,16,255,234,0,155,0,34,255,240,0,155,0,46,255,248,0,155,0,59,255,251,0,155,0,66,255,242,0,155,0,67,255,245,0,155,0,68,255,243,0,155,0,69,255,243,0,155,0,70,255,243,0,155,0,71,255,250,0,155,0,72,255,242,0,155,0,73,255,245,0,155,0,74,255,243,0,155,0,75,255,243,0,155,0,76,255,245,0,155,0,77,255,244,0,155,0,78,255,240,0,155,0,79,255,240,0,155,0,80,255,243,0,155,0,81,255,240,0,155,0,82,255,243,0,155,0,83,255,240,0,155,0,84,255,243,0,155,0,85,255,249,0,155,0,86,255,242,0,155,0,87,255,250,0,155,0,88,255,250,0,155,0,89,255,250,0,155,0,90,255,250,0,155,0,91,255,244,0,155,0,127,255,240,0,155,0,128,255,240,0,155,0,129,255,240,0,155,0,130,255,240,0,155,0,131,255,240,0,155,0,132,255,240,0,155,0,133,255,240,0,155,0,158,255,248,0,155,0,159,255,242,0,155,0,160,255,242,0,155,0,161,255,242,0,155,0,162,255,242,0,155,0,163,255,242,0,155,0,164,255,242,0,155,0,165,255,242,0,155,0,166,255,243,0,155,0,167,255,243,0,155,0,168,255,243,0,155,0,169,255,243,0,155,0,170,255,243,0,155,0,171,255,243,0,155,0,172,255,243,0,155,0,173,255,251,0,155,0,174,255,243,0,155,0,175,255,242,0,155,0,176,255,240,0,155,0,177,255,243,0,155,0,178,255,243,0,155,0,179,255,243,0,155,0,180,255,243,0,155,0,181,255,243,0,155,0,183,255,243,0,155,0,184,255,242,0,155,0,185,255,242,0,155,0,186,255,242,0,155,0,187,255,242,0,155,0,188,255,250,0,155,0,189,255,240,0,155,0,190,255,250,0,155,0,193,255,243,0,155,0,195,255,243,0,155,0,197,255,243,0,155,0,199,255,251,0,155,0,200,255,244,0,155,0,211,255,243,0,155,0,214,255,243,0,155,0,218,255,243,0,156,0,7,255,237,0,156,0,11,0,13,0,156,0,13,255,215,0,156,0,14,255,222,0,156,0,15,255,215,0,156,0,16,255,201,0,156,0,17,255,233,0,156,0,21,255,206,0,156,0,23,255,218,0,156,0,25,255,246,0,156,0,27,255,235,0,156,0,28,255,235,0,156,0,32,0,13,0,156,0,33,255,198,0,156,0,34,255,192,0,156,0,36,255,230,0,156,0,40,255,230,0,156,0,46,255,232,0,156,0,48,255,230,0,156,0,50,255,230,0,156,0,61,0,7,0,156,0,62,0,31,0,156,0,66,255,189,0,156,0,68,255,171,0,156,0,69,255,171,0,156,0,70,255,171,0,156,0,71,255,237,0,156,0,72,255,180,0,156,0,78,255,187,0,156,0,79,255,187,0,156,0,80,255,171,0,156,0,81,255,187,0,156,0,82,255,171,0,156,0,83,255,187,0,156,0,84,255,186,0,156,0,85,255,221,0,156,0,86,255,190,0,156,0,87,255,215,0,156,0,88,255,216,0,156,0,89,255,214,0,156,0,90,255,217,0,156,0,91,255,229,0,156,0,94,0,33,0,156,0,107,255,198,0,156,0,110,255,230,0,156,0,122,255,225,0,156,0,127,255,192,0,156,0,128,255,192,0,156,0,129,255,192,0,156,0,130,255,192,0,156,0,131,255,192,0,156,0,132,255,192,0,156,0,133,255,180,0,156,0,134,255,230,0,156,0,145,255,230,0,156,0,146,255,230,0,156,0,147,255,230,0,156,0,148,255,230,0,156,0,149,255,230,0,156,0,151,255,230,0,156,0,158,255,230,0,156,0,159,255,189,0,156,0,160,255,189,0,156,0,161,255,189,0,156,0,162,255,189,0,156,0,163,255,189,0,156,0,164,255,189,0,156,0,165,255,189,0,156,0,166,255,171,0,156,0,167,255,171,0,156,0,168,255,171,0,156,0,169,255,171,0,156,0,170,255,171,0,156,0,171,0,16,0,156,0,173,0,38,0,156,0,174,0,47,0,156,0,175,255,216,0,156,0,176,255,187,0,156,0,177,255,171,0,156,0,178,255,171,0,156,0,179,255,171,0,156,0,180,255,171,0,156,0,181,255,171,0,156,0,183,255,171,0,156,0,184,255,190,0,156,0,185,255,190,0,156,0,186,255,190,0,156,0,187,255,190,0,156,0,188,255,217,0,156,0,189,255,225,0,156,0,190,255,217,0,156,0,194,255,230,0,156,0,195,255,171,0,156,0,197,255,234,0,156,0,200,255,229,0,156,0,207,255,222,0,156,0,208,255,222,0,156,0,211,255,215,0,156,0,214,255,215,0,156,0,218,255,215,0,156,0,220,255,198,0,156,0,221,255,225,0,156,0,240,0,33,0,157,0,10,255,228,0,157,0,13,255,177,0,157,0,15,255,177,0,157,0,16,255,221,0,157,0,32,255,223,0,157,0,34,255,235,0,157,0,46,255,251,0,157,0,53,255,202,0,157,0,55,255,248,0,157,0,57,255,205,0,157,0,58,255,228,0,157,0,59,255,203,0,157,0,61,255,247,0,157,0,62,255,214,0,157,0,66,255,247,0,157,0,89,255,250,0,157,0,94,255,226,0,157,0,127,255,235,0,157,0,128,255,235,0,157,0,129,255,235,0,157,0,130,255,235,0,157,0,131,255,235,0,157,0,132,255,235,0,157,0,133,255,201,0,157,0,156,255,228,0,157,0,159,255,247,0,157,0,160,255,247,0,157,0,161,255,247,0,157,0,162,255,247,0,157,0,163,255,247,0,157,0,164,255,247,0,157,0,165,255,247,0,157,0,198,255,228,0,157,0,199,255,203,0,157,0,211,255,177,0,157,0,214,255,177,0,157,0,218,255,177,0,158,0,3,255,243,0,158,0,8,255,243,0,158,0,10,255,239,0,158,0,11,255,241,0,158,0,71,255,250,0,158,0,85,255,247,0,158,0,87,255,245,0,158,0,88,255,248,0,158,0,89,255,251,0,158,0,90,255,245,0,158,0,188,255,245,0,158,0,190,255,245,0,158,0,209,255,245,0,158,0,210,255,243,0,158,0,212,255,245,0,158,0,213,255,243,0,158,0,240,255,242,0,159,0,3,255,234,0,159,0,7,255,245,0,159,0,8,255,234,0,159,0,10,255,246,0,159,0,11,255,231,0,159,0,18,255,234,0,159,0,26,255,247,0,159,0,32,255,229,0,159,0,35,255,240,0,159,0,36,255,237,0,159,0,37,255,240,0,159,0,38,255,240,0,159,0,39,255,240,0,159,0,40,255,237,0,159,0,41,255,240,0,159,0,42,255,240,0,159,0,43,255,240,0,159,0,44,255,240,0,159,0,45,255,240,0,159,0,46,255,248,0,159,0,47,255,240,0,159,0,48,255,237,0,159,0,49,255,240,0,159,0,50,255,237,0,159,0,51,255,240,0,159,0,52,255,250,0,159,0,53,255,173,0,159,0,54,255,227,0,159,0,55,255,193,0,159,0,56,255,210,0,159,0,58,255,165,0,159,0,61,255,210,0,159,0,62,255,227,0,159,0,71,255,251,0,159,0,85,255,246,0,159,0,87,255,238,0,159,0,88,255,243,0,159,0,90,255,236,0,159,0,94,255,231,0,159,0,110,255,248,0,159,0,134,255,237,0,159,0,135,255,240,0,159,0,136,255,240,0,159,0,137,255,240,0,159,0,138,255,240,0,159,0,139,255,240,0,159,0,140,255,240,0,159,0,141,255,240,0,159,0,142,255,240,0,159,0,143,255,240,0,159,0,144,255,240,0,159,0,145,255,237,0,159,0,146,255,237,0,159,0,147,255,237,0,159,0,148,255,237,0,159,0,149,255,237,0,159,0,151,255,237,0,159,0,152,255,227,0,159,0,153,255,227,0,159,0,154,255,227,0,159,0,155,255,227,0,159,0,156,255,165,0,159,0,157,255,240,0,159,0,158,255,249,0,159,0,188,255,236,0,159,0,190,255,236,0,159,0,194,255,237,0,159,0,196,255,250,0,159,0,198,255,165,0,159,0,209,255,186,0,159,0,210,255,183,0,159,0,212,255,186,0,159,0,213,255,183,0,159,0,240,255,230,0,160,0,3,255,234,0,160,0,7,255,245,0,160,0,8,255,234,0,160,0,10,255,246,0,160,0,11,255,231,0,160,0,18,255,234,0,160,0,26,255,247,0,160,0,32,255,229,0,160,0,35,255,240,0,160,0,36,255,237,0,160,0,37,255,240,0,160,0,38,255,240,0,160,0,39,255,240,0,160,0,40,255,237,0,160,0,41,255,240,0,160,0,42,255,240,0,160,0,43,255,240,0,160,0,44,255,240,0,160,0,45,255,240,0,160,0,46,255,248,0,160,0,47,255,240,0,160,0,48,255,237,0,160,0,49,255,240,0,160,0,50,255,237,0,160,0,51,255,240,0,160,0,52,255,250,0,160,0,53,255,173,0,160,0,54,255,227,0,160,0,55,255,193,0,160,0,56,255,210,0,160,0,58,255,165,0,160,0,61,255,210,0,160,0,62,255,227,0,160,0,71,255,251,0,160,0,85,255,246,0,160,0,87,255,238,0,160,0,88,255,243,0,160,0,90,255,236,0,160,0,94,255,231,0,160,0,110,255,248,0,160,0,134,255,237,0,160,0,135,255,240,0,160,0,136,255,240,0,160,0,137,255,240,0,160,0,138,255,240,0,160,0,139,255,240,0,160,0,140,255,240,0,160,0,141,255,240,0,160,0,142,255,240,0,160,0,143,255,240,0,160,0,144,255,240,0,160,0,145,255,237,0,160,0,146,255,237,0,160,0,147,255,237,0,160,0,148,255,237,0,160,0,149,255,237,0,160,0,151,255,237,0,160,0,152,255,227,0,160,0,153,255,227,0,160,0,154,255,227,0,160,0,155,255,227,0,160,0,156,255,165,0,160,0,157,255,240,0,160,0,158,255,249,0,160,0,188,255,236,0,160,0,190,255,236,0,160,0,194,255,237,0,160,0,196,255,250,0,160,0,198,255,165,0,160,0,209,255,186,0,160,0,210,255,183,0,160,0,212,255,186,0,160,0,213,255,183,0,160,0,240,255,230,0,161,0,3,255,234,0,161,0,7,255,245,0,161,0,8,255,234,0,161,0,10,255,246,0,161,0,11,255,231,0,161,0,18,255,234,0,161,0,26,255,247,0,161,0,32,255,229,0,161,0,35,255,240,0,161,0,36,255,237,0,161,0,37,255,240,0,161,0,38,255,240,0,161,0,39,255,240,0,161,0,40,255,237,0,161,0,41,255,240,0,161,0,42,255,240,0,161,0,43,255,240,0,161,0,44,255,240,0,161,0,45,255,240,0,161,0,46,255,248,0,161,0,47,255,240,0,161,0,48,255,237,0,161,0,49,255,240,0,161,0,50,255,237,0,161,0,51,255,240,0,161,0,52,255,250,0,161,0,53,255,173,0,161,0,54,255,227,0,161,0,55,255,193,0,161,0,56,255,210,0,161,0,58,255,165,0,161,0,61,255,210,0,161,0,62,255,246,0,161,0,71,255,251,0,161,0,85,255,246,0,161,0,87,255,238,0,161,0,88,255,243,0,161,0,90,255,236,0,161,0,94,255,248,0,161,0,110,255,248,0,161,0,134,255,237,0,161,0,135,255,240,0,161,0,136,255,240,0,161,0,137,255,240,0,161,0,138,255,240,0,161,0,139,255,240,0,161,0,140,255,240,0,161,0,141,255,240,0,161,0,142,255,240,0,161,0,143,255,240,0,161,0,144,255,240,0,161,0,145,255,237,0,161,0,146,255,237,0,161,0,147,255,237,0,161,0,148,255,237,0,161,0,149,255,237,0,161,0,151,255,237,0,161,0,152,255,227,0,161,0,153,255,227,0,161,0,154,255,227,0,161,0,155,255,227,0,161,0,156,255,165,0,161,0,157,255,240,0,161,0,158,255,249,0,161,0,188,255,236,0,161,0,190,255,236,0,161,0,194,255,237,0,161,0,196,255,250,0,161,0,198,255,165,0,161,0,209,255,186,0,161,0,210,255,183,0,161,0,212,255,186,0,161,0,213,255,183,0,161,0,240,255,230,0,162,0,3,255,234,0,162,0,7,255,245,0,162,0,8,255,234,0,162,0,10,255,246,0,162,0,11,255,231,0,162,0,18,255,234,0,162,0,26,255,247,0,162,0,32,255,229,0,162,0,35,255,240,0,162,0,36,255,237,0,162,0,37,255,240,0,162,0,38,255,240,0,162,0,39,255,240,0,162,0,40,255,237,0,162,0,41,255,240,0,162,0,42,255,240,0,162,0,43,255,240,0,162,0,44,255,240,0,162,0,45,255,240,0,162,0,46,255,248,0,162,0,47,255,240,0,162,0,48,255,237,0,162,0,49,255,240,0,162,0,50,255,237,0,162,0,51,255,240,0,162,0,52,255,250,0,162,0,53,255,173,0,162,0,54,255,227,0,162,0,55,255,193,0,162,0,56,255,210,0,162,0,58,255,165,0,162,0,61,255,220,0,162,0,62,255,227,0,162,0,71,255,251,0,162,0,85,255,246,0,162,0,87,255,238,0,162,0,88,255,243,0,162,0,90,255,236,0,162,0,94,255,248,0,162,0,110,255,248,0,162,0,134,255,237,0,162,0,135,255,240,0,162,0,136,255,240,0,162,0,137,255,240,0,162,0,138,255,240,0,162,0,139,255,240,0,162,0,140,255,240,0,162,0,141,255,240,0,162,0,142,255,240,0,162,0,143,255,240,0,162,0,144,255,240,0,162,0,145,255,237,0,162,0,146,255,237,0,162,0,147,255,237,0,162,0,148,255,237,0,162,0,149,255,237,0,162,0,151,255,237,0,162,0,152,255,227,0,162,0,153,255,227,0,162,0,154,255,227,0,162,0,155,255,227,0,162,0,156,255,165,0,162,0,157,255,240,0,162,0,158,255,249,0,162,0,188,255,236,0,162,0,190,255,236,0,162,0,194,255,237,0,162,0,196,255,250,0,162,0,198,255,165,0,162,0,209,255,186,0,162,0,210,255,195,0,162,0,212,255,186,0,162,0,213,255,195,0,162,0,240,255,230,0,163,0,3,255,234,0,163,0,7,255,245,0,163,0,8,255,234,0,163,0,10,255,246,0,163,0,11,255,231,0,163,0,18,255,234,0,163,0,26,255,247,0,163,0,32,255,229,0,163,0,35,255,240,0,163,0,36,255,237,0,163,0,37,255,240,0,163,0,38,255,240,0,163,0,39,255,240,0,163,0,40,255,237,0,163,0,41,255,240,0,163,0,42,255,240,0,163,0,43,255,240,0,163,0,44,255,240,0,163,0,45,255,240,0,163,0,46,255,248,0,163,0,47,255,240,0,163,0,48,255,237,0,163,0,49,255,240,0,163,0,50,255,237,0,163,0,51,255,240,0,163,0,52,255,250,0,163,0,53,255,173,0,163,0,54,255,227,0,163,0,55,255,193,0,163,0,56,255,210,0,163,0,58,255,165,0,163,0,61,255,210,0,163,0,62,255,245,0,163,0,71,255,251,0,163,0,85,255,246,0,163,0,87,255,238,0,163,0,88,255,243,0,163,0,90,255,236,0,163,0,94,255,248,0,163,0,110,255,248,0,163,0,134,255,237,0,163,0,135,255,240,0,163,0,136,255,240,0,163,0,137,255,240,0,163,0,138,255,240,0,163,0,139,255,240,0,163,0,140,255,240,0,163,0,141,255,240,0,163,0,142,255,240,0,163,0,143,255,240,0,163,0,144,255,240,0,163,0,145,255,237,0,163,0,146,255,237,0,163,0,147,255,237,0,163,0,148,255,237,0,163,0,149,255,237,0,163,0,151,255,237,0,163,0,152,255,227,0,163,0,153,255,227,0,163,0,154,255,227,0,163,0,155,255,227,0,163,0,156,255,165,0,163,0,157,255,240,0,163,0,158,255,249,0,163,0,188,255,236,0,163,0,190,255,236,0,163,0,194,255,237,0,163,0,196,255,250,0,163,0,198,255,165,0,163,0,209,255,186,0,163,0,210,255,183,0,163,0,212,255,186,0,163,0,213,255,183,0,163,0,240,255,230,0,164,0,3,255,234,0,164,0,7,255,245,0,164,0,8,255,234,0,164,0,10,255,246,0,164,0,11,255,231,0,164,0,18,255,234,0,164,0,26,255,247,0,164,0,32,255,229,0,164,0,35,255,240,0,164,0,36,255,237,0,164,0,37,255,240,0,164,0,38,255,240,0,164,0,39,255,240,0,164,0,40,255,237,0,164,0,41,255,240,0,164,0,42,255,240,0,164,0,43,255,240,0,164,0,44,255,240,0,164,0,45,255,240,0,164,0,46,255,248,0,164,0,47,255,240,0,164,0,48,255,237,0,164,0,49,255,240,0,164,0,50,255,237,0,164,0,51,255,240,0,164,0,52,255,250,0,164,0,53,255,173,0,164,0,54,255,227,0,164,0,55,255,193,0,164,0,56,255,210,0,164,0,58,255,165,0,164,0,61,255,210,0,164,0,62,255,227,0,164,0,71,255,251,0,164,0,85,255,246,0,164,0,87,255,238,0,164,0,88,255,243,0,164,0,90,255,236,0,164,0,94,255,231,0,164,0,110,255,248,0,164,0,134,255,237,0,164,0,135,255,240,0,164,0,136,255,240,0,164,0,137,255,240,0,164,0,138,255,240,0,164,0,139,255,240,0,164,0,140,255,240,0,164,0,141,255,240,0,164,0,142,255,240,0,164,0,143,255,240,0,164,0,144,255,240,0,164,0,145,255,237,0,164,0,146,255,237,0,164,0,147,255,237,0,164,0,148,255,237,0,164,0,149,255,237,0,164,0,151,255,237,0,164,0,152,255,227,0,164,0,153,255,227,0,164,0,154,255,227,0,164,0,155,255,227,0,164,0,156,255,165,0,164,0,157,255,240,0,164,0,158,255,249,0,164,0,188,255,236,0,164,0,190,255,236,0,164,0,194,255,237,0,164,0,196,255,250,0,164,0,198,255,165,0,164,0,209,255,186,0,164,0,210,255,183,0,164,0,212,255,186,0,164,0,213,255,183,0,164,0,240,255,230,0,165,0,3,255,241,0,165,0,7,255,246,0,165,0,8,255,241,0,165,0,10,255,230,0,165,0,11,255,238,0,165,0,18,255,235,0,165,0,19,255,245,0,165,0,24,255,230,0,165,0,32,255,223,0,165,0,34,255,251,0,165,0,35,255,241,0,165,0,36,255,250,0,165,0,37,255,241,0,165,0,38,255,241,0,165,0,39,255,241,0,165,0,40,255,250,0,165,0,41,255,241,0,165,0,42,255,241,0,165,0,43,255,241,0,165,0,44,255,241,0,165,0,45,255,241,0,165,0,46,255,243,0,165,0,47,255,241,0,165,0,48,255,250,0,165,0,49,255,241,0,165,0,50,255,250,0,165,0,51,255,241,0,165,0,52,255,241,0,165,0,53,255,187,0,165,0,54,255,240,0,165,0,55,255,209,0,165,0,56,255,213,0,165,0,57,255,243,0,165,0,58,255,174,0,165,0,59,255,243,0,165,0,61,255,220,0,165,0,62,255,220,0,165,0,87,255,252,0,165,0,89,255,251,0,165,0,90,255,251,0,165,0,94,255,227,0,165,0,127,255,251,0,165,0,128,255,251,0,165,0,129,255,251,0,165,0,130,255,251,0,165,0,131,255,251,0,165,0,132,255,251,0,165,0,134,255,250,0,165,0,135,255,241,0,165,0,136,255,241,0,165,0,137,255,241,0,165,0,138,255,241,0,165,0,139,255,241,0,165,0,140,255,241,0,165,0,141,255,241,0,165,0,142,255,241,0,165,0,143,255,241,0,165,0,144,255,241,0,165,0,145,255,250,0,165,0,146,255,250,0,165,0,147,255,250,0,165,0,148,255,250,0,165,0,149,255,250,0,165,0,151,255,250,0,165,0,152,255,240,0,165,0,153,255,240,0,165,0,154,255,240,0,165,0,155,255,240,0,165,0,156,255,174,0,165,0,157,255,241,0,165,0,188,255,251,0,165,0,190,255,251,0,165,0,194,255,250,0,165,0,196,255,241,0,165,0,198,255,174,0,165,0,199,255,243,0,165,0,209,255,189,0,165,0,210,255,186,0,165,0,212,255,189,0,165,0,213,255,186,0,165,0,240,255,237,0,166,0,7,255,240,0,166,0,10,255,244,0,166,0,14,255,219,0,166,0,21,255,231,0,166,0,24,255,245,0,166,0,32,255,228,0,166,0,35,255,247,0,166,0,36,255,244,0,166,0,37,255,247,0,166,0,38,255,247,0,166,0,39,255,247,0,166,0,40,255,244,0,166,0,41,255,247,0,166,0,42,255,247,0,166,0,43,255,247,0,166,0,44,255,247,0,166,0,45,255,247,0,166,0,46,255,251,0,166,0,47,255,247,0,166,0,48,255,244,0,166,0,49,255,247,0,166,0,50,255,244,0,166,0,51,255,247,0,166,0,52,255,244,0,166,0,53,255,190,0,166,0,54,255,243,0,166,0,55,255,236,0,166,0,56,255,241,0,166,0,58,255,218,0,166,0,61,255,240,0,166,0,62,255,232,0,166,0,68,255,249,0,166,0,69,255,249,0,166,0,70,255,249,0,166,0,80,255,249,0,166,0,82,255,249,0,166,0,94,255,239,0,166,0,107,255,243,0,166,0,134,255,244,0,166,0,135,255,247,0,166,0,136,255,247,0,166,0,137,255,247,0,166,0,138,255,247,0,166,0,139,255,247,0,166,0,140,255,247,0,166,0,141,255,247,0,166,0,142,255,247,0,166,0,143,255,247,0,166,0,144,255,247,0,166,0,145,255,244,0,166,0,146,255,244,0,166,0,147,255,244,0,166,0,148,255,244,0,166,0,149,255,244,0,166,0,151,255,244,0,166,0,152,255,243,0,166,0,153,255,243,0,166,0,154,255,243,0,166,0,155,255,243,0,166,0,156,255,218,0,166,0,157,255,247,0,166,0,166,255,249,0,166,0,167,255,249,0,166,0,168,255,249,0,166,0,169,255,249,0,166,0,170,255,249,0,166,0,175,255,251,0,166,0,177,255,249,0,166,0,178,255,249,0,166,0,179,255,249,0,166,0,180,255,249,0,166,0,181,255,249,0,166,0,183,255,249,0,166,0,194,255,244,0,166,0,195,255,249,0,166,0,196,255,244,0,166,0,198,255,218,0,166,0,207,255,219,0,166,0,208,255,219,0,166,0,209,255,216,0,166,0,210,255,213,0,166,0,212,255,216,0,166,0,213,255,213,0,166,0,220,255,243,0,166,0,240,255,245,0,167,0,3,255,241,0,167,0,7,255,246,0,167,0,8,255,241,0,167,0,10,255,230,0,167,0,11,255,238,0,167,0,18,255,235,0,167,0,19,255,245,0,167,0,24,255,230,0,167,0,32,255,223,0,167,0,34,255,251,0,167,0,35,255,241,0,167,0,36,255,250,0,167,0,37,255,241,0,167,0,38,255,241,0,167,0,39,255,241,0,167,0,40,255,250,0,167,0,41,255,241,0,167,0,42,255,241,0,167,0,43,255,241,0,167,0,44,255,241,0,167,0,45,255,241,0,167,0,46,255,243,0,167,0,47,255,241,0,167,0,48,255,250,0,167,0,49,255,241,0,167,0,50,255,250,0,167,0,51,255,241,0,167,0,52,255,241,0,167,0,53,255,187,0,167,0,54,255,240,0,167,0,55,255,209,0,167,0,56,255,213,0,167,0,57,255,243,0,167,0,58,255,174,0,167,0,59,255,243,0,167,0,61,255,220,0,167,0,62,255,220,0,167,0,87,255,252,0,167,0,89,255,251,0,167,0,90,255,251,0,167,0,94,255,227,0,167,0,127,255,251,0,167,0,128,255,251,0,167,0,129,255,251,0,167,0,130,255,251,0,167,0,131,255,251,0,167,0,132,255,251,0,167,0,134,255,250,0,167,0,135,255,241,0,167,0,136,255,241,0,167,0,137,255,241,0,167,0,138,255,241,0,167,0,139,255,241,0,167,0,140,255,241,0,167,0,141,255,241,0,167,0,142,255,241,0,167,0,143,255,241,0,167,0,144,255,241,0,167,0,145,255,250,0,167,0,146,255,250,0,167,0,147,255,250,0,167,0,148,255,250,0,167,0,149,255,250,0,167,0,151,255,250,0,167,0,152,255,240,0,167,0,153,255,240,0,167,0,154,255,240,0,167,0,155,255,240,0,167,0,156,255,174,0,167,0,157,255,241,0,167,0,188,255,251,0,167,0,190,255,251,0,167,0,194,255,250,0,167,0,196,255,241,0,167,0,198,255,174,0,167,0,199,255,243,0,167,0,209,255,189,0,167,0,210,255,186,0,167,0,212,255,189,0,167,0,213,255,186,0,167,0,240,255,237,0,168,0,3,255,241,0,168,0,7,255,246,0,168,0,8,255,241,0,168,0,10,255,230,0,168,0,11,255,238,0,168,0,18,255,235,0,168,0,19,255,245,0,168,0,24,255,230,0,168,0,32,255,223,0,168,0,34,255,251,0,168,0,35,255,241,0,168,0,36,255,250,0,168,0,37,255,241,0,168,0,38,255,241,0,168,0,39,255,241,0,168,0,40,255,250,0,168,0,41,255,241,0,168,0,42,255,241,0,168,0,43,255,241,0,168,0,44,255,241,0,168,0,45,255,241,0,168,0,46,255,243,0,168,0,47,255,241,0,168,0,48,255,250,0,168,0,49,255,241,0,168,0,50,255,250,0,168,0,51,255,241,0,168,0,52,255,241,0,168,0,53,255,187,0,168,0,54,255,240,0,168,0,55,255,209,0,168,0,56,255,213,0,168,0,57,255,243,0,168,0,58,255,174,0,168,0,59,255,243,0,168,0,61,255,220,0,168,0,62,255,220,0,168,0,87,255,252,0,168,0,89,255,251,0,168,0,90,255,251,0,168,0,94,255,227,0,168,0,127,255,251,0,168,0,128,255,251,0,168,0,129,255,251,0,168,0,130,255,251,0,168,0,131,255,251,0,168,0,132,255,251,0,168,0,134,255,250,0,168,0,135,255,241,0,168,0,136,255,241,0,168,0,137,255,241,0,168,0,138,255,241,0,168,0,139,255,241,0,168,0,140,255,241,0,168,0,141,255,241,0,168,0,142,255,241,0,168,0,143,255,241,0,168,0,144,255,241,0,168,0,145,255,250,0,168,0,146,255,250,0,168,0,147,255,250,0,168,0,148,255,250,0,168,0,149,255,250,0,168,0,151,255,250,0,168,0,152,255,240,0,168,0,153,255,240,0,168,0,154,255,240,0,168,0,155,255,240,0,168,0,156,255,174,0,168,0,157,255,241,0,168,0,188,255,251,0,168,0,190,255,251,0,168,0,194,255,250,0,168,0,196,255,241,0,168,0,198,255,174,0,168,0,199,255,243,0,168,0,209,255,189,0,168,0,210,255,186,0,168,0,212,255,189,0,168,0,213,255,186,0,168,0,240,255,237,0,169,0,3,255,241,0,169,0,7,255,246,0,169,0,8,255,241,0,169,0,10,255,230,0,169,0,11,255,238,0,169,0,18,255,235,0,169,0,19,255,245,0,169,0,24,255,230,0,169,0,32,255,223,0,169,0,34,255,251,0,169,0,35,255,241,0,169,0,36,255,250,0,169,0,37,255,241,0,169,0,38,255,241,0,169,0,39,255,241,0,169,0,40,255,250,0,169,0,41,255,241,0,169,0,42,255,241,0,169,0,43,255,241,0,169,0,44,255,241,0,169,0,45,255,241,0,169,0,46,255,243,0,169,0,47,255,241,0,169,0,48,255,250,0,169,0,49,255,241,0,169,0,50,255,250,0,169,0,51,255,241,0,169,0,52,255,241,0,169,0,53,255,187,0,169,0,54,255,240,0,169,0,55,255,209,0,169,0,56,255,213,0,169,0,57,255,243,0,169,0,58,255,174,0,169,0,59,255,243,0,169,0,61,255,220,0,169,0,62,255,220,0,169,0,87,255,252,0,169,0,89,255,251,0,169,0,90,255,251,0,169,0,94,255,227,0,169,0,127,255,251,0,169,0,128,255,251,0,169,0,129,255,251,0,169,0,130,255,251,0,169,0,131,255,251,0,169,0,132,255,251,0,169,0,134,255,250,0,169,0,135,255,241,0,169,0,136,255,241,0,169,0,137,255,241,0,169,0,138,255,241,0,169,0,139,255,241,0,169,0,140,255,241,0,169,0,141,255,241,0,169,0,142,255,241,0,169,0,143,255,241,0,169,0,144,255,241,0,169,0,145,255,250,0,169,0,146,255,250,0,169,0,147,255,250,0,169,0,148,255,250,0,169,0,149,255,250,0,169,0,151,255,250,0,169,0,152,255,240,0,169,0,153,255,240,0,169,0,154,255,240,0,169,0,155,255,240,0,169,0,156,255,174,0,169,0,157,255,241,0,169,0,188,255,251,0,169,0,190,255,251,0,169,0,194,255,250,0,169,0,196,255,241,0,169,0,198,255,174,0,169,0,199,255,243,0,169,0,209,255,189,0,169,0,210,255,186,0,169,0,212,255,189,0,169,0,213,255,186,0,169,0,240,255,237,0,170,0,3,255,241,0,170,0,7,255,246,0,170,0,8,255,241,0,170,0,10,255,230,0,170,0,11,255,238,0,170,0,18,255,235,0,170,0,19,255,245,0,170,0,24,255,230,0,170,0,32,255,223,0,170,0,34,255,251,0,170,0,35,255,241,0,170,0,36,255,250,0,170,0,37,255,241,0,170,0,38,255,241,0,170,0,39,255,241,0,170,0,40,255,250,0,170,0,41,255,241,0,170,0,42,255,241,0,170,0,43,255,241,0,170,0,44,255,241,0,170,0,45,255,241,0,170,0,46,255,243,0,170,0,47,255,241,0,170,0,48,255,250,0,170,0,49,255,241,0,170,0,50,255,250,0,170,0,51,255,241,0,170,0,52,255,241,0,170,0,53,255,187,0,170,0,54,255,240,0,170,0,55,255,209,0,170,0,56,255,213,0,170,0,57,255,243,0,170,0,58,255,174,0,170,0,59,255,243,0,170,0,61,255,220,0,170,0,62,255,220,0,170,0,87,255,252,0,170,0,89,255,251,0,170,0,90,255,251,0,170,0,94,255,227,0,170,0,127,255,251,0,170,0,128,255,251,0,170,0,129,255,251,0,170,0,130,255,251,0,170,0,131,255,251,0,170,0,132,255,251,0,170,0,134,255,250,0,170,0,135,255,241,0,170,0,136,255,241,0,170,0,137,255,241,0,170,0,138,255,241,0,170,0,139,255,241,0,170,0,140,255,241,0,170,0,141,255,241,0,170,0,142,255,241,0,170,0,143,255,241,0,170,0,144,255,241,0,170,0,145,255,250,0,170,0,146,255,250,0,170,0,147,255,250,0,170,0,148,255,250,0,170,0,149,255,250,0,170,0,151,255,250,0,170,0,152,255,240,0,170,0,153,255,240,0,170,0,154,255,240,0,170,0,155,255,240,0,170,0,156,255,174,0,170,0,157,255,241,0,170,0,188,255,251,0,170,0,190,255,251,0,170,0,194,255,250,0,170,0,196,255,241,0,170,0,198,255,174,0,170,0,199,255,243,0,170,0,209,255,189,0,170,0,210,255,186,0,170,0,212,255,189,0,170,0,213,255,186,0,170,0,240,255,237,0,171,0,7,255,244,0,171,0,11,0,30,0,171,0,34,255,248,0,171,0,35,255,242,0,171,0,36,255,244,0,171,0,37,255,242,0,171,0,38,255,242,0,171,0,39,255,242,0,171,0,40,255,244,0,171,0,41,255,242,0,171,0,42,255,242,0,171,0,43,255,242,0,171,0,44,255,242,0,171,0,45,255,242,0,171,0,46,255,241,0,171,0,47,255,242,0,171,0,48,255,244,0,171,0,49,255,242,0,171,0,50,255,244,0,171,0,51,255,242,0,171,0,52,255,244,0,171,0,53,255,242,0,171,0,54,255,238,0,171,0,55,255,247,0,171,0,56,255,246,0,171,0,58,255,247,0,171,0,59,255,245,0,171,0,127,255,248,0,171,0,128,255,248,0,171,0,129,255,248,0,171,0,130,255,248,0,171,0,131,255,248,0,171,0,132,255,248,0,171,0,134,255,244,0,171,0,135,255,242,0,171,0,136,255,242,0,171,0,137,255,242,0,171,0,138,255,242,0,171,0,139,255,242,0,171,0,140,255,242,0,171,0,141,255,242,0,171,0,142,255,242,0,171,0,143,255,242,0,171,0,144,255,242,0,171,0,145,255,244,0,171,0,146,255,244,0,171,0,147,255,244,0,171,0,148,255,244,0,171,0,149,255,244,0,171,0,151,255,244,0,171,0,152,255,238,0,171,0,153,255,238,0,171,0,154,255,238,0,171,0,155,255,238,0,171,0,156,255,247,0,171,0,157,255,242,0,171,0,194,255,244,0,171,0,196,255,244,0,171,0,198,255,247,0,171,0,199,255,245,0,171,0,240,0,28,0,172,0,7,255,244,0,172,0,11,0,18,0,172,0,34,255,248,0,172,0,35,255,242,0,172,0,36,255,244,0,172,0,37,255,242,0,172,0,38,255,242,0,172,0,39,255,242,0,172,0,40,255,244,0,172,0,41,255,242,0,172,0,42,255,242,0,172,0,43,255,242,0,172,0,44,255,242,0,172,0,45,255,242,0,172,0,46,255,241,0,172,0,47,255,242,0,172,0,48,255,244,0,172,0,49,255,242,0,172,0,50,255,244,0,172,0,51,255,242,0,172,0,52,255,244,0,172,0,53,255,242,0,172,0,54,255,238,0,172,0,55,255,247,0,172,0,56,255,246,0,172,0,58,255,247,0,172,0,59,255,245,0,172,0,62,0,9,0,172,0,94,0,14,0,172,0,127,255,248,0,172,0,128,255,248,0,172,0,129,255,248,0,172,0,130,255,248,0,172,0,131,255,248,0,172,0,132,255,248,0,172,0,134,255,244,0,172,0,135,255,242,0,172,0,136,255,242,0,172,0,137,255,242,0,172,0,138,255,242,0,172,0,139,255,242,0,172,0,140,255,242,0,172,0,141,255,242,0,172,0,142,255,242,0,172,0,143,255,242,0,172,0,144,255,242,0,172,0,145,255,244,0,172,0,146,255,244,0,172,0,147,255,244,0,172,0,148,255,244,0,172,0,149,255,244,0,172,0,151,255,244,0,172,0,152,255,238,0,172,0,153,255,238,0,172,0,154,255,238,0,172,0,155,255,238,0,172,0,156,255,247,0,172,0,157,255,242,0,172,0,194,255,244,0,172,0,196,255,244,0,172,0,198,255,247,0,172,0,199,255,245,0,172,0,240,0,18,0,173,0,3,0,29,0,173,0,7,255,244,0,173,0,8,0,29,0,173,0,11,0,76,0,173,0,32,0,39,0,173,0,34,255,248,0,173,0,35,255,242,0,173,0,36,255,244,0,173,0,37,255,242,0,173,0,38,255,242,0,173,0,39,255,242,0,173,0,40,255,244,0,173,0,41,255,242,0,173,0,42,255,242,0,173,0,43,255,242,0,173,0,44,255,242,0,173,0,45,255,242,0,173,0,46,255,241,0,173,0,47,255,242,0,173,0,48,255,244,0,173,0,49,255,242,0,173,0,50,255,244,0,173,0,51,255,242,0,173,0,52,255,244,0,173,0,53,255,242,0,173,0,54,255,238,0,173,0,55,255,247,0,173,0,56,255,246,0,173,0,58,255,247,0,173,0,59,255,245,0,173,0,61,0,13,0,173,0,62,0,44,0,173,0,94,0,33,0,173,0,127,255,248,0,173,0,128,255,248,0,173,0,129,255,248,0,173,0,130,255,248,0,173,0,131,255,248,0,173,0,132,255,248,0,173,0,134,255,244,0,173,0,135,255,242,0,173,0,136,255,242,0,173,0,137,255,242,0,173,0,138,255,242,0,173,0,139,255,242,0,173,0,140,255,242,0,173,0,141,255,242,0,173,0,142,255,242,0,173,0,143,255,242,0,173,0,144,255,242,0,173,0,145,255,244,0,173,0,146,255,244,0,173,0,147,255,244,0,173,0,148,255,244,0,173,0,149,255,244,0,173,0,151,255,244,0,173,0,152,255,238,0,173,0,153,255,238,0,173,0,154,255,238,0,173,0,155,255,238,0,173,0,156,255,247,0,173,0,157,255,242,0,173,0,194,255,244,0,173,0,196,255,244,0,173,0,198,255,247,0,173,0,199,255,245,0,173,0,209,0,37,0,173,0,210,0,24,0,173,0,212,0,37,0,173,0,213,0,24,0,173,0,240,0,81,0,174,0,7,255,244,0,174,0,11,0,43,0,174,0,32,0,27,0,174,0,34,255,248,0,174,0,35,255,242,0,174,0,36,255,244,0,174,0,37,255,242,0,174,0,38,255,242,0,174,0,39,255,242,0,174,0,40,255,244,0,174,0,41,255,242,0,174,0,42,255,242,0,174,0,43,255,242,0,174,0,44,255,242,0,174,0,45,255,242,0,174,0,46,255,241,0,174,0,47,255,242,0,174,0,48,255,244,0,174,0,49,255,242,0,174,0,50,255,244,0,174,0,51,255,242,0,174,0,52,255,244,0,174,0,53,255,242,0,174,0,54,255,238,0,174,0,55,255,247,0,174,0,56,255,246,0,174,0,58,255,247,0,174,0,59,255,245,0,174,0,61,0,14,0,174,0,62,0,39,0,174,0,94,0,44,0,174,0,127,255,248,0,174,0,128,255,248,0,174,0,129,255,248,0,174,0,130,255,248,0,174,0,131,255,248,0,174,0,132,255,248,0,174,0,134,255,244,0,174,0,135,255,242,0,174,0,136,255,242,0,174,0,137,255,242,0,174,0,138,255,242,0,174,0,139,255,242,0,174,0,140,255,242,0,174,0,141,255,242,0,174,0,142,255,242,0,174,0,143,255,242,0,174,0,144,255,242,0,174,0,145,255,244,0,174,0,146,255,244,0,174,0,147,255,244,0,174,0,148,255,244,0,174,0,149,255,244,0,174,0,151,255,244,0,174,0,152,255,238,0,174,0,153,255,238,0,174,0,154,255,238,0,174,0,155,255,238,0,174,0,156,255,247,0,174,0,157,255,242,0,174,0,194,255,244,0,174,0,196,255,244,0,174,0,198,255,247,0,174,0,199,255,245,0,174,0,240,0,48,0,175,0,3,255,245,0,175,0,7,255,247,0,175,0,8,255,245,0,175,0,10,255,232,0,175,0,11,255,240,0,175,0,13,255,247,0,175,0,15,255,247,0,175,0,32,255,242,0,175,0,61,255,246,0,175,0,62,255,240,0,175,0,89,255,248,0,175,0,94,255,243,0,175,0,209,255,236,0,175,0,210,255,237,0,175,0,211,255,247,0,175,0,212,255,236,0,175,0,213,255,237,0,175,0,214,255,247,0,175,0,218,255,247,0,175,0,240,255,241,0,176,0,2,255,248,0,176,0,3,255,238,0,176,0,7,255,245,0,176,0,8,255,238,0,176,0,10,255,232,0,176,0,11,255,235,0,176,0,18,255,231,0,176,0,24,255,233,0,176,0,32,255,224,0,176,0,34,255,250,0,176,0,35,255,238,0,176,0,36,255,243,0,176,0,37,255,238,0,176,0,38,255,238,0,176,0,39,255,238,0,176,0,40,255,243,0,176,0,41,255,238,0,176,0,42,255,238,0,176,0,43,255,238,0,176,0,44,255,238,0,176,0,45,255,238,0,176,0,46,255,241,0,176,0,47,255,238,0,176,0,48,255,243,0,176,0,49,255,238,0,176,0,50,255,243,0,176,0,51,255,238,0,176,0,52,255,241,0,176,0,53,255,162,0,176,0,54,255,231,0,176,0,55,255,198,0,176,0,56,255,214,0,176,0,57,255,249,0,176,0,58,255,163,0,176,0,59,255,245,0,176,0,61,255,214,0,176,0,62,255,216,0,176,0,71,255,251,0,176,0,85,255,248,0,176,0,87,255,243,0,176,0,88,255,248,0,176,0,90,255,242,0,176,0,94,255,225,0,176,0,127,255,250,0,176,0,128,255,250,0,176,0,129,255,250,0,176,0,130,255,250,0,176,0,131,255,250,0,176,0,132,255,250,0,176,0,134,255,243,0,176,0,135,255,238,0,176,0,136,255,238,0,176,0,137,255,238,0,176,0,138,255,238,0,176,0,139,255,238,0,176,0,140,255,238,0,176,0,141,255,238,0,176,0,142,255,238,0,176,0,143,255,238,0,176,0,144,255,238,0,176,0,145,255,243,0,176,0,146,255,243,0,176,0,147,255,243,0,176,0,148,255,243,0,176,0,149,255,243,0,176,0,151,255,243,0,176,0,152,255,231,0,176,0,153,255,231,0,176,0,154,255,231,0,176,0,155,255,231,0,176,0,156,255,163,0,176,0,157,255,238,0,176,0,158,255,248,0,176,0,188,255,242,0,176,0,190,255,242,0,176,0,194,255,243,0,176,0,196,255,241,0,176,0,198,255,163,0,176,0,199,255,245,0,176,0,209,255,187,0,176,0,210,255,184,0,176,0,212,255,187,0,176,0,213,255,184,0,176,0,240,255,235,0,177,0,3,255,236,0,177,0,7,255,246,0,177,0,8,255,236,0,177,0,10,255,224,0,177,0,11,255,234,0,177,0,18,255,230,0,177,0,19,255,229,0,177,0,24,255,223,0,177,0,32,255,222,0,177,0,34,255,240,0,177,0,35,255,237,0,177,0,36,255,246,0,177,0,37,255,237,0,177,0,38,255,237,0,177,0,39,255,237,0,177,0,40,255,246,0,177,0,41,255,237,0,177,0,42,255,237,0,177,0,43,255,237,0,177,0,44,255,237,0,177,0,45,255,237,0,177,0,46,255,239,0,177,0,47,255,237,0,177,0,48,255,246,0,177,0,49,255,237,0,177,0,50,255,246,0,177,0,51,255,237,0,177,0,52,255,238,0,177,0,53,255,173,0,177,0,54,255,238,0,177,0,55,255,192,0,177,0,56,255,212,0,177,0,57,255,218,0,177,0,58,255,167,0,177,0,59,255,227,0,177,0,61,255,214,0,177,0,62,255,213,0,177,0,71,255,251,0,177,0,85,255,249,0,177,0,87,255,247,0,177,0,88,255,251,0,177,0,89,255,237,0,177,0,90,255,245,0,177,0,91,255,246,0,177,0,94,255,222,0,177,0,122,255,247,0,177,0,127,255,240,0,177,0,128,255,240,0,177,0,129,255,240,0,177,0,130,255,240,0,177,0,131,255,240,0,177,0,132,255,240,0,177,0,134,255,246,0,177,0,135,255,237,0,177,0,136,255,237,0,177,0,137,255,237,0,177,0,138,255,237,0,177,0,139,255,237,0,177,0,140,255,237,0,177,0,141,255,237,0,177,0,142,255,237,0,177,0,143,255,237,0,177,0,144,255,237,0,177,0,145,255,246,0,177,0,146,255,246,0,177,0,147,255,246,0,177,0,148,255,246,0,177,0,149,255,246,0,177,0,151,255,246,0,177,0,152,255,238,0,177,0,153,255,238,0,177,0,154,255,238,0,177,0,155,255,238,0,177,0,156,255,167,0,177,0,157,255,237,0,177,0,158,255,248,0,177,0,188,255,245,0,177,0,190,255,245,0,177,0,194,255,246,0,177,0,196,255,238,0,177,0,198,255,167,0,177,0,199,255,227,0,177,0,200,255,246,0,177,0,209,255,182,0,177,0,210,255,179,0,177,0,212,255,182,0,177,0,213,255,179,0,177,0,221,255,247,0,177,0,240,255,236,0,178,0,3,255,236,0,178,0,7,255,246,0,178,0,8,255,236,0,178,0,10,255,224,0,178,0,11,255,234,0,178,0,18,255,230,0,178,0,19,255,229,0,178,0,24,255,223,0,178,0,32,255,222,0,178,0,34,255,240,0,178,0,35,255,237,0,178,0,36,255,246,0,178,0,37,255,237,0,178,0,38,255,237,0,178,0,39,255,237,0,178,0,40,255,246,0,178,0,41,255,237,0,178,0,42,255,237,0,178,0,43,255,237,0,178,0,44,255,237,0,178,0,45,255,237,0,178,0,46,255,239,0,178,0,47,255,237,0,178,0,48,255,246,0,178,0,49,255,237,0,178,0,50,255,246,0,178,0,51,255,237,0,178,0,52,255,238,0,178,0,53,255,173,0,178,0,54,255,238,0,178,0,55,255,192,0,178,0,56,255,212,0,178,0,57,255,218,0,178,0,58,255,167,0,178,0,59,255,227,0,178,0,61,255,214,0,178,0,62,255,213,0,178,0,71,255,251,0,178,0,85,255,249,0,178,0,87,255,247,0,178,0,88,255,251,0,178,0,89,255,237,0,178,0,90,255,245,0,178,0,91,255,246,0,178,0,94,255,222,0,178,0,122,255,247,0,178,0,127,255,240,0,178,0,128,255,240,0,178,0,129,255,240,0,178,0,130,255,240,0,178,0,131,255,240,0,178,0,132,255,240,0,178,0,134,255,246,0,178,0,135,255,237,0,178,0,136,255,237,0,178,0,137,255,237,0,178,0,138,255,237,0,178,0,139,255,237,0,178,0,140,255,237,0,178,0,141,255,237,0,178,0,142,255,237,0,178,0,143,255,237,0,178,0,144,255,237,0,178,0,145,255,246,0,178,0,146,255,246,0,178,0,147,255,246,0,178,0,148,255,246,0,178,0,149,255,246,0,178,0,151,255,246,0,178,0,152,255,238,0,178,0,153,255,238,0,178,0,154,255,238,0,178,0,155,255,238,0,178,0,156,255,167,0,178,0,157,255,237,0,178,0,158,255,248,0,178,0,188,255,245,0,178,0,190,255,245,0,178,0,194,255,246,0,178,0,196,255,238,0,178,0,198,255,167,0,178,0,199,255,227,0,178,0,200,255,246,0,178,0,209,255,182,0,178,0,210,255,179,0,178,0,212,255,182,0,178,0,213,255,179,0,178,0,221,255,247,0,178,0,240,255,236,0,179,0,3,255,236,0,179,0,7,255,246,0,179,0,8,255,236,0,179,0,10,255,224,0,179,0,11,255,234,0,179,0,18,255,230,0,179,0,19,255,229,0,179,0,24,255,223,0,179,0,32,255,222,0,179,0,34,255,240,0,179,0,35,255,237,0,179,0,36,255,246,0,179,0,37,255,237,0,179,0,38,255,237,0,179,0,39,255,237,0,179,0,40,255,246,0,179,0,41,255,237,0,179,0,42,255,237,0,179,0,43,255,237,0,179,0,44,255,237,0,179,0,45,255,237,0,179,0,46,255,239,0,179,0,47,255,237,0,179,0,48,255,246,0,179,0,49,255,237,0,179,0,50,255,246,0,179,0,51,255,237,0,179,0,52,255,238,0,179,0,53,255,173,0,179,0,54,255,238,0,179,0,55,255,192,0,179,0,56,255,212,0,179,0,57,255,218,0,179,0,58,255,167,0,179,0,59,255,227,0,179,0,61,255,214,0,179,0,62,255,213,0,179,0,71,255,251,0,179,0,85,255,249,0,179,0,87,255,247,0,179,0,88,255,251,0,179,0,89,255,237,0,179,0,90,255,245,0,179,0,91,255,246,0,179,0,94,255,222,0,179,0,122,255,247,0,179,0,127,255,240,0,179,0,128,255,240,0,179,0,129,255,240,0,179,0,130,255,240,0,179,0,131,255,240,0,179,0,132,255,240,0,179,0,134,255,246,0,179,0,135,255,237,0,179,0,136,255,237,0,179,0,137,255,237,0,179,0,138,255,237,0,179,0,139,255,237,0,179,0,140,255,237,0,179,0,141,255,237,0,179,0,142,255,237,0,179,0,143,255,237,0,179,0,144,255,237,0,179,0,145,255,246,0,179,0,146,255,246,0,179,0,147,255,246,0,179,0,148,255,246,0,179,0,149,255,246,0,179,0,151,255,246,0,179,0,152,255,238,0,179,0,153,255,238,0,179,0,154,255,238,0,179,0,155,255,238,0,179,0,156,255,167,0,179,0,157,255,237,0,179,0,158,255,248,0,179,0,188,255,245,0,179,0,190,255,245,0,179,0,194,255,246,0,179,0,196,255,238,0,179,0,198,255,167,0,179,0,199,255,227,0,179,0,200,255,246,0,179,0,209,255,182,0,179,0,210,255,179,0,179,0,212,255,182,0,179,0,213,255,179,0,179,0,221,255,247,0,179,0,240,255,236,0,180,0,3,255,236,0,180,0,7,255,246,0,180,0,8,255,236,0,180,0,10,255,224,0,180,0,11,255,234,0,180,0,18,255,230,0,180,0,19,255,229,0,180,0,24,255,223,0,180,0,32,255,222,0,180,0,34,255,240,0,180,0,35,255,237,0,180,0,36,255,246,0,180,0,37,255,237,0,180,0,38,255,237,0,180,0,39,255,237,0,180,0,40,255,246,0,180,0,41,255,237,0,180,0,42,255,237,0,180,0,43,255,237,0,180,0,44,255,237,0,180,0,45,255,237,0,180,0,46,255,239,0,180,0,47,255,237,0,180,0,48,255,246,0,180,0,49,255,237,0,180,0,50,255,246,0,180,0,51,255,237,0,180,0,52,255,238,0,180,0,53,255,173,0,180,0,54,255,238,0,180,0,55,255,192,0,180,0,56,255,212,0,180,0,57,255,218,0,180,0,58,255,167,0,180,0,59,255,227,0,180,0,61,255,214,0,180,0,62,255,213,0,180,0,71,255,251,0,180,0,85,255,249,0,180,0,87,255,247,0,180,0,88,255,251,0,180,0,89,255,237,0,180,0,90,255,245,0,180,0,91,255,246,0,180,0,94,255,222,0,180,0,122,255,247,0,180,0,127,255,240,0,180,0,128,255,240,0,180,0,129,255,240,0,180,0,130,255,240,0,180,0,131,255,240,0,180,0,132,255,240,0,180,0,134,255,246,0,180,0,135,255,237,0,180,0,136,255,237,0,180,0,137,255,237,0,180,0,138,255,237,0,180,0,139,255,237,0,180,0,140,255,237,0,180,0,141,255,237,0,180,0,142,255,237,0,180,0,143,255,237,0,180,0,144,255,237,0,180,0,145,255,246,0,180,0,146,255,246,0,180,0,147,255,246,0,180,0,148,255,246,0,180,0,149,255,246,0,180,0,151,255,246,0,180,0,152,255,238,0,180,0,153,255,238,0,180,0,154,255,238,0,180,0,155,255,238,0,180,0,156,255,167,0,180,0,157,255,237,0,180,0,158,255,248,0,180,0,188,255,245,0,180,0,190,255,245,0,180,0,194,255,246,0,180,0,196,255,238,0,180,0,198,255,167,0,180,0,199,255,227,0,180,0,200,255,246,0,180,0,209,255,182,0,180,0,210,255,179,0,180,0,212,255,182,0,180,0,213,255,179,0,180,0,221,255,247,0,180,0,240,255,236,0,181,0,3,255,236,0,181,0,7,255,246,0,181,0,8,255,236,0,181,0,10,255,224,0,181,0,11,255,234,0,181,0,18,255,230,0,181,0,19,255,229,0,181,0,24,255,223,0,181,0,32,255,222,0,181,0,34,255,240,0,181,0,35,255,237,0,181,0,36,255,246,0,181,0,37,255,237,0,181,0,38,255,237,0,181,0,39,255,237,0,181,0,40,255,246,0,181,0,41,255,237,0,181,0,42,255,237,0,181,0,43,255,237,0,181,0,44,255,237,0,181,0,45,255,237,0,181,0,46,255,239,0,181,0,47,255,237,0,181,0,48,255,246,0,181,0,49,255,237,0,181,0,50,255,246,0,181,0,51,255,237,0,181,0,52,255,238,0,181,0,53,255,173,0,181,0,54,255,238,0,181,0,55,255,192,0,181,0,56,255,212,0,181,0,57,255,218,0,181,0,58,255,167,0,181,0,59,255,227,0,181,0,61,255,214,0,181,0,62,255,213,0,181,0,71,255,251,0,181,0,85,255,249,0,181,0,87,255,247,0,181,0,88,255,251,0,181,0,89,255,237,0,181,0,90,255,245,0,181,0,91,255,246,0,181,0,94,255,222,0,181,0,122,255,247,0,181,0,127,255,240,0,181,0,128,255,240,0,181,0,129,255,240,0,181,0,130,255,240,0,181,0,131,255,240,0,181,0,132,255,240,0,181,0,134,255,246,0,181,0,135,255,237,0,181,0,136,255,237,0,181,0,137,255,237,0,181,0,138,255,237,0,181,0,139,255,237,0,181,0,140,255,237,0,181,0,141,255,237,0,181,0,142,255,237,0,181,0,143,255,237,0,181,0,144,255,237,0,181,0,145,255,246,0,181,0,146,255,246,0,181,0,147,255,246,0,181,0,148,255,246,0,181,0,149,255,246,0,181,0,151,255,246,0,181,0,152,255,238,0,181,0,153,255,238,0,181,0,154,255,238,0,181,0,155,255,238,0,181,0,156,255,167,0,181,0,157,255,237,0,181,0,158,255,248,0,181,0,188,255,245,0,181,0,190,255,245,0,181,0,194,255,246,0,181,0,196,255,238,0,181,0,198,255,167,0,181,0,199,255,227,0,181,0,200,255,246,0,181,0,209,255,182,0,181,0,210,255,179,0,181,0,212,255,182,0,181,0,213,255,179,0,181,0,221,255,247,0,181,0,240,255,236,0,183,0,3,255,236,0,183,0,7,255,246,0,183,0,8,255,236,0,183,0,10,255,224,0,183,0,11,255,234,0,183,0,18,255,230,0,183,0,19,255,229,0,183,0,24,255,223,0,183,0,32,255,222,0,183,0,34,255,240,0,183,0,35,255,237,0,183,0,36,255,246,0,183,0,37,255,237,0,183,0,38,255,237,0,183,0,39,255,237,0,183,0,40,255,246,0,183,0,41,255,237,0,183,0,42,255,237,0,183,0,43,255,237,0,183,0,44,255,237,0,183,0,45,255,237,0,183,0,46,255,239,0,183,0,47,255,237,0,183,0,48,255,246,0,183,0,49,255,237,0,183,0,50,255,246,0,183,0,51,255,237,0,183,0,52,255,238,0,183,0,53,255,173,0,183,0,54,255,238,0,183,0,55,255,192,0,183,0,56,255,212,0,183,0,57,255,218,0,183,0,58,255,167,0,183,0,59,255,227,0,183,0,61,255,214,0,183,0,62,255,213,0,183,0,71,255,251,0,183,0,85,255,249,0,183,0,87,255,247,0,183,0,88,255,251,0,183,0,89,255,237,0,183,0,90,255,245,0,183,0,91,255,246,0,183,0,94,255,222,0,183,0,122,255,247,0,183,0,127,255,240,0,183,0,128,255,240,0,183,0,129,255,240,0,183,0,130,255,240,0,183,0,131,255,240,0,183,0,132,255,240,0,183,0,134,255,246,0,183,0,135,255,237,0,183,0,136,255,237,0,183,0,137,255,237,0,183,0,138,255,237,0,183,0,139,255,237,0,183,0,140,255,237,0,183,0,141,255,237,0,183,0,142,255,237,0,183,0,143,255,237,0,183,0,144,255,237,0,183,0,145,255,246,0,183,0,146,255,246,0,183,0,147,255,246,0,183,0,148,255,246,0,183,0,149,255,246,0,183,0,151,255,246,0,183,0,152,255,238,0,183,0,153,255,238,0,183,0,154,255,238,0,183,0,155,255,238,0,183,0,156,255,167,0,183,0,157,255,237,0,183,0,158,255,248,0,183,0,188,255,245,0,183,0,190,255,245,0,183,0,194,255,246,0,183,0,196,255,238,0,183,0,198,255,167,0,183,0,199,255,227,0,183,0,200,255,246,0,183,0,209,255,182,0,183,0,210,255,179,0,183,0,212,255,182,0,183,0,213,255,179,0,183,0,221,255,247,0,183,0,240,255,236,0,184,0,7,255,244,0,184,0,10,255,233,0,184,0,11,255,244,0,184,0,24,255,232,0,184,0,32,255,223,0,184,0,34,255,248,0,184,0,35,255,242,0,184,0,36,255,244,0,184,0,37,255,242,0,184,0,38,255,242,0,184,0,39,255,242,0,184,0,40,255,244,0,184,0,41,255,242,0,184,0,42,255,242,0,184,0,43,255,242,0,184,0,44,255,242,0,184,0,45,255,242,0,184,0,46,255,241,0,184,0,47,255,242,0,184,0,48,255,244,0,184,0,49,255,242,0,184,0,50,255,244,0,184,0,51,255,242,0,184,0,52,255,243,0,184,0,53,255,164,0,184,0,54,255,235,0,184,0,55,255,216,0,184,0,56,255,218,0,184,0,57,255,246,0,184,0,58,255,183,0,184,0,59,255,242,0,184,0,61,255,228,0,184,0,62,255,215,0,184,0,94,255,226,0,184,0,127,255,248,0,184,0,128,255,248,0,184,0,129,255,248,0,184,0,130,255,248,0,184,0,131,255,248,0,184,0,132,255,248,0,184,0,134,255,244,0,184,0,135,255,242,0,184,0,136,255,242,0,184,0,137,255,242,0,184,0,138,255,242,0,184,0,139,255,242,0,184,0,140,255,242,0,184,0,141,255,242,0,184,0,142,255,242,0,184,0,143,255,242,0,184,0,144,255,242,0,184,0,145,255,244,0,184,0,146,255,244,0,184,0,147,255,244,0,184,0,148,255,244,0,184,0,149,255,244,0,184,0,151,255,244,0,184,0,152,255,235,0,184,0,153,255,235,0,184,0,154,255,235,0,184,0,155,255,235,0,184,0,156,255,183,0,184,0,157,255,242,0,184,0,194,255,244,0,184,0,196,255,243,0,184,0,198,255,183,0,184,0,199,255,242,0,184,0,209,255,211,0,184,0,210,255,209,0,184,0,212,255,211,0,184,0,213,255,209,0,184,0,240,255,239,0,185,0,7,255,244,0,185,0,10,255,233,0,185,0,11,255,244,0,185,0,24,255,232,0,185,0,32,255,223,0,185,0,34,255,248,0,185,0,35,255,242,0,185,0,36,255,244,0,185,0,37,255,242,0,185,0,38,255,242,0,185,0,39,255,242,0,185,0,40,255,244,0,185,0,41,255,242,0,185,0,42,255,242,0,185,0,43,255,242,0,185,0,44,255,242,0,185,0,45,255,242,0,185,0,46,255,241,0,185,0,47,255,242,0,185,0,48,255,244,0,185,0,49,255,242,0,185,0,50,255,244,0,185,0,51,255,242,0,185,0,52,255,243,0,185,0,53,255,164,0,185,0,54,255,235,0,185,0,55,255,216,0,185,0,56,255,218,0,185,0,57,255,246,0,185,0,58,255,183,0,185,0,59,255,242,0,185,0,61,255,228,0,185,0,62,255,215,0,185,0,94,255,226,0,185,0,127,255,248,0,185,0,128,255,248,0,185,0,129,255,248,0,185,0,130,255,248,0,185,0,131,255,248,0,185,0,132,255,248,0,185,0,134,255,244,0,185,0,135,255,242,0,185,0,136,255,242,0,185,0,137,255,242,0,185,0,138,255,242,0,185,0,139,255,242,0,185,0,140,255,242,0,185,0,141,255,242,0,185,0,142,255,242,0,185,0,143,255,242,0,185,0,144,255,242,0,185,0,145,255,244,0,185,0,146,255,244,0,185,0,147,255,244,0,185,0,148,255,244,0,185,0,149,255,244,0,185,0,151,255,244,0,185,0,152,255,235,0,185,0,153,255,235,0,185,0,154,255,235,0,185,0,155,255,235,0,185,0,156,255,183,0,185,0,157,255,242,0,185,0,194,255,244,0,185,0,196,255,243,0,185,0,198,255,183,0,185,0,199,255,242,0,185,0,209,255,211,0,185,0,210,255,209,0,185,0,212,255,211,0,185,0,213,255,209,0,185,0,240,255,239,0,186,0,7,255,244,0,186,0,10,255,233,0,186,0,11,255,244,0,186,0,24,255,232,0,186,0,32,255,223,0,186,0,34,255,248,0,186,0,35,255,242,0,186,0,36,255,244,0,186,0,37,255,242,0,186,0,38,255,242,0,186,0,39,255,242,0,186,0,40,255,244,0,186,0,41,255,242,0,186,0,42,255,242,0,186,0,43,255,242,0,186,0,44,255,242,0,186,0,45,255,242,0,186,0,46,255,241,0,186,0,47,255,242,0,186,0,48,255,244,0,186,0,49,255,242,0,186,0,50,255,244,0,186,0,51,255,242,0,186,0,52,255,243,0,186,0,53,255,164,0,186,0,54,255,235,0,186,0,55,255,216,0,186,0,56,255,218,0,186,0,57,255,246,0,186,0,58,255,183,0,186,0,59,255,242,0,186,0,61,255,228,0,186,0,62,255,215,0,186,0,94,255,226,0,186,0,127,255,248,0,186,0,128,255,248,0,186,0,129,255,248,0,186,0,130,255,248,0,186,0,131,255,248,0,186,0,132,255,248,0,186,0,134,255,244,0,186,0,135,255,242,0,186,0,136,255,242,0,186,0,137,255,242,0,186,0,138,255,242,0,186,0,139,255,242,0,186,0,140,255,242,0,186,0,141,255,242,0,186,0,142,255,242,0,186,0,143,255,242,0,186,0,144,255,242,0,186,0,145,255,244,0,186,0,146,255,244,0,186,0,147,255,244,0,186,0,148,255,244,0,186,0,149,255,244,0,186,0,151,255,244,0,186,0,152,255,235,0,186,0,153,255,235,0,186,0,154,255,235,0,186,0,155,255,235,0,186,0,156,255,183,0,186,0,157,255,242,0,186,0,194,255,244,0,186,0,196,255,243,0,186,0,198,255,183,0,186,0,199,255,242,0,186,0,209,255,211,0,186,0,210,255,209,0,186,0,212,255,211,0,186,0,213,255,209,0,186,0,240,255,239,0,187,0,7,255,244,0,187,0,10,255,233,0,187,0,11,255,244,0,187,0,24,255,232,0,187,0,32,255,223,0,187,0,34,255,248,0,187,0,35,255,242,0,187,0,36,255,244,0,187,0,37,255,242,0,187,0,38,255,242,0,187,0,39,255,242,0,187,0,40,255,244,0,187,0,41,255,242,0,187,0,42,255,242,0,187,0,43,255,242,0,187,0,44,255,242,0,187,0,45,255,242,0,187,0,46,255,241,0,187,0,47,255,242,0,187,0,48,255,244,0,187,0,49,255,242,0,187,0,50,255,244,0,187,0,51,255,242,0,187,0,52,255,243,0,187,0,53,255,164,0,187,0,54,255,235,0,187,0,55,255,216,0,187,0,56,255,218,0,187,0,57,255,246,0,187,0,58,255,183,0,187,0,59,255,242,0,187,0,61,255,228,0,187,0,62,255,215,0,187,0,94,255,226,0,187,0,127,255,248,0,187,0,128,255,248,0,187,0,129,255,248,0,187,0,130,255,248,0,187,0,131,255,248,0,187,0,132,255,248,0,187,0,134,255,244,0,187,0,135,255,242,0,187,0,136,255,242,0,187,0,137,255,242,0,187,0,138,255,242,0,187,0,139,255,242,0,187,0,140,255,242,0,187,0,141,255,242,0,187,0,142,255,242,0,187,0,143,255,242,0,187,0,144,255,242,0,187,0,145,255,244,0,187,0,146,255,244,0,187,0,147,255,244,0,187,0,148,255,244,0,187,0,149,255,244,0,187,0,151,255,244,0,187,0,152,255,235,0,187,0,153,255,235,0,187,0,154,255,235,0,187,0,155,255,235,0,187,0,156,255,183,0,187,0,157,255,242,0,187,0,194,255,244,0,187,0,196,255,243,0,187,0,198,255,183,0,187,0,199,255,242,0,187,0,209,255,211,0,187,0,210,255,209,0,187,0,212,255,211,0,187,0,213,255,209,0,187,0,240,255,239,0,188,0,7,255,238,0,188,0,10,255,231,0,188,0,13,255,225,0,188,0,15,255,225,0,188,0,16,255,220,0,188,0,19,255,227,0,188,0,20,255,230,0,188,0,24,255,198,0,188,0,32,255,205,0,188,0,33,255,238,0,188,0,34,255,214,0,188,0,35,255,243,0,188,0,37,255,243,0,188,0,38,255,243,0,188,0,39,255,243,0,188,0,41,255,243,0,188,0,42,255,243,0,188,0,43,255,243,0,188,0,44,255,243,0,188,0,45,255,243,0,188,0,46,255,229,0,188,0,47,255,243,0,188,0,49,255,243,0,188,0,51,255,243,0,188,0,53,255,168,0,188,0,54,255,245,0,188,0,55,255,238,0,188,0,56,255,242,0,188,0,57,255,208,0,188,0,58,255,211,0,188,0,59,255,225,0,188,0,62,255,214,0,188,0,66,255,250,0,188,0,68,255,246,0,188,0,69,255,246,0,188,0,70,255,246,0,188,0,72,255,250,0,188,0,80,255,246,0,188,0,82,255,246,0,188,0,84,255,252,0,188,0,94,255,227,0,188,0,127,255,214,0,188,0,128,255,214,0,188,0,129,255,214,0,188,0,130,255,214,0,188,0,131,255,214,0,188,0,132,255,214,0,188,0,135,255,243,0,188,0,136,255,243,0,188,0,137,255,243,0,188,0,138,255,243,0,188,0,139,255,243,0,188,0,140,255,243,0,188,0,141,255,243,0,188,0,142,255,243,0,188,0,143,255,243,0,188,0,144,255,243,0,188,0,152,255,245,0,188,0,153,255,245,0,188,0,154,255,245,0,188,0,155,255,245,0,188,0,156,255,211,0,188,0,157,255,243,0,188,0,159,255,250,0,188,0,160,255,250,0,188,0,161,255,250,0,188,0,162,255,250,0,188,0,163,255,250,0,188,0,164,255,250,0,188,0,165,255,250,0,188,0,166,255,246,0,188,0,167,255,246,0,188,0,168,255,246,0,188,0,169,255,246,0,188,0,170,255,246,0,188,0,175,255,236,0,188,0,177,255,246,0,188,0,178,255,246,0,188,0,179,255,246,0,188,0,180,255,246,0,188,0,181,255,246,0,188,0,183,255,246,0,188,0,195,255,246,0,188,0,197,255,252,0,188,0,198,255,211,0,188,0,199,255,225,0,188,0,209,255,227,0,188,0,210,255,225,0,188,0,211,255,225,0,188,0,212,255,227,0,188,0,213,255,225,0,188,0,214,255,225,0,188,0,218,255,225,0,189,0,3,255,234,0,189,0,7,255,246,0,189,0,8,255,234,0,189,0,10,255,227,0,189,0,11,255,232,0,189,0,13,255,246,0,189,0,15,255,247,0,189,0,18,255,235,0,189,0,19,255,232,0,189,0,24,255,226,0,189,0,32,255,224,0,189,0,34,255,240,0,189,0,35,255,237,0,189,0,36,255,246,0,189,0,37,255,237,0,189,0,38,255,237,0,189,0,39,255,237,0,189,0,40,255,246,0,189,0,41,255,237,0,189,0,42,255,237,0,189,0,43,255,237,0,189,0,44,255,237,0,189,0,45,255,237,0,189,0,46,255,239,0,189,0,47,255,237,0,189,0,48,255,246,0,189,0,49,255,237,0,189,0,50,255,246,0,189,0,51,255,237,0,189,0,52,255,237,0,189,0,53,255,171,0,189,0,54,255,238,0,189,0,55,255,193,0,189,0,56,255,212,0,189,0,57,255,217,0,189,0,58,255,167,0,189,0,59,255,227,0,189,0,61,255,217,0,189,0,62,255,217,0,189,0,71,255,251,0,189,0,85,255,250,0,189,0,87,255,247,0,189,0,88,255,251,0,189,0,89,255,238,0,189,0,90,255,245,0,189,0,91,255,246,0,189,0,94,255,226,0,189,0,122,255,247,0,189,0,127,255,240,0,189,0,128,255,240,0,189,0,129,255,240,0,189,0,130,255,240,0,189,0,131,255,240,0,189,0,132,255,240,0,189,0,134,255,246,0,189,0,135,255,237,0,189,0,136,255,237,0,189,0,137,255,237,0,189,0,138,255,237,0,189,0,139,255,237,0,189,0,140,255,237,0,189,0,141,255,237,0,189,0,142,255,237,0,189,0,143,255,237,0,189,0,144,255,237,0,189,0,145,255,246,0,189,0,146,255,246,0,189,0,147,255,246,0,189,0,148,255,246,0,189,0,149,255,246,0,189,0,151,255,246,0,189,0,152,255,238,0,189,0,153,255,238,0,189,0,154,255,238,0,189,0,155,255,238,0,189,0,156,255,167,0,189,0,157,255,237,0,189,0,158,255,248,0,189,0,188,255,245,0,189,0,190,255,245,0,189,0,194,255,246,0,189,0,196,255,237,0,189,0,198,255,167,0,189,0,199,255,227,0,189,0,200,255,246,0,189,0,209,255,181,0,189,0,210,255,178,0,189,0,211,255,246,0,189,0,212,255,181,0,189,0,213,255,178,0,189,0,214,255,246,0,189,0,218,255,247,0,189,0,221,255,247,0,189,0,240,255,234,0,190,0,7,255,238,0,190,0,10,255,231,0,190,0,13,255,225,0,190,0,15,255,225,0,190,0,16,255,220,0,190,0,19,255,227,0,190,0,20,255,230,0,190,0,24,255,198,0,190,0,32,255,205,0,190,0,33,255,238,0,190,0,34,255,214,0,190,0,35,255,243,0,190,0,37,255,243,0,190,0,38,255,243,0,190,0,39,255,243,0,190,0,41,255,243,0,190,0,42,255,243,0,190,0,43,255,243,0,190,0,44,255,243,0,190,0,45,255,243,0,190,0,46,255,229,0,190,0,47,255,243,0,190,0,49,255,243,0,190,0,51,255,243,0,190,0,53,255,168,0,190,0,54,255,245,0,190,0,55,255,238,0,190,0,56,255,242,0,190,0,57,255,208,0,190,0,58,255,211,0,190,0,59,255,225,0,190,0,62,255,214,0,190,0,66,255,250,0,190,0,68,255,246,0,190,0,69,255,246,0,190,0,70,255,246,0,190,0,72,255,250,0,190,0,80,255,246,0,190,0,82,255,246,0,190,0,84,255,252,0,190,0,94,255,227,0,190,0,127,255,214,0,190,0,128,255,214,0,190,0,129,255,214,0,190,0,130,255,214,0,190,0,131,255,214,0,190,0,132,255,214,0,190,0,135,255,243,0,190,0,136,255,243,0,190,0,137,255,243,0,190,0,138,255,243,0,190,0,139,255,243,0,190,0,140,255,243,0,190,0,141,255,243,0,190,0,142,255,243,0,190,0,143,255,243,0,190,0,144,255,243,0,190,0,152,255,245,0,190,0,153,255,245,0,190,0,154,255,245,0,190,0,155,255,245,0,190,0,156,255,211,0,190,0,157,255,243,0,190,0,159,255,250,0,190,0,160,255,250,0,190,0,161,255,250,0,190,0,162,255,250,0,190,0,163,255,250,0,190,0,164,255,250,0,190,0,165,255,250,0,190,0,166,255,246,0,190,0,167,255,246,0,190,0,168,255,246,0,190,0,169,255,246,0,190,0,170,255,246,0,190,0,175,255,236,0,190,0,177,255,246,0,190,0,178,255,246,0,190,0,179,255,246,0,190,0,180,255,246,0,190,0,181,255,246,0,190,0,183,255,246,0,190,0,195,255,246,0,190,0,197,255,252,0,190,0,198,255,211,0,190,0,199,255,225,0,190,0,209,255,227,0,190,0,210,255,225,0,190,0,211,255,225,0,190,0,212,255,227,0,190,0,213,255,225,0,190,0,214,255,225,0,190,0,218,255,225,0,193,0,7,255,244,0,193,0,34,255,248,0,193,0,35,255,242,0,193,0,36,255,244,0,193,0,37,255,242,0,193,0,38,255,242,0,193,0,39,255,242,0,193,0,40,255,244,0,193,0,41,255,242,0,193,0,42,255,242,0,193,0,43,255,242,0,193,0,44,255,242,0,193,0,45,255,242,0,193,0,46,255,241,0,193,0,47,255,242,0,193,0,48,255,244,0,193,0,49,255,242,0,193,0,50,255,244,0,193,0,51,255,242,0,193,0,52,255,244,0,193,0,53,255,242,0,193,0,54,255,238,0,193,0,55,255,247,0,193,0,56,255,246,0,193,0,58,255,247,0,193,0,59,255,245,0,193,0,127,255,248,0,193,0,128,255,248,0,193,0,129,255,248,0,193,0,130,255,248,0,193,0,131,255,248,0,193,0,132,255,248,0,193,0,134,255,244,0,193,0,135,255,242,0,193,0,136,255,242,0,193,0,137,255,242,0,193,0,138,255,242,0,193,0,139,255,242,0,193,0,140,255,242,0,193,0,141,255,242,0,193,0,142,255,242,0,193,0,143,255,242,0,193,0,144,255,242,0,193,0,145,255,244,0,193,0,146,255,244,0,193,0,147,255,244,0,193,0,148,255,244,0,193,0,149,255,244,0,193,0,151,255,244,0,193,0,152,255,238,0,193,0,153,255,238,0,193,0,154,255,238,0,193,0,155,255,238,0,193,0,156,255,247,0,193,0,157,255,242,0,193,0,194,255,244,0,193,0,196,255,244,0,193,0,198,255,247,0,193,0,199,255,245,0,194,0,14,255,244,0,194,0,21,255,220,0,194,0,36,255,245,0,194,0,40,255,245,0,194,0,48,255,245,0,194,0,50,255,245,0,194,0,68,255,240,0,194,0,69,255,240,0,194,0,70,255,240,0,194,0,71,255,243,0,194,0,72,255,241,0,194,0,78,255,247,0,194,0,79,255,247,0,194,0,80,255,240,0,194,0,81,255,247,0,194,0,82,255,240,0,194,0,83,255,247,0,194,0,84,255,251,0,194,0,85,255,242,0,194,0,86,255,238,0,194,0,87,255,241,0,194,0,88,255,243,0,194,0,90,255,240,0,194,0,107,255,235,0,194,0,110,255,248,0,194,0,134,255,245,0,194,0,145,255,245,0,194,0,146,255,245,0,194,0,147,255,245,0,194,0,148,255,245,0,194,0,149,255,245,0,194,0,151,255,245,0,194,0,158,255,243,0,194,0,166,255,240,0,194,0,167,255,240,0,194,0,168,255,240,0,194,0,169,255,240,0,194,0,170,255,240,0,194,0,173,0,21,0,194,0,175,255,246,0,194,0,176,255,247,0,194,0,177,255,240,0,194,0,178,255,240,0,194,0,179,255,240,0,194,0,180,255,240,0,194,0,181,255,240,0,194,0,183,255,240,0,194,0,184,255,238,0,194,0,185,255,238,0,194,0,186,255,238,0,194,0,187,255,238,0,194,0,188,255,240,0,194,0,189,255,247,0,194,0,190,255,240,0,194,0,194,255,245,0,194,0,195,255,240,0,194,0,197,255,251,0,194,0,207,255,244,0,194,0,208,255,244,0,194,0,220,255,235,0,195,0,3,255,241,0,195,0,7,255,246,0,195,0,8,255,241,0,195,0,10,255,230,0,195,0,11,255,238,0,195,0,18,255,235,0,195,0,19,255,245,0,195,0,24,255,230,0,195,0,32,255,223,0,195,0,34,255,251,0,195,0,35,255,241,0,195,0,36,255,250,0,195,0,37,255,241,0,195,0,38,255,241,0,195,0,39,255,241,0,195,0,40,255,250,0,195,0,41,255,241,0,195,0,42,255,241,0,195,0,43,255,241,0,195,0,44,255,241,0,195,0,45,255,241,0,195,0,46,255,243,0,195,0,47,255,241,0,195,0,48,255,250,0,195,0,49,255,241,0,195,0,50,255,250,0,195,0,51,255,241,0,195,0,52,255,241,0,195,0,53,255,187,0,195,0,54,255,240,0,195,0,55,255,209,0,195,0,56,255,213,0,195,0,57,255,243,0,195,0,58,255,174,0,195,0,59,255,243,0,195,0,61,255,220,0,195,0,62,255,220,0,195,0,87,255,252,0,195,0,89,255,251,0,195,0,90,255,251,0,195,0,94,255,227,0,195,0,127,255,251,0,195,0,128,255,251,0,195,0,129,255,251,0,195,0,130,255,251,0,195,0,131,255,251,0,195,0,132,255,251,0,195,0,134,255,250,0,195,0,135,255,241,0,195,0,136,255,241,0,195,0,137,255,241,0,195,0,138,255,241,0,195,0,139,255,241,0,195,0,140,255,241,0,195,0,141,255,241,0,195,0,142,255,241,0,195,0,143,255,241,0,195,0,144,255,241,0,195,0,145,255,250,0,195,0,146,255,250,0,195,0,147,255,250,0,195,0,148,255,250,0,195,0,149,255,250,0,195,0,151,255,250,0,195,0,152,255,240,0,195,0,153,255,240,0,195,0,154,255,240,0,195,0,155,255,240,0,195,0,156,255,174,0,195,0,157,255,241,0,195,0,188,255,251,0,195,0,190,255,251,0,195,0,194,255,250,0,195,0,196,255,241,0,195,0,198,255,174,0,195,0,199,255,243,0,195,0,209,255,189,0,195,0,210,255,186,0,195,0,212,255,189,0,195,0,213,255,186,0,195,0,240,255,237,0,196,0,10,255,246,0,196,0,57,255,251,0,196,0,67,255,250,0,196,0,71,255,243,0,196,0,72,255,250,0,196,0,73,255,250,0,196,0,74,255,250,0,196,0,75,255,250,0,196,0,76,255,250,0,196,0,77,255,250,0,196,0,78,255,250,0,196,0,79,255,250,0,196,0,81,255,250,0,196,0,83,255,250,0,196,0,84,255,251,0,196,0,85,255,241,0,196,0,86,255,250,0,196,0,87,255,241,0,196,0,88,255,244,0,196,0,89,255,242,0,196,0,90,255,240,0,196,0,91,255,244,0,196,0,158,255,244,0,196,0,171,255,250,0,196,0,172,255,250,0,196,0,173,255,250,0,196,0,174,255,250,0,196,0,176,255,250,0,196,0,184,255,250,0,196,0,185,255,250,0,196,0,186,255,250,0,196,0,187,255,250,0,196,0,188,255,240,0,196,0,189,255,250,0,196,0,190,255,240,0,196,0,193,255,250,0,196,0,197,255,251,0,196,0,200,255,244,0,197,0,10,255,231,0,197,0,11,255,241,0,197,0,24,255,234,0,197,0,32,255,224,0,197,0,35,255,241,0,197,0,36,255,244,0,197,0,37,255,241,0,197,0,38,255,241,0,197,0,39,255,241,0,197,0,40,255,244,0,197,0,41,255,241,0,197,0,42,255,241,0,197,0,43,255,241,0,197,0,44,255,241,0,197,0,45,255,241,0,197,0,46,255,245,0,197,0,47,255,241,0,197,0,48,255,244,0,197,0,49,255,241,0,197,0,50,255,244,0,197,0,51,255,241,0,197,0,52,255,248,0,197,0,53,255,202,0,197,0,54,255,238,0,197,0,55,255,216,0,197,0,56,255,224,0,197,0,57,255,244,0,197,0,58,255,209,0,197,0,59,255,245,0,197,0,61,255,225,0,197,0,62,255,220,0,197,0,94,255,229,0,197,0,134,255,244,0,197,0,135,255,241,0,197,0,136,255,241,0,197,0,137,255,241,0,197,0,138,255,241,0,197,0,139,255,241,0,197,0,140,255,241,0,197,0,141,255,241,0,197,0,142,255,241,0,197,0,143,255,241,0,197,0,144,255,241,0,197,0,145,255,244,0,197,0,146,255,244,0,197,0,147,255,244,0,197,0,148,255,244,0,197,0,149,255,244,0,197,0,151,255,244,0,197,0,152,255,238,0,197,0,153,255,238,0,197,0,154,255,238,0,197,0,155,255,238,0,197,0,156,255,209,0,197,0,157,255,241,0,197,0,194,255,244,0,197,0,196,255,248,0,197,0,198,255,209,0,197,0,199,255,245,0,197,0,209,255,203,0,197,0,210,255,200,0,197,0,212,255,203,0,197,0,213,255,200,0,197,0,240,255,235,0,198,0,7,255,237,0,198,0,11,0,13,0,198,0,13,255,215,0,198,0,14,255,222,0,198,0,15,255,215,0,198,0,16,255,201,0,198,0,17,255,233,0,198,0,21,255,206,0,198,0,23,255,218,0,198,0,25,255,246,0,198,0,27,255,235,0,198,0,28,255,235,0,198,0,32,0,13,0,198,0,33,255,198,0,198,0,34,255,192,0,198,0,36,255,230,0,198,0,40,255,230,0,198,0,46,255,232,0,198,0,48,255,230,0,198,0,50,255,230,0,198,0,61,0,7,0,198,0,62,0,31,0,198,0,66,255,189,0,198,0,68,255,171,0,198,0,69,255,171,0,198,0,70,255,171,0,198,0,71,255,237,0,198,0,72,255,180,0,198,0,78,255,187,0,198,0,79,255,187,0,198,0,80,255,171,0,198,0,81,255,187,0,198,0,82,255,171,0,198,0,83,255,187,0,198,0,84,255,186,0,198,0,85,255,221,0,198,0,86,255,190,0,198,0,87,255,215,0,198,0,88,255,216,0,198,0,89,255,214,0,198,0,90,255,217,0,198,0,91,255,229,0,198,0,94,0,33,0,198,0,107,255,198,0,198,0,110,255,230,0,198,0,122,255,225,0,198,0,127,255,192,0,198,0,128,255,192,0,198,0,129,255,192,0,198,0,130,255,192,0,198,0,131,255,192,0,198,0,132,255,192,0,198,0,133,255,180,0,198,0,134,255,230,0,198,0,145,255,230,0,198,0,146,255,230,0,198,0,147,255,230,0,198,0,148,255,230,0,198,0,149,255,230,0,198,0,151,255,230,0,198,0,158,255,230,0,198,0,159,255,189,0,198,0,160,255,189,0,198,0,161,255,189,0,198,0,162,255,189,0,198,0,163,255,189,0,198,0,164,255,189,0,198,0,165,255,189,0,198,0,166,255,171,0,198,0,167,255,171,0,198,0,168,255,171,0,198,0,169,255,171,0,198,0,170,255,171,0,198,0,171,0,16,0,198,0,173,0,38,0,198,0,174,0,47,0,198,0,175,255,216,0,198,0,176,255,187,0,198,0,177,255,171,0,198,0,178,255,171,0,198,0,179,255,171,0,198,0,180,255,171,0,198,0,181,255,171,0,198,0,183,255,171,0,198,0,184,255,190,0,198,0,185,255,190,0,198,0,186,255,190,0,198,0,187,255,190,0,198,0,188,255,217,0,198,0,189,255,225,0,198,0,190,255,217,0,198,0,194,255,230,0,198,0,195,255,171,0,198,0,197,255,234,0,198,0,200,255,229,0,198,0,207,255,222,0,198,0,208,255,222,0,198,0,211,255,215,0,198,0,214,255,215,0,198,0,218,255,215,0,198,0,220,255,198,0,198,0,221,255,225,0,198,0,240,0,33,0,199,0,14,255,217,0,199,0,17,255,243,0,199,0,21,255,199,0,199,0,23,255,247,0,199,0,36,255,238,0,199,0,40,255,238,0,199,0,48,255,238,0,199,0,50,255,238,0,199,0,62,0,23,0,199,0,66,255,246,0,199,0,68,255,227,0,199,0,69,255,227,0,199,0,70,255,227,0,199,0,71,255,241,0,199,0,72,255,229,0,199,0,74,255,250,0,199,0,75,255,250,0,199,0,78,255,235,0,199,0,79,255,235,0,199,0,80,255,227,0,199,0,81,255,235,0,199,0,82,255,227,0,199,0,83,255,235,0,199,0,84,255,245,0,199,0,85,255,241,0,199,0,86,255,224,0,199,0,87,255,241,0,199,0,88,255,241,0,199,0,90,255,242,0,199,0,91,255,248,0,199,0,94,0,23,0,199,0,107,255,214,0,199,0,110,255,233,0,199,0,134,255,238,0,199,0,145,255,238,0,199,0,146,255,238,0,199,0,147,255,238,0,199,0,148,255,238,0,199,0,149,255,238,0,199,0,151,255,238,0,199,0,158,255,239,0,199,0,159,255,246,0,199,0,160,255,246,0,199,0,161,255,246,0,199,0,162,255,246,0,199,0,163,255,246,0,199,0,164,255,246,0,199,0,165,255,246,0,199,0,166,255,227,0,199,0,167,255,227,0,199,0,168,255,227,0,199,0,169,255,227,0,199,0,170,255,227,0,199,0,171,0,6,0,199,0,172,255,250,0,199,0,173,0,29,0,199,0,174,0,37,0,199,0,175,255,235,0,199,0,176,255,235,0,199,0,177,255,227,0,199,0,178,255,227,0,199,0,179,255,227,0,199,0,180,255,227,0,199,0,181,255,227,0,199,0,183,255,227,0,199,0,184,255,224,0,199,0,185,255,224,0,199,0,186,255,224,0,199,0,187,255,224,0,199,0,188,255,242,0,199,0,189,255,235,0,199,0,190,255,242,0,199,0,193,255,250,0,199,0,194,255,238,0,199,0,195,255,227,0,199,0,197,255,245,0,199,0,200,255,248,0,199,0,207,255,217,0,199,0,208,255,217,0,199,0,220,255,214,0,199,0,240,0,24,0,200,0,7,255,245,0,200,0,10,255,246,0,200,0,14,255,240,0,200,0,21,255,225,0,200,0,24,255,244,0,200,0,32,255,221,0,200,0,35,255,242,0,200,0,36,255,244,0,200,0,37,255,242,0,200,0,38,255,242,0,200,0,39,255,242,0,200,0,40,255,244,0,200,0,41,255,242,0,200,0,42,255,242,0,200,0,43,255,242,0,200,0,44,255,242,0,200,0,45,255,242,0,200,0,46,255,245,0,200,0,47,255,242,0,200,0,48,255,244,0,200,0,49,255,242,0,200,0,50,255,244,0,200,0,51,255,242,0,200,0,53,255,203,0,200,0,54,255,239,0,200,0,55,255,240,0,200,0,56,255,243,0,200,0,58,255,227,0,200,0,61,255,242,0,200,0,62,255,222,0,200,0,68,255,245,0,200,0,69,255,245,0,200,0,70,255,245,0,200,0,72,255,251,0,200,0,80,255,245,0,200,0,82,255,245,0,200,0,94,255,232,0,200,0,107,255,232,0,200,0,134,255,244,0,200,0,135,255,242,0,200,0,136,255,242,0,200,0,137,255,242,0,200,0,138,255,242,0,200,0,139,255,242,0,200,0,140,255,242,0,200,0,141,255,242,0,200,0,142,255,242,0,200,0,143,255,242,0,200,0,144,255,242,0,200,0,145,255,244,0,200,0,146,255,244,0,200,0,147,255,244,0,200,0,148,255,244,0,200,0,149,255,244,0,200,0,151,255,244,0,200,0,152,255,239,0,200,0,153,255,239,0,200,0,154,255,239,0,200,0,155,255,239,0,200,0,156,255,227,0,200,0,157,255,242,0,200,0,166,255,245,0,200,0,167,255,245,0,200,0,168,255,245,0,200,0,169,255,245,0,200,0,170,255,245,0,200,0,175,255,247,0,200,0,177,255,245,0,200,0,178,255,245,0,200,0,179,255,245,0,200,0,180,255,245,0,200,0,181,255,245,0,200,0,183,255,245,0,200,0,194,255,244,0,200,0,195,255,245,0,200,0,198,255,227,0,200,0,207,255,240,0,200,0,208,255,240,0,200,0,209,255,219,0,200,0,210,255,216,0,200,0,212,255,219,0,200,0,213,255,216,0,200,0,220,255,232,0,200,0,240,255,242,0,207,0,3,255,234,0,207,0,8,255,234,0,207,0,52,255,243,0,207,0,53,255,216,0,207,0,55,255,238,0,207,0,56,255,248,0,207,0,57,255,242,0,207,0,58,255,222,0,207,0,59,255,237,0,207,0,71,255,247,0,207,0,85,255,248,0,207,0,89,255,247,0,207,0,91,255,231,0,207,0,156,255,222,0,207,0,158,255,248,0,207,0,196,255,243,0,207,0,198,255,222,0,207,0,199,255,237,0,207,0,200,255,231,0,207,0,210,255,193,0,207,0,213,255,193,0,208,0,3,255,234,0,208,0,8,255,234,0,208,0,52,255,243,0,208,0,53,255,216,0,208,0,55,255,238,0,208,0,56,255,248,0,208,0,57,255,242,0,208,0,58,255,222,0,208,0,59,255,237,0,208,0,71,255,247,0,208,0,85,255,248,0,208,0,89,255,247,0,208,0,91,255,231,0,208,0,156,255,222,0,208,0,158,255,248,0,208,0,196,255,243,0,208,0,198,255,222,0,208,0,199,255,237,0,208,0,200,255,231,0,208,0,210,255,193,0,208,0,213,255,193,0,209,0,13,255,123,0,209,0,15,255,124,0,209,0,34,255,205,0,209,0,46,255,236,0,209,0,66,255,194,0,209,0,68,255,182,0,209,0,69,255,182,0,209,0,70,255,182,0,209,0,71,255,243,0,209,0,72,255,189,0,209,0,78,255,211,0,209,0,79,255,211,0,209,0,80,255,182,0,209,0,81,255,211,0,209,0,82,255,182,0,209,0,83,255,211,0,209,0,84,255,193,0,209,0,85,255,248,0,209,0,86,255,213,0,209,0,87,255,226,0,209,0,88,255,227,0,209,0,89,255,225,0,209,0,90,255,227,0,209,0,91,255,217,0,209,0,127,255,205,0,209,0,128,255,205,0,209,0,129,255,205,0,209,0,130,255,205,0,209,0,131,255,205,0,209,0,132,255,205,0,209,0,133,255,190,0,209,0,158,255,245,0,209,0,159,255,194,0,209,0,160,255,194,0,209,0,161,255,194,0,209,0,162,255,194,0,209,0,163,255,194,0,209,0,164,255,194,0,209,0,165,255,194,0,209,0,166,255,182,0,209,0,167,255,182,0,209,0,168,255,182,0,209,0,169,255,182,0,209,0,170,255,182,0,209,0,173,0,37,0,209,0,175,255,235,0,209,0,176,255,211,0,209,0,177,255,182,0,209,0,178,255,182,0,209,0,179,255,182,0,209,0,180,255,182,0,209,0,181,255,182,0,209,0,183,255,182,0,209,0,184,255,213,0,209,0,185,255,213,0,209,0,186,255,213,0,209,0,187,255,213,0,209,0,188,255,227,0,209,0,189,255,211,0,209,0,190,255,227,0,209,0,195,255,182,0,209,0,197,255,193,0,209,0,200,255,217,0,209,0,218,255,124,0,210,0,7,255,239,0,210,0,11,0,5,0,210,0,13,255,110,0,210,0,14,255,181,0,210,0,15,255,110,0,210,0,16,255,209,0,210,0,33,255,210,0,210,0,34,255,200,0,210,0,36,255,234,0,210,0,40,255,234,0,210,0,46,255,234,0,210,0,48,255,234,0,210,0,50,255,234,0,210,0,58,0,6,0,210,0,66,255,179,0,210,0,68,255,167,0,210,0,69,255,167,0,210,0,70,255,167,0,210,0,71,255,243,0,210,0,72,255,174,0,210,0,78,255,198,0,210,0,79,255,198,0,210,0,80,255,167,0,210,0,81,255,198,0,210,0,82,255,167,0,210,0,83,255,198,0,210,0,84,255,178,0,210,0,85,255,244,0,210,0,86,255,200,0,210,0,87,255,214,0,210,0,88,255,215,0,210,0,89,255,213,0,210,0,90,255,215,0,210,0,91,255,204,0,210,0,107,255,192,0,210,0,110,255,245,0,210,0,122,255,220,0,210,0,127,255,200,0,210,0,128,255,200,0,210,0,129,255,200,0,210,0,130,255,200,0,210,0,131,255,200,0,210,0,132,255,200,0,210,0,133,255,184,0,210,0,134,255,234,0,210,0,145,255,234,0,210,0,146,255,234,0,210,0,147,255,234,0,210,0,148,255,234,0,210,0,149,255,234,0,210,0,151,255,234,0,210,0,156,0,6,0,210,0,158,255,241,0,210,0,159,255,179,0,210,0,160,255,179,0,210,0,161,255,187,0,210,0,162,255,179,0,210,0,163,255,179,0,210,0,164,255,179,0,210,0,165,255,179,0,210,0,166,255,167,0,210,0,167,255,167,0,210,0,168,255,167,0,210,0,169,255,174,0,210,0,170,255,167,0,210,0,173,0,44,0,210,0,174,0,28,0,210,0,175,255,237,0,210,0,176,255,198,0,210,0,177,255,167,0,210,0,178,255,167,0,210,0,179,255,167,0,210,0,180,255,167,0,210,0,181,255,167,0,210,0,183,255,167,0,210,0,184,255,200,0,210,0,185,255,200,0,210,0,186,255,200,0,210,0,187,255,200,0,210,0,188,255,215,0,210,0,189,255,224,0,210,0,190,255,215,0,210,0,194,255,234,0,210,0,195,255,167,0,210,0,197,255,232,0,210,0,198,0,6,0,210,0,200,255,204,0,210,0,207,255,181,0,210,0,208,255,181,0,210,0,211,255,110,0,210,0,214,255,110,0,210,0,218,255,110,0,210,0,220,255,192,0,210,0,221,255,220,0,210,0,240,0,9,0,211,0,3,255,146,0,211,0,8,255,146,0,211,0,36,255,242,0,211,0,40,255,242,0,211,0,48,255,242,0,211,0,50,255,242,0,211,0,53,255,214,0,211,0,54,255,243,0,211,0,55,255,213,0,211,0,56,255,226,0,211,0,58,255,215,0,211,0,71,255,241,0,211,0,85,255,239,0,211,0,87,255,227,0,211,0,88,255,236,0,211,0,90,255,222,0,211,0,134,255,242,0,211,0,145,255,242,0,211,0,146,255,242,0,211,0,147,255,242,0,211,0,148,255,242,0,211,0,149,255,242,0,211,0,151,255,242,0,211,0,152,255,243,0,211,0,153,255,243,0,211,0,154,255,243,0,211,0,155,255,243,0,211,0,156,255,215,0,211,0,158,255,242,0,211,0,188,255,222,0,211,0,190,255,222,0,211,0,194,255,242,0,211,0,198,255,215,0,211,0,210,255,121,0,211,0,213,255,121,0,212,0,13,255,123,0,212,0,15,255,124,0,212,0,34,255,205,0,212,0,46,255,236,0,212,0,66,255,194,0,212,0,68,255,182,0,212,0,69,255,182,0,212,0,70,255,182,0,212,0,71,255,243,0,212,0,72,255,189,0,212,0,78,255,211,0,212,0,79,255,211,0,212,0,80,255,182,0,212,0,81,255,211,0,212,0,82,255,182,0,212,0,83,255,211,0,212,0,84,255,193,0,212,0,85,255,248,0,212,0,86,255,213,0,212,0,87,255,226,0,212,0,88,255,227,0,212,0,89,255,225,0,212,0,90,255,227,0,212,0,91,255,217,0,212,0,127,255,205,0,212,0,128,255,205,0,212,0,129,255,205,0,212,0,130,255,205,0,212,0,131,255,205,0,212,0,132,255,205,0,212,0,133,255,190,0,212,0,158,255,245,0,212,0,159,255,194,0,212,0,160,255,194,0,212,0,161,255,194,0,212,0,162,255,194,0,212,0,163,255,194,0,212,0,164,255,194,0,212,0,165,255,194,0,212,0,166,255,182,0,212,0,167,255,182,0,212,0,168,255,182,0,212,0,169,255,182,0,212,0,170,255,182,0,212,0,173,0,37,0,212,0,175,255,235,0,212,0,176,255,211,0,212,0,177,255,182,0,212,0,178,255,182,0,212,0,179,255,182,0,212,0,180,255,182,0,212,0,181,255,182,0,212,0,183,255,182,0,212,0,184,255,213,0,212,0,185,255,213,0,212,0,186,255,213,0,212,0,187,255,213,0,212,0,188,255,227,0,212,0,189,255,211,0,212,0,190,255,227,0,212,0,195,255,182,0,212,0,197,255,193,0,212,0,200,255,217,0,212,0,218,255,124,0,213,0,7,255,239,0,213,0,11,0,5,0,213,0,13,255,110,0,213,0,14,255,181,0,213,0,15,255,110,0,213,0,16,255,209,0,213,0,33,255,210,0,213,0,34,255,200,0,213,0,36,255,234,0,213,0,40,255,234,0,213,0,46,255,234,0,213,0,48,255,234,0,213,0,50,255,234,0,213,0,58,0,6,0,213,0,66,255,179,0,213,0,68,255,167,0,213,0,69,255,167,0,213,0,70,255,167,0,213,0,71,255,243,0,213,0,72,255,174,0,213,0,78,255,198,0,213,0,79,255,198,0,213,0,80,255,167,0,213,0,81,255,198,0,213,0,82,255,167,0,213,0,83,255,198,0,213,0,84,255,178,0,213,0,85,255,244,0,213,0,86,255,200,0,213,0,87,255,214,0,213,0,88,255,215,0,213,0,89,255,213,0,213,0,90,255,215,0,213,0,91,255,204,0,213,0,107,255,192,0,213,0,110,255,245,0,213,0,122,255,220,0,213,0,127,255,200,0,213,0,128,255,200,0,213,0,129,255,200,0,213,0,130,255,200,0,213,0,131,255,200,0,213,0,132,255,200,0,213,0,133,255,184,0,213,0,134,255,234,0,213,0,145,255,234,0,213,0,146,255,234,0,213,0,147,255,234,0,213,0,148,255,234,0,213,0,149,255,234,0,213,0,151,255,234,0,213,0,156,0,6,0,213,0,158,255,241,0,213,0,159,255,179,0,213,0,160,255,179,0,213,0,161,255,187,0,213,0,162,255,179,0,213,0,163,255,179,0,213,0,164,255,179,0,213,0,165,255,179,0,213,0,166,255,167,0,213,0,167,255,167,0,213,0,168,255,167,0,213,0,169,255,174,0,213,0,170,255,167,0,213,0,173,0,44,0,213,0,174,0,28,0,213,0,175,255,237,0,213,0,176,255,198,0,213,0,177,255,167,0,213,0,178,255,167,0,213,0,179,255,167,0,213,0,180,255,167,0,213,0,181,255,167,0,213,0,183,255,167,0,213,0,184,255,200,0,213,0,185,255,200,0,213,0,186,255,200,0,213,0,187,255,200,0,213,0,188,255,215,0,213,0,189,255,224,0,213,0,190,255,215,0,213,0,194,255,234,0,213,0,195,255,167,0,213,0,197,255,232,0,213,0,198,0,6,0,213,0,200,255,204,0,213,0,207,255,181,0,213,0,208,255,181,0,213,0,211,255,110,0,213,0,214,255,110,0,213,0,218,255,110,0,213,0,220,255,192,0,213,0,221,255,220,0,213,0,240,0,9,0,214,0,3,255,146,0,214,0,8,255,146,0,214,0,36,255,242,0,214,0,40,255,242,0,214,0,48,255,242,0,214,0,50,255,242,0,214,0,53,255,214,0,214,0,54,255,243,0,214,0,55,255,213,0,214,0,56,255,226,0,214,0,58,255,215,0,214,0,71,255,241,0,214,0,85,255,239,0,214,0,87,255,227,0,214,0,88,255,236,0,214,0,90,255,222,0,214,0,134,255,242,0,214,0,145,255,242,0,214,0,146,255,242,0,214,0,147,255,242,0,214,0,148,255,242,0,214,0,149,255,242,0,214,0,151,255,242,0,214,0,152,255,243,0,214,0,153,255,243,0,214,0,154,255,243,0,214,0,155,255,243,0,214,0,156,255,215,0,214,0,158,255,242,0,214,0,188,255,222,0,214,0,190,255,222,0,214,0,194,255,242,0,214,0,198,255,215,0,214,0,210,255,121,0,214,0,213,255,121,0,220,0,53,255,197,0,220,0,55,255,245,0,220,0,58,255,226,0,220,0,68,255,247,0,220,0,69,255,247,0,220,0,70,255,247,0,220,0,80,255,247,0,220,0,82,255,247,0,220,0,156,255,226,0,220,0,166,255,247,0,220,0,167,255,247,0,220,0,168,255,247,0,220,0,169,255,247,0,220,0,170,255,247,0,220,0,177,255,247,0,220,0,178,255,247,0,220,0,179,255,247,0,220,0,180,255,247,0,220,0,181,255,247,0,220,0,183,255,247,0,220,0,195,255,247,0,220,0,198,255,226,0,220,0,210,255,229,0,220,0,213,255,229,0,221,0,3,255,241,0,221,0,8,255,241,0,221,0,34,255,247,0,221,0,52,255,234,0,221,0,53,255,195,0,221,0,55,255,220,0,221,0,56,255,230,0,221,0,57,255,224,0,221,0,58,255,198,0,221,0,59,255,223,0,221,0,85,255,247,0,221,0,89,255,236,0,221,0,90,255,248,0,221,0,91,255,233,0,221,0,127,255,247,0,221,0,128,255,247,0,221,0,129,255,247,0,221,0,130,255,247,0,221,0,131,255,247,0,221,0,132,255,247,0,221,0,133,255,243,0,221,0,143,0,6,0,221,0,156,255,198,0,221,0,158,255,248,0,221,0,188,255,248,0,221,0,190,255,248,0,221,0,196,255,234,0,221,0,198,255,198,0,221,0,199,255,223,0,221,0,200,255,233,0,221,0,210,255,204,0,221,0,213,255,204,0,240,0,34,255,232,0,240,0,127,255,232,0,240,0,128,255,232,0,240,0,129,255,232,0,240,0,130,255,232,0,240,0,131,255,232,0,240,0,132,255,232,0,240,0,133,255,228,0,240,0,143,0,10,0,240,0,173,0,11,0,0,0,26,0,26,0,128,0,180,1,222,3,150,5,20,7,18,7,50,7,152,7,254,8,126,8,236,9,44,9,76,9,118,9,164,10,242,11,84,12,94,13,186,14,88,15,116,16,222,17,80,18,196,20,20,20,90,20,182,20,234,21,28,21,86,22,64,23,106,24,52,25,156,26,174,27,122,27,230,28,78,29,42,29,170,29,242,30,62,30,238,31,56,32,156,33,74,34,90,35,34,36,114,37,108,39,118,39,180,40,192,41,132,42,144,43,146,44,30,45,24,45,82,45,126,45,186,45,250,46,40,46,116,47,190,48,152,49,132,50,84,51,134,52,34,54,126,55,48,55,150,56,32,56,246,57,70,58,122,59,70,60,44,61,44,62,12,62,124,63,222,64,108,65,32,65,192,66,202,67,216,68,110,69,122,70,22,70,62,70,222,71,82,71,82,71,186,72,170,73,160,74,142,75,104,75,162,77,148,77,202,79,230,80,216,81,64,81,112,81,162,83,120,84,100,84,188,85,156,86,186,86,252,87,166,88,14,88,64,88,106,88,216,89,124,89,248,90,38,90,82,90,128,91,94,91,142,91,180,91,214,91,248,92,44,92,104,93,92,93,104,93,154,93,198,93,226,94,12,94,68,94,88,94,126,94,170,95,162,95,188,95,216,95,254,96,28,96,56,96,100,96,180,98,188,98,230,99,12,99,46,99,92,99,132,100,86,101,182,101,210,101,238,102,6,102,34,102,78,102,110,104,160,104,182,104,206,104,230,105,4,105,26,105,66,105,106,105,134,105,174,107,26,107,44,107,68,107,106,107,134,107,158,107,184,107,248,109,120,109,152,109,194,109,234,110,14,110,32,111,30,111,56,111,86,111,108,111,180,113,68,115,64,115,96,115,124,115,172,115,202,115,232,116,178,117,30,117,112,117,194,118,158,119,90,119,114,119,142,119,188,119,234,120,26,120,112,120,200,121,40,121,166,122,108,122,152,122,236,125,28,125,154,126,18,127,134,127,238,128,186,129,228,130,64,131,176,132,150,132,172,132,192,132,212,132,232,132,254,133,18,133,40,133,60,133,86,133,108,134,206,135,148,136,128,137,136,138,34,138,132,138,236,139,180,140,10,140,76,140,156,141,52,142,108,143,160,144,190,146,12,146,232,147,174,149,108,150,84,152,6,152,82,153,10,153,184,155,6,155,248,156,152,157,86,158,238,159,60,0,1,0,0,1,13,0,106,0,7,0,71,0,4,0,1,0,0,0,0,0,10,0,0,2,0,4,21,0,3,0,1,0,0,0,31,1,122,0,1,0,0,0,0,0,0,0,106,0,0,0,1,0,0,0,0,0,1,0,5,0,106,0,1,0,0,0,0,0,2,0,7,0,111,0,1,0,0,0,0,0,3,0,75,0,118,0,1,0,0,0,0,0,4,0,13,0,193,0,1,0,0,0,0,0,5,0,13,0,206,0,1,0,0,0,0,0,6,0,13,0,219,0,1,0,0,0,0,0,7,0,95,0,232,0,1,0,0,0,0,0,8,0,62,1,71,0,1,0,0,0,0,0,9,0,15,1,133,0,1,0,0,0,0,0,10,0,127,1,148,0,1,0,0,0,0,0,11,0,17,2,19,0,1,0,0,0,0,0,12,0,17,2,36,0,1,0,0,0,0,0,13,0,255,2,53,0,1,0,0,0,0,0,14,0,26,3,52,0,1,0,0,0,0,0,18,0,13,3,78,0,3,0,1,4,9,0,0,0,212,3,91,0,3,0,1,4,9,0,1,0,10,4,47,0,3,0,1,4,9,0,2,0,14,4,57,0,3,0,1,4,9,0,3,0,150,4,71,0,3,0,1,4,9,0,4,0,26,4,221,0,3,0,1,4,9,0,5,0,26,4,247,0,3,0,1,4,9,0,6,0,26,5,17,0,3,0,1,4,9,0,7,0,190,5,43,0,3,0,1,4,9,0,8,0,124,5,233,0,3,0,1,4,9,0,9,0,30,6,101,0,3,0,1,4,9,0,10,0,254,6,131,0,3,0,1,4,9,0,11,0,34,7,129,0,3,0,1,4,9,0,12,0,34,7,163,0,3,0,1,4,9,0,13,1,254,7,197,0,3,0,1,4,9,0,14,0,52,9,195,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,49,32,98,121,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,46,32,65,108,108,32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,67,97,98,105,110,82,101,103,117,108,97,114,80,97,98,108,111,73,109,112,97,108,108,97,114,105,46,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,73,103,105,110,111,77,97,114,105,110,105,46,119,119,119,46,105,107,101,114,110,46,99,111,109,58,32,67,97,98,105,110,32,66,111,108,100,58,32,50,48,49,48,67,97,98,105,110,32,82,101,103,117,108,97,114,86,101,114,115,105,111,110,32,49,46,48,48,53,67,97,98,105,110,45,82,101,103,117,108,97,114,67,97,98,105,110,32,82,101,103,117,108,97,114,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,102,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,46,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,49,32,98,121,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,49,32,98,121,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,32,65,108,108,32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,48,44,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,32,40,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,124,105,109,112,97,108,108,97,114,105,64,103,109,97,105,108,46,99,111,109,41,44,13,10,119,105,116,104,32,82,101,115,101,114,118,101,100,32,70,111,110,116,32,78,97,109,101,32,67,97,98,105,110,46,13,10,84,104,105,115,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,105,115,32,108,105,99,101,110,115,101,100,32,117,110,100,101,114,32,116,104,101,32,83,73,76,32,79,112,101,110,32,70,111,110,116,32,76,105,99,101,110,115,101,44,32,86,101,114,115,105,111,110,32,49,46,49,46,13,10,84,104,105,115,32,108,105,99,101,110,115,101,32,105,115,32,97,118,97,105,108,97,98,108,101,32,119,105,116,104,32,97,32,70,65,81,32,97,116,58,32,104,116,116,112,58,47,47,115,99,114,105,112,116,115,46,115,105,108,46,111,114,103,47,79,70,76,104,116,116,112,58,47,47,115,99,114,105,112,116,115,46,115,105,108,46,111,114,103,47,79,70,76,67,97,98,105,110,32,82,101,103,117,108,97,114,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,49,0,32,0,98,0,121,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,67,0,97,0,98,0,105,0,110,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,80,0,97,0,98,0,108,0,111,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,73,0,103,0,105,0,110,0,111,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,58,0,32,0,67,0,97,0,98,0,105,0,110,0,32,0,66,0,111,0,108,0,100,0,58,0,32,0,50,0,48,0,49,0,48,0,67,0,97,0,98,0,105,0,110,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,48,0,53,0,67,0,97,0,98,0,105,0,110,0,45,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,67,0,97,0,98,0,105,0,110,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,46,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,49,0,32,0,98,0,121,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,49,0,32,0,98,0,121,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,48,0,44,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,32,0,40,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,124,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,64,0,103,0,109,0,97,0,105,0,108,0,46,0,99,0,111,0,109,0,41,0,44,0,13,0,10,0,119,0,105,0,116,0,104,0,32,0,82,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,32,0,70,0,111,0,110,0,116,0,32,0,78,0,97,0,109,0,101,0,32,0,67,0,97,0,98,0,105,0,110,0,46,0,13,0,10,0,84,0,104,0,105,0,115,0,32,0,70,0,111,0,110,0,116,0,32,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,100,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,83,0,73,0,76,0,32,0,79,0,112,0,101,0,110,0,32,0,70,0,111,0,110,0,116,0,32,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,44,0,32,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,49,0,46,0,13,0,10,0,84,0,104,0,105,0,115,0,32,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,32,0,105,0,115,0,32,0,97,0,118,0,97,0,105,0,108,0,97,0,98,0,108,0,101,0,32,0,119,0,105,0,116,0,104,0,32,0,97,0,32,0,70,0,65,0,81,0,32,0,97,0,116,0,58,0,32,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,115,0,99,0,114,0,105,0,112,0,116,0,115,0,46,0,115,0,105,0,108,0,46,0,111,0,114,0,103,0,47,0,79,0,70,0,76,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,115,0,99,0,114,0,105,0,112,0,116,0,115,0,46,0,115,0,105,0,108,0,46,0,111,0,114,0,103,0,47,0,79,0,70,0,76,0,0,0,0,2,0,0,0,0,0,0,255,181,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,13,0,0,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,1,2,0,163,0,132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,1,3,0,138,0,131,0,147,1,4,1,5,0,141,1,6,0,136,1,7,0,222,1,8,0,158,0,170,0,245,0,244,0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200,0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0,240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109,0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129,0,236,0,238,0,186,0,255,1,0,0,215,0,176,0,177,0,228,0,229,0,187,0,230,0,231,0,166,1,9,0,216,0,225,0,221,0,217,0,178,0,179,0,182,0,183,0,196,0,180,0,181,0,197,0,130,0,194,0,135,0,171,0,198,0,190,0,191,1,10,1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,0,140,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,7,117,110,105,48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,14,112,101,114,105,111,100,99,101,110,116,101,114,101,100,7,117,110,105,48,48,66,57,7,117,110,105,48,50,51,55,7,117,110,105,50,48,55,48,7,117,110,105,50,48,55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,54,7,117,110,105,50,48,55,55,7,117,110,105,50,48,55,56,7,117,110,105,50,48,55,57,7,117,110,105,50,48,56,48,7,117,110,105,50,48,56,49,7,117,110,105,50,48,56,50,7,117,110,105,50,48,56,51,7,117,110,105,50,48,56,52,7,117,110,105,50,48,56,53,7,117,110,105,50,48,56,54,7,117,110,105,50,48,56,55,7,117,110,105,50,48,56,56,7,117,110,105,50,48,56,57,4,69,117,114,111,4,66,46,115,99,4,67,46,115,99,4,68,46,115,99,4,69,46,115,99,4,70,46,115,99,4,71,46,115,99,4,72,46,115,99,4,73,46,115,99,4,74,46,115,99,4,75,46,115,99,4,65,46,115,99,4,77,46,115,99,4,78,46,115,99,4,79,46,115,99,5,65,69,46,115,99,4,80,46,115,99,4,81,46,115,99,4,82,46,115,99,4,83,46,115,99,4,84,46,115,99,4,85,46,115,99,4,86,46,115,99,4,87,46,115,99,4,88,46,115,99,4,89,46,115,99,4,90,46,115,99,5,79,69,46,115,99,4,76,46,115,99,0,0,184,0,0,43,0,186,0,1,0,3,0,2,43,1,186,0,4,0,2,0,2,43,1,191,0,4,0,58,0,47,0,37,0,28,0,18,0,0,0,8,43,191,0,5,0,77,0,63,0,50,0,34,0,18,0,0,0,8,43,0,191,0,1,0,79,0,65,0,50,0,34,0,18,0,0,0,8,43,191,0,2,0,66,0,54,0,42,0,32,0,18,0,0,0,8,43,191,0,3,0,95,0,78,0,61,0,44,0,22,0,0,0,8,43,0,186,0,6,0,7,0,7,43,184,0,0,32,69,125,105,24,68,186,0,16,0,8,0,1,115,186,0,144,0,8,0,1,115,186,0,208,0,8,0,1,115,186,0,144,0,10,0,1,115,186,0,240,0,10,0,1,115,186,0,32,0,10,0,1,116,186,0,80,0,10,0,1,116,186,0,127,0,10,0,1,116,186,0,32,0,10,0,1,115,186,0,207,0,12,0,1,115,186,0,239,0,12,0,1,115,186,0,79,0,14,0,1,116,186,0,63,0,14,0,1,115,186,0,175,0,14,0,1,115,186,0,223,0,14,0,1,115,186,0,31,0,14,0,1,116,186,0,127,0,14,0,1,116,186,0,223,0,16,0,1,115,186,0,255,0,16,0,1,115,186,0,111,0,16,0,1,116,186,0,127,0,16,0,1,116,186,0,143,0,16,0,1,116,0,0,1,13,1,1,1,1,50,1,1,46,1,10,10,1,1,1,1,1,1,1,1,1,1,1,1,23,1,1,1,1,1,1,1,1,18,28,1,1,10,1,38,1,1,14,50,50,1,1,9,50,10,1,10,1,1,11,10,14,21,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,24,1,1,13,37,15,1,1,36,36,15,14,1,13,12,10,12,1,1,6,25,6,1,1,30,23,1,1,1,29,1,1,1,1,12,27,1,1,1,4,1,1,1,1,1,1,1,1,1,12,1,25,1,1,1,1,1,1,1,1,1,10,38,38,38,38,50,50,50,50,1,50,10,10,10,10,10,1,10,1,1,1,1,1,1,36,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,39,18,13,13,13,13,1,18,1,10,1,1,8,25,1,14,1,1,1,48,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,40,1,30,1,1,1,50,1,1,1,1,40,33,1,45,28,32,1,1,19,1,1,10,1,45,34,1,15,1,1,15,28,1,17,1,1,1,11,1,12,20,1,0,0,0,0,0,0,42,0,0,1,16,9,11,2,2,2,4,6,5,8,6,2,3,3,4,4,2,4,2,5,6,3,5,5,5,5,5,5,5,5,2,2,4,5,4,4,7,6,5,5,7,5,5,6,6,2,2,5,5,7,6,6,5,6,5,5,5,6,6,9,6,5,5,3,5,3,5,5,3,4,5,4,5,5,3,4,5,2,2,4,2,8,5,5,5,5,3,4,3,5,4,6,4,5,4,3,2,3,4,2,2,4,5,6,6,2,4,4,6,3,5,5,4,6,3,4,3,3,3,5,6,2,3,2,3,5,6,7,8,4,6,6,6,6,6,6,8,5,5,5,5,5,2,2,2,2,7,6,6,6,6,6,6,4,6,7,7,7,7,5,5,5,4,4,4,4,4,4,7,4,5,5,5,5,2,2,2,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,2,10,8,5,4,5,5,4,3,2,4,4,3,5,5,5,2,2,2,4,3,4,4,4,3,6,11,3,3,4,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,6,7,5,5,6,4,4,5,6,2,3,5,5,6,6,6,7,5,6,5,5,5,6,5,8,5,5,4,8,4,0,10,12,3,2,2,4,7,5,8,6,2,3,3,4,5,2,4,2,5,7,4,5,5,6,5,6,5,6,6,2,2,4,5,4,4,7,6,6,6,7,6,5,7,7,3,3,6,5,8,7,8,6,8,6,6,6,7,6,10,6,6,5,3,5,3,5,6,3,5,6,5,6,5,3,5,6,2,2,5,3,9,6,6,6,6,3,5,3,6,5,7,5,5,5,3,2,3,5,2,2,5,5,6,7,2,5,4,7,3,6,6,4,7,3,5,3,3,3,6,6,2,3,2,4,6,7,7,9,4,6,6,6,6,6,6,9,6,6,6,6,6,3,3,3,3,7,7,8,8,8,8,8,4,8,7,7,7,7,6,6,6,5,5,5,5,5,5,8,5,5,5,5,5,2,2,2,2,5,6,6,6,6,6,6,6,6,6,6,6,6,5,6,5,6,5,2,11,9,6,5,6,5,5,4,2,4,4,3,5,5,6,2,2,2,4,4,4,4,5,3,7,12,3,3,4,3,3,3,3,3,3,4,2,3,3,4,3,3,3,4,3,7,7,5,5,6,5,5,6,6,2,2,5,6,7,6,7,7,5,7,5,5,5,6,6,8,6,5,5,9,4,0,11,13,3,2,3,4,8,6,9,7,2,3,3,5,5,2,5,2,6,8,4,6,6,6,6,6,6,7,6,2,2,4,6,4,5,8,7,7,7,8,6,6,7,8,3,3,6,6,9,8,8,6,8,7,6,6,8,7,11,7,6,6,4,6,4,6,6,3,5,6,5,6,6,4,5,6,2,2,5,3,10,6,6,6,6,4,5,4,6,6,8,6,6,5,3,3,3,5,2,2,5,6,7,7,3,5,5,8,4,7,7,5,8,4,5,3,3,3,7,7,3,3,2,4,7,8,8,10,5,7,7,7,7,7,7,10,7,6,6,6,6,3,3,3,3,8,8,8,8,8,8,8,5,8,8,8,8,8,6,6,6,5,5,5,5,5,5,9,5,6,6,6,6,2,2,2,2,6,6,6,6,6,6,6,7,6,6,6,6,6,6,6,6,7,5,2,12,10,6,5,6,6,5,4,2,5,5,3,6,6,7,2,2,2,4,4,5,5,5,3,7,13,4,4,4,4,3,4,3,4,4,5,3,4,4,4,4,4,4,4,4,8,8,6,6,7,5,5,6,7,3,3,6,6,8,7,8,8,6,8,6,6,5,7,6,9,6,6,6,10,5,0,12,14,3,3,3,5,8,6,10,7,2,3,3,5,6,3,5,2,6,9,4,6,7,7,6,7,6,7,7,2,3,5,6,5,5,9,7,7,7,9,7,6,8,9,3,3,7,6,10,8,9,7,9,7,7,6,9,8,12,7,7,7,4,6,4,6,7,4,6,7,5,7,6,4,6,7,3,3,6,3,11,7,7,7,7,4,5,4,7,6,9,6,6,6,4,3,4,5,3,3,6,6,8,8,3,5,5,9,4,7,7,5,9,4,6,4,4,4,7,7,3,4,3,4,7,9,9,11,5,7,7,7,7,7,7,10,7,7,7,7,7,3,3,3,3,9,8,9,9,9,9,9,5,9,9,9,9,9,7,7,7,6,6,6,6,6,6,10,5,6,6,6,6,3,3,3,3,6,7,7,7,7,7,7,7,7,7,7,7,7,6,7,6,7,5,3,13,11,7,5,7,7,6,4,3,5,5,4,6,6,7,2,2,3,5,5,5,5,6,4,8,14,4,4,5,4,4,4,3,4,4,5,3,4,4,4,4,4,4,4,4,8,9,6,6,8,6,6,7,8,3,3,6,7,9,7,8,9,6,8,6,6,6,8,7,10,6,6,6,11,5,0,13,16,3,3,3,5,9,7,11,8,2,3,3,6,6,3,6,3,7,9,5,7,7,7,7,7,7,8,7,3,3,5,7,5,6,9,8,8,8,9,7,7,9,9,3,3,8,7,11,9,10,7,10,8,8,7,9,9,13,8,7,7,4,7,4,7,7,4,6,7,6,7,7,4,7,7,3,3,6,3,11,7,7,7,7,4,6,4,7,6,9,6,7,6,4,3,4,6,3,3,6,7,8,9,3,6,5,9,5,7,8,6,9,4,6,4,4,4,8,8,3,4,3,5,7,9,9,12,6,8,8,8,8,8,8,11,8,7,7,7,7,3,3,3,3,9,9,10,10,10,10,10,6,10,9,9,9,9,7,7,7,6,6,6,6,6,6,10,6,7,7,7,7,3,3,3,3,7,7,7,7,7,7,7,8,7,7,7,7,7,7,7,7,8,6,3,14,11,8,6,7,7,6,5,3,6,6,4,7,7,8,2,2,3,5,5,6,6,6,4,9,16,4,4,5,4,4,4,4,5,4,6,3,4,4,5,4,5,4,5,5,9,9,7,7,8,6,6,8,8,3,3,7,7,9,8,9,10,7,9,7,7,6,8,7,11,7,7,6,12,6,0,14,17,4,3,3,6,10,7,12,9,3,4,4,6,6,3,6,3,7,10,5,7,8,8,8,8,7,9,8,3,3,6,7,6,6,10,9,8,9,10,8,7,9,10,3,4,8,7,11,10,11,8,11,8,8,7,10,9,14,8,8,8,5,7,5,7,8,4,7,8,6,8,7,5,7,8,3,3,6,3,13,8,8,8,8,5,6,5,7,7,10,7,7,7,4,3,4,6,3,3,7,7,9,9,3,6,6,10,5,8,8,6,10,5,7,4,4,4,8,9,3,4,3,5,8,10,10,12,6,9,9,9,9,9,9,12,9,8,8,8,8,3,3,3,3,10,10,11,11,11,11,11,6,11,10,10,10,10,8,8,8,7,7,7,7,7,7,11,6,7,7,7,7,3,3,3,3,7,8,8,8,8,8,8,8,8,7,7,7,7,7,8,7,9,6,3,15,13,8,6,8,8,7,5,3,6,6,4,7,7,8,3,2,3,6,5,6,6,6,4,9,17,5,5,6,5,4,5,4,5,5,6,3,5,5,5,5,5,5,5,5,10,10,7,8,9,7,6,8,9,3,3,7,7,10,9,10,10,7,10,8,7,7,9,8,12,8,7,7,13,6,0,15,18,4,3,4,6,11,8,13,9,3,4,4,6,7,3,6,3,8,11,5,8,8,8,8,9,8,9,9,3,3,6,8,6,7,11,9,9,9,11,8,8,10,11,4,4,9,8,12,11,12,9,12,9,9,8,11,10,15,9,9,8,5,8,5,8,8,5,7,8,7,8,8,5,7,8,3,3,7,4,13,8,8,8,8,5,6,5,8,7,11,7,8,7,4,3,4,7,3,3,7,8,9,10,3,7,6,11,5,8,9,6,11,5,7,5,5,5,9,9,4,5,3,6,8,11,11,13,7,9,9,9,9,9,9,13,9,8,8,8,8,4,4,4,4,11,11,12,12,12,12,12,7,12,11,11,11,11,9,9,8,7,7,7,7,7,7,12,7,8,8,8,8,3,3,3,3,8,8,8,8,8,8,8,9,9,8,8,8,8,8,8,8,9,7,3,16,13,9,6,9,8,7,5,3,7,7,4,8,8,9,3,3,3,6,6,7,6,7,5,10,18,5,5,6,5,5,5,4,5,5,6,4,5,5,5,5,5,5,6,5,11,11,8,8,9,7,7,9,10,4,4,8,8,11,9,10,11,8,10,8,8,7,9,8,13,8,8,7,14,7,0,16,19,4,4,4,6,11,8,13,10,3,4,4,7,7,3,7,3,9,11,6,8,9,9,9,9,8,10,9,3,3,6,8,6,7,12,10,10,10,12,9,8,11,12,4,4,9,8,13,11,12,9,12,10,9,9,12,10,16,10,9,9,5,8,5,8,9,5,8,9,7,9,8,5,8,9,3,3,7,4,14,9,9,9,9,5,7,5,8,8,12,8,8,8,5,4,5,7,4,4,8,8,10,11,4,7,7,12,6,9,10,7,12,5,8,5,5,5,9,10,4,5,3,6,9,11,12,14,7,10,10,10,10,10,10,14,10,9,9,9,9,4,4,4,4,12,11,12,12,12,12,12,7,12,12,12,12,12,9,9,9,8,8,8,8,8,8,13,7,8,8,8,8,3,3,3,3,8,9,9,9,9,9,9,9,9,8,8,8,8,8,9,8,10,7,3,17,14,9,7,9,9,8,6,3,7,7,5,8,8,10,3,3,3,6,6,7,7,7,5,11,19,5,5,7,5,5,5,5,6,5,7,4,5,5,6,5,6,5,6,6,11,12,9,9,10,8,7,9,10,4,4,8,9,11,10,11,12,8,11,9,8,7,10,9,13,9,8,8,15,7,0,17,20,4,4,4,7,12,9,14,10,3,4,4,7,8,4,7,3,9,12,6,9,9,10,9,10,9,10,10,3,4,7,9,7,8,12,10,10,10,12,9,9,11,13,4,4,10,9,14,12,13,10,13,10,10,9,12,11,17,10,10,9,6,9,6,9,10,5,8,9,8,9,9,6,8,10,4,4,8,4,15,10,9,9,9,5,7,6,9,8,12,8,9,8,5,4,5,8,4,4,8,9,11,11,4,8,7,12,6,10,10,7,12,6,8,5,5,5,10,11,4,5,4,6,10,12,12,15,8,10,10,10,10,10,10,15,10,9,9,9,9,4,4,4,4,12,12,13,13,13,13,13,7,13,12,12,12,12,10,10,9,8,8,8,8,8,8,14,8,9,9,9,9,4,4,4,4,9,10,9,9,9,9,9,10,9,9,9,9,9,9,9,9,10,8,4,18,15,10,7,10,9,8,6,4,8,8,5,9,9,10,3,3,4,7,6,8,7,8,5,11,20,5,5,7,6,5,5,5,6,6,7,4,6,6,6,6,6,6,6,6,12,12,9,9,11,8,8,10,11,4,4,9,9,12,10,11,13,9,11,9,9,8,11,10,14,9,9,8,16,7,0,18,22,5,4,4,7,13,9,15,11,3,5,5,8,8,4,8,4,10,13,6,9,10,10,10,10,9,11,10,4,4,7,9,7,8,13,11,11,11,13,10,9,12,13,5,5,10,9,15,13,14,10,14,11,11,10,13,12,18,11,10,10,6,9,6,9,10,5,9,10,8,10,9,6,9,10,4,4,8,4,16,10,10,10,10,6,7,6,9,9,13,9,9,8,5,4,5,8,4,4,9,9,11,12,4,8,8,13,6,10,11,8,13,6,9,5,6,5,11,11,4,5,4,7,10,13,13,16,8,11,11,11,11,11,11,16,11,10,10,10,10,5,5,5,5,13,13,14,14,14,14,14,8,14,13,13,13,13,10,10,10,9,9,9,9,9,9,14,8,9,9,9,9,4,4,4,4,9,10,10,10,10,10,10,11,10,9,9,9,9,9,10,9,11,8,4,19,16,11,7,10,10,8,6,4,8,8,5,10,9,11,3,3,4,7,7,8,8,8,6,12,22,6,6,7,6,6,6,5,6,6,8,4,6,6,6,6,6,6,7,6,13,13,10,10,11,9,8,11,12,4,4,9,10,13,11,12,13,9,12,10,9,8,11,10,15,10,9,9,17,8,0,19,23,5,4,5,8,13,10,16,12,3,5,5,8,9,4,8,4,10,14,7,10,10,11,10,11,10,12,11,4,4,8,10,8,8,14,12,11,12,14,11,10,13,14,5,5,11,10,15,13,15,11,15,11,11,10,14,12,18,11,11,10,6,10,6,10,11,6,9,11,9,11,10,6,9,11,4,4,9,5,17,11,10,11,11,6,8,6,10,9,14,9,10,9,6,4,6,9,4,4,9,10,12,13,4,9,8,14,7,11,11,8,14,6,9,6,6,6,11,12,5,6,4,7,11,14,14,17,9,12,12,12,12,12,12,16,12,11,11,11,11,5,5,5,5,14,13,15,15,15,15,15,8,15,14,14,14,14,11,11,11,9,9,9,9,9,9,15,9,10,10,10,10,4,4,4,4,10,11,10,10,10,10,10,11,11,10,10,10,10,10,11,10,12,9,4,20,17,11,8,11,10,9,7,4,8,8,6,10,10,11,4,3,4,8,7,8,8,9,6,13,23,6,6,8,6,6,6,6,7,6,8,5,6,6,7,6,7,6,7,7,13,14,10,10,12,9,9,11,12,5,5,10,10,14,12,13,14,10,13,10,10,9,12,11,16,10,10,9,18,8,0,20,24,5,5,5,8,14,10,17,12,4,5,5,9,9,4,8,4,11,14,7,10,11,11,11,11,10,12,11,4,4,8,10,8,9,14,12,12,12,15,11,10,13,15,5,5,12,10,16,14,15,11,15,12,12,11,14,13,20,12,11,11,7,11,7,10,11,6,10,11,9,11,10,7,10,11,4,4,9,5,18,11,11,11,11,6,8,7,10,10,15,9,10,9,6,5,6,9,5,4,10,10,13,13,5,9,8,14,7,11,12,8,14,7,10,6,6,6,12,12,5,6,4,7,11,14,15,18,9,12,12,12,12,12,12,17,12,11,11,11,11,5,5,5,5,15,14,15,15,15,15,15,9,15,15,15,15,15,11,11,11,10,10,10,10,10,10,16,9,10,10,10,10,4,4,4,4,10,11,11,11,11,11,11,12,11,10,10,10,10,10,12,10,12,9,4,21,18,12,8,11,11,9,7,4,9,9,6,11,10,12,4,3,4,8,8,9,8,9,6,14,24,6,6,8,7,6,6,6,7,6,9,5,7,7,7,7,7,7,7,7,14,15,11,11,13,10,9,12,13,5,5,11,11,14,12,13,15,10,13,11,10,9,13,11,17,11,10,10,18,9,0,21,25,5,5,5,8,15,11,18,13,4,5,5,9,10,5,9,4,11,15,7,11,11,12,11,12,11,13,12,4,5,9,11,8,9,15,13,13,13,15,12,11,14,16,5,5,12,11,17,15,16,12,16,13,12,11,15,14,20,13,12,12,7,11,7,11,12,6,10,12,10,12,11,7,10,12,4,4,9,5,18,12,12,12,12,7,9,7,11,10,15,10,11,10,6,5,6,10,5,5,10,11,13,14,5,10,9,15,7,12,13,9,15,7,10,6,7,6,12,13,5,6,5,8,12,15,15,19,9,13,13,13,13,13,13,18,13,12,12,12,12,5,5,5,5,15,15,16,16,16,16,16,9,16,15,15,15,15,12,12,12,10,10,10,10,10,10,17,10,11,11,11,11,4,4,4,4,11,12,12,12,12,12,12,12,12,11,11,11,11,11,12,11,13,10,4,22,19,12,9,12,12,10,7,4,9,9,6,11,11,12,4,4,5,8,8,9,9,10,6,14,25,7,7,9,7,6,7,6,7,7,9,5,7,7,8,7,7,7,8,7,15,15,11,11,13,10,10,12,14,5,5,11,11,15,13,14,16,11,14,11,11,10,13,12,18,11,11,10,19,9,0,22,26,6,5,5,9,15,11,18,13,4,6,6,9,10,5,9,4,12,16,8,12,12,12,12,13,11,13,13,4,5,9,11,9,10,16,14,13,14,16,12,12,15,16,6,6,13,11,18,15,17,13,17,13,13,12,16,14,21,13,12,12,7,12,7,11,12,7,11,12,10,12,11,7,11,12,5,5,10,5,19,12,12,12,12,7,9,7,12,11,16,10,11,10,7,5,7,10,5,5,11,11,14,15,5,10,9,16,8,12,13,9,16,7,11,7,7,7,13,14,5,7,5,8,12,16,16,19,10,14,14,14,14,14,14,19,14,12,12,12,12,6,6,6,6,16,15,17,17,17,17,17,10,17,16,16,16,16,12,13,12,11,11,11,11,11,11,18,10,11,11,11,11,5,5,5,5,11,12,12,12,12,12,12,13,13,12,12,12,12,11,13,11,14,10,5,24,20,13,9,12,12,10,8,5,10,10,6,12,11,13,4,4,5,9,8,10,9,10,7,15,26,7,7,9,7,7,7,6,8,7,9,5,7,7,8,7,8,7,8,8,15,16,12,12,14,11,10,13,14,5,5,12,12,16,14,15,16,11,15,12,11,10,14,12,18,12,11,11,20,10,0,23,28,6,5,6,9,16,12,19,14,4,6,6,10,11,5,10,5,12,16,8,12,13,13,12,13,12,14,13,5,5,9,12,9,10,17,14,14,14,17,13,12,15,17,6,6,13,12,19,16,18,13,18,14,13,12,17,15,22,14,13,13,8,12,8,12,13,7,11,13,10,13,12,8,11,13,5,5,10,5,20,13,13,13,13,7,10,8,12,11,17,11,12,11,7,5,7,10,5,5,11,12,14,16,5,10,10,17,8,13,14,10,17,8,11,7,7,7,14,14,5,7,5,9,13,16,17,20,10,14,14,14,14,14,14,20,14,13,13,13,13,6,6,6,6,17,16,18,18,18,18,18,10,18,17,17,17,17,13,13,13,11,11,11,11,11,11,18,10,12,12,12,12,5,5,5,5,12,13,13,13,13,13,13,14,13,12,12,12,12,12,13,12,14,10,5,25,21,13,10,13,13,11,8,5,10,10,7,12,12,14,4,4,5,9,9,10,10,11,7,16,28,7,7,9,8,7,7,7,8,7,10,5,8,8,8,8,8,8,9,8,16,17,12,12,14,11,11,13,15,6,6,12,12,16,14,15,17,12,15,12,12,11,14,13,19,12,12,11,21,10,0,24,29,6,5,6,10,17,12,20,15,4,6,6,10,11,5,10,5,13,17,9,13,13,13,13,14,12,15,14,5,5,10,12,10,11,17,15,14,15,17,13,13,16,18,6,6,14,12,19,17,18,14,18,14,14,13,17,15,23,14,14,13,8,13,8,12,14,7,12,13,11,13,12,8,12,13,5,5,11,6,21,13,13,13,13,8,10,8,13,12,17,11,12,11,7,6,7,11,5,5,11,12,15,16,6,11,10,17,8,14,14,10,17,8,12,7,7,7,14,15,6,7,5,9,14,17,18,21,11,15,15,15,15,15,15,21,15,13,13,13,13,6,6,6,6,17,17,18,18,18,18,18,11,18,17,17,17,17,14,14,13,12,12,12,12,12,12,19,11,12,12,12,12,5,5,5,5,12,13,13,13,13,13,13,14,14,13,13,13,13,12,14,12,15,11,5,26,21,14,10,14,13,11,8,5,11,11,7,13,12,14,4,4,5,10,9,11,10,11,7,16,29,8,8,10,8,7,8,7,8,8,10,6,8,8,9,8,8,8,9,8,17,17,13,13,15,12,11,14,16,6,6,13,13,17,15,16,18,12,16,13,12,11,15,13,20,13,12,12,22,11,0,25,30,6,6,6,10,18,13,21,15,5,7,7,11,12,5,11,5,13,18,9,13,14,14,14,14,13,15,14,5,5,10,13,10,11,18,15,15,15,18,14,13,17,19,6,6,14,13,20,18,19,14,19,15,15,13,18,16,24,15,14,14,8,13,8,13,14,8,12,14,11,14,13,8,12,14,5,5,11,6,22,14,14,14,14,8,10,8,13,12,18,12,13,12,7,6,7,11,6,6,12,13,16,17,6,11,11,18,9,14,15,11,18,8,12,8,8,8,15,16,6,8,5,9,14,18,18,22,11,15,15,15,15,15,15,22,15,14,14,14,14,6,6,6,6,18,18,19,19,19,19,19,11,19,18,18,18,18,14,14,14,12,12,12,12,12,12,20,11,13,13,13,13,5,5,5,5,13,14,14,14,14,14,14,15,14,13,13,13,13,13,15,13,15,11,5,27,23,15,10,14,14,12,9,5,11,11,7,13,13,15,5,4,5,10,9,11,11,12,8,17,30,8,8,10,8,8,8,7,9,8,11,6,8,8,9,8,9,8,9,9,18,18,13,13,16,12,11,15,16,6,6,13,13,18,15,17,19,13,17,13,13,12,16,14,21,14,13,12,23,11,0,26,31,7,6,6,10,18,13,22,16,5,7,7,11,12,6,11,5,14,19,9,14,14,15,14,15,13,16,15,5,6,11,13,11,11,19,16,16,16,19,14,14,17,19,7,7,15,13,21,18,20,15,20,16,15,14,19,17,25,16,15,14,9,14,9,13,15,8,12,14,12,14,13,9,13,14,6,6,12,6,23,15,14,14,14,8,11,9,14,13,19,12,13,12,8,6,8,12,6,6,12,13,16,18,6,12,11,19,9,15,16,11,19,9,13,8,8,8,15,16,6,8,6,10,15,19,19,23,12,16,16,16,16,16,16,22,16,14,14,14,14,7,7,7,7,19,18,20,20,20,20,20,11,20,19,19,19,19,15,15,14,12,12,12,12,12,12,21,12,13,13,13,13,6,6,6,6,13,15,14,14,14,14,14,15,15,14,14,14,14,13,15,13,16,12,6,28,23,15,11,15,14,12,9,6,12,12,8,14,13,15,5,4,6,10,10,12,11,12,8,18,31,8,8,11,9,8,8,8,9,8,11,6,9,9,9,9,9,9,10,9,18,19,14,14,16,13,12,15,17,6,6,14,14,19,16,17,19,13,17,14,13,12,16,15,22,14,13,13,24,11,0,27,32,7,6,7,11,19,14,23,17,5,7,7,12,13,6,11,6,14,19,10,14,15,15,15,15,14,16,15,6,6,11,14,11,12,20,17,16,17,20,15,14,18,20,7,7,16,14,22,19,21,15,21,16,16,14,20,17,26,16,15,15,9,14,9,14,15,8,13,15,12,15,14,9,13,15,6,6,12,6,24,15,15,15,15,9,11,9,14,13,20,13,14,13,8,6,8,12,6,6,13,14,17,18,6,12,11,19,9,15,16,11,19,9,13,8,8,8,16,17,6,8,6,10,15,19,20,24,12,17,17,17,17,17,17,23,17,15,15,15,15,7,7,7,7,20,19,21,21,21,21,21,12,21,20,20,20,20,15,15,15,13,13,13,13,13,13,22,12,14,14,14,14,6,6,6,6,14,15,15,15,15,15,15,16,15,14,14,14,14,14,16,14,17,12,6,29,24,16,11,15,15,13,9,6,12,12,8,14,14,16,5,5,6,11,10,12,11,12,8,18,32,9,9,11,9,8,9,8,9,9,12,6,9,9,10,9,9,9,10,9,19,20,14,15,17,13,12,16,17,7,7,14,14,19,17,18,20,14,18,15,14,13,17,15,23,15,14,13,25,12,0,28,34,7,6,7,11,20,14,24,17,5,7,7,12,13,6,12,6,15,20,10,15,15,16,15,16,14,17,16,6,6,11,14,11,12,20,17,17,17,20,16,15,19,21,7,7,16,14,23,20,22,16,22,17,16,15,20,18,27,17,16,15,9,15,9,14,16,8,13,16,13,16,14,9,14,15,6,6,13,7,25,16,15,16,16,9,12,9,15,14,20,13,14,13,8,6,8,13,6,6,13,14,18,19,7,13,12,20,10,16,17,12,20,9,14,9,9,8,17,17,7,8,6,10,16,20,20,25,13,17,17,17,17,17,17,24,17,16,16,16,16,7,7,7,7,20,20,22,22,22,22,22,12,22,20,20,20,20,16,16,16,13,13,13,13,13,13,22,13,14,14,14,14,6,6,6,6,14,16,15,15,15,15,15,17,16,15,15,15,15,14,16,14,17,13,6,30,25,16,12,16,15,13,10,6,12,12,8,15,14,17,5,5,6,11,11,12,12,13,9,19,34,9,9,11,9,9,9,8,10,9,12,7,9,9,10,9,10,9,10,10,20,20,15,15,18,14,13,16,18,7,7,15,15,20,17,19,21,14,19,15,14,13,18,16,23,15,14,14,26,12,0,29,35,7,7,7,12,20,15,24,18,5,8,8,12,13,6,12,6,15,21,10,15,16,16,16,16,15,18,17,6,6,12,15,12,13,21,18,17,18,21,16,15,19,22,7,7,17,15,24,20,22,17,22,17,17,15,21,19,28,17,16,16,9,15,9,15,16,9,14,16,13,16,15,10,14,16,6,6,13,7,25,16,16,16,16,9,12,10,15,14,21,14,15,14,9,7,9,13,7,7,14,15,18,20,7,13,12,21,10,16,17,12,21,10,14,9,9,9,17,18,7,9,6,11,16,21,21,26,13,18,18,18,18,18,18,25,18,16,16,16,16,7,7,7,7,21,20,22,22,22,22,22,13,22,21,21,21,21,16,17,16,14,14,14,14,14,14,23,13,15,15,15,15,6,6,6,6,15,16,16,16,16,16,16,17,17,15,15,15,15,15,17,15,18,13,6,31,26,17,12,16,16,14,10,6,13,13,8,15,15,17,5,5,6,11,11,13,12,13,9,20,35,9,9,12,10,9,9,8,10,9,13,7,10,10,10,10,10,10,11,10,20,21,16,16,18,14,13,17,19,7,7,15,15,21,18,19,22,15,19,16,15,14,18,16,24,16,15,14,27,13,0,30,36,8,7,7,12,21,15,25,18,5,8,8,13,14,6,13,6,16,21,11,16,16,17,16,17,15,18,17,6,6,12,15,12,13,22,18,18,18,22,17,16,20,22,8,8,17,15,24,21,23,17,23,18,18,16,22,19,29,18,17,16,10,16,10,15,17,9,14,17,14,17,15,10,15,16,6,6,13,7,26,17,17,17,17,10,12,10,16,15,22,14,15,14,9,7,9,14,7,7,14,15,19,20,7,14,13,22,10,17,18,13,22,10,15,9,9,9,18,19,7,9,6,11,17,22,22,27,13,18,18,18,18,18,18,26,18,17,17,17,17,8,8,8,8,22,21,23,23,23,23,23,13,23,22,22,22,22,17,17,17,14,14,14,14,14,14,24,14,15,15,15,15,6,6,6,6,16,17,17,17,17,17,17,18,17,16,16,16,16,15,17,15,18,14,6,32,27,18,12,17,16,14,11,6,13,13,9,16,15,18,6,5,6,12,11,13,13,14,9,20,36,10,10,12,10,9,10,9,10,10,13,7,10,10,11,10,10,10,11,10,21,22,16,16,19,15,14,17,19,7,7,16,16,21,18,20,22,15,20,16,15,14,19,17,25,16,15,14,28,13,0,31,37,8,7,8,12,22,16,26,19,6,8,8,13,14,7,13,6,16,22,11,16,17,17,17,18,16,19,18,6,7,13,16,13,14,22,19,19,19,23,17,16,21,23,8,8,18,16,25,22,24,18,24,19,18,17,22,20,30,19,18,17,10,16,10,16,18,9,15,17,14,17,16,10,15,17,7,7,14,7,27,17,17,17,17,10,13,10,16,15,22,15,16,15,9,7,9,14,7,7,15,16,19,21,7,14,13,22,11,17,18,13,22,10,15,9,10,9,18,19,7,9,7,11,17,22,23,27,14,19,19,19,19,19,19,27,19,17,17,17,17,8,8,8,8,23,22,24,24,24,24,24,14,24,23,23,23,23,18,18,17,15,15,15,15,15,15,25,14,16,16,16,16,7,7,7,7,16,17,17,17,17,17,17,18,18,16,16,16,16,16,18,16,19,14,7,33,28,18,13,18,17,15,11,7,14,14,9,16,16,18,6,5,7,12,12,14,13,14,9,21,37,10,10,13,10,10,10,9,11,10,13,7,10,10,11,10,11,10,12,11,22,23,17,17,20,15,14,18,20,7,7,16,17,22,19,21,23,16,21,17,16,15,19,17,26,17,16,15,29,14,0,32,38,8,7,8,13,23,16,27,20,6,8,8,14,15,7,14,7,17,23,11,17,18,18,17,18,16,19,18,7,7,13,16,13,14,23,20,19,20,23,18,17,22,24,8,8,18,16,26,23,25,18,25,19,19,17,23,21,31,19,18,18,10,17,10,16,18,10,15,18,15,18,16,11,16,17,7,7,14,8,28,18,18,18,18,10,13,11,17,16,23,15,16,15,10,7,10,15,7,7,15,16,20,22,7,15,14,23,11,18,19,14,23,11,16,10,10,10,19,20,8,10,7,12,18,23,23,28,14,20,20,20,20,20,20,28,20,18,18,18,18,8,8,8,8,23,23,25,25,25,25,25,14,25,23,23,23,23,18,18,18,15,15,15,15,15,15,26,15,16,16,16,16,7,7,7,7,17,18,18,18,18,18,18,19,18,17,17,17,17,16,19,16,20,15,7,34,29,19,13,18,18,15,11,7,14,14,9,17,16,19,6,5,7,13,12,14,14,15,10,22,38,10,10,13,11,10,10,9,11,10,14,8,11,11,11,11,11,11,12,11,23,23,17,17,20,16,15,19,21,8,8,17,17,23,20,21,24,16,21,17,16,15,20,18,27,17,16,15,29,14,0,33,40,8,7,8,13,23,17,28,20,6,9,9,14,15,7,14,7,18,24,12,17,18,18,18,19,17,20,19,7,7,13,17,13,15,24,20,20,20,24,18,17,22,25,8,8,19,17,27,23,25,19,25,20,19,18,24,21,32,20,19,18,11,17,11,17,19,10,16,18,15,18,17,11,16,18,7,7,15,8,29,18,18,18,18,11,14,11,17,16,24,16,17,16,10,8,10,15,7,7,16,17,21,22,8,15,14,24,12,19,20,14,24,11,16,10,10,10,20,21,8,10,7,12,19,24,24,29,15,20,20,20,20,20,20,29,20,18,18,18,18,8,8,8,8,24,23,25,25,25,25,25,14,25,24,24,24,24,19,19,18,16,16,16,16,16,16,26,15,17,17,17,17,7,7,7,7,17,18,18,18,18,18,18,20,19,17,17,17,17,17,19,17,20,15,7,35,30,19,14,19,18,16,12,7,15,15,10,17,17,20,6,6,7,13,13,15,14,15,10,22,40,11,11,13,11,10,11,10,11,11,14,8,11,11,12,11,11,11,12,11,23,24,18,18,21,16,15,19,21,8,8,17,18,24,20,22,24,17,22,18,17,16,21,19,28,18,17,16,30,15,0,34,41,9,8,8,14,24,17,29,21,6,9,9,14,16,7,14,7,18,24,12,18,19,19,18,19,17,21,19,7,7,14,17,14,15,25,21,20,21,25,19,18,23,25,9,9,20,17,28,24,26,19,26,21,20,18,25,22,33,20,19,19,11,18,11,17,19,10,16,19,15,19,17,11,17,18,7,7,15,8,30,19,19,19,19,11,14,11,18,17,25,16,17,16,10,8,10,15,8,8,16,17,21,23,8,16,14,24,12,19,20,14,24,11,17,10,11,10,20,21,8,10,7,13,19,24,25,30,15,21,21,21,21,21,21,29,21,19,19,19,19,9,9,9,9,25,24,26,26,26,26,26,15,26,25,25,25,25,19,19,19,16,16,16,16,16,16,27,15,17,17,17,17,7,7,7,7,18,19,19,19,19,19,19,20,19,18,18,18,18,17,20,17,21,15,7,36,31,20,14,19,19,16,12,7,15,15,10,18,17,20,6,6,7,13,13,15,14,16,10,23,41,11,11,14,11,10,11,10,12,11,15,8,11,11,12,11,12,11,13,12,24,25,18,18,21,17,16,20,22,8,8,18,18,24,21,23,25,17,23,18,17,16,21,19,28,18,17,16,31,15,0,35,42,9,8,8,14,25,18,29,21,6,9,9,15,16,8,15,7,19,25,12,18,19,20,19,20,18,21,20,7,8,14,18,14,15,25,22,21,22,25,19,18,24,26,9,9,20,18,28,25,27,20,27,21,20,19,25,23,34,21,20,19,11,18,11,18,20,11,17,19,16,19,18,12,17,19,7,7,16,8,31,20,19,20,20,11,14,12,18,17,25,17,18,16,10,8,10,16,8,8,17,18,22,24,8,16,15,25,12,20,21,15,25,12,17,11,11,11,21,22,8,11,8,13,20,25,26,31,16,22,22,22,22,22,22,30,22,19,19,19,19,9,9,9,9,25,25,27,27,27,27,27,15,27,25,25,25,25,20,20,20,17,17,17,17,17,17,28,16,18,18,18,18,7,7,7,7,18,20,19,19,19,19,19,21,20,18,18,18,18,18,20,18,22,16,7,37,32,20,14,20,19,16,12,7,16,16,10,18,18,21,7,6,8,14,13,16,15,16,11,24,42,11,11,14,12,11,11,10,12,11,15,8,12,12,13,12,12,12,13,12,25,25,19,19,22,17,16,20,23,8,8,18,19,25,21,23,26,18,23,19,18,16,22,20,29,19,18,17,32,15,0,36,43,9,8,9,14,25,19,30,22,7,9,9,15,17,8,15,7,19,26,13,19,20,20,19,20,18,22,21,7,8,15,18,15,16,26,22,21,22,26,20,19,24,27,9,9,21,18,29,25,28,21,28,22,21,19,26,23,35,22,20,20,12,19,12,18,20,11,17,20,16,20,18,12,18,20,8,8,16,9,32,20,20,20,20,12,15,12,19,18,26,17,18,17,11,8,11,16,8,8,17,18,23,24,8,16,15,26,13,20,21,15,26,12,18,11,11,11,21,22,9,11,8,13,20,26,26,32,16,22,22,22,22,22,22,31,22,20,20,20,20,9,9,9,9,26,25,28,28,28,28,28,16,28,26,26,26,26,20,21,20,17,17,17,17,17,17,29,16,18,18,18,18,8,8,8,8,19,20,20,20,20,20,20,21,21,19,19,19,19,18,21,18,22,16,8,39,32,21,15,20,20,17,13,8,16,16,11,19,18,21,7,6,8,14,14,16,15,17,11,24,43,12,12,15,12,11,12,10,12,12,16,9,12,12,13,12,12,12,13,12,25,26,19,19,23,18,17,21,23,9,9,19,19,26,22,24,27,18,24,19,18,17,23,20,30,19,18,17,33,16,0,37,44,9,8,9,15,26,19,31,23,7,10,10,16,17,8,16,8,20,26,13,19,20,21,20,21,19,23,21,8,8,15,19,15,16,27,23,22,23,27,21,19,25,28,9,9,21,19,30,26,28,21,28,22,22,20,27,24,36,22,21,20,12,19,12,19,21,11,18,21,17,21,19,12,18,20,8,8,17,9,32,21,20,21,21,12,15,12,19,18,27,18,19,17,11,8,11,17,8,8,18,19,23,25,9,17,16,27,13,21,22,16,27,12,18,11,11,11,22,23,9,11,8,14,21,27,27,33,17,23,23,23,23,23,23,32,23,21,21,21,21,9,9,9,9,27,26,28,28,28,28,28,16,28,27,27,27,27,21,21,21,18,18,18,18,18,18,30,17,19,19,19,19,8,8,8,8,19,21,20,20,20,20,20,22,21,19,19,19,19,19,21,19,23,17,8,40,33,22,15,21,20,17,13,8,17,17,11,20,19,22,7,6,8,15,14,17,16,17,11,25,44,12,12,15,12,11,12,11,13,12,16,9,12,12,13,12,13,12,14,13,26,27,20,20,23,18,17,22,24,9,9,19,20,26,23,25,27,19,25,20,19,17,23,21,31,20,19,18,34,16,0,38,46,10,9,9,15,27,20,32,23,7,10,10,16,18,8,16,8,20,27,13,20,21,21,21,22,19,23,22,8,8,15,19,15,17,27,23,23,23,28,21,20,26,28,10,10,22,19,31,27,29,22,29,23,22,20,28,24,37,23,22,21,12,20,12,19,22,12,18,21,17,21,19,13,19,21,8,8,17,9,33,21,21,21,21,12,16,13,20,19,28,18,19,18,11,9,11,17,9,9,18,19,24,26,9,17,16,27,13,21,23,16,27,13,19,12,12,12,22,24,9,12,8,14,21,27,28,34,17,23,23,23,23,23,23,33,23,21,21,21,21,10,10,10,10,28,27,29,29,29,29,29,17,29,28,28,28,28,22,22,21,18,18,18,18,18,18,30,17,19,19,19,19,8,8,8,8,20,21,21,21,21,21,21,23,22,20,20,20,20,19,22,19,23,17,8,41,34,22,16,22,21,18,13,8,17,17,11,20,19,23,7,6,8,15,14,17,16,17,12,26,46,12,12,15,13,12,12,11,13,12,16,9,13,13,14,13,13,13,14,13,27,28,20,20,24,19,17,22,25,9,9,20,20,27,23,25,28,19,25,20,19,18,24,21,32,21,19,18,35,17,0,39,47,10,9,9,16,27,20,33,24,7,10,10,17,18,8,17,8,21,28,14,20,21,22,21,22,20,24,22,8,8,16,20,16,17,28,24,23,24,28,22,20,26,29,10,10,23,20,32,27,30,22,30,24,23,21,28,25,38,23,22,21,13,20,13,20,22,12,19,22,18,22,20,13,19,21,8,8,17,9,34,22,21,22,22,13,16,13,20,19,28,18,20,18,12,9,12,18,9,9,19,20,24,26,9,18,16,28,14,22,23,17,28,13,19,12,12,12,23,24,9,12,8,14,22,28,28,35,18,24,24,24,24,24,24,34,24,22,22,22,22,10,10,10,10,28,27,30,30,30,30,30,17,30,28,28,28,28,22,22,22,19,19,19,19,19,19,31,18,20,20,20,20,8,8,8,8,20,22,21,21,21,21,21,23,22,20,20,20,20,20,23,20,24,18,8,42,35,23,16,22,21,18,14,8,17,17,11,21,20,23,7,7,8,15,15,17,17,18,12,26,47,13,13,16,13,12,13,11,14,13,17,9,13,13,14,13,14,13,15,14,27,28,21,21,25,19,18,23,25,9,9,20,21,28,24,26,29,20,26,21,20,18,24,22,33,21,20,19,36,17,0,40,48,10,9,10,16,28,21,34,24,7,10,10,17,19,9,17,8,21,29,14,21,22,22,22,23,20,24,23,8,9,16,20,16,18,29,25,24,25,29,22,21,27,30,10,10,23,20,32,28,31,23,31,24,23,21,29,26,39,24,23,22,13,21,13,20,23,12,19,22,18,22,20,13,20,22,8,8,18,9,35,22,22,22,22,13,17,13,21,20,29,19,20,19,12,9,12,18,9,9,19,20,25,27,9,18,17,29,14,23,24,17,29,13,20,12,12,12,24,25,10,12,9,15,23,29,29,35,18,25,25,25,25,25,25,35,25,22,22,22,22,10,10,10,10,29,28,31,31,31,31,31,18,31,29,29,29,29,23,23,22,19,19,19,19,19,19,32,18,20,20,20,20,8,8,8,8,21,22,22,22,22,22,22,24,23,21,21,21,21,20,23,20,25,18,8,43,36,23,17,23,22,19,14,8,18,18,12,21,20,24,7,7,9,16,15,18,17,18,12,27,48,13,13,16,13,12,13,12,14,13,17,9,13,13,14,13,14,13,15,14,28,29,21,21,25,20,18,23,26,10,10,21,21,28,25,27,30,20,27,21,20,19,25,22,33,22,20,19,37,18,0,41,49,10,9,10,16,29,21,34,25,7,11,11,17,19,9,17,8,22,29,15,21,22,23,22,23,21,25,23,8,9,17,21,17,18,30,25,24,25,30,23,21,28,31,10,10,24,21,33,29,31,23,31,25,24,22,30,26,40,25,23,23,13,22,13,21,23,12,20,23,19,23,21,14,20,22,9,9,18,10,36,23,23,23,23,13,17,14,21,20,30,19,21,19,12,9,12,19,9,9,20,21,26,28,10,19,17,30,14,23,24,17,30,14,20,12,13,12,24,26,10,12,9,15,23,29,30,36,18,25,25,25,25,25,25,35,25,23,23,23,23,10,10,10,10,30,29,31,31,31,31,31,18,31,30,30,30,30,23,23,23,20,20,20,20,20,20,33,19,21,21,21,21,9,9,9,9,21,23,23,23,23,23,23,24,23,21,21,21,21,21,24,21,25,19,9,44,37,24,17,23,23,19,14,9,18,18,12,22,21,24,8,7,9,16,16,18,17,19,13,28,49,13,13,17,14,13,13,12,14,13,18,10,14,14,15,14,14,14,15,14,29,30,22,22,26,20,19,24,26,10,10,22,22,29,25,27,30,21,27,22,21,19,26,23,34,22,21,20,38,18,0,42,50,11,9,10,17,30,22,35,26,8,11,11,18,19,9,18,9,22,30,15,22,23,23,23,24,21,26,24,9,9,17,21,17,19,30,26,25,26,31,23,22,28,31,11,11,24,21,34,30,32,24,32,25,25,22,30,27,41,25,24,23,14,22,14,21,24,13,20,23,19,23,22,14,21,23,9,9,19,10,37,23,23,23,23,13,17,14,22,21,30,20,21,20,13,10,13,19,9,9,20,21,26,28,10,19,18,30,15,24,25,18,30,14,21,13,13,13,25,26,10,13,9,16,24,30,31,37,19,26,26,26,26,26,26,36,26,23,23,23,23,11,11,11,11,31,30,32,32,32,32,32,18,32,30,30,30,30,24,24,23,20,20,20,20,20,20,34,19,22,22,22,22,9,9,9,9,22,23,23,23,23,23,23,25,24,22,22,22,22,21,24,21,26,19,9,45,38,25,17,24,23,20,15,9,19,19,12,22,21,25,8,7,9,17,16,19,18,19,13,28,50,14,14,17,14,13,14,12,15,14,18,10,14,14,15,14,15,14,16,15,30,31,22,23,26,21,19,24,27,10,10,22,22,30,26,28,31,21,28,23,21,20,26,24,35,23,21,20,39,18,0,43,52,11,10,10,17,30,22,36,26,8,11,11,18,20,9,18,9,23,31,15,23,24,24,23,24,22,26,25,9,9,17,22,17,19,31,26,26,26,31,24,22,29,32,11,11,25,22,35,30,33,25,33,26,25,23,31,28,42,26,24,24,14,23,14,22,24,13,21,24,20,24,22,14,21,23,9,9,19,10,38,24,24,24,24,14,18,14,23,21,31,20,22,20,13,10,13,20,10,10,21,22,27,29,10,20,18,31,15,24,26,18,31,14,21,13,13,13,25,27,10,13,9,16,24,31,31,38,19,26,26,26,26,26,26,37,26,24,24,24,24,11,11,11,11,31,30,33,33,33,33,33,19,33,31,31,31,31,24,25,24,21,21,21,21,21,21,34,20,22,22,22,22,9,9,9,9,22,24,24,24,24,24,24,25,25,23,23,23,23,22,25,22,26,20,9,46,39,25,18,24,24,20,15,9,19,19,13,23,22,26,8,7,9,17,16,19,18,20,13,29,52,14,14,18,14,13,14,12,15,14,19,10,14,14,15,14,15,14,16,15,30,31,23,23,27,21,20,25,28,10,10,23,23,31,26,29,32,22,29,23,22,20,27,24,36,23,22,21,40,19,0,44,53,11,10,11,18,31,23,37,27,8,11,11,19,20,10,19,9,23,31,16,23,24,25,24,25,22,27,25,9,10,18,22,18,19,32,27,26,27,32,24,23,30,33,11,11,25,22,36,31,34,25,34,27,26,23,32,28,43,26,25,24,14,23,14,22,25,13,21,24,20,24,23,15,22,24,9,9,20,10,39,25,24,25,25,14,18,15,23,22,32,21,22,21,13,10,13,20,10,10,21,22,28,30,10,20,19,32,15,25,26,19,32,15,22,13,14,13,26,27,10,13,10,16,25,32,32,39,20,27,27,27,27,27,27,38,27,24,24,24,24,11,11,11,11,32,31,34,34,34,34,34,19,34,32,32,32,32,25,25,25,21,21,21,21,21,21,35,20,23,23,23,23,9,9,9,9,23,25,24,24,24,24,24,26,25,23,23,23,23,22,26,22,27,20,9,47,40,26,18,25,24,21,15,9,20,20,13,23,22,26,8,7,10,17,17,20,19,20,13,30,53,14,14,18,15,14,14,13,15,14,19,10,15,15,16,15,15,15,16,15,31,32,24,24,28,22,20,26,28,11,11,23,24,31,27,29,33,22,29,24,22,21,28,25,37,24,22,21,41,19,0,45,54,11,10,11,18,32,23,38,28,8,12,12,19,21,10,19,9,24,32,16,24,25,25,24,26,23,27,26,9,10,18,23,18,20,32,28,27,28,33,25,24,30,34,11,11,26,23,37,32,35,26,35,27,26,24,33,29,44,27,26,25,15,24,15,23,25,14,22,25,20,25,23,15,22,24,10,10,20,11,39,25,25,25,25,14,19,15,24,22,33,21,23,21,13,10,13,20,10,10,21,23,28,30,10,21,19,32,16,25,27,19,32,15,22,14,14,14,27,28,11,14,10,17,25,32,33,40,20,28,28,28,28,28,28,39,28,25,25,25,25,11,11,11,11,33,32,35,35,35,35,35,20,35,33,33,33,33,26,26,25,22,22,22,22,22,22,36,20,23,23,23,23,10,10,10,10,23,25,25,25,25,25,25,27,26,24,24,24,24,23,26,23,28,20,10,48,41,26,19,26,25,21,16,10,20,20,13,24,23,27,8,8,10,18,17,20,19,21,14,30,54,14,15,18,15,14,14,13,16,15,19,11,15,15,16,15,16,15,17,16,32,33,24,24,28,22,21,26,29,11,11,24,24,32,28,30,33,23,30,24,23,21,28,25,38,24,23,22,41,20,0,46,55,12,10,11,18,32,24,39,28,8,12,12,20,21,10,20,9,24,33,16,24,25,26,25,26,23,28,26,9,10,19,23,19,20,33,28,27,28,33,25,24,31,34,12,12,27,23,37,32,35,26,35,28,27,25,33,30,45,28,26,25,15,24,15,24,26,14,22,26,21,26,24,15,23,25,10,10,21,11,40,26,25,26,26,15,19,16,24,23,33,22,23,22,14,11,14,21,10,10,22,23,29,31,11,21,19,33,16,26,27,20,33,15,23,14,14,14,27,29,11,14,10,17,26,33,34,41,21,28,28,28,28,28,28,40,28,25,25,25,25,12,12,12,12,33,32,35,35,35,35,35,20,35,33,33,33,33,26,26,26,22,22,22,22,22,22,37,21,24,24,24,24,10,10,10,10,24,26,25,25,25,25,25,27,26,24,24,24,24,23,27,23,28,21,10,49,41,27,19,26,25,22,16,10,21,21,13,24,23,27,9,8,10,18,17,21,20,21,14,31,55,15,15,19,15,14,15,13,16,15,20,11,15,16,16,15,16,15,17,16,32,33,25,25,29,23,21,27,30,11,11,24,25,33,28,31,34,23,31,25,24,22,29,26,38,25,23,22,42,20,0,47,56,12,11,11,19,33,24,39,29,9,12,12,20,22,10,20,10,25,34,17,25,26,26,25,27,24,29,27,10,10,19,24,19,21,34,29,28,29,34,26,25,32,35,12,12,27,24,38,33,36,27,36,28,27,25,34,30,46,28,27,26,15,25,15,24,27,14,23,26,21,26,24,16,23,25,10,10,21,11,41,26,26,26,26,15,19,16,25,23,34,22,24,22,14,11,14,21,11,11,22,24,29,32,11,21,20,34,16,26,28,20,34,16,23,14,15,14,28,29,11,14,10,17,26,34,34,42,21,29,29,29,29,29,29,41,29,26,26,26,26,12,12,12,12,34,33,36,36,36,36,36,21,36,34,34,34,34,27,27,26,23,23,23,23,23,23,38,21,24,24,24,24,10,10,10,10,24,26,26,26,26,26,26,28,27,25,25,25,25,24,27,24,29,21,10,50,42,27,19,27,26,22,17,10,21,21,14,25,24,28,9,8,10,19,18,21,20,22,14,32,56,15,15,19,16,14,15,14,16,15,20,11,16,16,17,16,16,16,17,16,33,34,25,25,30,23,22,27,30,11,11,25,25,33,29,31,35,24,31,25,24,22,29,26,39,25,24,23,43,21,0,48,58,12,11,12,19,34,25,40,29,9,13,13,20,22,10,20,10,26,34,17,25,26,27,26,27,24,29,27,10,10,19,24,19,21,35,30,29,30,35,27,25,32,36,12,12,28,24,39,34,37,27,37,29,28,26,35,31,47,29,27,26,16,25,16,25,27,15,23,27,22,27,25,16,24,26,10,10,22,11,42,27,26,27,27,15,20,16,25,24,35,23,24,23,14,11,14,22,11,11,23,24,30,32,11,22,20,35,17,27,29,20,35,16,24,15,15,15,28,30,11,15,10,18,27,34,35,42,22,30,30,30,30,30,30,42,30,27,27,27,27,12,12,12,12,35,34,37,37,37,37,37,21,37,35,35,35,35,27,27,27,23,23,23,23,23,23,38,22,25,25,25,25,10,10,10,10,25,27,26,26,26,26,26,28,27,25,25,25,25,24,28,24,30,22,10,51,43,28,20,27,26,23,17,10,21,21,14,25,24,29,9,8,10,19,18,21,20,22,15,32,58,15,16,20,16,15,15,14,17,16,21,11,16,16,17,16,17,16,18,17,34,35,26,26,30,24,22,28,31,12,12,25,26,34,29,32,36,24,32,26,25,23,30,27,40,26,24,23,44,21,0,49,59,12,11,12,20,35,25,41,30,9,13,13,21,23,11,21,10,26,35,17,26,27,27,27,28,25,30,28,10,11,20,25,20,22,35,30,29,30,36,27,26,33,37,13,13,28,25,40,35,38,28,38,30,29,26,35,32,48,29,28,27,16,26,16,25,28,15,24,27,22,27,25,16,24,27,10,10,22,12,43,27,27,27,27,16,20,17,26,24,36,23,25,23,15,11,15,22,11,11,23,25,31,33,11,22,21,35,17,28,29,21,35,16,24,15,15,15,29,30,12,15,11,18,28,35,36,43,22,30,30,30,30,30,30,42,30,27,27,27,27,13,13,13,13,36,35,38,38,38,38,38,22,38,36,36,36,36,28,28,27,24,24,24,24,24,24,39,22,25,25,25,25,10,10,10,10,25,27,27,27,27,27,27,29,28,26,26,26,26,25,28,25,30,22,10,52,44,29,20,28,27,23,17,10,22,22,14,26,25,29,9,8,11,19,19,22,21,23,15,33,59,16,16,20,16,15,16,14,17,16,21,12,16,17,18,16,17,16,18,17,34,36,26,26,31,24,22,29,32,12,12,26,26,35,30,33,36,25,33,26,25,23,31,27,41,26,25,24,45,22,0,50,60,13,11,12,20,35,26,42,31,9,13,13,21,23,11,21,10,27,36,18,26,27,28,27,28,25,30,29,10,11,20,25,20,22,36,31,30,31,36,28,26,34,37,13,13,29,25,41,35,38,29,38,30,29,27,36,32,49,30,28,27,16,26,16,26,28,15,24,28,23,28,26,17,25,27,11,11,22,12,44,28,28,28,28,16,21,17,26,25,36,24,25,24,15,11,15,23,11,11,24,25,31,34,12,23,21,36,17,28,30,21,36,17,25,15,16,15,30,31,12,15,11,19,28,36,36,44,22,31,31,31,31,31,31,43,31,28,28,28,28,13,13,13,13,36,35,38,38,38,38,38,22,38,36,36,36,36,28,29,28,24,24,24,24,24,24,40,23,26,26,26,26,11,11,11,11,26,28,28,28,28,28,28,30,29,26,26,26,26,25,29,25,31,23,11,54,45,29,21,28,27,24,18,11,22,22,15,26,25,30,9,8,11,20,19,22,21,23,15,34,60,16,16,20,17,15,16,15,17,16,22,12,17,17,18,17,17,17,19,17,35,36,27,27,31,25,23,29,32,12,12,26,27,36,31,33,37,26,33,27,26,24,31,28,42,27,25,24,46,22,0,0,1,0,2,0,2,1,1,1,1,1,0,0,0,0,18,5,230,0,248,8,255,0,8,0,8,255,254,0,9,0,9,255,253,0,10,0,10,255,253,0,11,0,11,255,253,0,12,0,12,255,253,0,13,0,13,255,253,0,14,0,14,255,253,0,15,0,15,255,252,0,16,0,16,255,252,0,17,0,17,255,252,0,18,0,18,255,251,0,19,0,19,255,251,0,20,0,20,255,251,0,21,0,21,255,251,0,22,0,22,255,250,0,23,0,22,255,250,0,24,0,23,255,250,0,25,0,25,255,250,0,26,0,25,255,250,0,27,0,26,255,249,0,28,0,27,255,249,0,29,0,28,255,249,0,30,0,29,255,249,0,31,0,30,255,248,0,32,0,31,255,248,0,33,0,32,255,248,0,34,0,33,255,248,0,35,0,33,255,248,0,36,0,35,255,247,0,37,0,36,255,247,0,38,0,37,255,247,0,39,0,38,255,247,0,40,0,38,255,246,0,41,0,40,255,246,0,42,0,41,255,246,0,43,0,42,255,246,0,44,0,42,255,245,0,45,0,43,255,245,0,46,0,45,255,245,0,47,0,45,255,245,0,48,0,47,255,244,0,49,0,47,255,244,0,50,0,48,255,243,0,51,0,49,255,243,0,52,0,50,255,243,0,53,0,51,255,243,0,54,0,52,255,242,0,55,0,54,255,242,0,56,0,54,255,242,0,57,0,55,255,242,0,58,0,55,255,241,0,59,0,57,255,241,0,60,0,59,255,241,0,61,0,59,255,241,0,62,0,60,255,240,0,63,0,60,255,240,0,64,0,61,255,240,0,65,0,63,255,240,0,66,0,64,255,239,0,67,0,65,255,239,0,68,0,65,255,239,0,69,0,66,255,239,0,70,0,68,255,238,0,71,0,69,255,238,0,72,0,69,255,238,0,73,0,70,255,238,0,74,0,71,255,237,0,75,0,72,255,237,0,76,0,74,255,237,0,77,0,74,255,237,0,78,0,75,255,236,0,79,0,77,255,236,0,80,0,77,255,236,0,81,0,79,255,236,0,82,0,79,255,235,0,83,0,80,255,235,0,84,0,81,255,235,0,85,0,82,255,235,0,86,0,83,255,234,0,87,0,84,255,234,0,88,0,85,255,234,0,89,0,86,255,234,0,90,0,87,255,233,0,91,0,87,255,233,0,92,0,88,255,233,0,93,0,90,255,233,0,94,0,91,255,232,0,95,0,92,255,232,0,96,0,92,255,232,0,97,0,93,255,232,0,98,0,94,255,231,0,99,0,96,255,231,0,100,0,97,255,231,0,101,0,97,255,231,0,102,0,98,255,230,0,103,0,99,255,230,0,104,0,101,255,230,0,105,0,101,255,230,0,106,0,102,255,229,0,107,0,103,255,229,0,108,0,104,255,229,0,109,0,106,255,229,0,110,0,106,255,228,0,111,0,107,255,228,0,112,0,108,255,228,0,113,0,109,255,228,0,114,0,110,255,227,0,115,0,111,255,227,0,116,0,112,255,227,0,117,0,112,255,227,0,118,0,114,255,226,0,119,0,115,255,226,0,120,0,115,255,226,0,121,0,117,255,226,0,122,0,118,255,225,0,123,0,119,255,225,0,124,0,119,255,225,0,125,0,120,255,225,0,126,0,122,255,224,0,127,0,123,255,224,0,128,0,124,255,224,0,129,0,124,255,224,0,130,0,125,255,223,0,131,0,125,255,223,0,132,0,128,255,223,0,133,0,129,255,223,0,134,0,129,255,222,0,135,0,130,255,222,0,136,0,130,255,222,0,137,0,133,255,222,0,138,0,133,255,221,0,139,0,134,255,221,0,140,0,135,255,221,0,141,0,135,255,221,0,142,0,137,255,220,0,143,0,138,255,220,0,144,0,139,255,220,0,145,0,140,255,220,0,146,0,141,255,219,0,147,0,142,255,219,0,148,0,142,255,219,0,149,0,144,255,219,0,150,0,144,255,218,0,151,0,146,255,218,0,152,0,147,255,218,0,153,0,147,255,218,0,154,0,149,255,217,0,155,0,149,255,217,0,156,0,151,255,217,0,157,0,151,255,217,0,158,0,152,255,216,0,159,0,153,255,216,0,160,0,154,255,216,0,161,0,156,255,216,0,162,0,156,255,215,0,163,0,157,255,215,0,164,0,157,255,215,0,165,0,159,255,215,0,166,0,161,255,214,0,167,0,161,255,214,0,168,0,162,255,214,0,169,0,162,255,214,0,170,0,164,255,213,0,171,0,166,255,213,0,172,0,166,255,213,0,173,0,167,255,213,0,174,0,167,255,212,0,175,0,169,255,212,0,176,0,170,255,212,0,177,0,171,255,212,0,178,0,172,255,211,0,179,0,172,255,211,0,180,0,174,255,211,0,181,0,174,255,211,0,182,0,176,255,210,0,183,0,176,255,210,0,184,0,177,255,210,0,185,0,179,255,210,0,186,0,179,255,209,0,187,0,180,255,209,0,188,0,181,255,209,0,189,0,183,255,209,0,190,0,183,255,208,0,191,0,184,255,208,0,192,0,185,255,208,0,193,0,186,255,208,0,194,0,188,255,207,0,195,0,188,255,207,0,196,0,189,255,207,0,197,0,189,255,207,0,198,0,190,255,206,0,199,0,193,255,206,0,200,0,193,255,206,0,201,0,194,255,206,0,202,0,194,255,205,0,203,0,195,255,205,0,204,0,198,255,205,0,205,0,198,255,205,0,206,0,199,255,204,0,207,0,199,255,204,0,208,0,200,255,204,0,209,0,201,255,204,0,210,0,203,255,203,0,211,0,204,255,203,0,212,0,204,255,203,0,213,0,206,255,203,0,214,0,206,255,202,0,215,0,207,255,202,0,216,0,208,255,202,0,217,0,209,255,202,0,218,0,211,255,201,0,219,0,211,255,201,0,220,0,212,255,201,0,221,0,213,255,201,0,222,0,214,255,200,0,223,0,215,255,200,0,224,0,216,255,200,0,225,0,217,255,200,0,226,0,217,255,199,0,227,0,219,255,199,0,228,0,220,255,199,0,229,0,221,255,199,0,230,0,221,255,198,0,231,0,222,255,198,0,232,0,224,255,198,0,233,0,225,255,198,0,234,0,226,255,197,0,235,0,226,255,197,0,236,0,227,255,197,0,237,0,229,255,197,0,238,0,230,255,196,0,239,0,231,255,196,0,240,0,231,255,196,0,241,0,232,255,196,0,242,0,233,255,195,0,243,0,235,255,195,0,244,0,236,255,195,0,245,0,236,255,195,0,246,0,237,255,194,0,247,0,238,255,194,0,248,0,239,255,194,0,249,0,240,255,194,0,250,0,241,255,193,0,251,0,242,255,193,0,252,0,243,255,193,0,253,0,244,255,193,0,254,0,244,255,192,0,255,0,246,255,192,0,248,8,255,0,8,0,8,255,254,0,9,0,9,255,253,0,10,0,10,255,253,0,11,0,11,255,253,0,12,0,12,255,253,0,13,0,13,255,253,0,14,0,14,255,253,0,15,0,15,255,252,0,16,0,16,255,252,0,17,0,17,255,252,0,18,0,18,255,251,0,19,0,19,255,251,0,20,0,20,255,251,0,21,0,21,255,251,0,22,0,22,255,250,0,23,0,22,255,250,0,24,0,23,255,250,0,25,0,25,255,250,0,26,0,25,255,250,0,27,0,26,255,249,0,28,0,27,255,249,0,29,0,28,255,249,0,30,0,29,255,249,0,31,0,30,255,248,0,32,0,31,255,248,0,33,0,32,255,248,0,34,0,33,255,248,0,35,0,33,255,248,0,36,0,35,255,247,0,37,0,36,255,247,0,38,0,37,255,247,0,39,0,38,255,247,0,40,0,38,255,246,0,41,0,40,255,246,0,42,0,41,255,246,0,43,0,42,255,246,0,44,0,42,255,245,0,45,0,43,255,245,0,46,0,45,255,245,0,47,0,45,255,245,0,48,0,47,255,244,0,49,0,47,255,244,0,50,0,48,255,243,0,51,0,49,255,243,0,52,0,50,255,243,0,53,0,51,255,243,0,54,0,52,255,242,0,55,0,54,255,242,0,56,0,54,255,242,0,57,0,55,255,242,0,58,0,55,255,241,0,59,0,57,255,241,0,60,0,59,255,241,0,61,0,59,255,241,0,62,0,60,255,240,0,63,0,60,255,240,0,64,0,61,255,240,0,65,0,63,255,240,0,66,0,64,255,239,0,67,0,65,255,239,0,68,0,65,255,239,0,69,0,66,255,239,0,70,0,68,255,238,0,71,0,69,255,238,0,72,0,69,255,238,0,73,0,70,255,238,0,74,0,71,255,237,0,75,0,72,255,237,0,76,0,74,255,237,0,77,0,74,255,237,0,78,0,75,255,236,0,79,0,77,255,236,0,80,0,77,255,236,0,81,0,79,255,236,0,82,0,79,255,235,0,83,0,80,255,235,0,84,0,81,255,235,0,85,0,82,255,235,0,86,0,83,255,234,0,87,0,84,255,234,0,88,0,85,255,234,0,89,0,86,255,234,0,90,0,87,255,233,0,91,0,87,255,233,0,92,0,88,255,233,0,93,0,90,255,233,0,94,0,91,255,232,0,95,0,92,255,232,0,96,0,92,255,232,0,97,0,93,255,232,0,98,0,94,255,231,0,99,0,96,255,231,0,100,0,97,255,231,0,101,0,97,255,231,0,102,0,98,255,230,0,103,0,99,255,230,0,104,0,101,255,230,0,105,0,101,255,230,0,106,0,102,255,229,0,107,0,103,255,229,0,108,0,104,255,229,0,109,0,106,255,229,0,110,0,106,255,228,0,111,0,107,255,228,0,112,0,108,255,228,0,113,0,109,255,228,0,114,0,110,255,227,0,115,0,111,255,227,0,116,0,112,255,227,0,117,0,112,255,227,0,118,0,114,255,226,0,119,0,115,255,226,0,120,0,115,255,226,0,121,0,117,255,226,0,122,0,118,255,225,0,123,0,119,255,225,0,124,0,119,255,225,0,125,0,120,255,225,0,126,0,122,255,224,0,127,0,123,255,224,0,128,0,124,255,224,0,129,0,124,255,224,0,130,0,125,255,223,0,131,0,125,255,223,0,132,0,128,255,223,0,133,0,129,255,223,0,134,0,129,255,222,0,135,0,130,255,222,0,136,0,130,255,222,0,137,0,133,255,222,0,138,0,133,255,221,0,139,0,134,255,221,0,140,0,135,255,221,0,141,0,135,255,221,0,142,0,137,255,220,0,143,0,138,255,220,0,144,0,139,255,220,0,145,0,140,255,220,0,146,0,141,255,219,0,147,0,142,255,219,0,148,0,142,255,219,0,149,0,144,255,219,0,150,0,144,255,218,0,151,0,146,255,218,0,152,0,147,255,218,0,153,0,147,255,218,0,154,0,149,255,217,0,155,0,149,255,217,0,156,0,151,255,217,0,157,0,151,255,217,0,158,0,152,255,216,0,159,0,153,255,216,0,160,0,154,255,216,0,161,0,156,255,216,0,162,0,156,255,215,0,163,0,157,255,215,0,164,0,157,255,215,0,165,0,159,255,215,0,166,0,161,255,214,0,167,0,161,255,214,0,168,0,162,255,214,0,169,0,162,255,214,0,170,0,164,255,213,0,171,0,166,255,213,0,172,0,166,255,213,0,173,0,167,255,213,0,174,0,167,255,212,0,175,0,169,255,212,0,176,0,170,255,212,0,177,0,171,255,212,0,178,0,172,255,211,0,179,0,172,255,211,0,180,0,174,255,211,0,181,0,174,255,211,0,182,0,176,255,210,0,183,0,176,255,210,0,184,0,177,255,210,0,185,0,179,255,210,0,186,0,179,255,209,0,187,0,180,255,209,0,188,0,181,255,209,0,189,0,183,255,209,0,190,0,183,255,208,0,191,0,184,255,208,0,192,0,185,255,208,0,193,0,186,255,208,0,194,0,188,255,207,0,195,0,188,255,207,0,196,0,189,255,207,0,197,0,189,255,207,0,198,0,190,255,206,0,199,0,193,255,206,0,200,0,193,255,206,0,201,0,194,255,206,0,202,0,194,255,205,0,203,0,195,255,205,0,204,0,198,255,205,0,205,0,198,255,205,0,206,0,199,255,204,0,207,0,199,255,204,0,208,0,200,255,204,0,209,0,201,255,204,0,210,0,203,255,203,0,211,0,204,255,203,0,212,0,204,255,203,0,213,0,206,255,203,0,214,0,206,255,202,0,215,0,207,255,202,0,216,0,208,255,202,0,217,0,209,255,202,0,218,0,211,255,201,0,219,0,211,255,201,0,220,0,212,255,201,0,221,0,213,255,201,0,222,0,214,255,200,0,223,0,215,255,200,0,224,0,216,255,200,0,225,0,217,255,200,0,226,0,217,255,199,0,227,0,219,255,199,0,228,0,220,255,199,0,229,0,221,255,199,0,230,0,221,255,198,0,231,0,222,255,198,0,232,0,224,255,198,0,233,0,225,255,198,0,234,0,226,255,197,0,235,0,226,255,197,0,236,0,227,255,197,0,237,0,229,255,197,0,238,0,230,255,196,0,239,0,231,255,196,0,240,0,231,255,196,0,241,0,232,255,196,0,242,0,233,255,195,0,243,0,235,255,195,0,244,0,236,255,195,0,245,0,236,255,195,0,246,0,237,255,194,0,247,0,238,255,194,0,248,0,239,255,194,0,249,0,240,255,194,0,250,0,241,255,193,0,251,0,242,255,193,0,252,0,243,255,193,0,253,0,244,255,193,0,254,0,244,255,192,0,255,0,246,255,192,0,0, \ No newline at end of file diff --git a/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 000000000..db433349b Binary files /dev/null and b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf differ diff --git a/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h new file mode 100644 index 000000000..292846b19 --- /dev/null +++ b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h @@ -0,0 +1 @@ +0,1,0,0,0,19,1,0,0,4,0,48,68,83,73,71,158,18,68,29,0,3,59,156,0,0,21,116,71,68,69,70,0,38,3,175,0,3,55,124,0,0,0,30,71,80,79,83,11,55,15,55,0,3,55,156,0,0,0,56,71,83,85,66,14,43,61,183,0,3,55,212,0,0,3,198,79,83,47,50,161,62,158,201,0,0,1,184,0,0,0,96,99,109,97,112,41,171,47,104,0,0,16,180,0,0,4,26,99,118,116,32,15,77,24,164,0,0,29,144,0,0,0,162,102,112,103,109,126,97,182,17,0,0,20,208,0,0,7,180,103,97,115,112,0,21,0,35,0,3,55,108,0,0,0,16,103,108,121,102,116,56,153,75,0,0,37,140,0,1,47,180,104,101,97,100,247,118,226,166,0,0,1,60,0,0,0,54,104,104,101,97,13,204,9,115,0,0,1,116,0,0,0,36,104,109,116,120,232,53,60,221,0,0,2,24,0,0,14,154,107,101,114,110,84,43,9,126,0,1,85,64,0,1,182,54,108,111,99,97,41,20,220,241,0,0,30,52,0,0,7,86,109,97,120,112,5,67,2,10,0,0,1,152,0,0,0,32,110,97,109,101,115,176,136,133,0,3,11,120,0,0,5,199,112,111,115,116,2,67,239,108,0,3,17,64,0,0,38,43,112,114,101,112,67,183,150,164,0,0,28,132,0,0,1,9,0,1,0,0,0,1,25,154,33,199,245,95,95,15,60,245,0,9,8,0,0,0,0,0,201,53,49,139,0,0,0,0,201,232,76,76,251,154,253,213,9,162,8,98,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,8,141,253,168,0,0,9,172,251,154,254,123,9,162,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,163,0,1,0,0,3,170,0,138,0,22,0,86,0,5,0,2,0,16,0,47,0,92,0,0,1,14,0,248,0,3,0,1,0,3,4,182,1,144,0,5,0,8,5,154,5,51,0,0,1,31,5,154,5,51,0,0,3,209,0,102,1,241,8,2,2,11,6,6,3,5,4,2,2,4,224,0,2,239,64,0,32,91,0,0,0,40,0,0,0,0,49,65,83,67,0,64,0,32,255,253,6,31,254,20,0,132,8,141,2,88,32,0,1,159,0,0,0,0,4,72,5,182,0,0,0,32,0,3,4,205,0,193,0,0,0,0,4,20,0,0,2,20,0,0,2,35,0,152,3,53,0,133,5,43,0,51,4,147,0,131,6,150,0,104,5,215,0,113,1,197,0,133,2,94,0,82,2,94,0,61,4,106,0,86,4,147,0,104,1,246,0,63,2,147,0,84,2,33,0,152,2,240,0,20,4,147,0,102,4,147,0,188,4,147,0,100,4,147,0,94,4,147,0,43,4,147,0,133,4,147,0,117,4,147,0,94,4,147,0,104,4,147,0,106,2,33,0,152,2,33,0,63,4,147,0,104,4,147,0,119,4,147,0,104,3,111,0,27,7,49,0,121,5,16,0,0,5,47,0,201,5,12,0,125,5,213,0,201,4,115,0,201,4,33,0,201,5,211,0,125,5,231,0,201,2,170,0,84,2,35,255,96,4,233,0,201,4,39,0,201,7,57,0,201,6,8,0,201,6,59,0,125,4,209,0,201,6,59,0,125,4,242,0,201,4,100,0,106,4,109,0,18,5,211,0,186,4,195,0,0,7,104,0,27,4,158,0,8,4,123,0,0,4,145,0,82,2,162,0,166,2,240,0,23,2,162,0,51,4,86,0,49,3,150,255,252,4,158,1,137,4,115,0,94,4,231,0,176,3,207,0,115,4,231,0,115,4,125,0,115,2,182,0,29,4,98,0,39,4,233,0,176,2,6,0,162,2,6,255,145,4,51,0,176,2,6,0,176,7,113,0,176,4,233,0,176,4,213,0,115,4,231,0,176,4,231,0,115,3,68,0,176,3,209,0,106,2,211,0,31,4,233,0,164,4,2,0,0,6,57,0,23,4,49,0,39,4,8,0,2,3,190,0,82,3,8,0,61,4,104,1,238,3,8,0,72,4,147,0,104,2,20,0,0,2,35,0,152,4,147,0,190,4,147,0,63,4,147,0,123,4,147,0,31,4,104,1,238,4,33,0,123,4,158,1,53,6,168,0,100,2,213,0,70,3,250,0,82,4,147,0,104,2,147,0,84,6,168,0,100,4,0,255,250,3,109,0,127,4,147,0,104,2,199,0,49,2,199,0,33,4,158,1,137,4,244,0,176,5,61,0,113,2,33,0,152,1,209,0,37,2,199,0,76,3,0,0,66,3,250,0,80,6,61,0,75,6,61,0,46,6,61,0,26,3,111,0,51,5,16,0,0,5,16,0,0,5,16,0,0,5,16,0,0,5,16,0,0,5,16,0,0,6,252,255,254,5,12,0,125,4,115,0,201,4,115,0,201,4,115,0,201,4,115,0,201,2,170,0,60,2,170,0,84,2,170,255,255,2,170,0,60,5,199,0,47,6,8,0,201,6,59,0,125,6,59,0,125,6,59,0,125,6,59,0,125,6,59,0,125,4,147,0,133,6,59,0,125,5,211,0,186,5,211,0,186,5,211,0,186,5,211,0,186,4,123,0,0,4,227,0,201,4,250,0,176,4,115,0,94,4,115,0,94,4,115,0,94,4,115,0,94,4,115,0,94,4,115,0,94,6,221,0,94,3,207,0,115,4,125,0,115,4,125,0,115,4,125,0,115,4,125,0,115,2,6,255,218,2,6,0,169,2,6,255,179,2,6,255,236,4,197,0,113,4,233,0,176,4,213,0,115,4,213,0,115,4,213,0,115,4,213,0,115,4,213,0,115,4,147,0,104,4,213,0,115,4,233,0,164,4,233,0,164,4,233,0,164,4,233,0,164,4,8,0,2,4,231,0,176,4,8,0,2,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,12,0,125,3,207,0,115,5,12,0,125,3,207,0,115,5,12,0,125,3,207,0,115,5,12,0,125,3,207,0,115,5,213,0,201,4,231,0,115,5,199,0,47,4,231,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,5,211,0,125,4,98,0,39,5,211,0,125,4,98,0,39,5,211,0,125,4,98,0,39,5,211,0,125,4,98,0,39,5,231,0,201,4,233,0,176,5,231,0,0,4,233,0,20,2,170,255,226,2,6,255,144,2,170,0,42,2,6,255,218,2,170,0,30,2,6,255,204,2,170,0,84,2,6,0,53,2,170,0,84,2,6,0,176,4,205,0,84,4,12,0,162,2,35,255,96,2,6,255,145,4,233,0,201,4,51,0,176,4,37,0,176,4,39,0,201,2,6,0,163,4,39,0,201,2,6,0,89,4,39,0,201,2,6,0,176,4,39,0,201,2,131,0,176,4,47,0,29,2,23,255,252,6,8,0,201,4,233,0,176,6,8,0,201,4,233,0,176,6,8,0,201,4,233,0,176,5,115,0,1,6,8,0,201,4,233,0,176,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,7,98,0,125,7,137,0,113,4,242,0,201,3,68,0,176,4,242,0,201,3,68,0,96,4,242,0,201,3,68,0,130,4,100,0,106,3,209,0,106,4,100,0,106,3,209,0,106,4,100,0,106,3,209,0,106,4,100,0,106,3,209,0,106,4,109,0,18,2,211,0,31,4,109,0,18,2,211,0,31,4,109,0,18,2,211,0,31,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,7,104,0,27,6,57,0,23,4,123,0,0,4,8,0,2,4,123,0,0,4,145,0,82,3,190,0,82,4,145,0,82,3,190,0,82,4,145,0,82,3,190,0,82,2,143,0,176,4,158,0,195,5,20,0,0,4,115,0,94,6,252,255,254,6,221,0,94,6,59,0,125,4,213,0,115,4,100,0,106,3,209,0,106,4,188,1,12,4,188,1,12,4,178,1,45,4,188,1,37,2,6,0,162,4,158,1,111,1,147,0,37,4,188,1,8,4,158,0,231,4,158,1,252,4,158,1,27,5,16,0,0,2,33,0,152,4,242,255,212,6,125,255,212,3,152,255,228,6,129,255,228,5,133,255,212,6,129,255,228,2,182,255,233,5,16,0,0,5,47,0,201,4,41,0,201,4,147,0,39,4,115,0,201,4,145,0,82,5,231,0,201,6,59,0,125,2,170,0,84,4,233,0,201,4,211,0,0,7,57,0,201,6,8,0,201,4,109,0,72,6,59,0,125,5,213,0,201,4,209,0,201,4,137,0,74,4,109,0,18,4,123,0,0,6,98,0,106,4,158,0,8,6,94,0,109,6,66,0,80,2,170,0,60,4,123,0,0,4,227,0,115,3,205,0,90,4,233,0,176,2,182,0,168,4,223,0,164,4,227,0,115,5,6,0,176,4,25,0,10,4,164,0,113,3,205,0,90,3,221,0,115,4,233,0,176,4,188,0,115,2,182,0,168,4,37,0,176,4,70,255,242,4,244,0,176,4,86,0,0,3,205,0,113,4,213,0,115,5,51,0,25,4,213,0,166,3,219,0,115,4,231,0,115,3,201,0,18,4,223,0,164,5,190,0,115,4,94,255,236,6,6,0,164,6,47,0,115,2,182,0,9,4,223,0,164,4,213,0,115,4,223,0,164,6,47,0,115,4,115,0,201,5,223,0,18,4,41,0,201,5,29,0,125,4,100,0,106,2,170,0,84,2,170,0,60,2,35,255,96,7,111,0,0,7,160,0,201,5,223,0,18,4,229,0,201,4,248,0,27,5,213,0,201,5,16,0,0,4,231,0,201,5,47,0,201,4,41,0,201,5,119,0,14,4,115,0,201,6,193,0,2,4,166,0,74,6,25,0,203,6,25,0,203,4,229,0,201,5,162,0,0,7,57,0,201,5,231,0,201,6,59,0,125,5,213,0,201,4,209,0,201,5,12,0,125,4,109,0,18,4,248,0,27,6,98,0,106,4,158,0,8,5,229,0,201,5,143,0,170,8,66,0,201,8,68,0,201,5,129,0,18,6,211,0,201,5,37,0,201,5,10,0,61,8,102,0,201,5,23,0,51,4,115,0,94,4,197,0,119,4,141,0,176,3,109,0,176,4,147,0,41,4,125,0,115,5,227,0,4,3,221,0,68,5,18,0,176,5,18,0,176,4,39,0,176,4,145,0,16,5,225,0,176,5,18,0,176,4,213,0,115,4,248,0,176,4,231,0,176,3,207,0,115,3,188,0,41,4,8,0,2,5,184,0,113,4,49,0,39,5,2,0,176,4,221,0,156,7,31,0,176,7,45,0,176,5,143,0,41,6,41,0,176,4,188,0,176,3,240,0,57,6,166,0,176,4,113,0,37,4,125,0,115,4,233,0,20,3,109,0,176,3,240,0,115,3,209,0,106,2,6,0,162,2,6,255,236,2,6,255,145,6,178,0,16,7,23,0,176,4,233,0,20,4,39,0,176,4,8,0,2,4,248,0,176,4,55,0,201,3,109,0,176,7,104,0,27,6,57,0,23,7,104,0,27,6,57,0,23,7,104,0,27,6,57,0,23,4,123,0,0,4,8,0,2,4,0,0,82,8,0,0,82,8,0,0,82,3,74,255,252,1,92,0,25,1,92,0,25,1,246,0,63,1,92,0,25,2,205,0,25,2,205,0,25,3,61,0,25,4,4,0,123,4,20,0,123,3,2,0,164,6,70,0,152,9,158,0,100,1,197,0,133,3,37,0,133,2,111,0,82,2,111,0,80,3,227,0,152,1,10,254,121,3,39,0,109,4,147,0,98,4,147,0,68,6,27,0,154,4,184,0,63,6,152,0,141,4,41,0,119,8,39,0,201,6,53,0,37,6,66,0,80,4,244,0,102,6,61,0,71,6,61,0,32,6,61,0,71,6,61,0,106,4,166,0,102,4,147,0,39,5,233,0,201,5,12,0,76,4,147,0,104,4,100,0,37,5,164,0,119,3,18,0,12,4,147,0,98,4,147,0,104,4,147,0,104,4,147,0,104,4,170,0,111,4,188,0,29,4,188,0,29,4,158,0,219,2,6,255,145,4,0,1,137,4,0,1,113,4,0,1,129,2,199,0,39,2,199,0,20,2,199,0,59,2,199,0,41,2,199,0,57,2,199,0,51,2,199,0,35,4,0,0,0,8,0,0,0,4,0,0,0,8,0,0,0,2,170,0,0,2,0,0,0,1,86,0,0,4,121,0,0,2,33,0,0,1,154,0,0,0,205,0,0,0,0,0,0,0,0,0,0,8,0,0,84,8,0,0,84,2,6,255,145,1,92,0,25,4,250,0,10,4,133,0,0,6,184,0,18,7,57,0,201,7,113,0,176,5,16,0,0,4,115,0,94,6,82,254,223,2,170,0,117,3,51,0,152,7,117,0,29,7,117,0,29,6,61,0,125,4,223,0,115,6,37,0,186,5,82,0,164,0,0,252,83,0,0,253,13,0,0,252,25,0,0,253,8,0,0,253,59,4,115,0,201,6,25,0,203,4,125,0,115,5,18,0,176,8,23,0,133,6,141,0,0,5,102,0,23,5,14,0,23,7,90,0,201,5,227,0,176,5,109,0,0,4,131,0,10,7,94,0,201,6,33,0,176,5,197,0,20,5,35,0,12,7,203,0,201,6,197,0,176,4,168,0,63,3,221,0,25,6,94,0,109,6,6,0,164,6,61,0,125,4,213,0,115,5,2,0,0,4,12,0,0,5,2,0,0,4,12,0,0,9,172,0,125,8,125,0,115,6,141,0,125,5,66,0,115,7,254,0,125,6,119,0,115,7,223,0,94,6,141,0,0,5,29,0,125,3,231,0,115,4,223,0,106,4,117,0,203,4,158,0,248,4,158,1,223,4,158,1,225,7,233,0,41,7,166,0,41,6,41,0,201,5,37,0,176,4,231,0,47,4,188,0,20,4,227,0,201,4,231,0,176,4,55,0,47,3,109,0,18,5,35,0,201,4,51,0,176,7,31,0,2,6,61,0,4,4,166,0,74,3,221,0,68,5,74,0,201,4,92,0,176,4,233,0,201,4,68,0,176,4,233,0,47,4,35,0,20,5,131,0,16,4,236,0,41,5,248,0,201,5,47,0,176,6,129,0,201,5,227,0,176,8,137,0,201,6,236,0,176,6,59,0,125,5,31,0,115,5,12,0,125,3,207,0,115,4,109,0,16,3,188,0,41,4,123,0,0,4,2,0,0,4,123,0,0,4,2,0,0,4,244,0,8,4,86,0,39,6,215,0,16,5,188,0,41,5,137,0,170,4,223,0,156,5,143,0,170,4,205,0,156,5,143,0,201,4,174,0,176,6,180,0,61,5,70,0,51,6,180,0,61,5,70,0,51,2,170,0,84,6,193,0,2,5,227,0,4,5,131,0,201,4,100,0,176,5,166,0,0,4,147,0,16,5,209,0,201,4,238,0,176,5,246,0,201,5,57,0,176,5,143,0,170,4,221,0,156,7,59,0,201,5,227,0,176,2,170,0,84,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,6,252,255,254,6,221,0,94,4,115,0,201,4,125,0,115,5,215,0,117,4,121,0,102,5,215,0,117,4,121,0,102,6,193,0,2,5,227,0,4,4,166,0,74,3,221,0,68,4,170,0,74,3,233,0,27,6,25,0,203,5,18,0,176,6,25,0,203,5,18,0,176,6,59,0,125,4,213,0,115,6,61,0,125,4,213,0,115,6,61,0,125,4,213,0,115,5,10,0,61,3,240,0,57,4,248,0,27,4,8,0,2,4,248,0,27,4,8,0,2,4,248,0,27,4,8,0,2,5,143,0,170,4,221,0,156,4,55,0,201,3,109,0,176,6,211,0,201,6,41,0,176,4,55,0,47,3,109,0,18,4,248,0,8,4,82,0,39,4,158,0,6,4,49,0,39,4,231,0,131,4,231,0,115,7,49,0,131,7,43,0,115,7,59,0,78,6,106,0,80,5,0,0,78,4,47,0,80,7,217,0,0,6,207,0,16,8,25,0,201,7,78,0,176,6,12,0,125,5,31,0,115,5,174,0,16,5,45,0,41,4,170,0,111,3,205,0,90,5,154,0,0,4,145,0,16,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,45,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,93,4,125,0,74,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,2,170,0,84,2,6,0,123,2,170,0,84,2,6,0,157,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,97,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,4,123,0,0,4,8,0,2,4,123,0,0,4,8,0,2,4,123,0,0,4,8,0,2,4,231,0,115,0,0,251,229,0,0,252,113,0,0,251,154,0,0,252,113,0,0,252,104,0,0,252,121,0,0,252,121,0,0,252,121,0,0,252,104,1,164,0,49,1,164,0,25,1,164,0,25,3,45,0,52,4,137,0,115,2,244,0,45,4,20,0,41,4,147,0,94,4,143,0,23,4,147,0,133,4,147,0,117,4,147,0,94,4,147,0,104,4,147,0,106,5,109,0,29,6,90,0,92,4,109,0,18,2,211,0,31,4,231,0,113,4,231,0,113,4,231,0,113,4,231,0,113,4,231,0,113,2,59,0,201,2,59,0,5,2,59,0,179,2,59,255,199,2,59,0,5,2,59,255,171,2,59,255,243,2,59,255,231,2,59,0,86,2,59,0,187,4,94,0,201,2,229,255,228,2,59,0,201,0,5,0,201,0,5,0,201,0,201,0,153,0,184,0,0,0,0,0,1,0,3,0,1,0,0,0,12,0,4,4,14,0,0,0,176,0,128,0,6,0,48,0,72,0,73,0,126,0,203,0,207,1,39,1,50,1,97,1,127,1,146,1,161,1,176,1,240,1,255,2,27,2,55,2,188,2,199,2,201,2,221,2,243,3,1,3,3,3,9,3,15,3,35,3,138,3,140,3,161,3,170,3,206,3,210,3,214,4,13,4,79,4,95,4,134,4,145,4,191,4,207,5,19,30,1,30,63,30,133,30,199,30,202,30,241,30,249,31,77,32,11,32,21,32,30,32,34,32,38,32,48,32,51,32,58,32,60,32,68,32,112,32,121,32,127,32,164,32,167,32,172,33,5,33,19,33,22,33,32,33,34,33,38,33,46,33,94,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,72,34,96,34,101,37,202,251,4,254,255,255,253,255,255,0,0,0,32,0,73,0,74,0,160,0,204,0,208,1,40,1,51,1,98,1,146,1,160,1,175,1,240,1,250,2,24,2,55,2,188,2,198,2,201,2,216,2,243,3,0,3,3,3,9,3,15,3,35,3,132,3,140,3,142,3,163,3,171,3,209,3,214,4,0,4,14,4,80,4,96,4,136,4,146,4,192,4,208,30,0,30,62,30,128,30,160,30,200,30,203,30,242,31,77,32,0,32,19,32,23,32,32,32,38,32,48,32,50,32,57,32,60,32,68,32,112,32,116,32,127,32,163,32,167,32,171,33,5,33,19,33,22,33,32,33,34,33,38,33,46,33,91,34,2,34,6,34,15,34,17,34,26,34,30,34,43,34,72,34,96,34,100,37,202,251,0,254,255,255,252,255,255,255,227,0,0,255,227,255,194,0,0,255,194,0,0,255,194,0,0,255,176,0,191,0,178,0,97,255,73,0,0,0,0,255,150,254,133,254,132,254,118,255,104,255,99,255,98,255,93,0,103,255,68,0,0,253,207,0,0,0,0,253,205,254,130,254,127,0,0,253,154,0,0,254,12,0,0,254,9,0,0,254,9,228,88,228,24,227,122,228,125,0,0,228,125,0,0,227,13,226,66,225,239,225,238,225,237,225,234,225,225,225,224,225,219,225,218,225,211,225,203,225,200,225,153,225,118,225,116,0,0,225,24,225,11,225,9,226,110,224,254,224,251,224,244,224,200,224,37,224,34,224,26,224,25,224,18,224,15,224,3,223,231,223,208,223,205,220,105,0,0,3,79,2,83,0,1,0,0,0,174,0,0,0,0,0,170,0,0,0,174,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,234,1,16,0,0,0,0,0,0,1,24,0,0,1,48,0,0,1,76,0,0,1,92,0,0,0,0,0,0,0,0,0,0,1,112,0,0,1,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,0,0,0,0,0,0,3,150,3,151,3,152,3,153,3,154,3,155,0,235,3,156,0,237,3,157,0,239,3,158,0,241,3,159,0,243,3,160,3,143,3,144,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,73,1,74,1,36,1,37,1,84,1,85,1,86,1,87,1,88,1,89,3,161,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,3,162,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,3,163,2,104,1,156,1,157,1,158,1,159,1,160,3,164,3,165,1,163,1,164,1,165,1,166,1,167,2,105,2,106,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245,2,107,1,246,1,247,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,1,248,1,249,3,166,2,202,2,203,2,204,2,205,2,206,2,207,2,208,2,209,2,210,2,211,2,212,2,213,2,214,2,215,3,167,3,168,3,70,3,169,2,0,2,1,3,111,3,112,3,113,3,114,3,115,3,116,3,117,2,28,3,141,2,52,2,53,2,93,2,94,0,0,64,71,91,90,89,88,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,32,176,1,96,69,176,3,37,32,17,70,97,35,69,35,97,72,45,44,32,69,24,104,68,45,44,69,35,70,96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96,32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176,102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176,64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68,35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77,68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24,104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67,35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40,62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97,100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176,0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0,139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3,97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24,45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89,45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176,1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45,44,1,176,6,37,16,245,0,237,236,45,44,176,2,67,176,1,82,88,33,33,33,33,33,27,70,35,70,96,138,138,70,35,32,70,138,96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0,80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,89,45,44,32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32,104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67,11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100,35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81,88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12,100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35,69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246,27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176,5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38,16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138,176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96,35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64,68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1,96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75,81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20,67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96,68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179,51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96,27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41,35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35,75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37,69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41,35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176,4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176,1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69,101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89,176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67,72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66,176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176,2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35,104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75,81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33,33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56,27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2,67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33,33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35,75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32,176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97,184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100,138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1,75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0,0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136,84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75,82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66,89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0,99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,177,38,1,136,81,88,185,64,0,2,0,99,184,4,0,136,84,88,178,2,64,2,67,96,66,89,185,64,0,4,0,99,184,8,0,136,84,88,178,2,128,2,67,96,66,89,89,89,89,89,89,177,0,2,67,84,88,64,10,5,64,8,64,9,64,12,2,13,2,27,177,1,2,67,84,88,178,5,64,8,186,1,0,0,9,1,0,179,12,1,13,1,27,177,128,2,67,82,88,178,5,64,8,184,1,128,177,9,64,27,178,5,64,8,186,1,128,0,9,1,64,89,185,64,0,0,128,136,85,185,64,0,2,0,99,184,4,0,136,85,90,88,179,12,0,13,1,27,179,12,0,13,1,89,89,89,66,66,66,66,66,45,44,69,24,104,35,75,81,88,35,32,69,32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2,37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66,1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176,1,22,1,45,44,176,128,176,2,67,80,176,1,176,2,67,84,91,88,33,35,16,176,32,26,201,27,138,16,237,89,45,44,176,89,43,45,44,138,16,229,45,64,153,9,33,72,32,85,32,1,30,85,31,72,3,85,31,30,1,15,30,63,30,175,30,3,77,75,38,31,76,75,51,31,75,70,37,31,38,52,16,85,37,51,36,85,25,19,255,31,7,4,255,31,6,3,255,31,74,73,51,31,73,70,37,31,19,51,18,85,5,1,3,85,4,51,3,85,31,3,1,15,3,63,3,175,3,3,71,70,25,31,235,70,1,35,51,34,85,28,51,27,85,22,51,21,85,17,1,15,85,16,51,15,85,15,15,79,15,2,31,15,207,15,2,15,15,255,15,2,6,2,1,0,85,1,51,0,85,111,0,127,0,175,0,239,0,4,16,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255,82,75,176,9,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176,0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,32,29,89,75,176,100,83,88,176,16,29,177,22,0,66,89,115,115,43,43,94,115,116,117,43,43,43,43,43,116,43,115,116,43,43,43,43,43,43,43,43,43,43,43,43,43,115,116,43,43,43,24,94,0,0,0,6,20,0,23,0,78,5,182,0,23,0,117,5,182,5,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,72,0,20,0,145,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,20,255,236,0,0,5,182,0,19,252,148,255,237,254,133,255,234,254,169,255,236,0,24,254,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,139,0,129,0,221,0,152,0,143,0,142,0,153,0,136,0,129,1,15,0,138,0,0,0,0,0,31,0,31,0,31,0,31,0,81,0,119,0,255,1,123,1,236,2,106,2,131,2,174,2,217,3,21,3,65,3,95,3,116,3,150,3,175,3,241,4,26,4,91,4,185,4,251,5,70,5,163,5,197,6,52,6,145,6,199,6,251,7,27,7,68,7,100,7,187,8,65,8,128,8,219,9,25,9,85,9,138,9,184,10,8,10,57,10,108,10,148,10,195,10,225,11,31,11,86,11,156,11,217,12,44,12,121,12,204,12,240,13,36,13,75,13,143,13,191,13,230,14,18,14,54,14,79,14,114,14,147,14,169,14,200,15,36,15,121,15,180,16,7,16,84,16,148,17,40,17,102,17,148,17,210,18,16,18,39,18,127,18,185,18,250,19,79,19,163,19,214,20,40,20,104,20,165,20,204,21,23,21,71,21,128,21,172,21,238,22,6,22,75,22,133,22,133,22,182,23,1,23,83,23,161,23,245,24,26,24,149,24,203,25,71,25,148,25,207,25,237,25,245,26,127,26,149,26,205,26,217,27,19,27,99,27,130,27,193,27,241,28,19,28,69,28,108,28,165,28,221,28,243,29,8,29,30,29,123,29,140,29,157,29,174,29,191,29,209,29,221,30,43,30,55,30,72,30,89,30,106,30,124,30,141,30,158,30,175,30,193,31,25,31,42,31,59,31,76,31,93,31,110,31,128,31,174,32,25,32,42,32,59,32,76,32,94,32,111,32,177,33,24,33,40,33,56,33,72,33,88,33,105,33,122,34,5,34,17,34,33,34,49,34,65,34,82,34,99,34,116,34,133,34,151,34,255,35,15,35,31,35,47,35,63,35,79,35,96,35,166,36,12,36,28,36,44,36,60,36,77,36,93,36,180,36,197,36,214,36,230,36,247,37,7,37,19,37,31,37,48,37,64,37,81,37,97,37,114,37,131,37,148,37,164,37,181,37,198,37,206,38,58,38,75,38,91,38,108,38,124,38,141,38,158,38,170,38,182,38,199,38,215,38,232,38,248,39,9,39,25,39,42,39,59,39,71,39,87,39,104,39,121,39,201,40,34,40,51,40,68,40,85,40,102,40,119,40,136,40,147,40,158,40,175,40,198,40,210,40,222,40,239,41,0,41,12,41,23,41,76,41,93,41,110,41,121,41,133,41,150,41,166,41,178,41,190,41,248,42,45,42,62,42,78,42,90,42,101,42,118,42,134,42,151,42,222,43,39,43,56,43,72,43,89,43,105,43,123,43,140,43,239,44,105,44,122,44,138,44,149,44,161,44,178,44,195,44,212,44,228,44,245,45,5,45,17,45,29,45,46,45,62,45,73,45,84,45,101,45,117,45,178,46,4,46,21,46,37,46,54,46,70,46,87,46,103,46,121,46,138,46,156,46,173,46,185,46,197,46,214,46,231,46,248,47,8,47,26,47,43,47,59,47,76,47,93,47,110,47,126,47,165,47,248,48,119,49,22,49,39,49,56,49,73,49,89,49,100,49,111,49,152,49,193,49,215,49,255,50,31,50,84,50,123,50,180,50,230,51,5,51,78,51,95,51,103,51,120,51,138,51,156,51,173,51,191,51,208,51,227,51,235,51,243,52,18,52,26,52,34,52,42,52,50,52,139,52,147,52,155,52,193,52,201,52,209,53,6,53,14,53,50,53,58,53,113,53,121,53,129,53,232,53,240,54,60,54,144,54,162,54,180,54,196,54,212,54,228,54,245,55,7,55,107,55,208,56,6,56,103,56,197,57,18,57,76,57,166,57,210,57,218,58,44,58,52,58,95,58,202,58,210,59,16,59,92,59,168,59,237,60,37,60,93,60,186,61,16,61,95,61,185,61,203,61,220,61,236,61,252,62,13,62,31,62,111,62,128,62,202,62,210,62,218,62,236,62,244,63,83,63,166,63,229,63,246,64,7,64,55,64,63,64,134,64,142,64,150,64,223,64,231,65,44,65,137,65,193,65,210,66,1,66,60,66,68,66,76,66,84,66,92,66,100,66,108,66,116,66,179,66,187,66,195,66,244,67,43,67,91,67,149,67,219,68,35,68,97,68,175,69,15,69,86,69,94,69,186,70,21,70,52,70,124,70,132,70,202,71,35,71,91,71,107,71,155,71,209,72,20,72,73,72,81,72,117,72,125,72,133,72,170,72,178,73,19,73,27,73,76,73,131,73,180,73,239,74,52,74,125,74,184,75,8,75,101,75,169,75,186,76,37,76,53,76,131,76,139,76,147,76,165,76,173,77,6,77,88,77,96,77,112,77,128,77,177,77,214,77,253,78,14,78,30,78,47,78,64,78,82,78,100,78,117,78,134,78,155,78,176,78,184,78,218,78,247,79,21,79,29,79,58,79,105,79,154,79,180,79,242,80,90,80,122,80,138,81,36,81,44,81,52,81,87,81,123,81,135,81,160,81,211,82,24,82,134,82,248,83,110,83,212,84,44,84,160,84,244,84,252,85,75,85,98,85,121,85,144,85,167,86,10,86,62,86,99,86,151,86,174,86,210,87,50,87,98,87,227,88,44,88,62,88,80,88,125,88,137,88,149,88,188,88,227,89,2,89,33,89,64,89,117,89,183,89,252,90,77,90,110,90,211,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,92,113,92,204,92,221,92,229,93,108,93,167,94,11,94,28,94,45,94,57,94,69,94,87,94,140,94,195,94,211,94,227,95,64,95,151,95,224,96,49,96,58,96,67,96,76,96,122,96,153,96,170,96,187,96,203,96,219,97,78,97,153,97,237,98,59,98,155,98,254,99,63,99,128,99,214,100,44,100,143,100,244,101,105,101,224,102,140,103,48,103,56,103,64,103,157,103,246,104,47,104,103,104,121,104,139,105,1,105,13,105,128,105,243,106,157,107,59,107,209,108,58,108,125,108,191,109,3,109,51,109,96,109,134,109,172,110,144,111,27,111,129,111,223,112,49,112,130,112,215,113,67,113,123,113,180,114,6,114,85,114,168,114,251,115,7,115,19,115,80,115,140,115,205,116,16,116,88,116,172,116,230,117,30,117,93,117,162,117,221,118,29,118,115,118,198,119,66,119,185,119,197,119,209,120,2,120,52,120,60,120,111,120,173,120,241,121,48,121,113,121,174,121,236,122,48,122,115,122,191,123,11,123,67,123,122,123,232,124,75,124,193,125,45,125,53,125,70,125,87,125,172,125,252,126,68,126,135,126,204,127,21,127,85,127,150,127,218,128,30,128,111,128,189,128,197,128,214,128,230,128,248,129,9,129,17,129,25,129,42,129,58,129,139,129,218,129,236,129,253,130,15,130,33,130,51,130,68,130,144,130,218,130,235,130,251,131,13,131,30,131,48,131,65,131,73,131,81,131,99,131,116,131,134,131,151,131,168,131,184,131,202,131,219,131,237,131,254,132,16,132,33,132,76,132,119,132,137,132,155,132,167,132,178,132,190,132,202,133,16,133,86,133,148,133,156,133,246,134,100,134,201,135,39,135,129,135,212,136,43,136,121,136,196,137,19,137,102,137,176,137,239,138,45,138,138,138,146,138,158,138,170,138,182,138,194,138,211,138,228,138,246,139,8,139,26,139,44,139,62,139,80,139,98,139,116,139,137,139,157,139,175,139,193,139,211,139,229,139,247,140,9,140,27,140,45,140,66,140,86,140,98,140,110,140,127,140,144,140,161,140,177,140,195,140,213,140,231,140,249,141,11,141,29,141,47,141,65,141,86,141,106,141,123,141,140,141,152,141,164,141,176,141,188,141,205,141,222,141,240,142,2,142,20,142,38,142,56,142,74,142,92,142,110,142,131,142,151,142,168,142,184,142,201,142,217,142,234,142,251,143,12,143,28,143,40,143,52,143,64,143,76,143,93,143,110,143,127,143,143,143,160,143,176,143,193,143,210,143,227,143,243,143,255,144,11,144,23,144,35,144,52,144,69,144,86,144,102,144,114,144,166,144,225,145,29,145,106,145,194,145,250,146,50,146,123,146,205,146,245,147,24,147,59,147,68,147,131,147,173,147,238,148,78,148,147,148,222,148,230,149,9,149,17,149,110,149,122,149,246,150,2,150,14,150,113,150,129,150,145,150,162,150,178,150,199,150,216,150,233,150,250,151,12,151,29,151,46,151,63,151,74,151,91,151,103,151,121,151,129,151,147,151,155,151,173,151,181,151,189,151,206,151,218,0,0,0,2,0,193,0,0,4,10,5,182,0,3,0,7,0,21,183,4,3,5,2,4,3,7,0,0,47,50,47,51,1,47,51,47,51,49,48,19,33,17,33,55,33,17,33,193,3,73,252,183,104,2,121,253,135,5,182,250,74,104,4,230,0,2,0,152,255,227,1,137,5,182,0,3,0,14,0,43,64,20,3,9,9,2,4,4,15,16,1,1,12,2,12,6,79,89,12,22,2,3,0,63,63,43,17,18,0,57,24,47,17,18,1,57,17,51,51,17,51,49,48,1,35,3,51,3,52,51,50,22,21,20,6,35,34,38,1,70,105,51,207,225,120,58,63,64,57,52,68,1,147,4,35,250,180,136,70,66,64,71,63,0,0,2,0,133,3,166,2,176,5,182,0,3,0,7,0,31,64,13,0,3,7,4,3,4,8,9,6,2,7,3,3,0,63,51,205,50,17,18,1,57,57,17,51,17,51,49,48,1,3,35,3,33,3,35,3,1,63,40,105,41,2,43,41,104,41,5,182,253,240,2,16,253,240,2,16,0,0,2,0,51,0,0,4,246,5,182,0,27,0,31,0,153,64,85,8,31,28,21,4,20,9,17,12,12,9,18,15,14,11,4,10,19,19,20,22,29,30,7,4,6,23,4,1,0,25,4,24,5,5,6,20,6,10,33,3,26,23,3,24,10,24,32,33,8,4,12,13,12,78,89,28,1,13,31,0,16,17,16,78,89,25,21,17,79,13,1,79,17,1,13,17,13,17,5,23,19,3,10,5,0,47,51,63,51,18,57,57,47,47,93,93,17,51,51,43,17,0,51,51,17,51,51,43,17,0,51,51,17,18,1,57,57,17,23,51,17,18,57,57,17,51,17,18,23,57,17,18,23,57,17,51,17,18,23,57,50,50,17,51,17,18,23,57,49,48,1,3,33,21,33,3,35,19,33,3,35,19,33,53,33,19,33,53,33,19,51,3,33,19,51,3,33,21,1,33,19,33,3,213,66,1,27,254,205,84,137,84,254,209,82,136,80,254,250,1,31,68,254,235,1,43,82,139,82,1,49,84,134,84,1,8,252,229,1,47,66,254,209,3,131,254,172,129,254,82,1,174,254,82,1,174,129,1,84,127,1,180,254,76,1,180,254,76,127,254,172,1,84,0,3,0,131,255,137,4,12,6,18,0,32,0,38,0,45,0,102,64,53,39,17,37,29,23,4,4,42,20,13,5,33,0,0,25,5,17,9,5,46,47,37,13,6,13,77,89,3,6,36,14,42,14,76,89,29,42,43,28,20,28,77,89,23,42,20,6,20,6,20,5,22,5,0,47,47,18,57,57,47,47,18,57,50,43,17,0,51,17,51,43,17,0,51,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,51,51,17,51,51,51,17,51,49,48,1,20,6,7,21,35,53,34,38,39,53,22,22,51,17,38,38,53,52,54,55,53,51,21,22,23,7,38,39,17,30,2,7,52,38,39,17,54,1,20,22,23,17,6,6,4,12,204,183,129,112,210,67,83,217,89,205,165,203,167,129,184,171,52,149,154,157,156,74,170,89,128,217,253,221,90,111,99,102,1,193,136,177,23,232,223,35,31,156,37,47,1,184,65,172,136,131,168,18,182,180,5,69,131,59,11,254,78,50,95,123,101,72,89,44,254,123,30,3,7,76,92,41,1,131,16,93,0,0,5,0,104,255,236,6,45,5,203,0,9,0,21,0,33,0,45,0,49,0,69,64,36,0,16,5,10,22,40,28,34,34,46,40,10,48,16,6,50,51,3,13,31,43,13,43,13,43,48,49,6,48,24,25,37,25,7,19,7,0,63,51,63,51,63,63,18,57,57,47,47,17,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,20,22,51,50,17,16,35,34,6,5,20,6,35,34,38,53,52,54,51,50,22,1,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,52,54,51,50,22,1,1,35,1,242,74,83,164,164,83,74,1,202,153,148,140,155,149,146,145,156,1,166,74,84,84,80,80,84,84,74,1,203,153,148,142,153,149,146,142,159,254,254,252,213,147,3,43,4,2,170,170,1,84,1,82,168,170,228,233,238,223,227,230,238,252,219,171,169,167,173,171,165,165,171,227,233,238,222,227,230,235,3,32,250,74,5,182,0,0,3,0,113,255,236,5,211,5,205,0,11,0,21,0,53,0,81,64,48,19,22,0,29,6,35,42,43,46,43,45,35,14,38,25,29,22,9,54,55,51,12,73,89,51,19,15,39,45,14,48,5,47,3,25,38,3,42,42,32,47,18,32,9,74,89,32,4,0,63,43,0,24,63,18,57,47,23,57,18,23,57,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,20,22,23,54,54,53,52,38,35,34,6,19,50,55,1,14,2,21,20,22,37,52,54,55,46,2,53,52,54,51,50,22,21,20,6,7,1,54,54,55,51,2,7,1,35,39,6,6,35,34,38,1,158,72,87,129,101,103,86,89,111,155,241,159,254,75,111,92,44,155,254,185,139,180,85,61,36,196,175,162,186,136,157,1,151,56,67,23,168,68,137,1,43,229,185,118,244,150,215,237,4,147,69,125,88,75,127,83,77,97,96,251,157,154,1,168,68,89,102,65,117,137,250,130,200,102,95,98,106,57,150,168,167,149,107,181,93,254,121,62,167,99,254,226,148,254,221,178,106,92,212,0,0,1,0,133,3,166,1,63,5,182,0,3,0,20,183,0,3,3,4,5,2,3,3,0,63,205,17,18,1,57,17,51,49,48,1,3,35,3,1,63,40,105,41,5,182,253,240,2,16,0,0,1,0,82,254,188,2,33,5,182,0,13,0,28,64,12,7,0,10,4,0,4,14,15,11,39,3,3,0,63,63,17,18,1,57,57,17,51,17,51,49,48,19,16,18,55,51,6,2,21,20,18,23,35,38,2,82,155,146,162,144,145,148,139,160,147,154,2,49,1,9,1,206,174,193,254,50,244,240,254,54,189,170,1,198,0,0,1,0,61,254,188,2,12,5,182,0,13,0,28,64,12,4,10,7,0,10,0,14,15,10,3,4,39,0,63,63,17,18,1,57,57,17,51,17,51,49,48,1,16,2,7,35,54,18,53,52,2,39,51,22,18,2,12,155,146,160,139,148,145,144,162,147,154,2,49,254,249,254,58,168,188,1,203,240,244,1,206,193,175,254,49,0,1,0,86,2,127,4,14,6,20,0,14,0,48,64,27,3,5,4,1,7,13,10,9,11,9,15,16,4,10,1,13,2,12,12,13,10,7,4,6,8,14,0,0,63,196,50,23,57,17,51,17,51,17,51,17,18,1,23,57,49,48,1,3,37,23,5,19,7,3,3,39,19,37,55,5,3,2,145,43,1,142,26,254,131,248,172,176,160,176,242,254,135,29,1,135,43,6,20,254,117,111,182,31,254,186,94,1,106,254,150,94,1,70,31,182,111,1,139,0,0,1,0,104,0,227,4,41,4,195,0,11,0,40,64,19,0,4,4,9,5,5,12,13,3,7,8,7,80,89,0,15,8,1,8,0,47,93,51,43,17,0,51,17,18,1,57,17,51,51,17,51,49,48,1,33,21,33,17,35,17,33,53,33,17,51,2,141,1,156,254,100,139,254,102,1,154,139,3,23,138,254,86,1,170,138,1,172,0,1,0,63,254,248,1,109,0,238,0,8,0,17,181,5,0,9,10,5,0,0,47,205,17,18,1,57,57,49,48,37,23,6,2,7,35,54,18,55,1,94,15,26,98,53,125,27,65,13,238,23,100,254,247,114,104,1,50,92,0,1,0,84,1,217,2,63,2,113,0,3,0,17,181,2,0,5,4,0,1,0,47,51,17,18,1,57,57,49,48,19,53,33,21,84,1,235,1,217,152,152,0,1,0,152,255,227,1,137,0,242,0,11,0,24,64,11,6,0,0,12,13,9,3,79,89,9,22,0,63,43,17,18,1,57,17,51,49,48,55,52,54,51,50,22,21,20,6,35,34,38,152,61,57,58,65,66,57,51,67,106,67,69,69,67,65,70,63,0,0,1,0,20,0,0,2,219,5,182,0,3,0,19,183,2,0,4,5,3,3,2,18,0,63,63,17,18,1,57,57,49,48,1,1,35,1,2,219,253,223,166,2,33,5,182,250,74,5,182,0,2,0,102,255,236,4,45,5,205,0,11,0,23,0,40,64,20,18,0,12,6,0,6,25,24,9,21,75,89,9,7,3,15,75,89,3,25,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,2,35,34,2,17,16,18,51,50,18,1,16,18,51,50,18,17,16,2,35,34,2,4,45,239,246,236,246,238,244,238,247,252,225,150,164,166,149,149,166,164,150,2,221,254,133,254,138,1,127,1,114,1,126,1,114,254,126,254,146,254,193,254,221,1,39,1,59,1,59,1,37,254,223,0,1,0,188,0,0,2,203,5,182,0,10,0,36,64,16,9,0,1,8,1,11,12,4,9,7,7,1,9,6,1,24,0,63,63,18,57,47,18,57,17,18,1,57,57,17,51,51,49,48,33,35,17,52,55,6,6,7,39,1,51,2,203,162,8,21,52,212,88,1,131,140,4,18,130,116,21,46,172,114,1,43,0,1,0,100,0,0,4,37,5,203,0,25,0,43,64,23,24,1,7,19,0,19,14,1,4,26,27,16,10,75,89,16,7,1,24,76,89,1,24,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,33,53,1,62,2,53,52,38,35,34,6,7,39,54,51,50,22,21,20,2,7,1,21,33,4,37,252,63,1,129,176,112,56,142,126,91,163,100,88,202,238,206,234,156,214,254,192,2,240,143,1,131,178,152,144,83,117,137,60,79,113,168,211,178,139,254,240,208,254,199,8,0,0,1,0,94,255,236,4,27,5,203,0,39,0,67,64,36,27,0,19,7,7,0,3,22,34,13,6,40,41,3,23,22,23,22,75,89,23,23,10,37,37,30,75,89,37,7,10,17,75,89,10,25,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,4,33,34,38,39,53,22,22,51,32,17,16,33,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,3,238,157,144,176,170,254,222,254,245,116,193,91,95,215,96,1,123,254,94,144,146,171,200,147,126,96,170,109,84,90,235,130,213,236,4,94,140,178,30,8,22,180,146,209,225,35,44,158,47,49,1,41,1,10,143,151,134,107,122,52,70,112,71,81,195,0,0,2,0,43,0,0,4,106,5,190,0,10,0,18,0,60,64,30,18,5,9,2,2,11,7,3,0,3,5,3,19,20,1,5,18,5,76,89,9,15,7,18,18,3,7,6,3,24,0,63,63,18,57,47,18,57,51,43,17,0,51,17,18,1,23,57,17,51,51,51,17,51,17,51,49,48,1,35,17,35,17,33,53,1,51,17,51,33,17,52,55,35,6,7,1,4,106,217,159,253,57,2,182,176,217,254,136,10,8,48,42,254,55,1,80,254,176,1,80,145,3,221,252,41,1,230,143,180,96,63,253,118,0,1,0,133,255,236,4,29,5,182,0,26,0,58,64,31,15,3,25,20,8,20,23,3,4,28,27,0,17,75,89,0,0,6,21,21,24,76,89,21,6,6,12,75,89,6,25,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,50,4,21,20,0,35,34,39,53,22,22,51,50,54,53,16,33,34,7,39,19,33,21,33,3,54,2,45,231,1,9,254,223,254,247,130,70,208,101,176,195,254,137,95,159,86,55,2,215,253,183,37,115,3,125,229,199,227,254,254,79,160,45,51,166,157,1,50,29,55,2,172,153,254,73,23,0,0,2,0,117,255,236,4,47,5,203,0,22,0,36,0,68,64,35,26,17,11,33,33,0,0,6,17,3,38,37,12,11,14,29,77,89,11,14,14,20,3,20,23,75,89,20,25,3,8,77,89,3,7,0,63,43,0,24,63,43,17,18,0,57,24,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,19,16,0,33,50,23,21,38,35,34,2,3,51,54,51,50,22,21,20,2,35,34,0,5,50,54,53,52,38,35,34,6,6,21,20,22,22,117,1,79,1,72,113,65,77,99,235,248,12,12,110,238,197,227,249,212,227,254,246,1,235,142,157,146,145,90,150,89,80,147,2,113,1,175,1,171,19,143,25,254,219,254,198,172,238,204,228,254,251,1,85,200,179,169,145,166,74,130,70,103,178,104,0,1,0,94,0,0,4,43,5,182,0,6,0,31,64,16,1,5,5,0,2,3,7,8,3,2,76,89,3,6,0,24,0,63,63,43,17,18,1,23,57,17,51,49,48,33,1,33,53,33,21,1,1,29,2,94,252,227,3,205,253,170,5,29,153,133,250,207,0,3,0,104,255,236,4,41,5,203,0,22,0,34,0,46,0,77,64,41,23,15,38,20,44,3,29,9,9,3,6,17,20,15,6,47,48,6,17,41,32,41,32,75,89,41,41,12,0,12,26,77,89,12,25,0,35,77,89,0,7,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,50,22,21,20,6,7,22,22,21,20,6,35,34,38,53,52,37,38,38,53,52,54,3,20,22,51,50,54,53,52,38,39,6,6,1,34,6,21,20,22,23,54,54,53,52,38,2,72,200,234,134,147,178,150,254,221,234,252,1,50,138,120,235,119,167,151,149,166,156,194,149,134,1,58,125,142,118,159,143,119,145,5,203,186,164,108,178,73,85,187,123,182,217,205,188,251,140,78,181,112,159,189,251,166,120,134,140,122,97,151,71,64,155,3,103,120,100,92,132,66,60,138,92,101,119,0,0,2,0,106,255,236,4,37,5,203,0,23,0,37,0,65,64,34,27,17,34,10,10,0,0,4,17,3,38,39,14,30,77,89,11,20,14,14,2,20,20,24,75,89,20,7,2,7,77,89,2,25,0,63,43,0,24,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,33,34,39,53,22,51,50,18,19,35,6,6,35,34,38,53,52,18,51,50,22,18,1,34,6,21,20,22,51,50,54,54,53,52,38,38,4,37,253,104,116,68,80,102,240,245,11,12,55,182,114,194,228,255,208,149,223,120,254,20,143,156,144,147,91,153,88,82,147,3,70,252,166,20,143,26,1,41,1,51,83,87,232,208,228,1,8,153,254,219,1,48,184,164,144,165,74,128,70,105,178,102,0,0,2,0,152,255,227,1,137,4,100,0,11,0,21,0,40,64,20,16,6,6,12,0,0,22,23,14,19,79,89,14,16,9,3,79,89,9,22,0,63,43,0,24,63,43,17,18,1,57,17,51,51,17,51,49,48,55,52,54,51,50,22,21,20,6,35,34,38,17,52,51,50,21,20,6,35,34,38,152,61,57,58,65,66,57,51,67,118,123,66,57,51,67,106,67,69,69,67,65,70,63,3,187,135,135,65,70,63,0,2,0,63,254,248,1,133,4,100,0,8,0,18,0,34,64,16,1,13,13,5,9,9,20,19,11,16,79,89,11,16,5,0,0,47,205,63,43,17,18,1,57,17,51,51,17,51,49,48,37,23,6,2,7,35,54,18,55,3,52,51,50,21,20,6,35,34,38,1,94,15,26,98,53,125,27,65,13,21,119,123,66,57,58,61,238,23,100,254,247,114,104,1,50,92,2,239,135,135,65,70,70,0,0,1,0,104,0,242,4,41,4,217,0,6,0,21,64,9,4,0,5,1,4,7,8,3,0,0,47,47,17,18,1,23,57,49,48,37,1,53,1,21,1,1,4,41,252,63,3,193,252,242,3,14,242,1,166,98,1,223,149,254,141,254,184,0,0,2,0,119,1,193,4,25,3,227,0,3,0,7,0,42,64,21,7,2,4,0,2,0,9,8,4,5,80,89,4,1,0,80,89,15,1,1,1,0,47,93,43,0,24,47,43,17,18,1,57,57,17,51,17,51,49,48,19,53,33,21,1,53,33,21,119,3,162,252,94,3,162,3,90,137,137,254,103,137,137,0,0,1,0,104,0,242,4,41,4,217,0,6,0,21,64,9,5,1,2,0,4,7,8,6,3,0,47,47,17,18,1,23,57,49,48,19,1,1,53,1,21,1,104,3,15,252,241,3,193,252,63,1,137,1,70,1,117,149,254,33,98,254,90,0,0,2,0,27,255,227,3,57,5,203,0,27,0,38,0,57,64,29,33,28,27,0,7,19,19,0,28,14,4,39,40,0,0,36,16,36,30,79,89,36,22,16,10,73,89,16,4,0,63,43,0,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,17,51,49,48,1,53,52,54,55,54,54,53,52,38,35,34,6,7,39,54,51,50,22,21,20,6,6,7,6,6,21,21,3,52,51,50,22,21,20,6,35,34,38,1,33,72,98,136,71,131,123,79,150,97,59,189,206,191,212,39,76,126,101,65,178,120,58,63,64,57,52,68,1,147,54,117,151,84,115,116,82,102,111,37,49,135,99,188,171,73,111,99,110,86,114,95,33,254,215,136,70,66,64,71,63,0,2,0,121,255,70,6,184,5,180,0,53,0,63,0,69,64,34,35,46,54,14,59,7,20,27,0,0,41,20,14,46,5,64,65,24,56,56,4,61,8,17,11,17,11,17,43,31,50,3,38,43,0,47,51,63,51,18,57,57,47,47,18,57,50,51,51,17,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,20,6,6,35,34,38,39,35,6,6,35,34,38,53,52,54,51,50,22,23,3,21,20,51,50,54,53,52,2,36,35,34,4,2,21,16,0,33,50,55,21,6,35,32,0,17,16,18,36,33,50,4,18,1,20,51,50,19,19,38,35,34,6,6,184,88,160,104,86,118,11,8,40,149,102,150,169,236,192,68,172,69,25,133,91,114,148,254,239,177,223,254,182,174,1,66,1,47,210,226,192,244,254,149,254,111,214,1,140,1,0,215,1,79,183,251,246,195,207,18,14,72,85,130,147,2,217,142,236,130,104,81,87,98,205,176,204,255,25,22,254,42,22,178,215,172,181,1,16,147,185,254,169,225,254,207,254,184,86,133,84,1,143,1,102,1,4,1,150,223,181,254,179,254,164,254,1,57,1,5,20,180,0,2,0,0,0,0,5,16,5,188,0,7,0,14,0,57,64,30,2,14,11,8,1,5,0,3,0,7,3,4,7,4,16,15,14,2,73,89,11,5,14,14,4,5,3,0,4,18,0,63,51,63,18,57,47,18,57,43,17,18,1,57,57,17,51,17,51,17,18,23,57,49,48,33,3,33,3,35,1,51,1,1,3,38,39,6,7,3,4,96,182,253,182,180,172,2,66,143,2,63,254,101,170,33,35,22,41,172,1,209,254,47,5,188,250,68,2,106,1,197,86,125,96,115,254,59,0,3,0,201,0,0,4,190,5,182,0,14,0,23,0,32,0,73,64,38,19,4,29,10,15,25,25,14,10,4,7,14,4,33,34,8,15,24,15,24,74,89,15,15,14,0,14,25,74,89,14,18,0,23,74,89,0,3,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,33,32,4,21,20,6,7,21,4,17,20,4,35,33,19,33,50,54,53,52,38,35,35,17,17,33,50,54,53,52,38,35,201,1,157,1,35,1,4,145,139,1,77,254,247,238,254,2,170,1,24,180,158,176,192,250,1,49,177,179,183,187,5,182,174,188,130,169,25,10,57,254,219,196,220,3,68,113,134,123,109,253,145,253,221,137,146,136,128,0,0,1,0,125,255,236,4,207,5,203,0,22,0,38,64,20,3,14,20,9,14,3,23,24,18,0,73,89,18,4,11,6,73,89,11,19,0,63,43,0,24,63,43,17,18,1,23,57,17,51,49,48,1,34,0,17,16,0,51,50,55,21,6,35,32,0,17,52,18,36,51,50,23,7,38,3,59,241,254,233,1,13,249,153,196,152,223,254,189,254,161,169,1,63,216,230,172,72,166,5,51,254,191,254,233,254,225,254,199,55,149,57,1,136,1,105,226,1,84,184,84,146,78,0,0,2,0,201,0,0,5,88,5,182,0,8,0,17,0,40,64,20,14,4,9,0,4,0,18,19,5,13,74,89,5,3,4,14,74,89,4,18,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,0,33,33,17,33,32,0,3,16,0,33,35,17,51,32,0,5,88,254,119,254,143,254,107,1,192,1,85,1,122,180,254,225,254,229,247,207,1,48,1,50,2,233,254,150,254,129,5,182,254,134,254,167,1,30,1,34,251,112,1,43,0,0,1,0,201,0,0,3,248,5,182,0,11,0,58,64,31,6,10,10,1,4,0,8,1,4,12,13,6,9,73,89,6,6,1,2,2,5,73,89,2,3,1,10,73,89,1,18,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,33,33,17,33,21,33,17,33,21,33,17,33,3,248,252,209,3,47,253,123,2,94,253,162,2,133,5,182,151,254,41,150,253,230,0,1,0,201,0,0,3,248,5,182,0,9,0,50,64,26,6,0,0,1,3,8,1,3,10,11,6,9,73,89,6,6,1,2,2,5,73,89,2,3,1,18,0,63,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,33,35,17,33,21,33,17,33,21,33,1,115,170,3,47,253,123,2,94,253,162,5,182,151,253,233,151,0,0,1,0,125,255,236,5,61,5,203,0,27,0,58,64,31,20,8,25,2,2,14,27,8,4,28,29,0,27,73,89,0,0,5,12,12,17,73,89,12,4,5,23,73,89,5,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,33,17,6,6,35,32,0,17,52,18,36,51,50,23,7,38,35,32,0,17,16,0,33,50,55,17,33,3,76,1,241,116,240,158,254,180,254,142,183,1,88,231,234,202,66,198,183,254,245,254,212,1,33,1,24,152,145,254,185,2,254,253,57,37,38,1,139,1,100,228,1,87,181,86,150,84,254,194,254,230,254,216,254,206,35,1,194,0,1,0,201,0,0,5,31,5,182,0,11,0,51,64,25,9,1,1,0,8,4,4,5,0,5,13,12,8,3,73,89,8,8,5,10,6,3,1,5,18,0,63,51,63,51,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,33,35,17,33,17,35,17,51,17,33,17,51,5,31,170,252,254,170,170,3,2,170,2,176,253,80,5,182,253,146,2,110,0,0,1,0,84,0,0,2,86,5,182,0,11,0,55,64,28,5,1,10,3,8,0,0,3,1,3,12,13,9,4,6,4,74,89,6,3,10,3,1,3,74,89,1,18,0,63,43,17,0,51,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,53,55,17,39,53,33,21,7,17,23,2,86,253,254,172,172,2,2,172,172,98,35,4,170,37,98,98,37,251,86,35,0,1,255,96,254,127,1,104,5,182,0,13,0,29,64,13,11,8,8,14,15,9,3,0,5,73,89,0,34,0,63,43,0,24,63,17,18,1,57,17,51,49,48,3,34,39,53,22,51,50,54,53,17,51,17,20,6,12,94,54,71,77,99,103,170,192,254,127,27,145,20,120,113,5,182,250,88,190,209,0,0,1,0,201,0,0,4,233,5,182,0,11,0,42,64,21,8,4,4,5,5,2,11,10,0,5,13,12,2,8,5,9,6,3,1,5,18,0,63,51,63,51,18,57,57,17,18,1,23,57,17,51,17,51,49,48,33,35,1,7,17,35,17,51,17,1,51,1,4,233,200,253,235,153,170,170,2,151,201,253,180,2,197,136,253,195,5,182,253,43,2,213,253,133,0,1,0,201,0,0,3,248,5,182,0,5,0,31,64,14,3,0,0,4,6,7,1,3,0,3,73,89,0,18,0,63,43,0,24,63,17,18,1,57,57,17,51,49,48,51,17,51,17,33,21,201,170,2,133,5,182,250,228,154,0,1,0,201,0,0,6,113,5,182,0,19,0,50,64,24,8,5,5,6,11,14,14,13,6,13,20,21,1,10,17,3,6,11,7,3,14,0,6,18,0,63,51,51,63,51,18,23,57,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,33,1,35,22,21,17,35,17,33,1,51,1,51,17,35,17,52,55,35,1,3,80,254,16,8,14,157,1,0,1,207,8,1,211,254,170,14,8,254,12,5,16,154,212,252,94,5,182,251,74,4,182,250,74,3,174,162,190,250,242,0,1,0,201,0,0,5,63,5,182,0,16,0,46,64,21,9,6,6,7,1,15,15,0,7,0,17,18,11,3,7,15,8,3,1,7,18,0,63,51,63,51,18,57,57,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,33,35,1,35,22,21,17,35,17,51,1,51,38,2,55,17,51,5,63,194,252,225,8,16,157,192,3,29,8,2,14,2,159,4,203,216,180,252,193,5,182,251,58,27,1,37,63,3,71,0,0,2,0,125,255,236,5,190,5,205,0,11,0,23,0,40,64,20,18,0,12,6,0,6,25,24,9,21,73,89,9,4,3,15,73,89,3,19,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,5,190,254,157,254,196,254,189,254,161,1,96,1,68,1,59,1,98,251,115,253,241,243,248,247,242,243,253,2,221,254,161,254,110,1,139,1,104,1,101,1,137,254,112,254,160,254,215,254,205,1,50,1,42,1,39,1,49,254,205,0,2,0,201,0,0,4,104,5,182,0,9,0,18,0,52,64,26,10,5,5,6,14,0,6,0,19,20,10,4,74,89,10,10,6,7,7,18,74,89,7,3,6,18,0,63,63,43,17,18,0,57,24,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,20,4,33,35,17,35,17,33,32,1,51,50,54,53,52,38,35,35,4,104,254,209,254,230,172,170,1,123,2,36,253,11,153,226,202,190,201,190,4,12,222,239,253,193,5,182,253,27,146,161,145,142,0,0,2,0,125,254,164,5,190,5,205,0,15,0,27,0,52,64,27,16,10,22,0,0,4,3,10,4,28,29,3,13,7,13,25,73,89,13,4,7,19,73,89,5,7,19,0,63,198,43,0,24,63,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,16,2,7,1,35,1,7,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,5,190,226,206,1,92,247,254,227,55,254,189,254,161,1,96,1,68,1,59,1,98,251,115,253,241,243,248,247,242,243,253,2,221,254,231,254,140,66,254,150,1,74,2,1,139,1,104,1,101,1,137,254,112,254,160,254,215,254,205,1,50,1,42,1,39,1,49,254,205,0,2,0,201,0,0,4,207,5,182,0,12,0,21,0,72,64,37,13,1,1,2,12,9,17,7,11,10,10,7,9,2,4,22,23,9,13,0,13,0,74,89,13,13,2,3,3,21,73,89,3,3,11,2,18,0,63,51,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,17,35,17,33,32,4,21,16,5,1,35,1,37,51,50,54,53,52,38,35,35,1,115,170,1,145,1,13,1,1,254,218,1,141,201,254,158,254,207,233,180,168,171,189,221,2,96,253,160,5,182,206,207,254,222,102,253,111,2,96,146,143,143,145,128,0,1,0,106,255,236,4,2,5,203,0,36,0,52,64,27,30,19,12,0,0,24,19,5,4,37,38,12,30,3,22,22,27,73,89,22,4,3,9,73,89,3,19,0,63,43,0,24,63,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,49,48,1,20,4,35,32,39,53,22,22,51,50,54,53,52,38,38,39,38,38,53,52,54,51,50,23,7,38,35,34,6,21,20,22,22,23,22,22,4,2,254,232,240,254,252,140,90,212,104,170,172,61,143,146,204,175,254,209,218,183,53,181,171,135,152,56,133,137,230,173,1,133,193,216,67,164,38,44,129,115,76,97,82,52,73,200,161,169,200,80,148,76,116,103,76,97,81,49,82,188,0,0,1,0,18,0,0,4,90,5,182,0,7,0,36,64,18,0,1,5,1,3,3,8,9,7,3,4,3,73,89,4,3,1,18,0,63,63,43,17,0,51,17,18,1,23,57,17,51,49,48,33,35,17,33,53,33,21,33,2,139,170,254,49,4,72,254,49,5,31,151,151,0,0,1,0,186,255,236,5,25,5,182,0,17,0,37,64,17,16,1,10,7,1,7,19,18,17,8,3,4,13,73,89,4,19,0,63,43,0,24,63,51,17,18,1,57,57,17,51,17,51,49,48,1,17,20,0,33,32,0,53,17,51,17,20,22,51,50,54,53,17,5,25,254,210,254,248,254,248,254,223,170,200,194,185,200,5,182,252,78,250,254,226,1,32,252,3,174,252,70,183,196,197,184,3,184,0,1,0,0,0,0,4,195,5,182,0,10,0,26,64,11,1,4,12,11,8,3,0,4,3,3,18,0,63,63,51,18,57,17,18,1,57,57,49,48,1,51,1,35,1,51,1,22,23,54,55,4,12,183,253,241,168,253,244,180,1,80,58,34,36,58,5,182,250,74,5,182,252,78,163,154,162,161,0,1,0,27,0,0,7,76,5,182,0,25,0,36,64,16,25,10,27,26,21,14,14,5,9,24,17,10,3,1,9,18,0,63,51,63,51,51,18,57,57,17,51,17,18,1,57,57,49,48,33,35,1,38,38,39,6,7,1,35,1,51,19,22,23,54,55,1,51,1,22,23,54,55,19,51,5,197,168,254,217,21,52,1,22,48,254,226,168,254,123,180,231,48,22,27,53,1,6,180,1,19,48,33,19,53,230,180,3,211,65,198,20,132,157,252,51,5,182,252,121,190,154,183,175,3,121,252,127,155,195,142,204,3,133,0,0,1,0,8,0,0,4,150,5,182,0,11,0,35,64,18,4,6,5,11,10,0,6,13,12,2,8,4,9,6,3,1,4,18,0,63,51,63,51,18,57,57,17,18,1,23,57,49,48,33,35,1,1,35,1,1,51,1,1,51,1,4,150,193,254,119,254,112,180,1,230,254,59,188,1,107,1,110,181,254,59,2,131,253,125,2,252,2,186,253,189,2,67,253,76,0,0,1,0,0,0,0,4,123,5,182,0,8,0,32,64,15,4,5,2,5,7,3,9,10,0,5,1,7,3,5,18,0,63,63,51,18,57,17,18,1,23,57,17,51,49,48,1,1,51,1,17,35,17,1,51,2,61,1,134,184,254,24,172,254,25,186,2,219,2,219,252,129,253,201,2,47,3,135,0,1,0,82,0,0,4,63,5,182,0,9,0,43,64,23,8,1,3,7,0,7,4,1,4,10,11,5,4,73,89,5,3,1,8,73,89,1,18,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,33,53,1,33,53,33,21,1,33,4,63,252,19,3,8,253,16,3,191,252,248,3,30,133,4,152,153,133,251,105,0,1,0,166,254,188,2,111,5,182,0,7,0,32,64,14,6,1,4,0,1,0,8,9,5,2,3,6,1,39,0,63,51,63,51,17,18,1,57,57,17,51,17,51,49,48,1,33,17,33,21,33,17,33,2,111,254,55,1,201,254,223,1,33,254,188,6,250,141,250,33,0,0,1,0,23,0,0,2,221,5,182,0,3,0,19,183,3,1,4,5,3,3,2,18,0,63,63,17,18,1,57,57,49,48,19,1,35,1,186,2,35,166,253,224,5,182,250,74,5,182,0,0,1,0,51,254,188,1,252,5,182,0,7,0,32,64,14,3,0,1,6,0,6,8,9,0,7,39,3,4,3,0,63,51,63,51,17,18,1,57,57,17,51,17,51,49,48,23,33,17,33,53,33,17,33,51,1,33,254,223,1,201,254,55,182,5,223,141,249,6,0,0,1,0,49,2,39,4,35,5,193,0,6,0,24,64,9,0,3,7,8,5,2,0,4,2,0,47,47,51,18,57,17,18,1,57,57,49,48,19,1,51,1,35,1,1,49,1,178,99,1,221,152,254,140,254,178,2,39,3,154,252,102,2,233,253,23,0,1,255,252,254,197,3,154,255,72,0,3,0,17,181,0,5,1,4,1,2,0,47,51,17,1,51,17,51,49,48,1,33,53,33,3,154,252,98,3,158,254,197,131,0,1,1,137,4,217,3,18,6,33,0,9,0,19,182,0,4,11,10,6,128,1,0,47,26,205,17,18,1,57,57,49,48,1,35,38,38,39,53,51,22,22,23,3,18,110,65,178,40,203,32,114,44,4,217,52,192,63,21,69,181,53,0,2,0,94,255,236,3,205,4,90,0,25,0,36,0,71,64,37,34,8,11,30,30,25,25,18,8,3,37,38,1,2,11,30,71,89,2,11,11,0,21,21,15,70,89,21,16,5,26,70,89,5,22,0,21,0,63,63,43,0,24,63,43,17,18,0,57,24,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,39,35,6,6,35,34,38,53,16,37,55,53,52,38,35,34,7,39,54,54,51,50,22,21,17,37,50,54,53,53,7,6,6,21,20,22,3,82,33,8,82,163,122,163,185,2,19,186,111,122,137,173,51,81,193,97,196,189,254,14,155,177,166,198,175,109,156,103,73,168,155,1,76,16,6,68,129,123,84,127,44,50,174,192,253,20,117,170,153,99,7,7,109,115,90,94,0,2,0,176,255,236,4,117,6,20,0,19,0,31,0,68,64,34,10,23,23,15,15,12,29,3,12,3,32,33,13,0,12,21,18,17,10,17,6,0,6,26,70,89,6,22,0,20,70,89,0,16,0,63,43,0,24,63,43,17,18,0,57,57,17,51,24,63,63,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,50,18,17,16,2,35,34,38,39,35,7,35,17,51,17,20,7,51,54,23,34,6,21,20,22,51,50,54,53,52,38,2,174,216,239,241,214,107,177,60,12,35,119,166,8,8,116,204,170,150,154,170,153,150,150,4,90,254,217,254,242,254,242,254,213,79,82,141,6,20,254,134,127,101,164,139,195,231,231,199,223,209,214,210,0,0,1,0,115,255,236,3,139,4,92,0,22,0,38,64,20,15,3,3,21,9,3,24,23,6,13,70,89,6,16,0,18,70,89,0,22,0,63,43,0,24,63,43,17,18,1,23,57,17,51,49,48,5,34,0,17,16,0,51,50,22,23,7,38,38,35,32,17,20,22,51,50,55,21,6,2,102,238,254,251,1,9,245,79,158,45,51,55,130,50,254,178,163,160,137,144,110,20,1,37,1,12,1,19,1,44,34,23,141,22,29,254,86,202,216,59,147,57,0,2,0,115,255,236,4,55,6,20,0,18,0,31,0,66,64,33,29,6,23,0,14,14,17,6,17,32,33,18,21,15,0,0,1,1,12,3,9,9,26,70,89,9,16,3,19,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,57,17,51,24,63,63,17,18,1,57,57,17,51,17,51,51,17,51,49,48,37,35,6,35,34,2,17,16,18,51,50,23,51,39,39,17,51,17,35,37,50,54,53,53,52,38,35,34,6,21,20,22,3,154,9,115,229,215,239,240,214,223,119,13,7,4,166,135,254,158,170,153,155,170,146,155,154,147,167,1,38,1,15,1,15,1,44,162,79,77,1,190,249,236,119,185,206,35,233,199,227,207,210,214,0,2,0,115,255,236,4,18,4,92,0,19,0,26,0,59,64,31,24,10,23,11,3,3,17,10,3,28,27,23,11,70,89,23,23,0,6,6,20,70,89,6,16,0,14,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,51,17,51,49,48,5,34,0,17,16,0,51,50,18,21,21,33,22,22,51,50,55,21,6,6,3,34,6,7,33,52,38,2,127,243,254,231,1,5,220,206,240,253,13,5,185,168,177,173,88,157,156,132,157,14,2,61,140,20,1,40,1,7,1,9,1,56,254,241,222,105,193,200,74,148,38,33,3,229,172,152,157,167,0,0,1,0,29,0,0,3,14,6,31,0,20,0,57,64,29,20,12,12,19,2,2,7,3,5,3,21,22,10,15,70,89,10,0,1,5,7,5,70,89,19,7,15,3,21,0,63,63,51,43,17,0,51,24,63,43,17,18,1,57,57,17,51,51,17,51,51,18,57,49,48,1,33,17,35,17,35,53,55,53,16,33,50,23,7,38,35,34,6,21,21,33,2,158,254,233,166,196,196,1,97,87,117,43,96,68,94,90,1,23,3,199,252,57,3,199,75,60,61,1,148,35,133,31,125,138,71,0,0,3,0,39,254,20,4,49,4,92,0,42,0,55,0,65,0,110,64,62,43,25,56,37,12,31,61,5,49,19,1,19,5,2,42,34,28,31,37,25,10,66,67,28,15,53,15,53,70,89,8,59,71,89,10,34,8,42,15,8,15,8,22,42,42,2,71,89,42,15,40,63,71,89,40,16,22,46,71,89,22,27,0,63,43,0,24,63,43,0,24,63,43,17,18,0,57,57,24,47,47,17,18,57,57,43,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,21,7,22,22,21,20,6,35,34,39,6,21,20,22,51,51,50,22,21,20,4,33,34,38,53,52,54,55,38,38,53,52,54,55,38,38,53,52,54,51,50,23,1,20,22,51,50,54,53,52,38,35,35,34,6,19,20,22,51,50,53,52,35,34,6,4,49,203,28,44,220,192,49,43,106,74,90,194,178,191,254,220,254,232,215,233,128,116,42,57,64,69,85,107,216,198,86,69,254,17,150,140,209,201,110,152,199,113,126,90,130,116,243,246,117,126,4,72,105,24,35,113,71,161,192,8,56,85,45,43,150,143,182,191,160,146,100,146,26,19,80,53,60,90,42,35,168,108,180,195,20,251,0,89,92,125,107,89,69,108,3,60,115,118,236,247,126,0,1,0,176,0,0,4,68,6,20,0,22,0,51,64,25,14,12,8,8,9,0,22,9,22,23,24,14,9,18,18,4,70,89,18,16,10,0,0,9,21,0,63,51,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,17,51,51,49,48,33,17,52,38,35,34,6,21,17,35,17,51,17,20,7,51,54,54,51,50,22,21,17,3,158,122,130,173,159,166,166,8,10,49,181,116,201,201,2,197,134,132,188,214,253,195,6,20,254,41,85,56,79,91,191,208,253,53,0,0,2,0,162,0,0,1,102,5,223,0,3,0,15,0,35,64,17,10,0,0,4,1,1,16,17,13,7,72,89,13,2,15,1,21,0,63,63,206,43,17,18,1,57,17,51,51,17,51,49,48,33,35,17,51,3,52,54,51,50,22,21,20,6,35,34,38,1,86,166,166,180,56,42,40,58,58,40,42,56,4,72,1,41,57,53,54,56,56,55,55,0,0,2,255,145,254,20,1,102,5,223,0,12,0,24,0,44,64,22,19,11,11,13,8,8,25,26,22,16,72,89,22,64,9,15,0,5,70,89,0,27,0,63,43,0,24,63,26,206,43,17,18,1,57,17,51,51,17,51,49,48,19,34,39,53,22,51,50,54,53,17,51,17,16,3,52,54,51,50,22,21,20,6,35,34,38,43,95,59,69,67,78,73,166,180,56,42,40,58,58,40,42,56,254,20,25,135,20,85,87,4,252,251,16,254,188,7,93,57,53,54,56,56,55,55,0,1,0,176,0,0,4,29,6,20,0,16,0,54,64,27,16,14,10,10,11,11,8,6,4,5,8,4,17,18,12,0,0,16,16,8,8,3,7,11,21,3,15,0,63,63,51,18,57,47,57,17,51,63,17,18,1,23,57,17,57,17,51,17,51,51,49,48,1,54,55,1,51,1,1,35,1,7,17,35,17,51,17,20,7,1,84,43,88,1,98,197,254,68,1,219,201,254,125,125,164,164,8,2,49,61,99,1,119,254,45,253,139,2,6,108,254,102,6,20,252,199,55,115,0,1,0,176,0,0,1,86,6,20,0,3,0,22,64,9,0,1,1,4,5,2,0,1,21,0,63,63,17,18,1,57,17,51,49,48,33,35,17,51,1,86,166,166,6,20,0,1,0,176,0,0,6,203,4,92,0,35,0,70,64,35,21,17,17,18,8,9,0,35,9,18,35,3,36,37,28,22,21,21,18,25,4,13,25,13,70,89,31,25,16,19,15,9,0,18,21,0,63,51,51,63,63,51,43,17,0,51,17,18,57,24,47,51,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,33,17,52,38,35,34,6,21,17,35,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,32,23,51,54,54,51,50,22,21,17,6,37,112,118,155,148,166,112,119,156,145,166,135,27,8,47,171,106,1,1,79,8,49,186,119,186,185,2,201,131,131,178,185,253,156,2,201,131,131,187,213,253,193,4,72,150,80,90,186,86,100,191,210,253,53,0,0,1,0,176,0,0,4,68,4,92,0,20,0,49,64,24,0,20,12,8,8,9,20,9,22,21,12,9,16,16,4,70,89,16,16,10,15,0,9,21,0,63,51,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,17,51,49,48,33,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,50,22,21,17,3,158,122,130,172,160,166,135,27,8,51,184,113,198,200,2,197,134,132,186,214,253,193,4,72,150,81,89,191,210,253,53,0,2,0,115,255,236,4,98,4,92,0,12,0,24,0,40,64,20,19,0,13,7,0,7,26,25,10,22,70,89,10,16,3,16,70,89,3,22,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,0,35,34,38,2,53,16,0,51,50,0,1,20,22,51,50,54,53,52,38,35,34,6,4,98,254,242,238,147,228,124,1,12,238,230,1,15,252,189,168,163,163,169,169,165,163,166,2,37,254,244,254,211,138,1,2,173,1,12,1,43,254,206,254,251,210,220,219,211,209,217,214,0,2,0,176,254,20,4,117,4,92,0,20,0,33,0,63,64,32,25,11,4,7,7,8,31,18,8,18,34,35,4,11,0,15,15,21,70,89,15,16,9,15,8,27,0,28,70,89,0,22,0,63,43,0,24,63,63,63,43,17,18,0,57,57,17,18,1,57,57,17,51,17,51,17,51,51,51,49,48,5,34,38,39,35,22,21,17,35,17,51,23,51,54,54,51,50,18,17,16,2,3,34,6,7,21,20,22,51,50,54,53,52,38,2,174,107,177,60,12,12,166,135,23,8,64,170,110,218,237,241,238,168,150,2,154,170,142,161,161,20,79,82,96,86,254,61,6,52,150,90,80,254,214,254,243,254,242,254,213,3,227,186,203,37,231,199,230,202,205,219,0,2,0,115,254,20,4,55,4,92,0,12,0,31,0,68,64,34,10,16,29,22,3,26,26,25,16,25,32,33,26,27,23,15,29,30,30,22,13,19,19,7,70,89,19,16,13,0,70,89,13,22,0,63,43,0,24,63,43,17,18,0,57,57,17,51,24,63,63,17,18,1,57,57,17,51,17,51,51,51,17,51,49,48,37,50,54,55,53,52,38,35,34,6,21,20,22,23,34,2,17,16,18,51,50,23,51,55,51,17,35,17,52,55,35,6,2,78,166,152,5,156,169,146,155,153,125,212,238,240,214,225,121,9,24,131,166,11,13,115,119,178,211,37,230,202,227,207,207,217,139,1,42,1,11,1,13,1,46,170,150,249,204,1,213,100,70,167,0,1,0,176,0,0,3,39,4,92,0,16,0,42,64,20,13,9,9,10,10,2,17,18,11,15,13,0,10,21,0,5,70,89,0,16,0,63,43,0,24,63,18,57,63,17,18,1,57,57,17,51,17,51,49,48,1,50,23,7,38,35,34,6,21,17,35,17,51,23,51,54,54,2,164,73,58,23,68,52,133,189,166,137,19,8,61,172,4,92,12,154,15,216,161,253,180,4,72,203,107,116,0,1,0,106,255,236,3,115,4,92,0,36,0,54,64,28,30,19,12,0,0,24,5,19,4,37,38,12,30,3,22,22,27,70,89,22,16,6,3,9,70,89,3,22,0,63,43,0,24,47,63,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,49,48,1,20,6,35,34,39,53,22,22,51,50,54,53,52,38,39,46,2,53,52,54,51,50,23,7,38,35,34,6,21,20,22,22,23,22,22,3,115,228,206,218,122,79,181,84,130,140,111,161,153,129,63,218,190,177,169,59,165,134,118,120,45,100,142,195,137,1,43,153,166,69,154,40,46,83,85,64,91,62,57,85,108,75,134,155,72,135,68,74,65,44,62,56,53,71,144,0,1,0,31,255,236,2,168,5,70,0,22,0,52,64,27,16,20,20,9,11,9,18,3,4,24,23,10,19,16,19,71,89,14,64,16,15,7,0,70,89,7,22,0,63,43,0,24,63,26,205,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,37,50,54,55,21,6,6,35,32,17,17,35,53,55,55,51,21,33,21,33,17,20,22,2,18,44,82,24,27,105,42,254,194,157,157,70,96,1,62,254,194,94,117,13,7,127,13,17,1,79,2,140,80,69,234,254,129,253,123,99,106,0,0,1,0,164,255,236,4,57,4,72,0,20,0,52,64,25,1,19,7,12,12,10,19,10,21,22,12,13,13,16,8,20,15,16,4,70,89,16,22,11,21,0,63,63,43,0,24,63,51,18,57,17,51,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,20,22,51,50,54,53,17,51,17,35,39,35,6,6,35,34,38,53,17,1,76,122,130,172,159,166,137,24,9,51,181,116,200,199,4,72,253,57,134,132,188,213,2,64,251,184,147,81,86,190,209,2,205,0,0,1,0,0,0,0,4,2,4,72,0,11,0,24,64,10,1,10,12,13,5,9,1,15,0,21,0,63,63,51,57,17,18,1,57,57,49,48,33,1,51,19,22,23,51,54,18,19,51,1,1,160,254,96,178,236,80,14,8,11,117,204,178,254,96,4,72,253,118,228,68,53,1,77,2,48,251,184,0,1,0,23,0,0,6,35,4,72,0,28,0,44,64,20,9,27,29,30,23,22,14,13,3,4,13,4,8,26,18,9,15,0,8,21,0,63,51,63,51,51,18,57,57,17,51,17,51,51,51,17,18,1,57,57,49,48,33,3,38,39,35,6,7,3,35,1,51,18,18,23,51,54,54,55,19,51,19,22,23,51,54,54,19,51,1,4,47,201,19,52,8,40,30,207,192,254,213,174,106,111,8,8,11,49,18,201,180,196,56,20,8,4,35,191,172,254,209,2,131,59,209,175,95,253,127,4,72,254,99,254,80,75,57,181,53,2,117,253,139,172,117,36,150,2,220,251,184,0,0,1,0,39,0,0,4,8,4,72,0,11,0,34,64,17,7,5,6,0,1,5,12,13,9,3,1,8,11,21,4,1,15,0,63,51,63,51,18,57,57,17,18,1,23,57,49,48,1,1,51,1,1,51,1,1,35,1,1,35,1,184,254,131,189,1,33,1,32,187,254,131,1,145,188,254,205,254,202,188,2,49,2,23,254,92,1,164,253,233,253,207,1,188,254,68,0,1,0,2,254,20,4,6,4,72,0,21,0,36,64,18,9,15,0,3,22,23,4,13,0,13,18,70,89,13,27,8,0,15,0,63,50,63,43,17,18,0,57,17,18,1,23,57,49,48,19,51,19,22,23,51,54,54,19,51,1,6,6,35,34,39,53,22,51,50,55,55,2,178,240,79,19,8,13,83,230,178,254,41,70,187,136,76,74,55,68,171,73,61,4,72,253,143,214,95,51,247,2,124,251,32,185,155,17,133,12,192,156,0,0,1,0,82,0,0,3,109,4,72,0,9,0,43,64,23,8,1,3,7,0,7,4,1,4,10,11,5,4,71,89,5,15,1,8,71,89,1,21,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,33,53,1,33,53,33,21,1,33,3,109,252,229,2,86,253,207,2,231,253,178,2,93,113,3,86,129,129,252,186,0,1,0,61,254,188,2,193,5,182,0,28,0,44,64,21,25,26,26,11,23,0,0,15,7,20,3,3,7,11,3,29,30,19,3,4,39,0,63,63,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,37,20,22,23,21,38,38,53,17,52,38,35,53,54,54,53,17,52,54,51,21,6,21,17,20,7,21,22,21,1,219,117,113,190,208,126,120,130,116,216,182,230,223,223,12,102,92,2,140,2,170,154,1,47,104,89,141,2,92,96,1,50,155,172,139,6,193,254,217,215,39,12,39,215,0,1,1,238,254,16,2,123,6,20,0,3,0,22,64,9,2,3,3,4,5,3,27,0,0,0,63,63,17,18,1,57,17,51,49,48,1,51,17,35,1,238,141,141,6,20,247,252,0,1,0,72,254,188,2,203,5,182,0,29,0,44,64,21,21,5,10,18,18,2,25,0,29,29,14,14,25,5,3,30,31,21,39,6,3,0,63,63,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,49,48,1,38,53,17,52,39,53,50,22,21,17,20,22,23,21,34,6,21,17,20,6,7,53,54,54,53,17,52,54,55,2,10,223,227,184,211,118,130,122,126,205,190,111,116,110,113,2,63,39,215,1,39,193,6,139,174,153,254,206,97,91,2,141,89,104,254,209,153,171,2,140,2,92,102,1,41,114,120,20,0,0,1,0,104,2,80,4,41,3,84,0,23,0,36,64,17,3,15,24,25,18,12,80,89,3,18,15,6,6,0,80,89,6,0,47,43,0,16,24,196,47,196,43,17,18,1,57,57,49,48,1,34,6,7,53,54,51,50,22,23,22,22,51,50,54,55,21,6,35,34,38,39,38,38,1,82,53,127,54,100,144,68,113,89,66,98,47,54,128,54,102,142,72,126,72,75,90,2,201,67,54,151,109,28,38,28,27,64,57,150,110,33,32,32,24,0,0,2,0,152,254,139,1,137,4,94,0,3,0,14,0,43,64,20,2,4,4,3,9,9,15,16,0,0,3,12,12,6,79,89,12,16,3,34,0,63,63,43,17,18,0,57,24,47,17,18,1,57,17,51,51,17,51,49,48,19,51,19,35,19,20,35,34,38,53,52,54,51,50,22,219,105,51,207,225,121,60,60,63,57,51,70,2,172,251,223,5,76,135,71,64,63,72,64,0,1,0,190,255,236,3,219,5,203,0,27,0,62,64,30,22,8,13,3,3,10,4,0,16,16,4,8,3,28,29,25,5,2,19,10,13,2,13,2,13,4,11,7,4,25,0,63,63,18,57,57,47,47,17,51,51,17,51,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,37,6,7,21,35,53,38,2,53,16,37,53,51,21,22,22,23,7,38,35,34,6,21,20,22,51,50,55,3,203,105,147,133,203,193,1,140,135,75,142,49,49,133,109,172,162,159,167,141,142,240,54,6,200,206,32,1,17,250,1,252,62,172,164,3,33,23,140,51,211,217,212,203,59,0,1,0,63,0,0,4,68,5,201,0,29,0,72,64,38,24,19,9,13,13,26,22,17,2,11,22,19,5,30,31,12,24,25,24,78,89,9,25,25,19,0,19,16,76,89,19,24,0,5,75,89,0,7,0,63,43,0,24,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,17,51,49,48,1,50,23,7,38,35,34,6,21,17,33,21,33,21,20,6,7,33,21,33,53,54,53,53,35,53,51,17,52,54,2,170,190,170,61,154,143,123,125,1,166,254,90,65,74,3,27,251,251,205,198,198,224,5,201,84,133,77,124,140,254,217,127,221,100,136,44,154,141,47,244,223,127,1,60,178,205,0,0,2,0,123,1,6,4,23,4,160,0,27,0,39,0,32,64,13,28,0,34,14,0,14,40,41,31,21,21,37,7,0,47,51,51,47,51,17,18,1,57,57,17,51,17,51,49,48,19,52,55,39,55,23,54,51,50,23,55,23,7,22,21,20,7,23,7,39,6,35,34,39,7,39,55,38,55,20,22,51,50,54,53,52,38,35,34,6,184,74,135,94,135,104,130,127,102,137,95,134,74,74,131,92,137,102,127,134,100,135,92,133,74,129,157,116,116,158,160,114,116,157,2,211,122,107,140,92,133,73,73,133,92,138,113,118,131,103,135,92,133,71,73,133,92,136,107,124,112,160,159,113,114,162,164,0,0,1,0,31,0,0,4,113,5,182,0,22,0,86,64,46,18,14,7,11,11,16,12,5,9,2,9,3,12,20,14,21,7,23,24,10,14,14,7,15,6,18,18,3,0,19,21,15,19,31,19,2,15,19,15,19,12,1,21,6,12,24,0,63,63,51,18,57,57,47,47,93,17,18,57,50,50,17,51,17,51,51,17,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,1,51,1,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,1,51,2,72,1,123,174,254,96,1,6,254,195,1,61,254,195,164,254,196,1,60,254,196,1,0,254,101,178,2,223,2,215,252,254,127,170,127,254,244,1,12,127,170,127,3,2,0,2,1,238,254,16,2,123,6,20,0,3,0,7,0,36,64,16,2,6,6,3,7,7,8,9,4,3,4,3,7,27,0,0,0,63,63,57,57,47,47,17,18,1,57,17,51,51,17,51,49,48,1,51,17,35,17,51,17,35,1,238,141,141,141,141,6,20,252,248,254,13,252,247,0,2,0,123,255,248,3,150,6,29,0,49,0,61,0,67,64,38,50,0,19,6,42,30,56,25,25,30,12,6,0,35,6,62,63,21,3,59,54,28,45,6,33,9,33,39,71,89,33,21,9,16,71,89,9,0,0,63,43,0,24,63,43,17,18,0,23,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,52,54,55,38,38,53,52,54,51,50,22,23,7,38,38,35,34,6,21,20,22,23,22,22,21,20,6,7,22,21,20,6,35,34,39,53,22,22,51,50,54,53,52,38,38,39,46,2,55,20,22,23,23,54,53,52,38,39,6,6,139,86,78,74,84,207,197,94,159,97,53,98,135,76,116,116,123,154,186,150,82,74,153,234,212,218,128,78,194,82,134,141,48,108,115,142,134,66,146,132,167,49,137,147,185,68,85,3,41,86,137,37,40,111,85,121,139,29,39,131,39,27,59,64,60,84,55,68,151,107,90,141,41,81,146,140,153,65,148,37,45,76,71,46,58,58,43,52,90,114,98,77,105,61,19,80,111,83,112,57,19,100,0,2,1,53,5,14,3,104,5,211,0,11,0,23,0,30,64,12,6,0,12,18,0,18,24,25,15,3,21,9,0,47,51,205,50,17,18,1,57,57,17,51,17,51,49,48,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,51,50,22,21,20,6,35,34,38,1,53,53,37,38,55,55,38,37,53,1,125,53,37,37,55,55,37,37,53,5,113,52,46,46,52,50,49,49,50,52,46,46,52,50,49,49,0,0,3,0,100,255,236,6,68,5,203,0,22,0,38,0,54,0,70,64,39,39,23,3,15,47,31,31,20,9,15,23,5,55,56,6,12,0,18,15,12,31,12,2,0,18,16,18,2,12,18,12,18,27,43,35,19,51,27,4,0,63,51,63,51,18,57,57,47,47,93,93,17,51,17,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,6,21,20,22,51,50,55,21,6,6,35,34,38,53,52,54,51,50,23,7,38,1,52,18,36,51,50,4,18,21,20,2,4,35,34,36,2,55,20,18,4,51,50,36,18,53,52,2,36,35,34,4,2,3,125,125,135,127,131,86,125,48,101,70,194,208,221,191,128,118,58,108,252,151,200,1,94,202,200,1,94,202,194,254,162,208,207,254,162,195,105,174,1,45,172,174,1,42,175,174,254,215,176,174,254,214,175,4,35,174,154,168,162,45,124,20,28,241,216,209,246,60,118,51,254,184,200,1,94,202,200,254,162,202,197,254,166,208,207,1,90,198,173,254,211,173,174,1,41,176,174,1,42,175,174,254,215,0,0,2,0,70,3,20,2,113,5,199,0,22,0,31,0,55,64,28,23,6,27,10,1,1,22,22,16,6,3,32,33,28,10,10,18,25,22,0,3,16,3,2,3,13,18,31,0,63,51,212,93,196,51,18,57,47,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,39,6,35,34,38,53,52,54,55,55,53,52,35,34,7,39,54,51,50,22,21,17,37,20,51,50,53,53,7,6,6,2,20,24,92,140,95,111,154,165,117,148,100,104,43,114,133,130,137,254,80,112,201,98,112,103,3,33,84,97,99,102,102,105,6,4,39,133,51,96,56,105,121,254,60,188,100,180,49,4,4,57,0,2,0,82,0,117,3,170,3,190,0,6,0,13,0,41,64,19,3,6,10,13,2,4,11,9,9,4,13,6,4,14,15,12,5,8,1,0,47,51,47,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,1,23,1,1,7,1,37,1,23,1,1,7,1,82,1,86,119,254,223,1,33,119,254,170,1,139,1,88,117,254,225,1,31,117,254,168,2,39,1,151,69,254,162,254,161,71,1,151,27,1,151,69,254,162,254,161,71,1,151,0,0,1,0,104,1,8,4,41,3,23,0,5,0,27,64,12,2,1,4,1,6,7,5,4,80,89,5,2,0,47,47,43,17,18,1,57,57,17,51,49,48,1,17,35,17,33,53,4,41,137,252,200,3,23,253,241,1,133,138,0,255,255,0,84,1,217,2,63,2,113,2,6,0,16,0,0,0,4,0,100,255,236,6,68,5,203,0,8,0,22,0,38,0,54,0,93,64,51,39,23,0,17,17,18,4,9,47,31,31,13,9,12,18,23,6,55,56,12,16,16,0,0,14,19,14,18,8,19,15,18,31,18,2,0,19,16,19,2,18,19,18,19,27,43,35,19,51,27,4,0,63,51,63,51,18,57,57,47,47,93,93,17,51,17,51,17,18,57,47,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,51,50,54,53,52,38,35,35,5,20,6,7,19,35,3,35,17,35,17,33,50,22,1,52,18,36,51,50,4,18,21,20,2,4,35,34,36,2,55,20,18,4,51,50,36,18,53,52,2,36,35,34,4,2,2,211,108,80,97,86,93,106,1,178,85,77,238,168,207,135,148,1,5,166,155,251,223,200,1,94,202,200,1,94,202,194,254,162,208,207,254,162,195,105,174,1,45,172,174,1,42,175,174,254,215,176,174,254,214,175,2,250,83,64,75,65,136,80,123,30,254,117,1,98,254,158,3,123,130,254,197,200,1,94,202,200,254,162,202,197,254,166,208,207,1,90,198,173,254,211,173,174,1,41,176,174,1,42,175,174,254,215,0,1,255,250,6,20,4,6,6,147,0,3,0,17,181,0,5,1,4,1,2,0,47,51,17,1,51,17,51,49,48,1,33,53,33,4,6,251,244,4,12,6,20,127,0,2,0,127,3,92,2,238,5,203,0,12,0,24,0,33,64,14,13,0,19,6,0,6,25,26,16,10,192,22,3,4,0,63,51,26,204,50,17,18,1,57,57,17,51,17,51,49,48,19,52,54,51,50,22,21,20,6,6,35,34,38,55,20,22,51,50,54,53,52,38,35,34,6,127,181,130,130,182,82,146,84,130,181,115,117,81,80,115,113,82,83,115,4,147,130,182,181,131,84,143,84,180,131,82,114,113,83,84,113,114,0,255,255,0,104,0,1,4,41,4,195,2,38,0,14,0,0,0,7,2,43,0,0,253,116,0,1,0,49,2,74,2,141,5,201,0,24,0,35,64,17,7,19,23,1,1,14,19,0,4,26,25,10,16,31,23,1,32,0,63,51,63,51,17,18,1,23,57,17,51,17,51,49,48,1,33,53,55,62,2,53,52,38,35,34,6,7,39,54,51,50,22,21,20,6,7,7,33,2,141,253,164,236,89,82,33,80,63,52,98,69,66,131,152,132,147,89,147,174,1,184,2,74,104,230,86,97,76,54,68,69,38,50,88,111,130,112,80,151,138,165,0,1,0,33,2,57,2,141,5,201,0,35,0,57,64,34,15,5,5,0,3,18,30,10,6,36,37,18,93,19,109,19,2,76,19,1,11,19,27,19,2,19,19,8,26,33,31,13,8,33,0,63,51,63,51,18,57,47,93,93,93,51,17,18,1,23,57,17,51,49,48,1,20,6,7,22,21,20,6,35,34,39,53,22,51,50,53,52,35,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,2,115,82,68,176,184,168,152,116,147,123,211,231,117,119,103,99,80,67,66,112,56,69,63,140,94,136,157,4,231,80,103,23,47,162,128,143,56,123,68,162,145,107,79,68,61,68,43,35,90,45,54,119,0,1,1,137,4,217,3,18,6,33,0,9,0,19,182,9,4,10,11,4,128,9,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,137,48,111,32,202,44,174,64,111,4,242,62,176,65,21,65,190,52,0,1,0,176,254,20,4,68,4,72,0,22,0,53,64,26,5,10,10,8,16,0,19,19,20,8,20,24,23,6,21,15,20,27,13,2,70,89,13,22,9,21,0,63,63,43,0,24,63,63,51,17,18,1,57,57,17,51,17,51,51,17,51,17,51,49,48,1,16,51,50,54,53,17,51,17,35,39,35,6,35,34,39,35,22,21,17,35,17,51,1,86,254,171,159,166,136,26,10,111,229,150,88,10,10,166,166,1,125,254,250,189,212,2,64,251,184,147,167,92,84,160,254,192,6,52,0,1,0,113,254,252,4,96,6,20,0,15,0,39,64,18,4,5,1,0,0,5,11,3,16,17,8,8,5,3,15,5,1,5,0,47,51,63,51,18,57,47,17,18,1,23,57,17,51,17,51,49,48,1,35,17,35,17,35,17,6,35,34,38,53,16,54,51,33,4,96,114,213,115,62,84,216,203,218,232,2,45,254,252,6,176,249,80,3,51,18,250,251,1,4,254,0,1,0,152,2,76,1,137,3,90,0,11,0,23,64,10,6,0,0,13,12,3,9,79,89,3,0,47,43,17,18,1,57,17,51,49,48,19,52,54,51,50,22,21,20,6,35,34,38,152,62,56,58,65,66,57,51,67,2,211,66,69,69,66,65,70,63,0,0,1,0,37,254,20,1,180,0,0,0,18,0,36,64,16,17,14,11,0,0,14,5,3,19,20,14,17,17,8,3,16,0,47,204,50,57,47,51,17,18,1,23,57,17,51,17,51,49,48,1,20,6,35,34,39,53,22,51,50,54,53,52,38,39,55,51,7,22,1,180,153,150,51,45,45,59,79,81,79,109,88,110,55,180,254,223,97,106,9,106,8,40,54,43,53,17,178,115,39,0,1,0,76,2,74,1,225,5,182,0,10,0,32,64,14,2,0,3,3,10,12,11,9,9,3,32,6,0,30,0,63,50,63,57,47,17,18,1,57,57,17,51,51,49,48,1,51,17,35,17,52,55,6,6,7,39,1,82,143,133,6,22,54,135,67,5,182,252,148,2,67,91,90,22,45,95,96,0,2,0,66,3,20,2,190,5,199,0,11,0,23,0,37,64,18,12,6,18,0,6,0,24,25,15,0,3,16,3,2,3,21,9,31,0,63,51,196,93,50,17,18,1,57,57,17,51,17,51,49,48,1,20,6,35,34,38,53,52,54,51,50,22,5,20,22,51,50,54,53,52,38,35,34,6,2,190,171,150,146,169,168,151,152,165,253,254,91,104,105,92,92,105,103,92,4,111,164,183,186,161,163,181,182,162,122,122,122,122,123,118,118,0,2,0,80,0,117,3,168,3,190,0,6,0,13,0,35,64,17,11,9,4,2,0,3,7,2,10,9,6,14,15,12,5,8,1,0,47,51,47,51,17,18,1,23,57,17,51,17,51,49,48,1,1,39,1,1,55,1,5,1,39,1,1,55,1,3,168,254,168,117,1,31,254,225,117,1,88,254,117,254,168,117,1,31,254,225,117,1,88,2,12,254,105,71,1,95,1,94,69,254,105,27,254,105,71,1,95,1,94,69,254,105,255,255,0,75,0,0,5,209,5,182,0,39,2,23,2,131,0,0,0,38,0,123,255,0,1,7,2,60,3,29,253,183,0,9,179,3,2,18,24,0,63,53,53,0,255,255,0,46,0,0,5,219,5,182,0,39,2,23,2,63,0,0,0,38,0,123,226,0,1,7,0,116,3,78,253,183,0,7,178,2,16,24,0,63,53,0,255,255,0,26,0,0,6,33,5,201,0,38,0,117,249,0,0,39,2,23,2,223,0,0,1,7,2,60,3,109,253,183,0,9,179,3,2,43,24,0,63,53,53,0,0,2,0,51,254,119,3,84,4,94,0,29,0,40,0,65,64,34,8,20,30,35,1,28,15,28,35,20,4,41,42,0,29,1,12,3,29,29,17,38,38,32,79,89,38,16,17,11,73,89,17,35,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,20,6,7,14,2,21,20,22,51,50,54,55,23,6,35,34,38,53,52,62,2,55,54,54,53,53,19,20,35,34,38,53,52,54,51,50,22,2,78,75,97,121,61,25,132,122,80,150,98,59,197,198,190,216,35,64,89,54,101,65,180,121,59,62,66,55,51,70,2,172,51,122,148,84,106,75,77,56,100,113,38,48,135,96,186,170,70,105,89,82,47,88,116,93,31,1,43,135,69,66,64,71,64,255,255,0,0,0,0,5,16,7,115,2,38,0,36,0,0,1,7,0,67,255,194,1,82,0,8,179,2,16,5,38,0,43,53,255,255,0,0,0,0,5,16,7,115,2,38,0,36,0,0,1,7,0,118,0,133,1,82,0,8,179,2,24,5,38,0,43,53,255,255,0,0,0,0,5,16,7,115,2,38,0,36,0,0,1,7,1,75,0,35,1,82,0,8,179,2,29,5,38,0,43,53,255,255,0,0,0,0,5,16,7,47,2,38,0,36,0,0,1,7,1,82,0,4,1,82,0,8,179,2,24,5,38,0,43,53,255,255,0,0,0,0,5,16,7,37,2,38,0,36,0,0,1,7,0,106,0,55,1,82,0,10,180,3,2,36,5,38,0,43,53,53,255,255,0,0,0,0,5,16,7,6,2,38,0,36,0,0,0,7,1,80,0,57,0,129,0,2,255,254,0,0,6,129,5,182,0,15,0,19,0,78,64,44,10,14,14,17,1,0,8,12,1,16,5,5,21,5,20,9,19,6,19,73,89,16,3,73,89,10,13,73,89,16,10,16,10,1,6,3,5,18,1,14,73,89,1,18,0,63,43,0,24,63,63,18,57,57,47,47,43,43,43,17,0,51,17,1,51,17,18,23,57,17,51,51,17,51,49,48,33,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,1,33,17,35,6,129,253,18,253,254,227,176,2,186,3,201,253,188,2,29,253,227,2,68,251,84,1,190,118,1,209,254,47,5,182,151,254,41,150,253,230,1,210,2,181,0,255,255,0,125,254,20,4,207,5,203,2,38,0,38,0,0,0,7,0,122,2,2,0,0,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,0,67,255,183,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,0,118,0,63,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,1,75,255,251,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,201,0,0,3,248,7,37,2,38,0,40,0,0,1,7,0,106,0,18,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,0,60,0,0,2,86,7,115,2,38,0,44,0,0,1,7,0,67,254,179,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,84,0,0,2,115,7,115,2,38,0,44,0,0,1,7,0,118,255,97,1,82,0,8,179,1,21,5,38,0,43,53,255,255,255,255,0,0,2,161,7,115,2,38,0,44,0,0,1,7,1,75,254,243,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,60,0,0,2,111,7,37,2,38,0,44,0,0,1,7,0,106,255,7,1,82,0,10,180,2,1,33,5,38,0,43,53,53,0,2,0,47,0,0,5,72,5,182,0,12,0,23,0,87,64,50,17,21,21,8,4,13,0,0,19,4,6,4,24,25,20,6,7,6,73,89,17,15,7,63,7,175,7,207,7,223,7,5,11,3,7,7,4,9,9,16,74,89,9,3,4,21,74,89,4,18,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,16,0,33,33,17,35,53,51,17,33,32,0,3,16,33,35,17,33,21,33,17,51,32,5,72,254,119,254,143,254,123,154,154,1,178,1,81,1,124,181,253,199,231,1,123,254,133,190,2,98,2,233,254,150,254,129,2,137,150,2,151,254,137,254,164,2,64,253,252,150,254,10,255,255,0,201,0,0,5,63,7,47,2,38,0,49,0,0,1,7,1,82,0,147,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,0,67,0,121,1,82,0,8,179,2,25,5,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,0,118,1,10,1,82,0,8,179,2,33,5,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,1,75,0,180,1,82,0,8,179,2,38,5,38,0,43,53,255,255,0,125,255,236,5,190,7,47,2,38,0,50,0,0,1,7,1,82,0,154,1,82,0,8,179,2,33,5,38,0,43,53,255,255,0,125,255,236,5,190,7,37,2,38,0,50,0,0,1,7,0,106,0,213,1,82,0,10,180,3,2,45,5,38,0,43,53,53,0,1,0,133,1,16,4,12,4,152,0,11,0,25,64,9,7,9,3,1,9,1,12,13,8,0,25,47,17,18,1,57,57,17,51,17,51,49,48,1,23,1,1,7,1,1,39,1,1,55,1,3,172,96,254,160,1,94,96,254,158,254,164,101,1,94,254,160,100,1,97,4,152,99,254,158,254,160,99,1,95,254,161,99,1,96,1,96,101,254,157,0,0,3,0,125,255,195,5,190,5,246,0,19,0,27,0,35,0,78,64,44,22,31,23,30,4,28,20,28,10,20,0,0,18,15,5,8,10,6,36,37,22,30,33,25,13,33,73,89,15,18,8,5,4,3,16,13,4,3,25,73,89,6,3,19,0,63,198,43,0,24,63,198,18,23,57,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,18,23,57,49,48,1,16,0,33,34,39,7,39,55,38,17,16,0,33,50,23,55,23,7,22,3,16,39,1,22,51,50,18,1,16,23,1,38,35,34,2,5,190,254,157,254,196,235,148,101,120,108,178,1,96,1,68,209,157,97,120,106,192,180,110,253,96,115,176,243,248,252,39,101,2,157,106,168,243,253,2,221,254,161,254,110,100,141,79,154,198,1,109,1,101,1,137,94,135,80,148,202,254,149,1,16,154,252,76,82,1,50,1,42,254,250,154,3,175,73,254,205,0,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,0,67,0,70,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,0,118,0,207,1,82,0,8,179,1,27,5,38,0,43,53,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,1,75,0,125,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,186,255,236,5,25,7,37,2,38,0,56,0,0,1,7,0,106,0,152,1,82,0,10,180,2,1,39,5,38,0,43,53,53,255,255,0,0,0,0,4,123,7,115,2,38,0,60,0,0,1,7,0,118,0,49,1,82,0,8,179,1,18,5,38,0,43,53,0,2,0,201,0,0,4,121,5,182,0,12,0,21,0,54,64,28,13,9,5,5,6,17,0,6,0,22,23,13,4,74,89,9,21,74,89,13,9,13,9,6,7,3,6,18,0,63,63,18,57,57,47,47,43,43,17,18,1,57,57,17,51,17,51,17,51,51,49,48,1,20,4,33,35,17,35,17,51,17,51,32,4,1,51,50,54,53,52,38,35,35,4,121,254,209,254,225,184,170,170,215,1,25,1,22,252,250,168,226,202,190,202,204,3,16,227,238,254,193,5,182,255,0,207,253,234,143,164,149,138,0,0,1,0,176,255,236,4,156,6,31,0,48,0,65,64,34,41,42,5,29,35,0,23,12,12,0,29,17,42,5,49,50,18,18,42,46,46,38,70,89,46,0,42,21,15,21,70,89,15,22,0,63,43,0,24,63,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,20,7,6,6,21,20,22,22,23,22,22,21,20,6,35,34,39,53,22,22,51,50,53,52,38,39,38,38,53,52,54,55,54,54,53,52,38,35,32,21,17,35,17,52,54,51,50,22,4,25,143,88,56,27,71,78,140,102,194,179,188,107,63,156,72,215,83,110,127,96,69,71,75,64,136,127,254,236,166,220,222,206,225,4,242,135,115,70,67,33,32,42,57,51,95,157,101,160,171,69,154,39,47,182,75,107,70,82,123,84,63,106,53,57,90,53,80,85,223,251,76,4,178,178,187,157,255,255,0,94,255,236,3,205,6,33,2,38,0,68,0,0,1,6,0,67,142,0,0,8,179,2,38,17,38,0,43,53,255,255,0,94,255,236,3,205,6,33,2,38,0,68,0,0,1,6,0,118,43,0,0,8,179,2,46,17,38,0,43,53,255,255,0,94,255,236,3,205,6,33,2,38,0,68,0,0,1,6,1,75,216,0,0,8,179,2,51,17,38,0,43,53,255,255,0,94,255,236,3,205,5,221,2,38,0,68,0,0,1,6,1,82,189,0,0,8,179,2,46,17,38,0,43,53,255,255,0,94,255,236,3,205,5,211,2,38,0,68,0,0,1,6,0,106,226,0,0,10,180,3,2,58,17,38,0,43,53,53,255,255,0,94,255,236,3,205,6,133,2,38,0,68,0,0,1,6,1,80,247,0,0,10,180,3,2,40,17,38,0,43,53,53,0,3,0,94,255,236,6,115,4,92,0,41,0,52,0,59,0,97,64,51,42,0,36,17,48,56,25,25,4,48,57,24,24,31,48,11,0,5,60,61,27,45,39,45,70,89,25,49,4,49,71,89,56,36,39,17,4,4,14,34,39,22,53,8,14,8,70,89,20,14,16,0,63,51,43,17,0,51,24,63,51,18,57,47,57,18,57,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,18,57,57,17,51,49,48,19,52,54,55,55,53,52,38,35,34,7,39,54,54,51,50,22,23,54,54,51,50,18,21,21,33,18,33,50,54,55,21,6,6,35,32,39,6,6,35,34,38,55,20,22,51,50,54,53,53,7,6,6,1,34,6,7,33,52,38,94,248,254,184,116,119,144,163,52,74,199,98,130,165,41,53,171,110,192,232,253,67,8,1,58,91,157,84,86,149,101,254,223,125,81,197,134,163,185,174,107,88,145,168,158,186,164,3,189,121,139,11,2,7,128,1,47,161,179,8,6,68,129,123,84,127,41,53,87,95,88,96,254,245,222,107,254,117,35,39,148,38,33,233,127,106,170,151,95,89,169,154,99,7,8,109,2,50,166,158,156,168,0,255,255,0,115,254,20,3,139,4,92,2,38,0,70,0,0,0,7,0,122,1,70,0,0,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,0,67,181,0,0,8,179,2,28,17,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,0,118,78,0,0,8,179,2,36,17,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,1,75,247,0,0,8,179,2,41,17,38,0,43,53,255,255,0,115,255,236,4,18,5,211,2,38,0,72,0,0,1,6,0,106,10,0,0,10,180,3,2,48,17,38,0,43,53,53,255,255,255,218,0,0,1,99,6,33,2,38,0,243,0,0,1,7,0,67,254,81,0,0,0,8,179,1,5,17,38,0,43,53,255,255,0,169,0,0,2,50,6,33,2,38,0,243,0,0,1,7,0,118,255,32,0,0,0,8,179,1,13,17,38,0,43,53,255,255,255,179,0,0,2,85,6,33,2,38,0,243,0,0,1,7,1,75,254,167,0,0,0,8,179,1,18,17,38,0,43,53,255,255,255,236,0,0,2,31,5,211,2,38,0,243,0,0,1,7,0,106,254,183,0,0,0,10,180,2,1,25,17,38,0,43,53,53,0,2,0,113,255,236,4,98,6,33,0,27,0,38,0,74,64,43,33,6,12,28,28,0,0,24,25,22,14,17,19,16,6,9,39,40,9,31,70,89,11,3,22,17,25,14,15,5,20,9,9,3,23,20,1,3,36,70,89,3,22,0,63,43,0,24,63,51,18,57,47,18,23,57,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,0,35,34,0,53,52,0,51,50,23,55,38,39,5,39,55,38,39,55,22,23,55,23,7,22,18,3,52,38,35,32,17,20,22,51,50,54,4,98,254,251,247,222,254,233,1,7,220,226,100,8,57,205,254,241,73,233,92,94,69,156,102,238,76,207,152,165,168,180,156,254,175,175,162,175,161,2,51,254,231,254,210,1,13,226,230,1,6,121,4,214,191,155,108,133,62,49,117,73,75,138,107,119,143,254,114,254,232,147,170,254,152,167,183,201,0,255,255,0,176,0,0,4,68,5,221,2,38,0,81,0,0,1,6,1,82,14,0,0,8,179,1,30,17,38,0,43,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,0,67,212,0,0,8,179,2,26,17,38,0,43,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,0,118,86,0,0,8,179,2,34,17,38,0,43,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,1,75,14,0,0,8,179,2,39,17,38,0,43,53,255,255,0,115,255,236,4,98,5,221,2,38,0,82,0,0,1,6,1,82,241,0,0,8,179,2,34,17,38,0,43,53,255,255,0,115,255,236,4,98,5,211,2,38,0,82,0,0,1,6,0,106,27,0,0,10,180,3,2,46,17,38,0,43,53,53,0,3,0,104,0,252,4,41,4,168,0,3,0,15,0,27,0,51,64,24,22,10,10,16,4,2,4,1,3,28,29,25,19,19,1,7,13,13,1,1,0,80,89,1,0,47,43,17,0,51,24,47,51,17,51,47,51,17,18,1,23,57,17,51,51,17,51,49,48,19,53,33,21,1,52,54,51,50,22,21,20,6,35,34,38,17,52,54,51,50,22,21,20,6,35,34,38,104,3,193,253,174,59,54,52,58,59,51,52,61,59,54,52,58,59,51,52,61,2,141,138,138,254,232,60,61,63,58,57,64,63,2,244,60,61,63,58,57,64,63,0,3,0,115,255,188,4,98,4,135,0,19,0,27,0,35,0,75,64,41,23,31,28,20,20,10,28,0,0,18,15,5,8,10,6,36,37,22,30,33,25,13,25,70,89,15,18,8,5,4,3,16,13,16,3,33,70,89,6,3,22,0,63,198,43,0,24,63,198,18,23,57,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,18,57,57,49,48,1,16,0,35,34,39,7,39,55,38,17,16,0,51,50,23,55,23,7,22,5,20,23,1,38,35,34,6,5,52,39,1,22,51,50,54,4,98,254,242,238,154,112,84,114,94,129,1,12,238,154,116,84,117,97,127,252,189,53,1,209,75,114,163,166,2,151,51,254,47,71,113,163,169,2,37,254,244,254,211,69,117,78,131,152,1,0,1,12,1,43,76,119,76,133,152,249,171,102,2,134,53,214,212,164,100,253,125,51,219,0,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,0,67,196,0,0,8,179,1,22,17,38,0,43,53,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,0,118,113,0,0,8,179,1,30,17,38,0,43,53,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,1,75,18,0,0,8,179,1,35,17,38,0,43,53,255,255,0,164,255,236,4,57,5,211,2,38,0,88,0,0,1,6,0,106,33,0,0,10,180,2,1,42,17,38,0,43,53,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,6,0,118,18,0,0,8,179,1,31,17,38,0,43,53,0,2,0,176,254,20,4,117,6,20,0,22,0,34,0,62,64,31,32,6,27,20,16,16,17,6,17,36,35,18,0,17,27,12,22,9,3,9,30,70,89,9,22,3,23,70,89,3,16,0,63,43,0,24,63,43,17,18,0,57,57,24,63,63,17,18,1,57,57,17,51,17,51,51,17,51,49,48,1,54,54,51,50,18,17,16,2,35,34,39,35,23,22,21,17,35,17,51,17,20,7,37,34,6,7,21,20,22,51,32,17,52,38,1,88,66,170,106,215,240,241,214,222,122,12,4,8,166,166,6,1,72,168,152,2,154,170,1,47,148,3,180,89,79,254,212,254,245,254,244,254,211,161,34,77,63,254,53,8,0,254,46,52,90,27,184,201,41,231,199,1,176,215,209,255,255,0,2,254,20,4,6,5,211,2,38,0,92,0,0,1,6,0,106,181,0,0,10,180,2,1,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,6,180,2,38,0,36,0,0,1,7,1,77,0,63,1,82,0,8,179,2,18,5,38,0,43,53,255,255,0,94,255,236,3,205,5,98,2,38,0,68,0,0,1,6,1,77,245,0,0,8,179,2,40,17,38,0,43,53,255,255,0,0,0,0,5,16,7,55,2,38,0,36,0,0,1,7,1,78,0,43,1,82,0,8,179,2,15,5,38,0,43,53,255,255,0,94,255,236,3,205,5,229,2,38,0,68,0,0,1,6,1,78,228,0,0,8,179,2,37,17,38,0,43,53,255,255,0,0,254,66,5,17,5,188,2,38,0,36,0,0,0,7,1,81,3,160,0,0,255,255,0,94,254,66,4,0,4,90,2,38,0,68,0,0,0,7,1,81,2,143,0,0,255,255,0,125,255,236,4,207,7,115,2,38,0,38,0,0,1,7,0,118,1,8,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,115,255,236,3,139,6,33,2,38,0,70,0,0,1,6,0,118,68,0,0,8,179,1,32,17,38,0,43,53,255,255,0,125,255,236,4,207,7,115,2,38,0,38,0,0,1,7,1,75,0,172,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,115,255,236,3,139,6,33,2,38,0,70,0,0,1,6,1,75,212,0,0,8,179,1,37,17,38,0,43,53,255,255,0,125,255,236,4,207,7,49,2,38,0,38,0,0,1,7,1,79,2,27,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,115,255,236,3,139,5,223,2,38,0,70,0,0,1,7,1,79,1,80,0,0,0,8,179,1,32,17,38,0,43,53,255,255,0,125,255,236,4,207,7,115,2,38,0,38,0,0,1,7,1,76,0,193,1,82,0,8,179,1,34,5,38,0,43,53,255,255,0,115,255,236,3,161,6,33,2,38,0,70,0,0,1,6,1,76,243,0,0,8,179,1,34,17,38,0,43,53,255,255,0,201,0,0,5,88,7,115,2,38,0,39,0,0,1,7,1,76,0,88,1,82,0,8,179,2,29,5,38,0,43,53,255,255,0,115,255,236,5,129,6,20,2,38,0,71,0,0,1,7,2,56,3,12,0,0,0,7,178,2,35,0,0,63,53,0,255,255,0,47,0,0,5,72,5,182,2,6,0,146,0,0,0,2,0,115,255,236,4,211,6,20,0,26,0,39,0,100,64,55,37,6,18,14,0,30,30,21,25,22,25,16,6,4,40,41,26,21,24,16,17,16,71,89,21,15,17,31,17,47,17,3,9,3,17,17,9,19,0,1,12,3,9,9,34,70,89,9,16,3,27,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,57,24,63,18,57,47,95,94,93,51,43,17,0,51,24,63,17,18,1,23,57,17,51,51,17,51,51,51,17,51,49,48,37,35,6,35,34,2,17,16,18,51,50,23,51,38,53,53,33,53,33,53,51,21,51,21,35,17,35,37,50,54,53,53,52,38,35,34,6,21,20,22,3,154,9,115,229,215,239,240,214,223,119,13,11,254,64,1,192,166,156,156,135,254,158,170,153,155,170,146,155,154,147,167,1,38,1,15,1,15,1,44,162,83,73,133,129,184,184,129,251,37,119,185,206,35,233,199,227,207,210,214,255,255,0,201,0,0,3,248,6,180,2,38,0,40,0,0,1,7,1,77,0,18,1,82,0,8,179,1,15,5,38,0,43,53,255,255,0,115,255,236,4,18,5,98,2,38,0,72,0,0,1,6,1,77,10,0,0,8,179,2,30,17,38,0,43,53,255,255,0,201,0,0,3,248,7,55,2,38,0,40,0,0,1,7,1,78,0,16,1,82,0,8,179,1,12,5,38,0,43,53,255,255,0,115,255,236,4,18,5,229,2,38,0,72,0,0,1,6,1,78,251,0,0,8,179,2,27,17,38,0,43,53,255,255,0,201,0,0,3,248,7,20,2,38,0,40,0,0,1,7,1,79,1,111,1,53,0,8,179,1,21,5,38,0,43,53,255,255,0,115,255,236,4,18,5,223,2,38,0,72,0,0,1,7,1,79,1,84,0,0,0,8,179,2,36,17,38,0,43,53,255,255,0,201,254,66,3,248,5,182,2,38,0,40,0,0,0,7,1,81,2,115,0,0,255,255,0,115,254,97,4,18,4,92,2,38,0,72,0,0,0,7,1,81,2,102,0,31,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,1,76,0,16,1,82,0,8,179,1,23,5,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,1,76,251,0,0,8,179,2,38,17,38,0,43,53,255,255,0,125,255,236,5,61,7,115,2,38,0,42,0,0,1,7,1,75,0,233,1,82,0,8,179,1,42,5,38,0,43,53,255,255,0,39,254,20,4,49,6,33,2,38,0,74,0,0,1,6,1,75,202,0,0,8,179,3,80,17,38,0,43,53,255,255,0,125,255,236,5,61,7,55,2,38,0,42,0,0,1,7,1,78,1,0,1,82,0,8,179,1,28,5,38,0,43,53,255,255,0,39,254,20,4,49,5,229,2,38,0,74,0,0,1,6,1,78,206,0,0,8,179,3,66,17,38,0,43,53,255,255,0,125,255,236,5,61,7,49,2,38,0,42,0,0,1,7,1,79,2,100,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,39,254,20,4,49,5,223,2,38,0,74,0,0,1,7,1,79,1,31,0,0,0,8,179,3,75,17,38,0,43,53,255,255,0,125,254,59,5,61,5,203,2,38,0,42,0,0,0,7,2,57,1,39,0,0,255,255,0,39,254,20,4,49,6,33,2,38,0,74,0,0,1,6,2,58,68,0,0,8,179,3,70,17,38,0,43,53,255,255,0,201,0,0,5,31,7,115,2,38,0,43,0,0,1,7,1,75,0,150,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,176,0,0,4,68,7,170,2,38,0,75,0,0,1,7,1,75,0,31,1,137,0,8,179,1,37,2,38,0,43,53,0,2,0,0,0,0,5,231,5,182,0,19,0,23,0,84,64,44,23,3,15,15,0,16,20,4,12,12,7,11,8,11,16,18,4,24,25,23,14,73,89,22,10,18,19,18,74,89,7,3,19,23,19,23,19,1,12,16,18,5,1,3,0,63,51,63,51,18,57,57,47,47,17,51,51,43,17,0,51,51,43,17,18,1,23,57,17,51,51,17,51,51,17,51,51,17,51,51,49,48,19,53,51,21,33,53,51,21,51,21,35,17,35,17,33,17,35,17,35,53,1,53,33,21,201,170,3,2,170,200,200,170,252,254,170,201,4,117,252,254,4,190,248,248,248,248,141,251,207,2,176,253,80,4,49,141,254,138,233,233,0,1,0,20,0,0,4,68,6,20,0,30,0,89,64,50,22,20,16,8,8,13,9,0,30,30,18,9,11,4,31,32,23,22,26,4,70,89,19,11,12,11,71,89,16,12,15,12,31,12,47,12,3,22,26,12,12,26,22,3,9,14,0,0,9,21,0,63,51,63,18,23,57,47,47,47,93,17,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,51,49,48,33,17,52,38,35,34,6,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,7,51,54,54,51,50,22,21,17,3,158,122,130,174,158,166,156,156,166,1,193,254,63,8,10,49,181,116,201,201,2,158,134,132,186,213,253,231,4,219,127,186,186,127,196,84,56,79,91,191,210,253,92,255,255,255,226,0,0,2,202,7,47,2,38,0,44,0,0,1,7,1,82,254,218,1,82,0,8,179,1,21,5,38,0,43,53,255,255,255,144,0,0,2,120,5,221,2,38,0,243,0,0,1,7,1,82,254,136,0,0,0,8,179,1,13,17,38,0,43,53,255,255,0,42,0,0,2,130,6,180,2,38,0,44,0,0,1,7,1,77,254,253,1,82,0,8,179,1,15,5,38,0,43,53,255,255,255,218,0,0,2,50,5,98,2,38,0,243,0,0,1,7,1,77,254,173,0,0,0,8,179,1,7,17,38,0,43,53,255,255,0,30,0,0,2,138,7,55,2,38,0,44,0,0,1,7,1,78,254,249,1,82,0,8,179,1,12,5,38,0,43,53,255,255,255,204,0,0,2,56,5,229,2,38,0,243,0,0,1,7,1,78,254,167,0,0,0,8,179,1,4,17,38,0,43,53,255,255,0,84,254,66,2,86,5,182,2,38,0,44,0,0,0,6,1,81,104,0,255,255,0,53,254,66,1,129,5,223,2,38,0,76,0,0,0,6,1,81,16,0,255,255,0,84,0,0,2,86,7,49,2,38,0,44,0,0,1,7,1,79,0,80,1,82,0,8,179,1,21,5,38,0,43,53,0,1,0,176,0,0,1,86,4,72,0,3,0,22,64,9,0,1,1,5,4,2,15,1,21,0,63,63,17,18,1,57,17,51,49,48,33,35,17,51,1,86,166,166,4,72,255,255,0,84,254,127,4,16,5,182,0,38,0,44,0,0,0,7,0,45,2,168,0,0,255,255,0,162,254,20,3,108,5,223,0,38,0,76,0,0,0,7,0,77,2,6,0,0,255,255,255,96,254,127,2,101,7,115,2,38,0,45,0,0,1,7,1,75,254,183,1,82,0,8,179,1,28,5,38,0,43,53,255,255,255,145,254,20,2,79,6,33,2,38,2,55,0,0,1,7,1,75,254,161,0,0,0,8,179,1,27,17,38,0,43,53,255,255,0,201,254,59,4,233,5,182,2,38,0,46,0,0,0,7,2,57,0,137,0,0,255,255,0,176,254,59,4,29,6,20,2,38,0,78,0,0,0,6,2,57,43,0,0,1,0,176,0,0,4,27,4,70,0,13,0,47,64,25,13,11,7,7,8,3,1,2,5,8,5,14,15,2,13,5,6,4,8,0,9,15,4,8,21,0,63,51,63,51,18,23,57,17,18,1,23,57,17,51,17,51,51,49,48,1,51,1,1,35,1,7,17,35,17,51,17,20,7,3,47,207,254,98,1,187,201,254,151,135,178,178,12,4,70,254,30,253,156,1,248,113,254,121,4,70,254,229,166,113,255,255,0,201,0,0,3,248,7,115,2,38,0,47,0,0,1,7,0,118,255,99,1,82,0,8,179,1,15,5,38,0,43,53,255,255,0,163,0,0,2,44,7,172,2,38,0,79,0,0,1,7,0,118,255,26,1,139,0,8,179,1,13,2,38,0,43,53,255,255,0,201,254,59,3,248,5,182,2,38,0,47,0,0,0,6,2,57,49,0,255,255,0,89,254,59,1,87,6,20,2,38,0,79,0,0,0,7,2,57,254,232,0,0,255,255,0,201,0,0,3,248,5,183,2,38,0,47,0,0,1,7,2,56,1,29,255,163,0,7,178,1,9,3,0,63,53,0,255,255,0,176,0,0,2,160,6,20,2,38,0,79,0,0,1,6,2,56,43,0,0,7,178,1,7,0,0,63,53,0,255,255,0,201,0,0,3,248,5,182,2,38,0,47,0,0,0,7,1,79,2,4,253,103,255,255,0,176,0,0,2,168,6,20,0,38,0,79,0,0,0,7,1,79,1,66,253,56,0,1,0,29,0,0,3,248,5,182,0,13,0,61,64,33,7,11,11,4,0,12,9,0,3,4,15,14,9,7,4,10,3,1,6,8,2,8,2,8,0,5,3,0,11,73,89,0,18,0,63,43,0,24,63,18,57,57,47,47,18,23,57,17,18,1,23,57,17,51,51,17,51,49,48,51,17,7,39,55,17,51,17,37,23,5,17,33,21,201,105,67,172,170,1,41,67,254,148,2,133,1,252,59,114,101,3,30,253,70,174,121,211,254,60,154,0,1,255,252,0,0,2,39,6,20,0,11,0,55,64,28,0,4,4,9,5,5,12,2,13,8,12,0,2,9,3,8,6,6,1,7,1,7,1,5,10,0,5,21,0,63,63,18,57,57,47,47,18,23,57,17,1,51,17,51,18,57,17,51,51,17,51,49,48,1,55,23,7,17,35,17,7,39,55,17,51,1,86,137,72,209,166,110,70,180,166,3,96,94,112,141,253,63,2,84,72,113,119,3,32,0,255,255,0,201,0,0,5,63,7,115,2,38,0,49,0,0,1,7,0,118,1,2,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,176,0,0,4,68,6,33,2,38,0,81,0,0,1,6,0,118,121,0,0,8,179,1,30,17,38,0,43,53,255,255,0,201,254,59,5,63,5,182,2,38,0,49,0,0,0,7,2,57,0,205,0,0,255,255,0,176,254,59,4,68,4,92,2,38,0,81,0,0,0,6,2,57,86,0,255,255,0,201,0,0,5,63,7,115,2,38,0,49,0,0,1,7,1,76,0,166,1,82,0,8,179,1,28,5,38,0,43,53,255,255,0,176,0,0,4,68,6,33,2,38,0,81,0,0,1,6,1,76,31,0,0,8,179,1,32,17,38,0,43,53,255,255,0,1,0,0,4,203,5,182,0,39,0,81,0,135,0,0,1,6,2,7,232,0,0,7,178,1,28,3,0,63,53,0,0,1,0,201,254,127,5,63,5,182,0,25,0,56,64,28,16,13,13,14,8,20,20,23,23,2,14,3,26,27,18,10,14,21,15,3,14,18,0,5,73,89,0,34,0,63,43,0,24,63,63,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,54,53,1,35,18,21,17,35,17,51,1,51,38,53,17,51,17,20,6,3,201,98,54,71,83,105,106,252,192,8,16,157,192,3,29,8,14,159,193,254,127,27,145,20,122,111,4,203,254,248,158,252,219,5,182,251,78,149,224,3,61,250,88,195,204,0,1,0,176,254,20,4,68,4,92,0,29,0,56,64,30,19,15,15,16,7,27,27,2,16,3,30,31,23,11,70,89,23,16,19,16,17,15,16,21,0,5,70,89,0,27,0,63,43,0,24,63,63,18,57,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,53,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,50,22,21,17,20,6,3,37,86,55,60,62,140,122,130,172,160,166,135,27,10,52,180,110,203,199,140,254,20,25,135,20,172,3,121,134,132,186,214,253,193,4,72,150,82,88,191,210,252,141,154,170,255,255,0,125,255,236,5,190,6,180,2,38,0,50,0,0,1,7,1,77,0,199,1,82,0,8,179,2,27,5,38,0,43,53,255,255,0,115,255,236,4,98,5,98,2,38,0,82,0,0,1,6,1,77,18,0,0,8,179,2,28,17,38,0,43,53,255,255,0,125,255,236,5,190,7,55,2,38,0,50,0,0,1,7,1,78,0,193,1,82,0,8,179,2,24,5,38,0,43,53,255,255,0,115,255,236,4,98,5,229,2,38,0,82,0,0,1,6,1,78,14,0,0,8,179,2,25,17,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,1,83,1,20,1,82,0,10,180,3,2,43,5,38,0,43,53,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,1,83,90,0,0,10,180,3,2,44,17,38,0,43,53,53,0,2,0,125,255,236,6,231,5,205,0,20,0,31,0,83,64,46,24,6,15,19,19,29,0,13,17,29,6,5,32,33,15,18,73,89,15,15,0,11,11,14,73,89,11,3,9,21,73,89,9,4,3,27,73,89,3,18,0,19,73,89,0,18,0,63,43,0,24,63,43,0,24,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,6,35,32,0,17,16,0,33,50,23,33,21,33,17,33,21,33,17,33,1,34,0,17,16,0,51,50,55,17,38,6,231,253,0,102,92,254,185,254,159,1,92,1,64,102,90,3,14,253,179,2,39,253,217,2,77,252,68,249,254,255,1,1,247,112,87,87,20,1,137,1,106,1,104,1,134,23,151,254,41,150,253,230,4,157,254,207,254,217,254,215,254,205,33,4,117,30,0,3,0,113,255,236,7,31,4,90,0,30,0,42,0,49,0,85,64,45,31,8,14,2,22,22,37,47,21,21,28,37,8,4,50,51,43,40,11,40,70,89,46,22,70,89,2,5,14,11,46,46,5,17,11,16,24,34,5,34,70,89,0,5,22,0,63,51,43,17,0,51,24,63,51,18,57,47,18,57,18,57,43,43,17,0,51,17,18,1,23,57,17,51,17,51,18,57,57,17,51,49,48,5,32,39,6,6,35,34,0,17,16,0,51,50,22,23,54,54,51,50,18,21,21,33,18,33,50,54,55,21,6,6,1,20,22,51,50,54,53,52,38,35,34,6,37,34,6,7,33,52,38,5,150,254,219,125,62,209,137,223,254,244,1,6,235,131,205,62,58,192,126,201,238,253,39,8,1,74,94,161,87,88,152,251,33,152,167,163,153,155,165,166,149,4,71,127,145,12,2,32,132,20,235,116,119,1,49,1,8,1,9,1,44,119,114,112,121,254,247,226,105,254,119,35,39,148,39,32,2,57,211,219,213,209,221,213,216,216,164,158,158,164,255,255,0,201,0,0,4,207,7,115,2,38,0,53,0,0,1,7,0,118,0,121,1,82,0,8,179,2,31,5,38,0,43,53,255,255,0,176,0,0,3,39,6,33,2,38,0,85,0,0,1,6,0,118,220,0,0,8,179,1,26,17,38,0,43,53,255,255,0,201,254,59,4,207,5,182,2,38,0,53,0,0,0,6,2,57,125,0,255,255,0,96,254,59,3,39,4,92,2,38,0,85,0,0,0,7,2,57,254,239,0,0,255,255,0,201,0,0,4,207,7,115,2,38,0,53,0,0,1,7,1,76,0,27,1,82,0,8,179,2,33,5,38,0,43,53,255,255,0,130,0,0,3,39,6,33,2,38,0,85,0,0,1,7,1,76,255,118,0,0,0,8,179,1,28,17,38,0,43,53,255,255,0,106,255,236,4,2,7,115,2,38,0,54,0,0,1,7,0,118,0,80,1,82,0,8,179,1,46,5,38,0,43,53,255,255,0,106,255,236,3,115,6,33,2,38,0,86,0,0,1,6,0,118,234,0,0,8,179,1,46,17,38,0,43,53,255,255,0,106,255,236,4,2,7,115,2,38,0,54,0,0,1,7,1,75,255,234,1,82,0,8,179,1,51,5,38,0,43,53,255,255,0,106,255,236,3,115,6,33,2,38,0,86,0,0,1,6,1,75,151,0,0,8,179,1,51,17,38,0,43,53,255,255,0,106,254,20,4,2,5,203,2,38,0,54,0,0,0,7,0,122,1,39,0,0,255,255,0,106,254,20,3,115,4,92,2,38,0,86,0,0,0,7,0,122,0,213,0,0,255,255,0,106,255,236,4,2,7,115,2,38,0,54,0,0,1,7,1,76,255,228,1,82,0,8,179,1,48,5,38,0,43,53,255,255,0,106,255,236,3,115,6,33,2,38,0,86,0,0,1,6,1,76,153,0,0,8,179,1,48,17,38,0,43,53,255,255,0,18,254,59,4,90,5,182,2,38,0,55,0,0,0,6,2,57,25,0,255,255,0,31,254,59,2,168,5,70,2,38,0,87,0,0,0,6,2,57,130,0,255,255,0,18,0,0,4,90,7,115,2,38,0,55,0,0,1,7,1,76,255,220,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,31,255,236,2,215,6,20,2,38,0,87,0,0,1,6,2,56,98,0,0,7,178,1,26,0,0,63,53,0,0,1,0,18,0,0,4,90,5,182,0,15,0,63,64,33,7,11,11,0,12,4,9,12,14,2,5,16,17,10,14,15,14,74,89,7,15,15,3,12,18,6,2,3,2,73,89,3,3,0,63,43,17,0,51,24,63,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,17,33,53,33,21,33,17,33,21,33,17,35,17,33,53,1,225,254,49,4,72,254,49,1,54,254,202,170,254,199,3,47,1,240,151,151,254,16,141,253,94,2,162,141,0,1,0,31,255,236,2,168,5,70,0,28,0,76,64,41,23,19,27,27,12,8,2,21,25,8,10,14,6,29,30,14,22,19,22,71,89,26,10,11,10,71,89,23,11,11,6,17,64,19,15,6,0,70,89,6,22,0,63,43,0,24,63,26,205,18,57,47,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,51,49,48,37,50,55,21,6,6,35,32,17,53,35,53,51,17,35,53,55,55,51,21,33,21,33,17,33,21,33,21,20,2,23,85,60,32,106,42,254,200,141,141,157,157,70,96,1,62,254,194,1,45,254,211,117,20,127,14,16,1,92,254,129,1,0,80,69,234,254,129,255,0,129,244,221,0,255,255,0,186,255,236,5,25,7,47,2,38,0,56,0,0,1,7,1,82,0,111,1,82,0,8,179,1,27,5,38,0,43,53,255,255,0,164,255,236,4,57,5,221,2,38,0,88,0,0,1,6,1,82,247,0,0,8,179,1,30,17,38,0,43,53,255,255,0,186,255,236,5,25,6,180,2,38,0,56,0,0,1,7,1,77,0,145,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,164,255,236,4,57,5,98,2,38,0,88,0,0,1,6,1,77,25,0,0,8,179,1,24,17,38,0,43,53,255,255,0,186,255,236,5,25,7,55,2,38,0,56,0,0,1,7,1,78,0,139,1,82,0,8,179,1,18,5,38,0,43,53,255,255,0,164,255,236,4,57,5,229,2,38,0,88,0,0,1,6,1,78,18,0,0,8,179,1,21,17,38,0,43,53,255,255,0,186,255,236,5,25,7,215,2,38,0,56,0,0,1,7,1,80,0,156,1,82,0,10,180,2,1,21,5,38,0,43,53,53,255,255,0,164,255,236,4,57,6,133,2,38,0,88,0,0,1,6,1,80,35,0,0,10,180,2,1,24,17,38,0,43,53,53,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,1,83,0,225,1,82,0,10,180,2,1,37,5,38,0,43,53,53,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,1,83,104,0,0,10,180,2,1,40,17,38,0,43,53,53,255,255,0,186,254,66,5,25,5,182,2,38,0,56,0,0,0,7,1,81,2,33,0,0,255,255,0,164,254,66,4,101,4,72,2,38,0,88,0,0,0,7,1,81,2,244,0,0,255,255,0,27,0,0,7,76,7,115,2,38,0,58,0,0,1,7,1,75,1,84,1,82,0,8,179,1,40,5,38,0,43,53,255,255,0,23,0,0,6,35,6,33,2,38,0,90,0,0,1,7,1,75,0,193,0,0,0,8,179,1,43,17,38,0,43,53,255,255,0,0,0,0,4,123,7,115,2,38,0,60,0,0,1,7,1,75,255,224,1,82,0,8,179,1,23,5,38,0,43,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,6,1,75,173,0,0,8,179,1,36,17,38,0,43,53,255,255,0,0,0,0,4,123,7,37,2,38,0,60,0,0,1,7,0,106,255,241,1,82,0,10,180,2,1,30,5,38,0,43,53,53,255,255,0,82,0,0,4,63,7,115,2,38,0,61,0,0,1,7,0,118,0,66,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,82,0,0,3,109,6,33,2,38,0,93,0,0,1,6,0,118,232,0,0,8,179,1,19,17,38,0,43,53,255,255,0,82,0,0,4,63,7,49,2,38,0,61,0,0,1,7,1,79,1,68,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,82,0,0,3,109,5,223,2,38,0,93,0,0,1,7,1,79,0,223,0,0,0,8,179,1,19,17,38,0,43,53,255,255,0,82,0,0,4,63,7,115,2,38,0,61,0,0,1,7,1,76,255,237,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,82,0,0,3,109,6,33,2,38,0,93,0,0,1,6,1,76,134,0,0,8,179,1,21,17,38,0,43,53,0,1,0,176,0,0,2,219,6,31,0,12,0,29,64,14,0,1,1,13,6,14,4,9,70,89,4,0,1,21,0,63,63,43,17,1,51,18,57,17,51,49,48,33,35,17,16,33,50,23,7,38,35,34,6,21,1,86,166,1,103,96,100,43,87,73,97,89,4,156,1,131,37,133,30,123,122,0,0,1,0,195,254,20,4,23,5,203,0,32,0,68,64,36,26,30,30,12,8,18,28,8,10,2,5,33,34,29,10,12,10,70,89,26,12,12,16,0,16,22,70,89,16,4,0,5,70,89,0,27,0,63,43,0,24,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,34,39,53,22,51,50,54,53,17,35,53,55,53,52,54,51,50,23,7,7,38,35,34,6,21,21,33,21,33,17,20,6,1,72,69,64,70,61,95,77,222,222,162,182,85,120,22,21,102,60,98,80,1,26,254,234,158,254,20,19,139,18,102,113,3,205,75,60,139,195,178,43,64,65,32,105,124,149,129,252,55,184,175,0,4,0,0,0,0,5,20,7,170,0,16,0,24,0,34,0,46,0,97,64,52,17,5,4,24,6,20,7,4,3,7,8,35,0,41,11,8,11,9,34,20,2,0,29,3,9,48,47,38,14,44,2,9,24,6,73,89,9,20,14,24,34,14,24,24,14,34,3,8,28,4,8,18,0,63,51,47,18,23,57,47,47,47,17,18,57,57,43,17,0,51,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,18,57,57,17,57,57,49,48,1,20,7,1,35,3,33,3,35,1,38,53,52,54,51,50,22,19,3,38,39,6,6,7,3,19,54,54,55,51,21,6,6,7,35,19,52,38,35,34,6,21,20,22,51,50,54,3,104,104,2,20,174,176,253,158,166,174,2,20,106,122,99,100,125,27,178,25,47,14,48,9,177,152,49,102,23,203,32,168,66,111,211,66,51,51,66,60,57,53,64,5,150,133,56,251,39,1,145,254,111,4,215,52,136,101,114,117,252,54,1,176,58,145,48,135,24,254,84,4,133,59,149,42,16,46,161,45,254,245,57,60,60,57,55,61,61,0,5,0,94,255,236,3,205,7,170,0,9,0,36,0,47,0,59,0,71,0,103,64,55,45,18,66,54,60,48,41,21,21,11,36,36,6,48,0,54,29,18,7,72,73,9,9,4,63,57,69,51,17,11,12,21,41,71,89,12,21,21,15,32,32,25,70,89,32,16,15,37,70,89,15,22,10,21,4,0,47,63,63,43,0,24,63,43,17,18,0,57,24,47,57,43,17,0,51,24,63,51,196,50,17,57,47,17,18,1,23,57,17,51,51,17,51,17,51,17,51,17,51,49,48,1,53,54,54,55,33,21,6,6,7,1,39,35,6,6,35,34,38,53,16,37,55,53,52,38,35,34,6,7,39,54,54,51,50,22,21,17,37,50,54,53,53,7,6,6,21,20,22,1,20,6,35,34,38,53,52,54,51,50,22,7,52,38,35,34,6,21,20,22,51,50,54,1,215,46,106,22,1,4,21,164,128,1,2,33,8,82,163,122,163,185,2,25,180,119,133,96,167,71,55,84,208,101,209,201,254,14,155,177,166,198,175,109,1,170,123,102,101,121,121,101,101,124,109,65,51,51,66,60,57,52,64,6,217,16,42,120,31,12,24,105,68,249,39,156,103,73,168,155,1,76,16,6,68,130,122,52,32,127,43,51,174,192,253,20,117,170,153,99,7,7,109,115,90,94,5,61,98,119,116,99,98,115,119,94,56,61,61,56,56,61,61,0,255,255,255,254,0,0,6,129,7,115,2,38,0,136,0,0,1,7,0,118,2,76,1,82,0,8,179,2,29,5,38,0,43,53,255,255,0,94,255,236,6,115,6,33,2,38,0,168,0,0,1,7,0,118,1,133,0,0,0,8,179,3,69,17,38,0,43,53,255,255,0,125,255,195,5,190,7,115,2,38,0,154,0,0,1,7,0,118,1,25,1,82,0,8,179,3,45,5,38,0,43,53,255,255,0,115,255,188,4,98,6,33,2,38,0,186,0,0,1,6,0,118,86,0,0,8,179,3,45,17,38,0,43,53,255,255,0,106,254,59,4,2,5,203,2,38,0,54,0,0,0,6,2,57,6,0,255,255,0,106,254,59,3,115,4,92,2,38,0,86,0,0,0,6,2,57,185,0,0,1,1,12,4,217,3,174,6,33,0,14,0,24,64,9,7,0,16,15,11,4,128,14,9,0,47,51,26,205,50,17,18,1,57,57,49,48,1,54,54,55,51,22,22,23,21,35,38,39,6,7,35,1,12,127,102,23,166,22,109,125,119,88,133,136,83,115,4,240,136,128,41,42,133,130,23,55,131,134,52,0,0,1,1,12,4,217,3,174,6,33,0,14,0,24,64,9,6,0,16,15,5,1,128,3,11,0,47,51,26,205,50,17,18,1,57,57,49,48,1,51,22,23,54,55,51,21,7,6,7,35,38,38,39,1,12,115,114,105,130,91,119,66,144,46,166,23,102,127,6,33,74,115,130,59,25,68,148,87,41,126,136,0,0,1,1,45,4,217,3,133,5,98,0,3,0,17,181,0,1,4,5,0,3,0,47,51,17,18,1,57,57,49,48,1,33,21,33,1,45,2,88,253,168,5,98,137,0,1,1,37,4,217,3,145,5,229,0,14,0,24,64,9,12,3,16,15,11,4,128,8,0,0,47,50,26,204,50,17,18,1,57,57,49,48,1,34,38,39,51,30,2,51,50,54,55,51,6,6,2,86,140,156,9,104,6,41,73,85,101,96,10,104,10,167,4,217,137,131,49,56,26,64,67,126,142,0,0,1,0,162,5,2,1,102,5,223,0,11,0,19,182,6,0,0,12,13,3,9,0,47,205,17,18,1,57,17,51,49,48,19,52,54,51,50,22,21,20,6,35,34,38,162,56,42,40,58,58,40,42,56,5,113,57,53,54,56,56,55,55,0,0,2,1,111,4,217,3,45,6,133,0,11,0,23,0,30,64,12,18,6,12,0,6,0,24,25,15,9,21,3,0,47,51,204,50,17,18,1,57,57,17,51,17,51,49,48,1,20,6,35,34,38,53,52,54,51,50,22,7,52,38,35,34,6,21,20,22,51,50,54,3,45,123,102,101,120,121,100,101,124,108,66,51,51,66,60,57,52,65,5,178,98,119,117,98,98,115,119,94,56,61,61,56,56,61,61,0,1,0,37,254,66,1,113,0,0,0,15,0,24,64,10,0,9,4,13,9,3,16,17,2,7,0,47,51,17,18,1,23,57,17,51,49,48,23,20,51,50,55,21,6,35,34,53,52,54,55,51,6,6,178,94,42,55,65,60,207,86,72,120,68,69,238,94,13,109,18,188,70,135,53,66,109,0,0,1,1,8,4,217,3,240,5,221,0,23,0,36,64,15,9,21,24,25,17,0,5,12,0,12,0,12,21,128,9,0,47,26,204,57,57,47,47,17,51,17,51,17,18,1,57,57,49,48,1,34,46,2,35,34,6,7,35,54,54,51,50,30,2,51,50,54,55,51,6,6,3,20,43,82,79,73,34,50,51,14,98,13,115,91,46,86,78,72,32,49,48,15,99,13,113,4,219,37,45,37,60,61,121,137,37,45,37,59,62,121,137,0,0,2,0,231,4,217,3,182,6,33,0,9,0,19,0,27,64,12,14,5,19,9,4,20,21,13,4,128,19,9,0,47,51,26,205,50,17,18,1,23,57,49,48,19,54,54,55,51,21,6,6,7,35,37,54,54,55,51,21,6,6,7,35,231,36,110,31,186,37,171,58,97,1,101,49,101,26,186,37,171,58,96,4,242,48,186,69,21,63,196,48,25,68,177,58,21,63,196,48,0,0,1,1,252,4,217,3,16,6,115,0,9,0,19,182,4,0,11,10,4,128,9,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,252,27,53,12,184,18,109,49,100,4,246,72,227,82,23,74,237,76,0,3,1,27,5,14,3,131,6,180,0,8,0,20,0,32,0,43,64,20,15,9,21,27,27,3,8,9,4,33,34,24,12,8,12,8,12,3,30,18,0,47,51,204,57,57,47,47,17,51,17,18,1,23,57,17,51,17,51,49,48,1,54,55,51,21,6,6,7,35,39,52,54,51,50,22,21,20,6,35,34,38,37,52,54,51,50,22,21,20,6,35,34,38,2,0,65,31,189,33,121,51,80,229,52,38,41,49,55,35,38,52,1,180,52,38,41,49,55,35,38,52,5,133,169,134,20,67,179,61,4,52,46,52,46,50,49,49,50,52,46,52,46,50,49,49,255,255,0,0,0,0,5,16,6,10,2,38,0,36,0,0,1,7,1,84,254,32,255,151,0,7,178,2,18,0,0,63,53,0,255,255,0,152,2,76,1,137,3,90,2,6,0,121,0,0,255,255,255,212,0,0,4,117,6,10,0,38,0,40,125,0,1,7,1,84,253,216,255,151,0,7,178,1,16,0,0,63,53,0,255,255,255,212,0,0,5,181,6,10,0,39,0,43,0,150,0,0,1,7,1,84,253,216,255,151,0,7,178,1,16,0,0,63,53,0,255,255,255,228,0,0,3,68,6,10,0,39,0,44,0,238,0,0,1,7,1,84,253,232,255,151,0,7,178,1,16,0,0,63,53,0,255,255,255,228,255,236,6,2,6,10,0,38,0,50,68,0,1,7,1,84,253,232,255,151,0,7,178,2,28,0,0,63,53,0,255,255,255,212,0,0,5,133,6,10,0,39,0,60,1,10,0,0,1,7,1,84,253,216,255,151,0,7,178,1,13,0,0,63,53,0,255,255,255,228,0,0,6,51,6,10,0,38,1,118,63,0,1,7,1,84,253,232,255,151,0,7,178,1,35,0,0,63,53,0,255,255,255,233,255,236,2,147,6,180,2,38,1,134,0,0,1,7,1,85,254,206,0,0,0,12,181,3,2,1,46,17,38,0,43,53,53,53,255,255,0,0,0,0,5,16,5,188,2,6,0,36,0,0,255,255,0,201,0,0,4,190,5,182,2,6,0,37,0,0,0,1,0,201,0,0,3,248,5,182,0,5,0,29,64,14,3,4,4,0,6,7,5,2,73,89,5,3,4,18,0,63,63,43,17,18,1,57,57,17,51,49,48,1,21,33,17,35,17,3,248,253,123,170,5,182,153,250,227,5,182,0,255,255,0,39,0,0,4,109,5,182,2,6,2,40,0,0,255,255,0,201,0,0,3,248,5,182,2,6,0,40,0,0,255,255,0,82,0,0,4,63,5,182,2,6,0,61,0,0,255,255,0,201,0,0,5,31,5,182,2,6,0,43,0,0,0,3,0,125,255,236,5,190,5,205,0,3,0,15,0,27,0,63,64,32,2,3,16,22,16,10,22,4,10,4,28,29,0,3,73,89,0,0,7,13,13,25,73,89,13,4,7,19,73,89,7,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,57,57,17,51,17,51,17,18,57,57,49,48,1,33,21,33,37,16,0,33,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,1,227,2,117,253,139,3,219,254,157,254,196,254,189,254,161,1,96,1,68,1,59,1,98,251,115,250,244,243,248,247,242,245,251,3,51,149,63,254,161,254,110,1,139,1,104,1,101,1,137,254,112,254,160,254,216,254,204,1,48,1,44,1,42,1,46,254,206,0,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,201,0,0,4,233,5,182,2,6,0,46,0,0,0,1,0,0,0,0,4,211,5,182,0,10,0,26,64,11,8,0,12,11,4,8,9,3,1,8,18,0,63,51,63,18,57,17,18,1,57,57,49,48,33,35,1,38,39,6,7,1,35,1,51,4,211,182,254,182,87,22,33,71,254,184,182,2,16,177,3,160,252,90,139,201,252,94,5,182,255,255,0,201,0,0,6,113,5,182,2,6,0,48,0,0,255,255,0,201,0,0,5,63,5,182,2,6,0,49,0,0,0,3,0,72,0,0,4,37,5,182,0,3,0,7,0,11,0,52,64,29,10,7,3,2,6,8,6,13,12,0,3,73,89,0,0,10,4,10,11,73,89,10,18,4,7,73,89,4,3,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,49,48,19,33,21,33,3,33,21,33,1,21,33,53,195,2,231,253,25,82,3,139,252,117,3,180,252,35,3,72,150,3,4,151,251,121,152,152,255,255,0,125,255,236,5,190,5,205,2,6,0,50,0,0,0,1,0,201,0,0,5,12,5,182,0,7,0,35,64,17,1,0,4,5,0,5,9,8,6,3,73,89,6,3,1,5,18,0,63,51,63,43,17,18,1,57,57,17,51,17,51,49,48,33,35,17,33,17,35,17,33,5,12,170,253,17,170,4,67,5,31,250,225,5,182,0,255,255,0,201,0,0,4,104,5,182,2,6,0,51,0,0,0,1,0,74,0,0,4,92,5,182,0,12,0,53,64,28,8,10,10,0,9,2,11,6,3,2,0,5,13,14,7,8,4,8,73,89,4,3,0,10,73,89,0,18,0,63,43,0,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,51,53,1,1,53,33,21,33,39,1,1,33,21,74,1,225,254,43,3,203,253,92,96,1,204,254,31,3,84,141,2,111,2,43,143,153,2,253,223,253,154,152,0,255,255,0,18,0,0,4,90,5,182,2,6,0,55,0,0,255,255,0,0,0,0,4,123,5,182,2,6,0,60,0,0,0,3,0,106,255,236,5,248,5,203,0,25,0,34,0,43,0,80,64,41,39,20,26,2,13,13,43,25,14,30,7,7,14,20,3,44,45,12,16,26,42,16,42,74,89,34,36,24,36,74,89,2,24,16,24,16,24,14,19,0,4,0,63,63,57,57,47,47,17,51,43,17,0,51,43,17,0,51,17,51,17,18,1,23,57,17,51,17,51,51,51,17,51,51,17,51,49,48,1,51,21,51,50,22,22,21,20,2,4,35,35,21,35,53,35,34,36,2,53,52,54,54,51,51,19,51,50,54,53,52,38,43,3,34,6,21,20,22,51,51,2,219,172,70,171,251,133,149,254,253,176,41,172,45,176,254,254,146,135,252,171,67,172,25,201,223,206,185,58,172,57,182,209,222,202,24,5,203,180,136,248,159,166,254,253,130,225,225,132,1,4,161,158,248,139,252,69,219,195,185,210,212,183,197,217,0,255,255,0,8,0,0,4,150,5,182,2,6,0,59,0,0,0,1,0,109,0,0,5,242,5,182,0,29,0,62,64,31,10,7,17,0,0,14,1,21,24,24,1,7,3,30,31,29,3,13,3,73,89,17,13,13,1,22,15,8,3,1,18,0,63,63,51,51,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,33,35,17,35,34,38,38,53,17,51,17,20,22,51,51,17,51,17,51,50,54,53,17,51,17,20,6,4,35,35,3,131,170,45,176,255,144,174,207,212,27,170,29,211,207,176,144,254,253,175,45,1,190,122,247,164,1,227,254,33,188,201,3,100,252,156,198,187,1,227,254,31,165,247,123,0,0,1,0,80,0,0,5,244,5,205,0,31,0,57,64,32,3,13,29,19,24,19,22,25,7,10,13,8,8,32,33,16,0,73,89,16,4,26,22,6,9,8,9,73,89,25,8,18,0,63,51,43,17,0,51,51,51,24,63,43,17,18,1,23,57,17,51,17,51,49,48,1,34,2,21,20,18,23,21,33,53,33,38,2,53,16,0,33,32,0,17,20,2,7,33,21,33,53,54,18,53,52,2,3,33,238,250,173,180,253,182,1,108,151,160,1,98,1,58,1,59,1,98,158,151,1,107,253,182,183,169,249,5,53,254,255,253,225,254,179,132,133,152,118,1,94,203,1,54,1,96,254,165,254,199,207,254,166,120,152,133,134,1,78,222,252,1,2,255,255,0,60,0,0,2,111,7,37,2,38,0,44,0,0,1,7,0,106,255,7,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,0,0,0,0,4,123,7,37,2,38,0,60,0,0,1,7,0,106,255,239,1,82,0,10,180,2,1,30,5,38,0,43,53,53,255,255,0,115,255,236,4,199,6,115,2,38,1,126,0,0,1,6,1,84,29,0,0,8,179,2,52,17,38,0,43,53,255,255,0,90,255,236,3,135,6,115,2,38,1,130,0,0,1,6,1,84,200,0,0,8,179,1,47,17,38,0,43,53,255,255,0,176,254,20,4,68,6,115,2,38,1,132,0,0,1,6,1,84,59,0,0,8,179,1,30,17,38,0,43,53,255,255,0,168,255,236,2,147,6,115,2,38,1,134,0,0,1,7,1,84,254,196,0,0,0,8,179,1,25,17,38,0,43,53,255,255,0,164,255,236,4,113,6,180,2,38,1,146,0,0,1,6,1,85,59,0,0,12,181,3,2,1,52,17,38,0,43,53,53,53,0,2,0,115,255,236,4,199,4,92,0,11,0,42,0,71,64,36,9,15,39,21,4,4,29,34,29,15,3,43,44,24,15,39,40,40,22,12,18,18,7,70,89,18,16,31,0,12,0,70,89,36,12,22,0,63,51,43,17,0,51,24,63,43,17,18,0,57,57,17,51,24,63,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,50,54,53,53,52,38,35,32,17,20,22,23,34,2,17,16,18,51,50,22,23,51,54,55,51,6,6,21,17,20,51,50,55,21,6,35,34,38,39,35,6,6,2,80,169,150,152,169,254,209,147,133,214,238,244,225,121,161,54,12,24,41,129,21,28,84,29,33,46,65,81,89,18,13,59,167,119,195,218,15,229,199,254,80,212,212,139,1,41,1,12,1,18,1,41,84,84,92,56,66,246,116,254,73,114,10,119,26,81,86,86,81,0,2,0,176,254,20,4,168,6,31,0,19,0,41,0,76,64,40,24,15,15,16,39,3,30,8,8,3,5,34,16,5,42,43,16,27,35,34,70,89,14,35,14,35,11,0,11,27,70,89,11,22,0,20,70,89,0,0,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,50,22,21,16,5,21,4,17,20,4,35,34,38,39,17,35,17,52,54,23,34,6,21,17,22,22,51,50,54,53,52,38,35,35,53,51,50,54,53,52,38,2,147,220,249,254,199,1,121,254,248,238,109,160,79,166,253,228,158,157,93,161,86,171,173,190,177,112,92,155,162,156,6,31,208,183,254,218,51,8,42,254,145,209,225,31,38,253,227,6,52,225,246,140,172,165,252,137,49,37,150,157,157,164,142,147,137,123,133,0,1,0,10,254,20,4,14,4,72,0,18,0,33,64,16,15,4,1,5,4,19,20,10,9,9,1,14,5,15,1,27,0,63,63,51,18,57,47,51,17,18,1,23,57,49,48,1,35,52,18,55,1,51,19,22,23,51,62,2,19,51,1,6,2,2,20,180,64,43,254,63,172,240,94,19,8,5,41,43,234,172,254,107,48,53,254,20,96,1,38,114,4,60,253,184,235,103,30,142,129,2,109,251,211,124,254,220,0,2,0,113,255,236,4,96,6,18,0,30,0,42,0,59,64,32,37,28,16,3,31,22,22,9,0,3,28,5,43,44,16,0,34,3,25,6,25,40,70,89,25,22,6,13,70,89,6,0,0,63,43,0,24,63,43,17,18,0,23,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,38,38,53,52,54,51,50,22,23,7,38,38,35,34,6,21,20,22,23,22,22,21,20,0,35,34,36,53,52,18,1,52,38,39,6,6,21,20,22,51,50,54,2,33,140,116,194,164,103,189,126,72,112,159,81,85,97,107,167,210,177,254,240,236,227,254,240,226,2,97,123,141,206,191,178,147,162,174,3,168,78,159,99,130,152,45,63,135,62,44,79,66,71,111,91,115,241,164,235,254,248,248,210,177,1,5,254,115,128,183,74,53,217,160,144,171,186,0,0,1,0,90,255,236,3,135,4,92,0,37,0,77,64,43,4,16,35,23,29,11,1,19,23,16,6,38,39,20,37,2,37,2,70,89,15,37,31,37,2,11,3,37,37,13,26,26,33,70,89,26,16,13,7,70,89,13,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,21,35,32,21,20,22,51,50,54,55,21,6,35,34,38,53,52,54,55,53,38,38,53,52,54,51,50,22,23,7,38,38,35,34,21,20,33,2,203,148,254,201,147,146,84,166,100,137,221,210,241,110,130,98,107,224,192,97,165,100,63,94,130,79,250,1,61,2,129,141,195,90,98,39,47,148,75,169,148,98,131,41,11,28,127,92,133,158,33,45,133,42,28,162,172,0,0,1,0,115,254,111,3,160,6,20,0,32,0,48,64,24,7,25,30,19,19,14,14,3,0,25,4,33,34,17,35,30,3,0,1,0,70,89,1,0,0,63,43,17,0,51,51,24,63,17,18,1,23,57,17,51,17,51,17,51,49,48,19,53,33,21,6,0,2,21,20,22,22,23,22,22,21,20,7,35,54,53,52,38,39,38,38,53,52,62,2,55,6,33,176,2,240,215,254,224,138,59,125,172,149,136,127,166,125,111,143,203,188,59,112,201,242,40,254,241,5,135,141,129,180,254,189,254,223,166,98,118,73,37,31,109,91,149,164,161,107,56,61,26,36,219,194,114,208,195,229,218,8,0,0,1,0,176,254,20,4,68,4,92,0,20,0,47,64,24,0,20,12,8,8,9,20,9,22,21,16,4,70,89,16,16,12,9,10,15,9,21,0,27,0,63,63,63,18,57,63,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,50,22,21,17,3,158,122,130,172,160,166,135,27,8,51,184,113,198,200,254,20,4,177,134,132,186,214,253,193,4,72,150,81,89,191,210,251,73,0,3,0,115,255,236,4,74,6,43,0,11,0,18,0,25,0,73,64,39,22,16,16,6,23,15,15,0,6,0,26,27,22,16,70,89,15,22,191,22,2,11,3,22,22,3,9,9,19,70,89,9,1,3,12,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,16,2,35,34,2,17,16,18,51,50,18,1,50,18,19,33,18,18,19,34,2,3,33,2,2,4,74,244,250,240,249,245,244,244,250,254,18,164,156,6,253,121,4,150,167,161,150,10,2,133,11,152,3,12,254,106,254,118,1,147,1,141,1,151,1,136,254,107,251,225,1,49,1,51,254,208,254,204,5,41,254,225,254,231,1,25,1,31,0,1,0,168,255,236,2,147,4,72,0,15,0,31,64,14,1,14,7,14,17,16,15,15,11,4,70,89,11,22,0,63,43,0,24,63,17,18,1,57,57,17,51,49,48,1,17,20,22,51,50,54,55,21,6,6,35,34,38,53,17,1,78,73,87,37,101,27,31,105,50,160,145,4,72,252,250,104,101,13,7,127,13,17,168,169,3,11,255,255,0,176,0,0,4,27,4,70,2,6,0,250,0,0,0,1,255,242,255,236,4,70,6,33,0,34,0,51,64,27,8,1,21,3,36,0,0,35,24,19,70,89,24,22,30,31,31,0,11,11,6,70,89,11,1,0,21,0,63,63,43,17,18,0,57,17,51,24,63,43,17,1,51,17,18,23,57,49,48,35,1,39,46,2,35,34,7,53,54,51,50,22,22,23,1,22,22,51,50,55,21,6,35,34,38,39,3,38,39,35,6,7,3,14,1,217,58,30,50,67,49,58,57,68,63,91,121,88,54,1,107,19,42,35,27,33,48,61,74,83,29,156,84,22,9,28,88,254,4,55,162,85,70,36,13,133,17,60,130,152,252,12,49,51,10,121,24,76,83,1,180,240,96,116,209,253,182,0,255,255,0,176,254,20,4,68,4,72,2,6,0,119,0,0,0,1,0,0,0,0,4,2,4,72,0,14,0,28,64,12,9,10,10,0,16,15,5,14,21,9,0,15,0,63,50,63,57,17,18,1,57,57,17,51,49,48,17,51,19,22,22,23,51,54,18,17,51,16,2,7,35,172,219,26,83,16,8,177,159,166,207,225,186,4,72,253,178,67,238,62,175,1,189,1,81,254,149,254,4,225,0,1,0,113,254,111,3,160,6,20,0,49,0,73,64,39,4,25,45,31,29,28,19,12,12,40,0,28,31,37,25,7,50,51,28,48,1,48,1,71,89,48,48,16,38,41,37,38,37,70,89,38,0,16,35,0,63,63,43,17,0,51,17,18,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,35,34,6,21,20,30,2,23,22,22,21,20,6,7,35,54,54,53,52,38,39,38,38,53,52,54,55,53,38,53,52,54,55,6,35,35,53,33,21,35,34,6,6,21,20,22,51,51,3,86,178,176,213,50,95,135,84,142,135,54,67,156,53,66,115,143,200,199,158,128,217,139,166,128,115,68,2,186,51,130,224,127,167,175,170,2,242,178,142,80,98,61,36,18,29,110,90,65,149,99,71,147,52,55,61,25,34,200,176,140,210,39,12,64,217,117,158,50,12,141,131,80,144,95,115,108,255,255,0,115,255,236,4,98,4,92,2,6,0,82,0,0,0,1,0,25,255,236,4,244,4,72,0,21,0,54,64,29,10,11,7,19,16,3,19,11,13,5,22,23,18,9,13,15,13,70,89,15,15,11,21,5,0,70,89,5,22,0,63,43,0,24,63,63,43,17,0,51,51,17,18,1,23,57,17,51,17,51,49,48,37,50,55,21,6,35,34,53,17,33,17,35,17,35,53,55,33,21,35,17,20,22,4,125,38,48,43,84,219,254,35,166,221,143,4,76,213,51,117,18,131,24,253,2,209,252,70,3,186,74,68,142,253,60,74,55,0,2,0,166,254,20,4,98,4,92,0,16,0,28,0,54,64,27,21,9,9,10,26,0,10,0,29,30,6,3,14,14,17,70,89,14,16,10,27,3,23,70,89,3,22,0,63,43,0,24,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,17,51,49,48,1,16,0,35,34,39,35,22,21,17,35,17,16,18,51,50,18,37,34,6,21,17,22,51,50,54,53,52,38,4,98,255,0,233,179,120,8,8,168,251,234,219,252,254,33,158,151,122,183,159,152,144,2,37,254,241,254,214,94,61,212,254,219,4,31,1,10,1,31,254,209,162,207,209,254,174,102,208,222,214,212,0,0,1,0,115,254,111,3,162,4,92,0,32,0,46,64,23,14,7,0,21,21,7,27,3,34,33,4,18,18,24,11,24,30,70,89,24,16,11,35,0,63,63,43,17,18,0,57,17,51,17,18,1,23,57,17,51,17,51,49,48,1,20,22,22,23,22,22,21,20,6,7,35,54,54,53,52,38,38,39,38,38,53,16,0,51,50,22,23,7,38,35,34,6,1,31,59,143,160,148,131,54,67,156,54,67,51,110,97,204,195,1,20,248,79,158,54,53,130,114,176,170,2,10,135,132,80,34,32,107,90,66,152,95,70,148,50,40,47,38,18,37,254,219,1,30,1,54,33,24,141,51,218,0,2,0,115,255,236,4,182,4,72,0,13,0,25,0,48,64,25,20,0,14,7,7,12,0,11,4,27,26,12,23,9,23,70,89,9,15,4,17,70,89,4,22,0,63,43,0,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,1,20,6,6,35,34,0,53,16,33,33,21,33,22,1,20,22,51,50,54,53,16,39,35,34,6,4,96,123,229,154,235,254,248,2,80,1,243,254,248,178,252,191,170,161,159,171,174,65,222,200,1,252,157,241,130,1,32,254,2,62,142,167,254,247,194,209,197,182,1,14,186,208,0,0,1,0,18,255,231,3,147,4,72,0,19,0,44,64,23,3,15,0,9,15,17,4,20,21,2,17,19,17,70,89,19,15,12,5,70,89,12,22,0,63,43,0,24,63,43,17,0,51,17,18,1,23,57,17,51,49,48,1,21,33,17,20,51,50,54,55,21,6,6,35,34,38,53,17,33,53,55,3,147,254,80,205,47,98,27,35,111,48,181,170,254,215,148,4,72,142,253,150,223,13,7,125,15,18,170,170,2,127,74,68,0,0,1,0,164,255,236,4,113,4,72,0,21,0,37,64,17,12,19,6,3,19,3,23,22,15,4,15,0,9,70,89,0,22,0,63,43,0,24,63,51,17,18,1,57,57,17,51,17,51,49,48,5,34,38,17,17,51,17,20,22,51,50,54,53,52,38,39,51,22,22,21,16,0,2,115,231,232,166,158,153,167,161,28,34,166,36,28,254,254,20,250,1,10,2,88,253,176,192,195,238,251,130,224,136,144,214,140,254,194,254,212,0,0,2,0,115,254,20,5,76,4,92,0,24,0,34,0,65,64,35,10,4,32,24,24,12,0,25,19,19,0,7,4,4,35,36,16,28,70,89,16,16,6,15,32,12,1,12,70,89,23,1,22,0,27,0,63,63,51,43,17,0,51,24,63,63,43,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,17,36,0,17,16,55,23,6,6,21,16,5,17,52,54,51,50,18,21,20,2,6,7,17,1,52,38,35,34,6,21,17,54,54,2,131,254,252,254,244,207,131,89,81,1,104,166,149,180,218,136,248,165,1,121,124,102,73,78,179,198,254,20,1,218,11,1,35,1,15,1,40,253,90,117,224,124,254,117,35,2,108,187,190,254,219,250,178,254,251,144,8,254,38,4,39,185,219,120,114,253,146,16,236,0,1,255,236,254,20,4,80,4,78,0,32,0,57,64,33,14,7,8,5,21,24,30,7,34,23,33,5,24,8,21,4,6,23,27,17,12,70,89,17,27,6,15,0,28,70,89,0,15,0,63,43,0,24,63,63,43,0,24,63,18,23,57,17,1,51,18,23,57,49,48,19,50,22,22,23,19,1,51,1,19,22,22,51,50,55,21,6,35,34,38,39,3,1,35,1,3,38,38,35,34,7,53,54,178,54,78,62,44,145,1,62,180,254,84,190,48,82,63,45,45,60,59,115,141,59,150,254,150,178,1,208,172,38,70,43,37,27,49,4,78,43,91,112,254,143,2,97,252,252,254,28,122,74,8,129,15,118,159,1,131,253,104,3,68,1,188,99,80,11,129,17,0,1,0,164,254,20,5,135,6,18,0,26,0,61,64,31,22,19,1,14,14,25,15,4,10,10,15,19,3,27,28,26,0,7,20,15,1,25,16,25,70,89,13,16,22,15,27,0,63,63,51,43,17,0,51,24,63,51,63,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,17,54,54,53,52,38,39,51,18,21,16,0,5,17,35,17,36,0,17,17,51,17,20,22,23,17,3,90,188,203,26,37,166,63,254,227,254,240,164,254,248,254,246,166,180,184,6,18,250,105,15,231,204,120,235,168,254,240,244,254,236,254,206,16,254,38,1,218,9,1,34,1,16,2,31,253,219,195,218,13,5,153,0,1,0,115,255,236,5,188,4,72,0,39,0,61,64,30,10,3,38,19,19,16,25,32,32,16,3,3,40,41,38,17,17,0,28,6,15,22,13,0,13,70,89,35,0,22,0,63,50,43,17,0,51,24,63,51,18,57,47,57,17,18,1,23,57,17,51,17,51,18,57,17,51,49,48,5,34,2,53,52,18,55,51,6,6,21,20,22,51,50,54,53,17,51,17,20,22,51,50,54,53,52,2,39,51,22,18,21,20,2,35,34,39,35,6,1,244,182,203,55,68,172,68,57,120,107,94,105,161,106,93,107,120,55,69,172,65,57,203,182,220,68,9,65,20,1,40,254,156,1,1,153,156,255,157,193,216,143,125,1,55,254,201,128,140,216,193,151,1,4,157,146,254,249,157,252,254,214,182,182,255,255,0,9,255,236,2,147,5,211,2,38,1,134,0,0,1,7,0,106,254,212,0,0,0,10,180,2,1,37,17,38,0,43,53,53,255,255,0,164,255,236,4,113,5,211,2,38,1,146,0,0,1,6,0,106,57,0,0,10,180,2,1,43,17,38,0,43,53,53,255,255,0,115,255,236,4,98,6,115,2,38,0,82,0,0,1,6,1,84,33,0,0,8,179,2,34,17,38,0,43,53,255,255,0,164,255,236,4,113,6,115,2,38,1,146,0,0,1,6,1,84,39,0,0,8,179,1,31,17,38,0,43,53,255,255,0,115,255,236,5,188,6,115,2,38,1,150,0,0,1,7,1,84,0,201,0,0,0,8,179,1,49,17,38,0,43,53,255,255,0,201,0,0,3,248,7,37,2,38,0,40,0,0,1,7,0,106,0,39,1,82,0,10,180,2,1,33,5,38,0,43,53,53,0,1,0,18,255,236,5,66,5,182,0,29,0,70,64,38,22,14,14,15,8,27,27,20,2,15,17,5,30,31,22,13,73,89,22,22,15,18,21,17,18,17,73,89,18,3,15,18,0,5,73,89,0,19,0,63,43,0,24,63,63,43,17,0,51,17,18,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,5,34,39,53,22,51,50,54,53,53,52,38,35,33,17,35,17,33,53,33,21,33,17,33,50,22,21,21,20,6,3,207,96,54,55,91,101,104,131,140,254,131,170,254,176,3,183,254,67,1,140,205,221,196,20,22,150,19,124,112,131,128,113,253,27,5,31,151,151,254,94,191,178,143,190,211,255,255,0,201,0,0,3,248,7,115,2,38,1,97,0,0,1,7,0,118,0,90,1,82,0,8,179,1,15,5,38,0,43,53,0,1,0,125,255,236,4,227,5,205,0,24,0,56,64,30,6,3,17,22,12,5,17,4,25,26,3,6,73,89,3,3,14,20,20,0,73,89,20,4,14,9,73,89,14,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,51,49,48,1,34,4,7,33,21,33,18,0,51,50,55,21,6,35,32,0,17,16,0,33,50,23,7,38,3,66,226,254,243,30,2,211,253,41,10,1,11,249,162,201,161,226,254,180,254,162,1,121,1,78,237,178,71,169,5,51,250,241,150,254,238,254,227,55,149,57,1,132,1,109,1,95,1,145,88,148,82,255,255,0,106,255,236,4,2,5,203,2,6,0,54,0,0,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,60,0,0,2,111,7,37,2,38,0,44,0,0,1,7,0,106,255,7,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,255,96,254,127,1,104,5,182,2,6,0,45,0,0,0,2,0,0,255,233,7,35,5,182,0,26,0,35,0,71,64,38,24,27,27,4,31,0,0,4,13,3,36,37,24,35,73,89,24,24,11,22,22,6,73,89,22,3,11,16,74,89,11,18,4,27,74,89,4,18,0,63,43,0,24,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,4,33,33,17,33,2,2,6,6,35,34,39,53,22,51,50,62,2,18,19,33,17,51,32,1,51,50,54,53,52,38,35,35,7,35,254,237,254,252,254,185,254,147,57,84,80,139,107,69,64,50,63,48,65,43,55,68,65,2,166,122,2,58,253,76,133,198,183,192,220,102,1,170,206,220,5,31,254,72,253,246,251,121,25,143,26,62,103,250,1,190,1,226,253,144,253,77,139,140,138,124,0,2,0,201,0,0,7,84,5,182,0,17,0,26,0,74,64,38,11,7,7,8,15,18,18,12,4,22,0,0,4,8,3,27,28,26,6,11,6,73,89,15,11,11,4,13,9,3,8,18,4,18,74,89,4,18,0,63,43,0,24,63,63,51,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,20,4,33,33,17,33,17,35,17,51,17,33,17,51,17,51,32,1,51,50,54,53,52,38,35,35,7,84,254,240,254,251,254,183,253,125,170,170,2,131,172,121,2,57,253,78,133,196,185,193,219,102,1,170,206,220,2,176,253,80,5,182,253,146,2,110,253,144,253,77,139,140,137,125,0,0,1,0,18,0,0,5,66,5,182,0,19,0,58,64,31,0,12,12,13,6,5,5,18,13,15,4,20,21,19,15,16,15,73,89,0,11,73,89,0,0,13,16,3,6,13,18,0,63,51,63,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,33,50,22,21,17,35,17,52,38,35,33,17,35,17,33,53,33,21,33,2,12,1,144,205,217,170,125,140,254,125,170,254,176,3,246,254,4,3,125,188,181,253,244,1,246,126,113,253,27,5,31,151,151,255,255,0,201,0,0,4,229,7,115,2,38,1,180,0,0,1,7,0,118,0,162,1,82,0,8,179,1,20,5,38,0,43,53,255,255,0,27,255,236,4,248,7,94,2,38,1,189,0,0,1,7,2,54,0,68,1,82,0,8,179,1,23,5,38,0,43,53,0,1,0,201,254,131,5,12,5,182,0,11,0,48,64,24,8,5,2,3,9,0,0,3,5,3,12,13,10,6,3,5,8,73,89,1,5,18,3,34,0,63,63,51,43,0,24,63,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,17,35,17,33,17,51,17,33,17,51,5,12,254,47,176,254,62,170,2,239,170,254,131,1,125,5,182,250,228,5,28,0,255,255,0,0,0,0,5,16,5,188,2,6,0,36,0,0,0,2,0,201,0,0,4,125,5,182,0,13,0,22,0,61,64,32,18,0,9,14,14,4,4,7,0,3,24,23,9,22,73,89,9,9,4,5,5,8,73,89,5,3,4,14,74,89,4,18,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,4,33,33,17,33,21,33,17,51,50,22,22,1,51,50,54,53,52,38,35,35,4,125,254,253,254,251,254,84,3,94,253,76,227,193,242,116,252,246,239,190,173,176,219,207,1,170,218,208,5,182,151,254,39,89,174,254,84,130,149,142,120,0,255,255,0,201,0,0,4,190,5,182,2,6,0,37,0,0,255,255,0,201,0,0,3,248,5,182,2,6,1,97,0,0,0,2,0,14,254,131,5,74,5,182,0,13,0,19,0,67,64,36,4,5,19,7,16,10,14,12,1,0,0,12,10,7,5,5,20,21,10,16,73,89,10,3,1,5,34,19,12,6,3,6,73,89,3,18,0,63,43,17,0,51,51,24,63,51,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,35,17,33,17,35,17,51,18,18,19,33,17,51,33,17,33,6,2,7,5,74,162,252,8,162,113,154,219,12,2,145,185,254,157,254,179,18,206,137,254,131,1,125,254,131,2,23,1,3,2,230,1,51,250,228,4,131,242,253,89,234,0,255,255,0,201,0,0,3,248,5,182,2,6,0,40,0,0,0,1,0,2,0,0,6,188,5,182,0,17,0,60,64,31,6,13,13,3,14,10,9,8,1,14,0,17,7,18,19,15,12,9,6,3,0,0,1,14,11,17,18,7,4,1,3,0,63,51,51,63,51,51,18,57,17,51,51,51,51,51,17,18,1,23,57,17,51,51,17,51,49,48,1,1,51,1,17,51,17,1,51,1,1,35,1,17,35,17,1,35,2,86,253,193,190,2,57,164,2,58,190,253,192,2,82,196,253,186,164,253,187,199,2,240,2,198,253,60,2,196,253,60,2,196,253,60,253,14,2,229,253,27,2,229,253,27,0,1,0,74,255,236,4,53,5,203,0,40,0,67,64,36,28,0,19,7,7,0,3,23,35,12,6,41,42,3,24,23,24,23,74,89,24,24,10,38,38,31,74,89,38,4,10,16,74,89,10,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,4,33,34,39,53,22,22,51,50,54,53,52,38,35,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,4,25,183,161,183,189,254,206,254,233,255,163,96,223,103,198,203,225,223,218,209,205,225,162,137,110,178,117,84,101,251,135,225,255,4,96,144,180,24,8,25,180,145,205,229,79,158,46,50,150,141,134,138,143,147,132,107,128,50,74,114,75,77,197,0,1,0,203,0,0,5,82,5,182,0,15,0,52,64,24,14,2,2,15,6,9,9,8,15,8,16,17,5,4,12,13,4,13,9,15,18,6,0,3,0,63,50,63,51,57,57,17,51,17,51,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,19,51,17,20,7,51,1,51,17,35,17,52,55,35,1,35,203,159,14,8,3,52,186,160,17,9,252,203,186,5,182,252,211,225,182,4,196,250,74,3,37,201,221,251,53,0,255,255,0,203,0,0,5,82,7,94,2,38,1,178,0,0,1,7,2,54,0,225,1,82,0,8,179,1,16,5,38,0,43,53,0,1,0,201,0,0,4,229,5,182,0,10,0,45,64,22,7,3,3,4,0,9,10,4,4,11,12,10,7,2,7,4,8,5,3,1,4,18,0,63,51,63,51,18,57,57,17,51,17,18,1,23,57,17,51,17,51,49,48,33,35,1,17,35,17,51,17,1,51,1,4,229,206,253,92,170,170,2,147,195,253,121,2,229,253,27,5,182,253,60,2,196,253,58,0,1,0,0,255,231,4,217,5,182,0,19,0,45,64,24,3,18,1,0,0,18,10,3,20,21,18,3,73,89,18,3,8,13,74,89,8,19,1,18,0,63,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,35,17,33,7,2,2,6,39,34,39,53,22,51,50,54,54,18,19,33,4,217,170,254,37,31,61,93,152,126,74,59,54,59,53,79,61,93,56,3,18,5,31,240,254,33,254,69,174,2,25,143,26,87,215,2,89,1,184,255,255,0,201,0,0,6,113,5,182,2,6,0,48,0,0,255,255,0,201,0,0,5,31,5,182,2,6,0,43,0,0,255,255,0,125,255,236,5,190,5,205,2,6,0,50,0,0,255,255,0,201,0,0,5,12,5,182,2,6,1,110,0,0,255,255,0,201,0,0,4,104,5,182,2,6,0,51,0,0,255,255,0,125,255,236,4,207,5,203,2,6,0,38,0,0,255,255,0,18,0,0,4,90,5,182,2,6,0,55,0,0,0,1,0,27,255,236,4,248,5,182,0,22,0,42,64,21,18,8,2,9,4,23,24,14,13,8,13,0,17,9,3,0,5,73,89,0,19,0,63,43,0,24,63,51,18,57,57,17,51,17,18,1,23,57,49,48,5,34,39,53,22,51,50,54,55,1,51,1,22,23,51,54,55,1,51,1,14,2,1,37,111,84,93,96,110,133,66,253,199,188,1,176,25,14,8,28,11,1,103,180,254,45,84,135,169,20,30,166,43,101,139,4,65,252,193,49,47,84,22,3,53,251,234,187,170,79,255,255,0,106,255,236,5,248,5,203,2,6,1,115,0,0,255,255,0,8,0,0,4,150,5,182,2,6,0,59,0,0,0,1,0,201,254,131,5,184,5,182,0,11,0,50,64,25,8,5,9,0,3,2,2,0,5,3,12,13,10,6,3,0,8,5,8,73,89,5,18,3,34,0,63,63,43,17,0,51,24,63,51,17,18,1,23,57,17,51,17,51,17,51,49,48,37,51,17,35,17,33,17,51,17,33,17,51,5,12,172,161,251,178,170,2,239,170,154,253,233,1,125,5,182,250,228,5,28,0,0,1,0,170,0,0,4,199,5,182,0,19,0,45,64,22,11,8,17,1,1,0,8,0,20,21,5,14,73,89,5,5,1,18,9,3,1,18,0,63,63,51,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,33,35,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,4,199,170,149,198,106,207,223,170,127,143,97,177,169,170,2,92,53,39,190,179,2,69,253,207,121,116,29,55,2,202,0,1,0,201,0,0,7,121,5,182,0,11,0,49,64,24,4,1,8,5,9,0,0,5,1,3,12,13,10,6,2,3,8,4,1,4,73,89,1,18,0,63,43,17,0,51,24,63,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,17,51,17,33,17,51,17,33,17,51,7,121,249,80,170,2,88,170,2,88,172,5,182,250,228,5,28,250,228,5,28,0,1,0,201,254,131,8,4,5,182,0,15,0,59,64,30,3,0,7,4,8,11,14,13,13,11,4,0,4,16,17,14,34,9,5,1,3,11,7,3,0,3,73,89,0,18,0,63,43,17,0,51,51,24,63,51,51,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,201,170,2,71,172,2,72,170,172,162,5,182,250,228,5,28,250,228,5,28,250,228,253,233,1,125,0,0,2,0,18,0,0,5,23,5,182,0,12,0,21,0,61,64,32,9,13,13,4,17,0,0,4,6,3,22,23,9,21,73,89,9,9,4,7,7,6,73,89,7,3,4,13,74,89,4,18,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,4,35,33,17,33,53,33,17,51,32,4,1,51,50,54,53,52,38,35,35,5,23,254,253,249,254,71,254,176,1,250,244,1,5,1,18,252,245,252,181,169,175,203,224,1,170,206,220,5,31,151,253,144,205,254,26,139,140,136,126,0,0,3,0,201,0,0,6,10,5,182,0,10,0,19,0,23,0,63,64,32,3,11,11,0,15,7,21,20,20,7,0,3,24,25,21,18,3,19,73,89,3,3,0,22,1,3,0,11,74,89,0,18,0,63,43,0,24,63,51,18,57,47,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,51,17,51,17,51,32,4,21,20,4,35,37,51,50,54,53,52,38,35,35,1,35,17,51,201,170,239,1,5,1,18,254,253,249,254,246,247,181,170,179,200,219,4,151,170,170,5,182,253,144,205,207,206,220,145,141,140,137,123,253,82,5,182,0,2,0,201,0,0,4,186,5,182,0,10,0,18,0,50,64,25,7,11,11,4,14,0,4,0,19,20,7,18,73,89,7,7,4,5,3,4,11,74,89,4,18,0,63,43,0,24,63,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,20,4,35,33,17,51,17,33,32,4,1,33,32,17,52,38,35,33,4,186,254,241,251,254,25,170,1,35,1,11,1,25,252,185,1,43,1,108,187,206,254,242,1,170,203,223,5,182,253,144,211,254,32,1,23,135,127,0,1,0,61,255,236,4,137,5,203,0,26,0,58,64,31,24,21,21,9,9,22,15,3,4,27,28,23,22,73,89,23,23,12,5,12,18,73,89,12,19,5,0,73,89,5,4,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,34,7,39,54,51,50,4,18,21,16,0,33,34,39,53,22,22,51,32,0,19,33,53,33,38,0,1,211,172,162,72,172,236,217,1,57,162,254,148,254,170,227,156,83,172,99,1,15,1,20,8,253,49,2,205,22,254,241,5,51,76,144,84,176,254,186,221,254,136,254,108,57,149,21,34,1,33,1,16,152,229,1,2,0,2,0,201,255,236,7,231,5,205,0,18,0,30,0,71,64,38,12,8,8,9,19,13,6,25,0,0,6,9,3,31,32,16,28,73,89,16,4,12,7,73,89,12,12,9,10,3,9,18,3,22,73,89,3,19,0,63,43,0,24,63,63,18,57,47,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,16,0,33,32,0,3,33,17,35,17,51,17,33,18,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,7,231,254,171,254,208,254,211,254,171,11,254,158,170,170,1,100,23,1,81,1,31,1,51,1,86,251,160,238,231,234,237,235,232,233,240,2,221,254,158,254,113,1,111,1,85,253,80,5,182,253,146,1,55,1,78,254,111,254,161,254,216,254,204,1,50,1,42,1,42,1,46,254,207,0,2,0,51,0,0,4,78,5,182,0,13,0,21,0,61,64,32,21,12,12,11,18,6,2,6,3,11,4,23,22,0,20,74,89,3,9,0,0,2,9,9,15,74,89,9,3,12,2,18,0,63,51,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,1,35,1,38,38,53,52,36,33,33,17,35,17,17,35,34,6,21,16,33,51,2,123,254,129,201,1,154,161,146,1,15,1,19,1,146,170,227,183,190,1,123,221,2,98,253,158,2,127,51,207,158,196,211,250,74,2,98,2,193,126,142,254,221,255,255,0,94,255,236,3,205,4,90,2,6,0,68,0,0,0,2,0,119,255,236,4,84,6,33,0,23,0,34,0,59,64,30,26,18,32,11,0,0,6,18,3,36,35,12,11,15,28,70,89,11,15,15,21,5,21,24,70,89,21,22,5,1,0,63,63,43,17,18,0,57,24,47,57,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,19,16,18,55,36,55,23,4,7,6,6,7,51,54,54,51,50,18,21,16,0,35,34,0,5,32,17,16,33,34,6,6,7,16,18,119,212,230,1,30,218,31,254,165,149,145,145,7,12,62,196,107,202,226,254,250,234,231,254,250,1,252,1,49,254,235,76,141,117,32,166,2,145,1,104,1,147,50,61,38,146,58,34,33,246,212,84,96,254,250,232,254,255,254,223,1,98,215,1,133,1,115,63,104,55,254,249,254,237,0,3,0,176,0,0,4,76,4,72,0,14,0,22,0,31,0,73,64,38,28,20,20,11,23,0,15,7,7,0,3,11,4,32,33,4,28,19,28,19,70,89,28,28,11,12,12,27,70,89,12,15,11,20,70,89,11,21,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,6,35,33,17,33,32,3,52,38,35,33,17,33,32,3,52,38,35,33,17,33,50,54,4,41,123,111,140,129,225,216,254,29,1,225,1,152,131,135,156,254,211,1,49,1,31,31,123,125,254,199,1,25,154,126,3,53,107,111,19,9,19,126,111,153,166,4,72,253,2,89,81,254,151,2,154,80,67,254,203,76,0,0,1,0,176,0,0,3,68,4,72,0,5,0,29,64,14,2,3,0,3,7,6,4,1,70,89,4,15,3,21,0,63,63,43,17,18,1,57,57,17,51,49,48,1,33,17,35,17,33,3,68,254,18,166,2,148,3,186,252,70,4,72,0,2,0,41,254,133,4,104,4,72,0,13,0,19,0,67,64,36,4,5,19,7,16,10,14,12,1,0,0,12,10,7,5,5,20,21,10,16,71,89,10,15,1,5,34,19,12,6,3,6,70,89,3,21,0,63,43,17,0,51,51,24,63,51,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,35,17,33,17,35,17,51,54,18,19,33,17,51,33,17,35,6,2,7,4,104,161,253,2,160,86,134,152,3,2,43,157,254,195,246,13,145,108,254,133,1,123,254,133,2,10,182,1,234,1,25,252,71,3,54,222,254,57,145,0,255,255,0,115,255,236,4,18,4,92,2,6,0,72,0,0,0,1,0,4,0,0,5,223,4,70,0,17,0,60,64,31,2,9,9,17,10,6,4,5,10,14,15,13,7,19,18,17,11,8,5,2,14,14,13,3,0,15,15,10,7,13,21,0,63,51,51,63,51,51,18,57,17,51,51,51,51,51,17,18,1,23,57,17,51,51,17,51,49,48,1,51,17,1,51,1,1,35,1,17,35,17,1,35,1,1,51,1,2,164,153,1,197,182,254,54,1,241,192,254,30,153,254,31,191,1,240,254,55,182,1,195,4,70,253,237,2,19,253,237,253,205,2,43,253,213,2,43,253,213,2,51,2,19,253,237,0,1,0,68,255,236,3,127,4,92,0,34,0,77,64,43,2,13,30,19,19,13,15,33,8,24,6,35,36,16,34,33,34,33,70,89,15,34,31,34,2,11,3,34,34,22,10,22,27,70,89,22,22,10,4,70,89,10,16,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,32,53,52,35,34,6,7,39,54,51,50,22,21,20,7,21,22,22,21,20,6,35,34,39,53,22,51,50,54,53,52,33,35,53,1,129,1,55,252,77,126,102,59,170,201,189,218,205,126,116,245,216,237,129,183,187,144,147,254,201,152,2,129,172,162,28,42,135,76,155,134,184,57,8,37,137,103,152,169,71,152,86,99,93,191,141,0,1,0,176,0,0,4,98,4,72,0,13,0,52,64,25,8,4,7,7,6,11,3,3,12,6,12,15,14,3,10,12,4,13,15,12,21,7,21,4,15,0,63,63,63,63,17,18,57,57,17,18,1,57,57,17,51,17,51,17,51,17,51,51,49,48,1,17,7,7,1,51,17,35,17,55,55,1,35,17,1,76,7,3,2,81,207,155,3,5,253,176,207,4,72,253,73,182,57,3,166,251,184,2,158,132,130,252,92,4,72,0,255,255,0,176,0,0,4,98,6,12,2,38,1,210,0,0,1,6,2,54,61,0,0,8,179,1,14,17,38,0,43,53,0,1,0,176,0,0,4,12,4,72,0,10,0,45,64,22,10,6,6,7,3,1,2,7,4,12,11,2,10,5,10,7,0,8,15,4,7,21,0,63,51,63,51,18,57,57,17,51,17,18,1,23,57,17,51,17,51,49,48,1,51,1,1,35,1,17,35,17,51,17,3,47,182,254,39,2,0,194,254,12,166,166,4,72,253,239,253,201,2,43,253,213,4,72,253,235,0,1,0,16,255,242,3,225,4,72,0,16,0,45,64,24,1,0,3,15,10,15,0,3,18,17,15,3,70,89,15,15,7,12,71,89,7,22,1,21,0,63,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,35,17,33,2,2,6,35,34,39,53,22,51,50,18,19,33,3,225,168,254,183,27,96,153,118,54,32,22,28,115,136,35,2,129,3,186,254,156,254,94,194,12,123,6,1,230,1,239,0,1,0,176,0,0,5,47,4,70,0,20,0,53,64,25,3,6,6,5,18,15,15,16,5,16,22,21,7,14,0,14,11,3,17,15,6,16,21,11,21,0,63,63,51,63,51,18,57,57,17,51,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,37,55,55,1,51,17,35,17,7,7,1,35,1,38,39,17,35,17,51,1,22,2,233,31,43,1,41,211,147,20,58,254,229,139,254,229,53,20,148,203,1,31,43,160,93,118,2,211,251,186,3,137,58,153,253,74,2,184,134,75,252,119,4,70,253,73,110,0,1,0,176,0,0,4,98,4,72,0,11,0,57,64,30,2,6,6,5,1,9,9,10,5,10,13,12,1,8,70,89,47,1,63,1,2,1,1,10,3,11,15,6,10,21,0,63,51,63,51,18,57,47,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,17,33,17,51,17,35,17,33,17,35,17,1,86,2,102,166,166,253,154,166,4,72,254,53,1,203,251,184,1,238,254,18,4,72,255,255,0,115,255,236,4,98,4,92,2,6,0,82,0,0,0,1,0,176,0,0,4,72,4,72,0,7,0,35,64,17,0,1,5,4,1,4,8,9,2,7,70,89,2,15,5,1,21,0,63,51,63,43,17,18,1,57,57,17,51,17,51,49,48,33,35,17,33,17,35,17,33,1,86,166,3,152,168,253,182,4,72,251,184,3,184,0,255,255,0,176,254,20,4,117,4,92,2,6,0,83,0,0,255,255,0,115,255,236,3,139,4,92,2,6,0,70,0,0,0,1,0,41,0,0,3,147,4,72,0,7,0,36,64,18,2,3,0,3,5,3,8,9,1,5,6,5,70,89,6,15,3,21,0,63,63,43,17,0,51,17,18,1,23,57,17,51,49,48,1,33,17,35,17,33,53,33,3,147,254,156,166,254,160,3,106,3,186,252,70,3,186,142,255,255,0,2,254,20,4,6,4,72,2,6,0,92,0,0,0,3,0,113,254,20,5,70,6,20,0,17,0,24,0,30,0,76,64,39,18,9,28,15,4,4,21,12,5,25,0,0,5,9,3,31,32,13,0,27,22,12,22,70,89,15,12,16,28,21,6,21,70,89,3,6,22,5,27,0,63,63,51,43,17,0,51,24,63,51,43,17,0,51,24,63,17,18,1,23,57,17,51,17,51,51,51,17,51,51,17,51,49,48,1,20,0,7,17,35,17,38,0,53,52,0,55,17,51,17,22,0,5,20,22,23,17,6,6,5,16,37,17,54,54,5,70,254,229,254,164,248,254,224,1,31,255,158,251,1,30,251,217,176,192,185,183,3,123,254,147,190,175,2,37,249,254,217,21,254,36,1,220,19,1,46,244,249,1,38,20,1,188,254,68,23,254,212,240,192,218,18,3,84,17,207,200,1,127,39,252,174,19,218,255,255,0,39,0,0,4,8,4,72,2,6,0,91,0,0,0,1,0,176,254,133,4,221,4,72,0,11,0,50,64,25,6,3,7,10,1,0,0,10,3,3,12,13,8,4,15,10,6,3,6,70,89,3,21,1,34,0,63,63,43,17,0,51,24,63,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,35,17,33,17,51,17,33,17,51,17,51,4,221,166,252,121,166,2,70,166,155,254,133,1,123,4,72,252,71,3,185,252,71,0,1,0,156,0,0,4,45,4,72,0,18,0,45,64,22,6,10,10,9,1,17,9,17,20,19,3,14,70,89,3,3,10,7,18,15,10,21,0,63,63,51,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,20,51,50,54,55,17,51,17,35,17,6,6,35,34,38,53,17,1,66,219,91,166,105,166,166,105,179,113,164,186,4,72,254,112,192,56,67,1,213,251,184,1,240,72,59,172,147,1,156,0,1,0,176,0,0,6,111,4,72,0,11,0,49,64,24,8,5,0,9,1,4,4,9,5,3,12,13,10,2,6,15,0,8,5,8,70,89,5,21,0,63,43,17,0,51,24,63,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,37,33,17,51,17,33,17,51,17,33,17,51,3,225,1,230,168,250,65,166,1,229,166,143,3,185,251,184,4,72,252,71,3,185,0,0,1,0,176,254,135,7,10,4,70,0,15,0,59,64,30,12,9,0,13,1,4,7,6,6,4,13,9,4,16,17,14,2,10,15,4,0,12,9,12,70,89,9,21,7,34,0,63,63,43,17,0,51,51,24,63,51,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,37,33,17,51,17,51,17,35,17,33,17,51,17,33,17,51,3,225,1,230,166,157,168,250,78,166,1,229,166,143,3,183,252,73,253,248,1,121,4,70,252,73,3,183,0,0,2,0,41,0,0,5,29,4,72,0,12,0,20,0,61,64,32,0,18,18,8,13,4,4,8,10,3,21,22,0,17,70,89,0,0,8,11,11,10,70,89,11,15,8,18,70,89,8,21,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,33,50,22,21,20,6,35,33,17,33,53,33,1,52,38,35,33,17,33,32,2,45,1,57,224,215,223,220,254,37,254,162,2,4,2,76,124,157,254,205,1,57,1,19,2,131,154,155,166,168,3,186,142,252,252,93,83,254,151,0,0,3,0,176,0,0,5,121,4,72,0,10,0,14,0,22,0,63,64,32,0,16,16,8,4,19,12,11,11,19,8,3,23,24,12,21,0,15,70,89,0,0,8,13,9,15,8,16,70,89,8,21,0,63,43,0,24,63,51,18,57,47,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,33,50,22,21,20,6,35,33,17,51,1,35,17,51,1,17,33,32,53,52,38,35,1,86,1,43,209,201,213,207,254,57,166,4,35,166,166,251,221,1,25,1,8,122,147,2,131,155,154,165,169,4,72,251,184,4,72,253,172,254,151,185,92,84,0,2,0,176,0,0,4,76,4,72,0,9,0,18,0,50,64,25,15,3,0,11,11,7,3,7,20,19,0,10,70,89,0,0,7,8,15,7,11,70,89,7,21,0,63,43,0,24,63,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,33,32,17,20,6,35,33,17,51,17,17,33,50,54,53,52,38,35,1,86,1,82,1,164,219,211,254,18,166,1,64,132,140,129,148,2,131,254,203,162,172,4,72,253,172,254,151,92,93,91,85,0,1,0,57,255,236,3,125,4,92,0,26,0,68,64,38,12,9,9,24,24,10,18,2,4,27,28,11,10,70,89,15,11,31,11,2,11,3,11,11,0,21,21,15,70,89,21,16,0,6,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,23,57,17,51,17,51,49,48,5,34,39,53,22,22,51,50,54,55,33,53,33,38,38,35,34,7,39,54,54,51,32,0,17,16,0,1,86,167,118,60,140,91,174,189,10,253,213,2,41,16,169,161,103,151,47,55,164,80,1,0,1,10,254,223,20,57,147,23,36,186,185,141,172,160,54,140,26,35,254,219,254,236,254,243,254,214,0,2,0,176,255,236,6,51,4,92,0,18,0,30,0,81,64,45,12,8,8,9,19,13,6,25,0,0,6,9,3,31,32,16,28,70,89,16,16,12,7,70,89,15,12,31,12,2,11,3,12,12,9,10,15,9,21,3,22,70,89,3,22,0,63,43,0,24,63,63,18,57,47,95,94,93,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,16,0,35,34,2,39,33,17,35,17,51,17,33,54,54,51,50,0,1,20,22,51,50,54,53,52,38,35,34,6,6,51,254,255,224,213,250,14,254,225,166,166,1,33,20,252,207,220,1,1,252,238,146,161,158,149,146,161,161,146,2,37,254,243,254,212,1,11,247,254,18,4,72,254,53,228,251,254,207,254,250,211,219,213,217,210,216,216,0,2,0,37,0,0,3,193,4,72,0,13,0,20,0,61,64,32,17,11,11,10,14,5,1,5,2,10,4,22,21,13,16,70,89,2,8,13,13,1,8,8,19,70,89,8,15,11,1,21,0,63,51,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,51,35,1,38,38,53,52,54,51,33,17,35,17,33,1,20,33,33,17,33,34,231,194,1,59,127,135,202,181,1,232,166,254,235,254,246,1,20,1,11,254,211,242,1,207,28,161,122,150,172,251,184,1,182,1,78,190,1,114,255,255,0,115,255,236,4,18,5,211,2,38,0,72,0,0,1,6,0,106,8,0,0,10,180,3,2,48,17,38,0,43,53,53,0,1,0,20,254,20,4,68,6,20,0,39,0,102,64,58,29,27,23,15,15,20,16,7,37,37,25,2,16,18,5,40,41,30,29,33,11,70,89,26,18,19,18,71,89,23,19,15,19,31,19,47,19,3,9,3,29,33,19,19,33,29,3,16,21,0,16,21,0,5,70,89,0,27,0,63,43,0,24,63,63,18,23,57,47,47,47,95,94,93,17,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,51,49,48,1,34,39,53,22,51,50,53,17,52,38,35,34,6,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,7,51,54,54,51,50,22,21,17,20,6,3,47,79,52,58,55,129,122,130,173,157,168,156,156,166,1,145,254,111,8,10,49,181,116,201,201,137,254,20,25,137,20,170,3,82,134,132,188,211,253,231,4,219,127,186,186,127,196,84,56,79,91,191,210,252,182,156,170,255,255,0,176,0,0,3,68,6,33,2,38,1,205,0,0,1,6,0,118,241,0,0,8,179,1,15,17,38,0,43,53,0,1,0,115,255,236,3,170,4,92,0,25,0,68,64,38,15,18,18,3,9,24,17,3,4,26,27,15,18,70,89,15,15,31,15,2,11,3,15,15,0,6,6,12,70,89,6,16,0,21,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,23,57,17,51,17,51,49,48,5,34,0,17,16,0,51,50,22,23,7,38,35,34,6,7,33,21,33,22,22,51,50,55,21,6,2,121,248,254,242,1,19,251,82,158,57,49,143,109,164,170,16,2,41,253,213,9,170,167,140,151,116,20,1,35,1,16,1,19,1,42,32,25,141,51,163,169,141,190,181,59,147,57,255,255,0,106,255,236,3,115,4,92,2,6,0,86,0,0,255,255,0,162,0,0,1,102,5,223,2,6,0,76,0,0,255,255,255,236,0,0,2,31,5,211,2,38,0,243,0,0,1,7,0,106,254,183,0,0,0,10,180,2,1,25,17,38,0,43,53,53,255,255,255,145,254,20,1,102,5,223,2,6,0,77,0,0,0,2,0,16,255,242,6,66,4,72,0,21,0,29,0,76,64,41,9,20,0,27,27,7,22,4,4,7,20,14,4,30,31,0,26,70,89,0,0,12,20,20,9,70,89,20,15,12,17,71,89,12,21,7,27,70,89,7,21,0,63,43,0,24,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,51,50,22,21,16,33,33,17,33,2,2,35,34,39,53,22,51,50,18,19,33,1,52,38,35,35,17,51,32,3,176,244,211,203,254,75,254,101,254,254,40,181,171,56,32,22,28,115,136,35,2,80,1,236,125,158,231,237,1,21,2,131,155,154,254,178,3,186,253,250,254,62,12,123,6,1,230,1,239,252,252,91,85,254,151,0,2,0,176,0,0,6,164,4,70,0,17,0,25,0,74,64,38,15,11,11,12,1,19,19,16,8,22,5,5,8,12,3,26,27,18,10,15,10,70,89,1,15,15,8,17,13,15,12,21,8,19,70,89,8,21,0,63,43,0,24,63,63,51,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,17,33,50,22,21,16,33,33,17,33,17,35,17,51,17,33,17,19,17,51,32,53,52,38,35,4,0,1,0,217,203,254,78,254,96,254,10,172,172,1,250,166,240,1,20,128,153,4,70,254,59,153,154,254,178,1,238,254,18,4,70,254,55,1,201,253,174,254,151,185,92,84,0,255,255,0,20,0,0,4,68,6,20,2,6,0,233,0,0,255,255,0,176,0,0,4,12,6,33,2,38,1,212,0,0,1,6,0,118,51,0,0,8,179,1,20,17,38,0,43,53,255,255,0,2,254,20,4,6,6,12,2,38,0,92,0,0,1,6,2,54,183,0,0,8,179,1,22,17,38,0,43,53,0,1,0,176,254,135,4,70,4,70,0,11,0,50,64,25,4,1,10,11,5,8,8,11,1,3,12,13,11,34,6,2,15,9,1,1,4,70,89,1,21,0,63,43,17,0,51,24,63,51,63,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,17,51,17,33,17,51,17,33,17,35,2,47,254,129,166,2,74,166,254,143,166,4,70,252,73,3,183,251,186,254,135,0,0,1,0,201,0,0,4,8,6,227,0,7,0,35,64,17,0,3,5,6,3,6,9,8,7,4,73,89,1,7,3,6,18,0,63,63,198,43,17,18,1,57,57,17,51,17,51,49,48,1,17,51,17,33,17,35,17,3,102,162,253,107,170,5,182,1,45,254,58,250,227,5,182,0,0,1,0,176,0,0,3,68,5,137,0,7,0,39,64,18,5,0,2,3,0,3,9,8,6,4,4,1,71,89,4,15,3,21,0,63,63,43,0,24,16,198,17,18,1,57,57,17,51,17,51,49,48,1,33,17,35,17,33,17,51,3,68,254,18,166,1,238,166,3,199,252,57,4,72,1,65,0,255,255,0,27,0,0,7,76,7,115,2,38,0,58,0,0,1,7,0,67,1,23,1,82,0,8,179,1,27,5,38,0,43,53,255,255,0,23,0,0,6,35,6,33,2,38,0,90,0,0,1,6,0,67,115,0,0,8,179,1,30,17,38,0,43,53,255,255,0,27,0,0,7,76,7,115,2,38,0,58,0,0,1,7,0,118,1,176,1,82,0,8,179,1,35,5,38,0,43,53,255,255,0,23,0,0,6,35,6,33,2,38,0,90,0,0,1,7,0,118,1,27,0,0,0,8,179,1,38,17,38,0,43,53,255,255,0,27,0,0,7,76,7,37,2,38,0,58,0,0,1,7,0,106,1,100,1,82,0,10,180,2,1,47,5,38,0,43,53,53,255,255,0,23,0,0,6,35,5,211,2,38,0,90,0,0,1,7,0,106,0,207,0,0,0,10,180,2,1,50,17,38,0,43,53,53,255,255,0,0,0,0,4,123,7,115,2,38,0,60,0,0,1,7,0,67,255,148,1,82,0,8,179,1,10,5,38,0,43,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,7,0,67,255,97,0,0,0,8,179,1,23,17,38,0,43,53,0,1,0,82,1,217,3,174,2,113,0,3,0,17,181,0,2,4,5,0,1,0,47,51,17,18,1,57,57,49,48,19,53,33,21,82,3,92,1,217,152,152,0,1,0,82,1,217,7,174,2,113,0,3,0,17,181,0,2,4,5,0,1,0,47,51,17,18,1,57,57,49,48,19,53,33,21,82,7,92,1,217,152,152,255,255,0,82,1,217,7,174,2,113,2,6,2,3,0,0,0,2,255,252,254,49,3,78,255,211,0,3,0,7,0,28,64,11,4,0,9,5,1,1,8,5,6,2,1,0,47,51,47,51,17,1,51,17,51,17,51,50,49,48,1,33,53,33,53,33,53,33,3,78,252,174,3,82,252,174,3,82,254,49,139,140,139,0,0,1,0,25,3,193,1,68,5,182,0,7,0,18,182,1,5,8,9,0,4,3,0,63,205,17,18,1,57,57,49,48,19,39,54,18,55,51,6,7,37,12,22,98,56,123,66,37,3,193,22,90,1,12,121,254,247,0,0,1,0,25,3,193,1,68,5,182,0,7,0,18,182,5,1,8,9,5,7,3,0,63,198,17,18,1,57,57,49,48,1,23,6,2,7,35,18,55,1,53,15,26,98,53,122,70,32,5,182,22,100,254,247,114,1,29,216,0,255,255,0,63,254,248,1,109,0,238,2,6,0,15,0,0,0,1,0,25,3,193,1,70,5,182,0,7,0,18,182,2,6,9,8,3,7,3,0,63,205,17,18,1,57,57,49,48,19,22,23,35,38,2,39,55,223,37,66,123,45,109,24,14,5,182,251,250,94,1,28,101,22,0,0,2,0,25,3,193,2,180,5,182,0,7,0,15,0,26,64,12,4,1,13,9,4,16,17,0,8,3,12,3,0,63,51,205,50,17,18,1,23,57,49,48,1,39,54,19,51,6,2,7,33,39,54,18,55,51,6,7,1,150,15,56,122,123,30,59,13,253,215,12,22,98,56,123,66,37,3,193,22,215,1,8,115,254,223,97,22,90,1,12,121,254,247,0,0,2,0,25,3,193,2,180,5,182,0,7,0,16,0,26,64,12,9,13,1,5,4,17,18,13,5,16,7,3,0,63,51,198,50,17,18,1,23,57,49,48,1,23,6,2,7,35,18,55,33,23,6,2,7,35,54,18,55,1,53,15,26,98,53,122,70,32,2,39,14,24,96,56,125,26,66,13,5,182,22,100,254,247,114,1,29,216,22,91,254,246,122,100,1,52,93,0,255,255,0,25,254,249,2,180,0,238,1,7,2,11,0,0,251,56,0,32,183,1,0,7,64,13,13,72,7,184,255,192,179,12,12,72,7,184,255,192,179,9,9,72,7,0,17,43,43,43,53,53,0,1,0,123,0,0,3,137,6,20,0,11,0,67,64,33,9,2,2,8,3,10,1,1,7,4,0,4,3,5,4,12,13,0,5,5,11,6,6,7,8,0,1,4,4,10,7,3,18,0,63,46,51,51,17,51,63,18,57,47,51,51,17,51,17,18,1,23,57,17,51,51,17,51,17,51,51,17,51,49,48,1,37,19,35,19,5,53,5,3,51,3,37,3,137,254,160,49,196,49,254,180,1,76,49,196,49,1,96,3,231,31,251,250,4,6,31,170,30,1,161,254,95,30,0,1,0,123,0,0,3,154,6,20,0,21,0,117,64,58,12,7,21,16,4,4,15,10,5,20,17,0,3,3,14,11,9,6,19,1,1,6,5,7,4,22,23,1,8,8,2,7,3,6,6,0,9,20,11,11,17,14,19,12,12,18,9,14,13,7,13,7,13,5,15,0,5,18,0,63,63,18,57,57,47,47,18,57,57,50,50,17,51,17,51,51,17,51,17,51,51,17,51,17,51,51,17,51,17,18,1,23,57,17,51,17,51,51,51,51,17,51,51,51,17,51,51,51,17,51,51,17,51,49,48,1,37,21,37,19,35,19,5,53,5,3,19,5,53,5,3,51,3,37,21,37,19,2,57,1,97,254,159,49,198,49,254,166,1,90,43,43,254,166,1,90,49,198,49,1,97,254,159,43,1,231,31,168,29,254,133,1,123,29,168,31,1,43,1,27,31,168,30,1,124,254,132,30,168,31,254,229,0,1,0,164,1,244,2,94,3,227,0,11,0,19,182,6,0,0,12,13,9,3,0,47,205,17,18,1,57,17,51,49,48,19,52,54,51,50,22,21,20,6,35,34,38,164,113,108,105,116,115,106,107,114,2,236,121,126,124,123,119,129,131,0,255,255,0,152,255,227,5,174,0,242,0,38,0,17,0,0,0,39,0,17,2,18,0,0,0,7,0,17,4,37,0,0,0,7,0,100,255,236,9,59,5,203,0,9,0,20,0,24,0,36,0,47,0,59,0,70,0,91,64,48,0,16,5,10,48,66,54,60,25,43,31,37,37,43,60,21,66,10,23,16,8,71,72,28,51,51,40,63,25,3,13,34,57,57,45,68,13,68,13,68,23,24,6,23,24,7,18,7,0,63,51,63,63,18,57,57,47,47,17,51,51,17,51,17,51,63,51,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,19,20,22,51,50,17,16,35,34,6,5,20,6,35,34,38,53,16,33,50,22,37,1,35,1,1,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,16,33,50,22,5,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,16,33,50,22,236,83,93,180,180,93,83,1,237,161,156,149,163,1,56,152,165,2,105,252,213,148,3,43,2,160,83,93,91,89,89,91,93,83,1,237,162,155,148,163,1,55,150,167,251,56,81,93,91,89,89,91,93,81,1,235,162,155,149,163,1,56,150,167,4,2,170,170,1,84,1,82,168,170,230,231,238,223,1,201,240,219,250,74,5,182,252,2,171,169,167,173,171,165,165,171,230,230,239,221,1,201,236,221,171,169,167,173,171,165,165,171,230,230,238,222,1,201,236,0,255,255,0,133,3,166,1,63,5,182,2,6,0,10,0,0,255,255,0,133,3,166,2,176,5,182,0,6,0,5,0,0,0,1,0,82,0,117,2,31,3,190,0,6,0,26,64,10,4,2,3,6,2,6,8,7,5,1,0,47,47,17,18,1,57,57,17,51,17,51,49,48,19,1,23,1,1,7,1,82,1,86,119,254,223,1,33,119,254,170,2,39,1,151,69,254,162,254,161,71,1,151,0,1,0,80,0,117,2,29,3,190,0,6,0,26,64,10,3,0,4,2,0,2,8,7,5,1,0,47,47,17,18,1,57,57,17,51,17,51,49,48,1,1,39,1,1,55,1,2,29,254,168,117,1,31,254,225,117,1,88,2,12,254,105,71,1,95,1,94,69,254,105,0,255,255,0,152,255,227,3,74,5,182,0,38,0,4,0,0,0,7,0,4,1,193,0,0,0,1,254,121,0,0,2,143,5,182,0,3,0,19,183,0,5,2,4,3,3,2,18,0,63,63,17,1,51,17,51,49,48,1,1,35,1,2,143,252,121,143,3,135,5,182,250,74,5,182,0,1,0,109,3,33,2,195,5,199,0,18,0,38,64,17,0,18,12,8,8,9,18,9,20,19,4,15,31,0,9,10,31,0,63,205,50,63,51,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,52,38,35,34,6,21,17,35,17,51,23,51,54,51,32,21,17,2,76,78,80,114,91,116,96,14,10,75,145,1,2,3,33,1,164,84,71,105,122,254,164,2,153,88,101,250,254,84,0,1,0,98,0,0,4,35,5,182,0,17,0,75,64,40,14,0,4,4,9,5,11,16,2,5,7,5,18,19,3,7,8,7,78,89,0,8,14,17,76,89,8,14,8,14,5,10,10,13,76,89,10,6,5,24,0,63,63,43,17,18,0,57,57,24,47,47,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,51,49,48,1,33,21,33,17,35,17,35,53,51,17,33,21,33,17,33,21,33,1,184,1,52,254,204,166,176,176,3,17,253,149,2,68,253,188,1,139,129,254,246,1,10,129,4,43,151,253,233,151,0,1,0,68,0,0,4,72,5,201,0,37,0,112,64,64,13,9,17,17,34,30,26,11,15,21,2,15,26,28,32,23,7,38,39,16,28,29,28,78,89,13,29,12,32,33,32,78,89,9,33,15,33,31,33,63,33,79,33,4,9,3,29,33,29,33,23,0,23,20,76,89,23,24,0,5,75,89,0,7,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,95,94,93,17,51,43,17,0,51,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,51,17,51,51,49,48,1,50,23,7,38,35,34,6,21,21,33,21,33,21,33,21,33,21,20,6,7,33,21,33,53,54,53,53,35,53,51,53,35,53,51,53,52,54,2,176,201,158,60,152,147,122,126,1,164,254,92,1,164,254,92,65,74,3,27,251,252,206,200,200,200,200,224,5,201,80,131,71,135,129,186,129,166,129,33,100,136,44,154,141,48,243,35,129,166,129,207,178,205,0,0,3,0,154,255,236,5,209,5,182,0,22,0,33,0,42,0,96,64,55,34,28,28,29,38,23,16,20,20,13,9,2,18,9,23,11,29,6,43,44,27,34,75,89,16,19,78,89,3,27,11,16,14,14,16,11,27,3,5,29,30,30,42,75,89,30,6,29,24,6,0,77,89,6,25,0,63,43,0,24,63,63,43,17,18,0,23,57,24,47,47,47,47,47,43,43,17,18,1,23,57,17,51,51,17,51,17,51,17,51,17,51,49,48,37,50,54,55,21,6,35,34,38,53,17,35,53,55,55,51,21,51,21,35,17,20,22,1,20,4,33,35,17,35,17,33,32,22,1,51,50,54,53,52,38,35,35,5,78,34,86,11,60,110,109,129,157,157,62,98,221,221,52,254,145,254,235,254,246,64,165,1,6,1,0,254,253,161,52,200,185,172,183,82,117,14,4,125,30,136,138,1,207,80,69,191,211,129,254,71,77,82,3,151,227,234,253,193,5,182,211,253,238,145,162,145,142,0,0,1,0,63,255,236,4,137,5,203,0,38,0,113,64,63,29,23,31,22,22,26,11,2,7,7,26,36,17,4,10,26,23,6,39,40,11,23,24,23,78,89,8,24,5,29,30,29,78,89,2,30,15,30,31,30,47,30,3,9,3,24,30,24,30,19,34,34,0,76,89,34,7,19,14,76,89,19,25,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,95,94,93,17,51,43,17,0,51,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,32,3,33,21,33,7,21,23,33,21,33,22,22,51,50,55,21,6,35,34,0,3,35,53,51,39,53,55,35,53,51,18,0,51,50,23,7,38,3,27,254,193,79,1,254,253,244,2,2,1,207,254,65,37,203,170,156,153,146,171,237,254,223,46,166,152,2,2,152,164,39,1,36,237,201,165,71,166,5,53,254,109,129,57,64,45,129,180,197,66,150,65,1,13,1,1,129,42,44,80,129,1,5,1,36,97,139,86,0,4,0,141,255,248,6,10,5,193,0,3,0,15,0,23,0,43,0,69,64,36,37,27,32,42,16,10,20,4,4,0,10,42,2,27,6,44,45,35,30,6,18,7,24,22,13,39,24,13,24,13,24,2,3,6,2,24,0,63,63,18,57,57,47,47,17,51,17,51,63,51,63,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,1,35,1,1,20,6,35,34,38,53,52,54,51,50,22,5,20,51,50,53,52,35,34,37,34,38,53,52,54,51,50,23,7,38,35,34,21,20,51,50,55,21,6,5,31,252,213,148,3,43,1,127,169,148,139,170,167,148,141,170,254,21,178,176,176,178,253,202,166,182,188,171,104,88,33,81,80,224,220,98,90,78,5,182,250,74,5,182,251,152,159,183,185,157,158,184,186,156,238,238,235,219,177,161,168,179,35,103,31,238,235,33,101,37,0,2,0,119,255,236,3,156,5,203,0,28,0,36,0,61,64,31,35,26,26,15,9,29,22,3,22,9,12,4,37,38,35,15,13,25,10,5,12,19,2,12,2,12,6,31,19,0,6,0,47,51,47,51,18,57,57,47,47,17,18,23,57,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,50,55,51,6,6,35,34,38,53,53,6,7,53,54,55,17,52,54,51,50,22,21,20,2,7,17,20,22,19,52,35,34,6,21,17,36,2,125,174,18,95,8,153,142,150,160,96,96,78,114,150,135,117,135,206,175,82,174,127,67,62,1,0,111,213,166,178,181,169,243,35,22,113,21,38,1,242,138,159,161,138,185,254,208,74,254,229,104,123,4,43,194,86,108,254,75,137,0,0,4,0,201,0,0,7,195,5,182,0,15,0,27,0,39,0,43,0,95,64,49,9,6,6,7,1,13,13,0,28,22,34,16,16,43,40,22,0,7,6,44,45,31,19,37,25,11,40,19,3,25,8,19,25,19,25,40,8,40,41,74,89,40,18,14,8,3,1,7,18,0,63,51,63,51,63,43,17,18,0,57,57,24,47,47,17,18,57,17,18,57,17,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,33,35,1,35,18,21,17,35,17,51,1,51,38,53,17,51,1,20,6,35,34,38,53,52,54,51,50,22,5,20,22,51,50,54,53,52,38,35,34,6,3,53,33,21,4,199,187,253,76,8,16,151,194,2,170,8,14,152,2,252,161,147,139,162,161,147,139,162,254,34,81,93,91,79,79,91,92,82,86,2,0,4,203,254,224,108,252,193,5,182,251,58,245,138,3,71,252,183,163,184,187,160,163,181,187,157,114,118,117,115,115,112,112,253,32,135,135,0,2,0,37,2,229,5,133,5,182,0,7,0,24,0,79,64,39,0,1,15,12,12,13,17,20,20,19,19,13,6,1,3,5,25,26,23,22,9,10,10,17,14,14,4,7,3,3,4,16,8,8,20,13,1,4,3,0,63,196,50,50,57,47,51,17,51,17,51,17,51,17,51,51,17,51,51,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,35,17,35,53,33,21,35,1,3,35,23,17,35,17,51,19,19,51,17,35,17,55,35,3,1,113,123,209,2,31,211,2,88,201,8,6,119,187,196,203,180,127,6,8,211,2,229,2,103,106,106,253,153,2,47,129,254,82,2,209,253,209,2,47,253,47,1,164,137,253,211,0,255,255,0,80,0,0,5,244,5,205,2,6,1,118,0,0,0,2,0,102,255,221,4,139,4,72,0,23,0,31,0,52,64,26,31,14,14,4,24,12,12,21,4,3,32,33,13,20,47,31,63,31,2,31,31,17,28,8,17,0,0,47,50,47,51,18,57,47,93,57,51,17,18,1,23,57,17,51,17,51,17,51,49,48,5,34,38,2,53,52,54,54,51,50,22,18,21,33,17,22,22,51,50,54,55,23,6,6,19,17,38,38,35,34,7,17,2,121,157,241,133,138,244,149,152,243,135,252,197,49,166,82,131,183,81,72,98,217,147,50,163,88,173,122,35,147,1,5,157,171,255,140,142,254,253,165,254,156,53,70,105,129,41,155,124,2,139,1,21,53,66,117,254,233,255,255,0,71,255,236,5,243,5,182,0,39,2,23,2,92,0,0,0,38,0,123,251,0,1,7,2,64,3,96,253,179,0,11,180,4,3,2,25,25,0,63,53,53,53,0,255,255,0,32,255,236,6,8,5,201,0,39,2,23,2,162,0,0,0,39,2,64,3,117,253,179,1,6,0,117,255,0,0,11,180,1,3,2,14,25,0,63,53,53,53,0,255,255,0,71,255,236,6,4,5,182,0,39,2,23,2,156,0,0,0,38,2,61,12,0,1,7,2,64,3,113,253,179,0,11,180,4,3,2,44,25,0,63,53,53,53,0,255,255,0,106,255,236,6,0,5,182,0,39,2,23,2,70,0,0,0,39,2,64,3,109,253,179,1,6,2,63,49,0,0,11,180,1,3,2,14,25,0,63,53,53,53,0,0,2,0,102,255,236,4,53,5,199,0,26,0,40,0,65,64,34,38,7,31,15,15,0,0,20,7,3,41,42,11,34,71,89,14,4,11,11,24,4,24,17,70,89,24,3,4,27,70,89,4,22,0,63,43,0,24,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,2,4,35,34,38,53,52,18,54,51,50,22,23,55,16,33,34,6,7,53,54,54,51,50,18,1,50,54,18,55,38,38,35,34,6,6,21,20,22,4,53,167,254,236,173,172,187,136,232,151,97,146,43,4,254,230,62,144,48,47,155,74,210,216,253,162,95,166,120,22,25,128,80,101,165,101,101,3,166,254,250,254,53,233,201,192,169,1,51,161,93,75,90,1,149,44,33,159,23,37,254,236,251,198,144,1,3,150,97,108,132,250,128,118,130,0,2,0,39,0,0,4,109,5,182,0,5,0,12,0,40,64,19,9,5,10,4,5,4,14,13,6,5,1,5,9,73,89,5,18,1,3,0,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,49,48,55,1,51,1,21,33,1,6,7,1,33,1,38,39,1,207,166,1,209,251,186,2,33,61,40,254,252,2,209,254,254,68,104,5,78,250,176,102,4,244,225,121,252,254,2,249,202,0,0,1,0,201,254,16,5,33,5,182,0,7,0,35,64,17,0,7,3,4,7,4,9,8,5,2,73,89,5,3,0,4,27,0,63,51,63,43,17,18,1,57,57,17,51,17,51,49,48,1,17,33,17,35,17,33,17,4,119,252,252,170,4,88,254,16,7,13,248,243,7,166,248,90,0,1,0,76,254,16,4,221,5,182,0,11,0,49,64,26,7,9,9,3,0,8,2,10,6,2,0,4,12,13,4,7,73,89,4,3,0,9,73,89,0,27,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,17,51,49,48,19,53,1,1,53,33,21,33,1,1,33,21,76,2,119,253,153,4,64,252,176,2,67,253,164,3,170,254,16,107,3,156,3,51,108,151,252,252,252,141,152,0,1,0,104,2,141,4,41,3,23,0,3,0,21,64,9,2,0,5,4,1,0,80,89,1,0,47,43,17,18,1,57,57,49,48,19,53,33,21,104,3,193,2,141,138,138,0,1,0,37,255,242,4,188,6,152,0,8,0,28,64,11,8,10,3,9,3,6,4,4,1,8,1,0,47,47,18,57,47,57,51,17,1,51,17,51,49,48,5,35,1,35,53,33,19,1,51,2,111,127,254,233,180,1,33,235,2,2,137,14,3,14,135,253,84,5,189,0,0,3,0,119,1,147,5,45,4,12,0,21,0,33,0,45,0,51,64,24,31,12,43,0,0,37,25,12,4,46,47,34,28,28,17,6,9,19,15,40,22,22,3,9,0,47,51,51,17,51,47,51,18,57,57,51,17,51,17,18,1,23,57,17,51,17,51,49,48,1,20,6,35,34,38,39,6,6,35,34,38,53,52,54,51,50,23,54,51,50,22,1,50,54,55,38,38,35,34,6,21,20,22,1,34,6,7,22,22,51,50,54,53,52,38,5,45,167,128,93,153,65,60,153,88,131,168,168,131,181,122,124,185,133,162,252,125,66,109,54,50,109,72,76,100,97,2,161,66,109,55,51,110,71,76,100,101,2,207,131,185,106,116,104,113,173,142,134,179,219,215,175,254,187,91,100,97,93,105,87,83,106,1,121,92,98,97,94,107,84,85,105,0,1,0,12,254,20,2,248,6,20,0,20,0,28,64,12,8,18,2,18,13,3,21,22,16,11,5,0,0,47,50,47,51,17,18,1,23,57,17,51,49,48,1,50,23,21,38,35,34,21,17,20,6,35,34,39,53,22,51,50,53,17,16,2,125,79,44,49,62,176,165,163,74,59,61,58,182,6,20,16,137,22,243,250,225,176,187,19,135,22,243,5,31,1,106,0,0,2,0,98,1,135,4,45,4,31,0,23,0,47,0,112,64,64,40,15,27,3,15,3,49,48,39,30,30,24,80,89,15,30,31,30,47,30,3,9,3,30,42,64,42,36,80,89,27,42,64,15,6,6,0,80,89,15,6,31,6,47,6,3,9,3,6,18,64,18,12,80,89,3,0,18,16,18,32,18,3,18,0,47,93,196,43,0,26,24,16,205,95,94,93,43,0,16,24,196,26,222,196,43,0,26,24,16,205,95,94,93,43,0,16,24,196,17,18,1,57,57,17,51,17,51,49,48,1,34,6,7,53,54,51,50,22,23,22,22,51,50,54,55,21,6,35,34,38,39,38,38,3,34,6,7,53,54,51,50,22,23,22,22,51,50,54,55,21,6,35,34,38,39,38,38,1,80,54,127,57,108,148,67,112,88,77,91,45,53,128,54,101,153,67,111,88,73,91,49,57,128,53,106,150,69,116,82,69,95,49,55,129,51,100,154,69,118,79,84,85,2,0,64,57,150,110,28,37,33,25,66,57,151,109,29,37,30,25,1,150,68,53,149,109,32,34,29,26,66,55,150,110,32,33,34,24,0,0,1,0,104,0,166,4,41,5,2,0,19,0,70,64,38,5,1,16,11,11,9,10,14,4,0,19,1,8,20,21,13,5,6,5,80,89,10,8,15,6,1,9,3,6,14,2,1,2,80,89,18,17,1,0,47,51,196,43,17,0,51,24,47,95,94,93,198,51,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,1,33,53,33,19,33,53,33,19,23,7,33,21,33,3,33,21,33,3,39,1,125,254,235,1,84,127,254,45,2,19,135,125,109,1,23,254,170,129,1,215,253,233,131,125,1,193,137,1,16,137,1,31,57,230,137,254,240,137,254,229,55,255,255,0,104,0,1,4,41,4,217,2,38,0,31,0,0,1,7,2,43,0,0,253,116,0,9,179,1,0,7,18,0,63,53,53,0,255,255,0,104,0,1,4,41,4,217,2,38,0,33,0,0,1,7,2,43,0,0,253,116,0,9,179,1,0,7,18,0,63,53,53,0,0,2,0,111,0,0,4,61,5,195,0,5,0,9,0,32,64,13,8,0,6,3,0,3,10,11,9,7,2,5,2,0,47,47,18,57,57,17,18,1,57,57,17,51,17,51,49,48,19,1,51,1,1,35,9,3,111,1,194,72,1,196,254,60,72,1,98,254,195,254,195,1,61,2,223,2,228,253,28,253,33,2,225,2,19,253,237,253,236,0,255,255,0,29,0,0,4,28,6,31,0,38,0,73,0,0,0,7,0,76,2,182,0,0,255,255,0,29,0,0,4,12,6,31,0,38,0,73,0,0,0,7,0,79,2,182,0,0,0,1,0,219,4,217,3,190,6,12,0,13,0,24,64,9,11,3,15,14,10,4,128,7,0,0,47,50,26,204,50,17,18,1,57,57,49,48,1,34,38,39,51,22,22,51,50,54,55,51,6,6,2,72,185,170,10,156,9,91,113,103,99,11,157,12,178,4,217,143,164,104,82,88,98,158,149,0,0,1,255,145,254,20,1,86,4,72,0,12,0,29,64,13,11,8,8,14,13,9,15,0,5,70,89,0,27,0,63,43,0,24,63,17,18,1,57,17,51,49,48,19,34,39,53,22,51,50,54,53,17,51,17,16,43,95,59,69,67,78,73,166,254,20,25,135,20,85,87,4,252,251,16,254,188,0,0,1,1,137,4,205,2,117,6,20,0,9,0,19,182,9,4,10,11,4,128,9,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,137,19,39,10,168,11,88,47,90,4,229,55,167,81,18,51,188,70,0,1,1,113,254,59,2,111,255,131,0,9,0,19,182,9,4,10,11,9,128,4,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,113,28,51,7,168,11,98,55,90,254,84,64,186,53,18,51,193,66,0,1,1,129,4,217,2,127,6,33,0,9,0,19,182,9,4,10,11,9,128,4,0,47,26,205,17,18,1,57,57,49,48,1,6,6,7,35,53,54,54,55,51,2,127,29,53,6,166,14,99,49,92,6,8,61,193,49,19,61,191,57,0,2,0,39,2,57,2,158,5,199,0,11,0,21,0,32,64,14,6,12,0,17,12,17,23,22,9,19,31,3,14,33,0,63,51,63,51,17,18,1,57,57,17,51,17,51,49,48,19,20,22,51,50,54,53,52,38,35,34,6,5,16,33,34,38,53,16,33,50,22,176,82,94,94,86,86,94,94,82,1,238,254,196,158,157,1,59,158,158,4,0,168,166,165,171,170,164,165,169,254,55,236,221,1,197,232,0,2,0,20,2,74,2,180,5,188,0,10,0,20,0,60,64,31,20,5,11,7,3,3,9,2,0,2,5,3,21,22,1,5,5,9,15,20,31,20,2,20,20,3,14,7,31,3,32,0,63,63,51,18,57,47,93,51,51,17,51,17,18,1,23,57,17,51,51,17,51,51,17,51,49,48,1,35,21,35,53,33,53,1,51,17,51,33,53,52,55,14,3,7,7,2,180,125,145,254,110,1,152,139,125,254,242,6,5,24,30,30,11,168,3,20,202,202,101,2,67,253,205,195,134,75,12,39,45,45,17,246,0,1,0,59,2,55,2,137,5,170,0,29,0,43,64,21,16,3,28,23,9,23,26,3,4,31,30,19,0,0,6,27,24,30,13,6,33,0,63,51,63,51,18,57,47,51,17,18,1,23,57,17,51,17,51,49,48,1,50,22,21,20,6,35,34,38,39,53,22,22,51,50,54,53,52,38,35,34,6,7,39,19,33,21,33,7,54,1,72,145,176,170,166,74,139,41,56,140,54,95,110,109,102,57,76,31,59,33,1,239,254,131,20,62,4,104,143,123,140,155,31,23,131,34,38,83,89,78,88,17,8,41,1,160,104,230,12,0,0,2,0,41,2,57,2,162,5,199,0,23,0,35,0,54,64,28,27,18,33,11,0,0,6,18,3,37,36,30,11,21,0,15,16,15,2,15,15,3,24,21,33,8,3,31,0,63,51,63,51,18,57,47,93,18,57,51,17,18,1,23,57,17,51,51,17,51,49,48,19,16,54,51,50,23,21,38,35,34,6,7,51,54,54,51,50,22,21,20,6,35,34,38,5,50,54,53,52,38,35,34,6,21,20,22,41,219,219,74,49,52,83,141,150,10,8,29,113,85,125,148,166,141,153,173,1,68,81,99,88,86,85,112,106,3,195,1,5,255,15,114,18,153,166,43,59,148,126,144,164,210,99,93,99,79,91,90,59,89,124,0,0,1,0,57,2,74,2,143,5,182,0,6,0,28,64,13,1,5,5,0,2,3,7,8,2,3,30,0,32,0,63,63,51,17,18,1,23,57,17,51,49,48,19,1,33,53,33,21,1,162,1,94,254,57,2,86,254,160,2,74,2,248,116,94,252,242,0,3,0,51,2,57,2,147,5,199,0,21,0,34,0,45,0,63,64,34,22,13,38,19,43,3,28,7,7,3,5,16,19,13,6,46,47,5,16,32,32,11,41,27,41,2,41,41,25,10,33,35,0,31,0,63,50,63,51,57,47,93,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,50,22,21,20,7,22,21,20,6,35,34,38,53,52,54,55,38,38,53,52,54,3,20,22,51,50,54,53,52,38,39,39,6,6,19,34,6,21,20,22,23,54,53,52,38,1,100,124,151,148,176,165,138,146,159,73,85,74,57,157,53,84,86,90,84,93,81,28,72,70,172,68,75,68,81,140,78,5,199,118,104,130,76,74,158,113,137,128,116,69,116,46,46,93,68,102,126,253,102,60,73,73,60,63,79,28,10,34,84,1,239,60,57,47,71,33,54,97,57,60,0,2,0,35,2,57,2,156,5,201,0,22,0,34,0,60,64,31,26,17,32,10,0,0,5,17,3,35,36,29,14,10,11,11,20,15,14,31,14,2,14,14,3,23,20,31,8,3,33,0,63,51,63,51,18,57,47,93,18,57,17,51,17,51,17,18,1,23,57,17,51,51,17,51,49,48,1,16,6,35,34,39,53,22,51,32,19,35,6,6,35,34,38,53,52,54,51,50,22,37,34,6,21,20,22,51,50,54,53,52,38,2,156,218,212,83,49,49,93,1,20,21,10,35,116,65,131,153,169,136,152,176,254,184,81,95,85,87,84,115,103,4,70,254,242,255,15,116,20,1,70,51,52,146,131,136,165,202,91,95,87,81,95,85,62,97,114,0,0,22,0,84,254,129,7,193,5,238,0,5,0,11,0,17,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,83,0,91,0,107,0,116,0,124,0,137,0,248,64,135,65,64,61,60,49,48,15,5,0,12,84,78,88,72,118,107,112,96,122,103,133,134,69,68,41,40,37,36,20,10,9,23,23,134,6,18,59,27,127,103,96,56,24,55,47,107,52,44,72,35,31,32,28,3,17,78,12,25,138,139,10,0,42,66,90,81,134,92,116,92,41,65,70,62,100,117,117,108,69,61,130,125,86,75,107,118,107,38,50,37,49,21,13,0,66,1,65,62,92,61,108,13,49,50,3,107,12,92,108,107,107,108,92,3,1,45,44,29,28,25,24,19,18,15,12,57,56,53,52,33,32,7,6,4,1,0,47,51,51,51,51,51,51,51,51,51,47,51,51,51,51,51,51,51,51,51,18,23,57,47,47,47,17,18,23,57,17,57,18,57,57,17,57,57,17,51,17,51,17,51,17,51,16,196,50,196,50,17,51,17,51,18,57,17,51,17,51,17,51,16,196,196,50,17,51,17,51,17,18,1,23,57,17,51,51,51,51,51,51,51,51,51,17,51,17,51,17,51,17,51,17,51,17,51,17,51,51,51,51,51,51,51,51,51,49,48,19,17,33,21,35,21,37,53,33,17,35,53,1,17,51,21,51,21,33,53,51,53,51,17,33,53,33,21,33,53,33,21,1,53,33,21,1,35,17,51,17,35,17,51,1,53,33,21,1,35,17,51,1,53,33,21,51,53,33,21,1,35,17,51,53,35,17,51,1,35,17,51,5,20,6,35,34,38,53,52,54,51,50,22,5,20,51,50,53,52,35,34,37,51,50,22,21,20,6,7,21,22,22,21,20,6,35,35,19,51,50,54,53,52,38,35,35,21,21,51,50,54,53,52,35,1,34,39,53,22,51,50,53,17,51,17,20,6,84,1,47,192,5,206,1,48,109,249,0,111,192,5,14,195,109,253,73,1,17,251,225,1,14,254,242,1,14,4,183,109,109,109,109,251,194,1,16,252,48,111,111,2,192,1,16,119,1,17,250,168,111,111,111,111,6,254,109,109,251,159,135,127,127,135,135,127,126,136,254,115,135,135,135,135,1,225,172,109,112,46,44,61,46,109,94,207,123,66,46,36,42,47,59,74,49,37,90,1,94,52,28,43,25,86,125,105,4,190,1,48,111,193,193,111,254,208,193,249,2,1,47,194,109,109,194,254,209,109,109,109,109,6,254,111,111,250,168,1,14,2,2,1,15,250,59,109,109,1,166,1,14,4,74,111,111,111,111,252,47,1,16,121,1,15,253,104,1,16,73,145,156,156,145,146,155,154,147,197,197,196,97,67,83,49,66,8,8,14,68,53,81,89,1,98,34,32,34,29,227,154,43,37,74,254,250,10,102,8,86,1,146,254,114,95,99,0,0,3,0,84,254,193,7,170,6,20,0,3,0,30,0,42,0,46,64,25,1,11,23,37,4,30,31,17,3,9,43,44,40,30,20,14,34,30,14,14,30,34,3,2,0,0,47,47,23,57,47,47,47,17,51,17,51,17,18,1,23,57,49,48,9,3,5,53,52,54,55,54,54,53,52,38,35,34,6,7,23,54,51,50,22,21,20,6,7,6,6,21,21,3,20,22,51,50,54,53,52,38,35,34,6,3,254,3,172,252,84,252,86,3,235,44,65,103,73,187,165,79,186,71,82,160,90,63,62,49,72,84,59,27,71,70,66,73,72,67,72,69,6,20,252,86,252,87,3,169,251,47,50,65,49,82,126,88,135,154,56,42,178,80,58,47,53,75,54,68,112,74,59,254,237,63,72,73,62,64,73,72,255,255,255,145,254,20,2,87,6,33,2,38,2,55,0,0,1,7,1,76,254,169,0,0,0,8,179,1,24,17,38,0,43,53,255,255,0,25,3,193,1,68,5,182,2,6,2,7,0,0,0,2,0,10,255,236,4,223,6,43,0,45,0,54,0,102,64,57,27,7,23,11,52,37,46,31,31,43,2,45,2,37,11,7,18,6,55,56,20,14,71,89,0,33,46,33,71,89,43,46,15,46,31,46,2,9,3,20,46,20,46,5,40,40,49,70,89,40,1,5,29,70,89,5,22,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,95,94,93,17,51,43,17,0,51,43,17,18,1,23,57,17,51,51,17,51,17,51,17,51,17,51,49,48,1,22,21,16,0,33,32,17,52,55,54,53,52,38,35,34,6,7,39,54,51,50,22,21,20,7,6,21,20,51,32,17,52,39,38,36,38,53,52,54,51,50,0,19,51,21,37,38,2,35,34,6,21,20,4,4,86,4,254,224,254,253,254,119,16,15,36,32,25,54,15,33,83,95,88,93,15,16,233,1,119,4,223,254,201,160,182,168,208,1,0,42,143,254,199,28,183,123,93,97,1,19,3,78,46,65,254,159,254,110,1,88,57,123,122,23,47,35,15,9,118,39,93,93,35,131,132,58,207,2,112,63,44,2,105,188,131,144,163,254,205,254,215,129,129,211,1,0,95,75,141,154,0,1,0,0,0,0,4,123,5,195,0,21,0,40,64,20,17,18,7,18,20,3,22,23,0,18,20,3,18,18,5,10,74,89,5,4,0,63,43,0,24,63,63,18,57,17,18,1,23,57,17,51,49,48,1,18,18,54,54,51,50,23,21,38,35,34,14,3,7,17,35,17,1,51,2,57,122,141,77,92,58,48,40,26,31,40,59,86,124,101,31,172,254,35,186,2,205,1,35,1,55,108,48,15,135,6,56,161,252,236,85,253,227,2,47,3,135,0,0,2,0,18,255,236,6,119,4,72,0,20,0,41,0,76,64,39,24,3,18,33,33,30,39,13,10,13,30,3,6,5,42,43,19,31,31,0,8,21,11,6,8,6,70,89,8,15,36,27,0,27,70,89,16,0,22,0,63,50,43,17,0,51,24,63,43,17,0,51,51,17,18,57,24,47,57,17,18,1,23,57,17,51,17,51,18,57,17,51,49,48,5,34,38,53,52,19,33,53,55,33,21,35,22,21,20,6,35,34,39,35,6,1,6,2,21,20,22,51,50,54,53,53,51,21,20,22,51,50,54,53,52,39,2,41,186,199,135,254,227,142,5,215,250,117,200,185,221,68,8,68,254,207,63,66,108,117,93,108,162,107,93,117,109,111,20,231,240,240,1,7,74,68,142,252,251,240,231,182,182,3,206,132,254,254,103,174,168,143,125,188,188,122,146,169,173,254,239,0,255,255,0,201,0,0,6,113,7,117,2,38,0,48,0,0,1,7,0,118,1,156,1,84,0,8,179,1,29,5,38,0,43,53,255,255,0,176,0,0,6,203,6,33,2,38,0,80,0,0,1,7,0,118,1,205,0,0,0,8,179,1,45,17,38,0,43,53,255,255,0,0,253,213,5,16,5,188,2,38,0,36,0,0,0,7,2,91,1,53,0,0,255,255,0,94,253,213,3,205,4,90,2,38,0,68,0,0,0,7,2,91,0,199,0,0,255,255,254,223,255,236,5,210,5,205,0,38,0,50,20,0,1,7,2,92,254,71,0,0,0,9,179,3,2,26,3,0,63,53,53,0,0,2,0,117,253,213,2,53,255,131,0,11,0,23,0,30,64,12,18,6,12,0,6,0,24,25,21,3,15,9,0,47,51,204,50,17,18,1,57,57,17,51,17,51,49,48,1,20,6,35,34,38,53,52,54,51,50,22,7,52,38,35,34,6,21,20,22,51,50,54,2,53,125,102,101,120,120,101,101,126,110,66,51,51,66,60,57,53,64,254,174,97,120,117,98,98,117,118,97,57,60,60,57,56,61,61,0,2,0,152,4,104,2,207,5,197,0,8,0,23,0,30,64,14,14,9,3,8,12,19,9,5,24,25,2,11,8,21,0,47,196,220,198,17,18,1,23,57,17,51,49,48,1,54,55,51,21,6,6,7,35,37,52,55,21,6,21,20,30,2,21,20,35,34,38,1,176,70,28,189,41,119,49,78,254,232,237,121,31,37,31,93,55,67,4,135,181,122,20,78,172,57,118,163,61,72,41,53,20,19,16,26,28,74,68,0,255,255,0,29,0,0,6,211,6,31,0,39,0,73,2,176,0,0,0,38,0,73,0,0,0,7,0,76,5,109,0,0,255,255,0,29,0,0,6,195,6,31,0,39,0,73,2,176,0,0,0,38,0,73,0,0,0,7,0,79,5,109,0,0,0,2,0,125,255,236,6,100,6,20,0,21,0,33,0,60,64,31,22,6,15,17,17,28,0,0,20,11,6,4,34,35,20,11,3,9,9,31,73,89,15,9,4,3,25,73,89,3,19,0,63,43,0,24,63,198,43,17,18,0,57,57,17,18,1,23,57,17,51,51,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,23,62,2,53,51,23,6,6,7,22,1,16,18,51,50,18,17,16,2,35,34,2,5,188,254,157,254,198,254,189,254,161,1,97,1,67,1,69,179,50,58,27,182,14,29,131,104,96,251,117,250,244,243,246,245,242,243,253,2,221,254,158,254,113,1,137,1,106,1,104,1,134,215,12,67,102,105,22,155,173,39,176,254,254,254,214,254,206,1,49,1,43,1,39,1,49,254,209,0,0,2,0,115,255,236,5,25,4,240,0,22,0,34,0,60,64,31,23,7,16,18,18,29,0,0,21,12,7,4,35,36,21,12,3,10,10,32,70,89,16,10,16,3,26,70,89,3,22,0,63,43,0,24,63,198,43,17,18,0,57,57,17,18,1,23,57,17,51,51,17,51,17,51,49,48,1,16,0,35,34,38,2,53,16,0,51,50,23,62,2,53,51,23,6,6,7,22,5,20,22,51,50,54,53,52,38,35,34,6,4,98,254,242,238,147,228,124,1,12,238,217,137,51,58,26,180,15,31,121,102,71,252,189,158,173,175,157,159,175,173,156,2,37,254,244,254,211,138,1,2,173,1,12,1,43,141,15,65,99,110,23,156,175,38,138,185,211,219,219,211,210,216,216,0,1,0,186,255,236,6,123,6,20,0,27,0,51,64,24,5,7,7,1,11,20,17,11,17,29,28,10,1,14,27,5,18,3,14,23,73,89,14,19,0,63,43,0,24,63,198,51,18,57,57,17,18,1,57,57,17,51,17,51,51,17,51,49,48,1,21,62,2,53,51,23,6,6,7,17,16,0,33,32,0,53,17,51,17,20,22,51,50,54,53,17,5,25,58,70,31,181,14,33,172,149,254,225,254,248,254,244,254,212,170,204,198,184,193,5,182,198,8,62,112,110,22,182,184,25,253,141,254,254,254,234,1,31,253,3,174,252,70,183,196,193,188,3,184,0,0,1,0,164,255,236,5,150,4,242,0,29,0,68,64,34,1,28,13,15,15,19,20,7,7,10,19,28,19,30,31,21,22,10,18,22,3,20,13,8,29,15,25,4,70,89,25,22,20,21,0,63,63,43,0,24,63,51,198,18,23,57,17,51,17,18,1,57,57,17,51,51,17,51,17,51,17,51,17,51,49,48,1,17,20,22,51,50,54,53,17,51,21,54,54,53,51,23,6,6,7,17,35,39,35,6,6,35,34,38,53,17,1,76,122,130,172,159,166,82,74,178,15,32,176,141,137,24,9,52,181,111,203,200,4,70,253,59,134,132,188,213,2,62,121,11,128,154,23,186,191,14,252,172,147,82,85,190,209,2,203,0,255,255,252,83,4,217,253,220,6,33,0,7,0,67,250,202,0,0,255,255,253,13,4,217,254,150,6,33,0,7,0,118,251,132,0,0,255,255,252,25,4,217,255,1,5,221,0,7,1,82,251,17,0,0,0,1,253,8,4,184,254,115,6,143,0,17,0,30,64,12,2,5,5,13,13,8,0,0,19,11,16,4,0,47,204,50,17,1,51,17,51,51,18,57,17,51,49,48,1,20,7,7,35,39,54,54,53,52,38,35,34,7,53,54,51,32,254,115,166,10,105,12,86,78,67,73,62,32,38,69,1,0,5,215,140,34,113,176,14,50,43,43,41,6,100,10,0,1,253,59,254,160,254,2,255,125,0,11,0,17,181,6,0,0,13,9,3,0,47,205,17,1,51,17,51,49,48,5,52,54,51,50,22,21,20,6,35,34,38,253,59,59,42,40,58,58,40,42,59,242,57,54,54,57,55,55,55,0,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,0,67,255,216,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,203,0,0,5,82,7,115,2,38,1,178,0,0,1,7,0,67,0,104,1,82,0,8,179,1,17,5,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,0,67,183,0,0,8,179,2,28,17,38,0,43,53,255,255,0,176,0,0,4,98,6,33,2,38,1,210,0,0,1,6,0,67,220,0,0,8,179,1,15,17,38,0,43,53,0,1,0,133,255,236,7,145,5,201,0,49,0,69,64,36,34,22,42,39,47,9,9,4,39,27,22,5,50,51,0,31,25,31,73,89,16,40,40,19,6,25,4,44,37,19,37,73,89,12,19,19,0,63,51,43,17,0,51,24,63,51,18,57,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,6,7,39,54,51,50,0,17,16,0,35,34,38,39,35,6,6,35,32,0,17,16,18,51,50,23,7,38,38,35,34,2,17,16,18,51,50,55,17,51,17,22,51,50,18,17,16,2,5,164,60,94,45,69,126,150,228,1,1,254,229,255,108,172,83,8,80,169,107,255,0,254,229,255,228,153,124,70,45,93,60,147,165,207,187,139,102,170,102,142,187,206,165,5,47,41,31,146,80,254,136,254,173,254,141,254,97,45,51,50,46,1,155,1,119,1,83,1,120,80,146,31,41,254,215,254,246,254,211,254,178,76,1,201,254,55,76,1,75,1,48,1,11,1,40,0,1,0,0,0,0,6,29,4,72,0,29,0,40,64,22,23,0,13,14,5,5,30,31,27,21,13,0,18,10,4,4,22,14,5,15,4,21,0,63,63,51,51,18,23,57,63,17,18,1,23,57,49,48,1,6,6,3,35,1,51,19,22,23,51,54,54,19,3,51,0,22,23,51,54,18,17,51,16,2,7,35,3,38,3,39,10,20,179,213,254,127,172,246,32,46,8,19,74,142,172,178,1,9,45,10,8,173,153,166,195,219,182,125,33,1,201,26,51,254,132,4,72,253,73,93,189,53,163,1,36,1,213,252,255,144,44,184,1,179,1,82,254,150,254,7,229,1,90,92,0,2,0,23,0,0,4,252,6,20,0,17,0,26,0,76,64,40,8,4,18,18,1,15,22,11,11,6,15,0,4,27,28,7,17,0,17,73,89,4,0,8,26,73,89,0,8,0,8,15,2,0,15,18,74,89,15,18,0,63,43,0,24,63,18,57,57,47,47,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,19,33,17,51,17,33,21,33,17,51,32,17,20,4,33,33,17,33,1,51,50,54,53,52,38,35,35,23,1,63,172,1,162,254,94,201,2,49,254,247,254,251,254,104,254,193,1,235,213,192,181,186,218,182,4,250,1,26,254,230,148,254,224,254,100,208,218,4,102,252,43,137,144,138,122,0,0,2,0,23,0,0,4,156,5,39,0,17,0,25,0,71,64,38,4,0,19,19,15,11,22,7,7,2,11,13,4,26,27,3,13,14,13,70,89,4,18,70,89,4,4,11,16,0,14,15,11,19,70,89,11,21,0,63,43,0,24,63,51,198,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,1,33,21,33,17,33,32,17,20,6,35,33,17,35,53,51,53,51,17,17,33,32,53,52,38,35,1,168,1,88,254,168,1,63,1,181,223,220,254,33,235,235,166,1,49,1,31,135,156,4,72,140,254,197,254,205,166,168,3,188,140,223,252,205,254,151,185,92,84,0,1,0,201,255,236,7,33,5,203,0,32,0,74,64,41,23,19,19,20,6,24,29,12,5,24,17,20,6,33,34,27,0,73,89,27,4,6,18,23,18,73,89,3,23,23,20,21,3,20,18,14,9,73,89,14,19,0,63,43,0,24,63,63,18,57,47,51,43,17,0,51,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,4,7,33,21,33,18,0,51,50,55,21,6,35,32,0,3,33,17,35,17,51,17,33,18,0,37,50,23,7,38,38,5,143,227,254,252,31,2,191,253,61,8,1,9,247,154,194,152,222,254,193,254,165,8,254,162,170,170,1,100,30,1,113,1,48,213,182,72,100,157,5,51,250,241,150,254,239,254,226,55,149,57,1,112,1,84,253,80,5,182,253,146,1,51,1,78,2,92,146,48,38,0,0,1,0,176,255,236,5,156,4,92,0,33,0,89,64,50,22,25,25,10,3,9,5,5,6,16,32,24,3,6,5,34,35,13,19,70,89,13,16,25,4,9,4,70,89,22,15,9,31,9,2,11,3,9,9,6,7,15,6,21,0,28,70,89,0,22,0,63,43,0,24,63,63,18,57,47,95,94,93,51,43,17,0,51,24,63,43,17,18,1,23,57,17,51,17,51,17,51,51,17,51,49,48,5,34,0,39,33,17,35,17,51,17,33,54,36,51,50,22,23,7,38,35,34,6,7,33,21,33,22,22,51,50,54,55,21,6,4,119,235,254,244,11,254,225,166,166,1,33,24,1,13,223,81,154,54,50,138,101,163,167,16,2,24,253,230,9,169,164,61,119,98,110,20,1,10,248,254,18,4,72,254,51,235,246,32,25,141,51,164,170,141,188,181,22,37,147,57,0,2,0,0,0,0,5,109,5,182,0,11,0,18,0,52,64,27,2,3,7,12,3,13,10,5,20,19,1,5,12,5,73,89,16,8,12,12,7,8,3,11,3,7,18,0,63,51,51,63,18,57,47,18,57,43,17,0,51,17,18,1,23,57,17,51,49,48,1,35,17,35,17,35,1,35,1,51,1,35,1,33,39,38,39,6,7,3,152,148,156,149,254,223,178,2,104,158,2,103,183,253,92,1,76,82,56,30,24,64,2,170,253,86,2,170,253,86,5,182,250,74,3,63,207,144,100,98,164,0,0,2,0,10,0,0,4,121,4,72,0,11,0,18,0,53,64,28,5,6,10,12,6,13,3,1,6,20,19,4,8,12,8,70,89,17,11,12,12,10,11,15,6,2,10,21,0,63,51,51,63,18,57,47,18,57,43,17,0,51,17,18,1,23,57,17,51,49,48,1,1,35,3,35,17,35,17,35,3,35,1,3,33,38,38,39,35,6,2,168,1,209,172,207,113,151,115,205,172,1,209,33,1,15,43,56,34,9,28,4,72,251,184,1,233,254,23,1,233,254,23,4,72,254,45,108,138,106,92,0,0,2,0,201,0,0,7,94,5,182,0,19,0,26,0,70,64,37,14,10,10,11,2,3,18,21,3,20,8,7,11,7,27,28,5,1,9,14,9,73,89,20,24,12,14,14,11,16,12,3,19,7,3,11,18,0,63,51,51,51,63,51,18,57,47,18,57,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,35,17,35,17,35,1,35,1,33,17,35,17,51,17,33,1,51,1,35,1,33,2,38,39,6,6,5,133,143,154,147,254,227,186,1,34,254,95,170,170,1,225,1,6,158,2,102,188,253,102,1,62,118,28,12,19,35,2,176,253,80,2,176,253,80,2,176,253,80,5,182,253,146,2,110,250,74,3,72,1,53,86,47,67,104,0,2,0,176,0,0,6,20,4,72,0,19,0,25,0,77,64,43,17,13,13,14,5,6,1,25,6,24,11,10,14,7,26,27,8,4,12,17,12,70,89,24,21,19,47,17,63,17,2,17,17,14,19,15,15,15,10,6,2,14,21,0,63,51,51,51,63,63,18,57,47,93,18,57,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,1,35,3,35,17,35,17,35,3,35,19,33,17,35,17,51,17,33,19,23,35,6,6,7,33,4,70,1,206,170,208,113,152,110,209,172,209,254,223,166,166,1,94,197,104,8,10,32,89,1,12,4,72,251,184,1,238,254,18,1,238,254,18,1,238,254,18,4,72,254,51,1,205,115,34,95,217,0,0,2,0,20,0,0,5,174,5,182,0,31,0,34,0,75,64,40,32,1,15,16,33,30,30,29,16,2,1,7,6,36,35,30,1,33,31,31,33,73,89,14,18,29,18,74,89,34,2,29,29,24,31,3,16,8,24,18,0,63,51,51,63,18,57,47,51,51,43,17,0,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,1,30,2,23,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,62,2,55,1,53,5,33,1,5,41,254,90,118,154,100,50,133,174,137,35,68,101,89,27,170,26,91,99,65,32,135,185,136,47,99,149,118,254,101,3,190,253,10,1,123,5,182,133,254,17,6,72,139,164,254,59,1,201,111,96,38,253,66,2,190,39,95,111,254,55,1,197,159,142,73,7,1,239,133,153,254,57,0,0,2,0,12,0,0,5,20,4,72,0,32,0,35,0,78,64,42,33,1,15,16,34,31,24,31,30,16,2,1,7,7,37,36,31,1,34,32,32,34,70,89,17,14,18,30,18,71,89,35,2,30,30,24,32,15,16,8,24,21,0,63,51,51,63,18,57,47,51,51,43,17,0,51,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,1,30,3,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,62,3,55,1,53,5,33,1,4,139,254,174,87,111,73,49,155,172,133,34,58,84,76,10,153,11,75,82,56,39,135,170,131,24,48,73,110,87,254,177,3,32,253,180,1,37,4,72,105,254,160,7,48,80,105,254,113,1,80,87,71,28,253,246,2,10,26,64,94,254,174,1,80,61,105,79,50,8,1,96,105,140,254,193,0,0,2,0,201,0,0,7,197,5,182,0,36,0,39,0,97,64,53,33,29,29,30,38,35,15,16,2,39,37,1,7,1,39,16,34,27,35,24,30,9,41,40,35,1,36,38,36,38,73,89,18,14,28,33,28,73,89,39,2,33,33,30,36,3,31,3,24,16,8,30,18,0,63,51,51,51,63,63,18,57,47,51,51,43,17,0,51,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,1,21,1,30,2,23,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,54,55,33,17,35,17,51,17,33,1,53,5,33,1,7,61,254,93,120,153,101,45,136,168,138,31,70,105,95,24,172,25,94,100,66,33,135,178,135,55,56,254,82,170,170,2,215,254,104,3,193,253,10,1,123,5,182,133,254,14,6,72,144,156,254,59,1,201,104,99,40,253,68,2,188,40,95,108,254,55,1,190,184,58,253,80,5,182,253,146,1,233,133,153,254,55,0,0,2,0,176,0,0,6,186,4,72,0,36,0,39,0,103,64,58,33,29,29,30,38,35,15,16,2,39,37,1,7,1,39,16,34,27,35,24,30,9,41,40,35,1,36,38,36,38,70,89,18,14,28,33,28,70,89,39,2,47,33,63,33,2,33,33,30,36,15,31,15,24,16,8,30,21,0,63,51,51,51,63,63,18,57,47,93,51,51,43,17,0,51,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,1,21,1,30,3,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,54,55,33,17,35,17,51,17,33,1,53,5,33,1,6,49,254,174,88,111,73,48,155,172,133,34,58,86,74,10,154,10,75,84,55,38,135,170,131,47,37,254,205,166,166,2,53,254,176,3,33,253,180,1,37,4,72,105,254,158,7,49,78,105,254,114,1,80,86,70,28,253,248,2,8,27,63,92,254,174,1,80,120,40,254,16,4,72,254,53,1,98,105,140,254,199,0,1,0,63,254,78,4,53,6,209,0,75,0,132,64,77,0,19,33,63,25,70,70,10,63,55,67,60,42,28,45,40,19,11,76,77,73,22,74,89,73,19,57,52,49,15,46,31,46,47,46,3,9,3,46,42,64,67,29,28,29,28,74,89,29,29,16,60,42,42,36,74,89,42,4,10,9,73,89,10,16,16,3,73,89,16,35,12,7,73,89,12,34,0,63,43,0,24,63,43,0,24,16,198,43,0,24,63,43,17,0,51,18,57,24,47,43,17,18,0,57,26,24,16,221,95,94,93,57,196,50,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,23,20,22,51,50,55,54,51,50,23,21,38,35,34,7,6,35,34,38,53,52,54,55,54,54,53,16,33,35,53,51,50,54,53,52,38,35,34,6,7,39,54,55,38,39,39,53,51,22,23,54,54,51,50,23,21,38,35,34,6,7,22,22,21,20,6,7,21,22,22,21,20,4,5,6,6,240,87,89,97,120,120,70,155,71,80,160,68,105,105,105,179,184,217,232,204,181,254,64,218,209,205,225,162,137,106,187,110,86,168,190,57,117,49,123,92,131,92,131,64,50,48,24,43,44,111,48,178,193,191,170,186,203,254,229,254,230,138,134,137,55,50,7,6,39,166,51,5,5,125,133,126,129,9,8,138,141,1,12,143,147,132,107,128,55,69,114,114,28,66,121,52,27,59,136,115,86,14,113,10,82,71,23,189,143,140,184,26,8,24,178,144,208,213,9,5,55,0,0,1,0,25,254,123,3,127,5,78,0,70,0,131,64,78,23,41,54,11,46,16,16,32,11,3,14,8,62,50,64,60,41,11,71,72,68,62,65,0,5,71,89,0,15,65,31,65,47,65,3,9,3,65,62,38,26,70,89,35,29,70,89,14,51,50,51,50,70,89,38,35,51,51,35,38,3,32,62,62,56,70,89,8,62,16,32,34,19,44,71,89,19,22,0,63,43,0,24,63,63,51,43,17,18,0,23,57,24,47,47,47,43,17,18,0,57,43,43,0,24,16,212,95,94,93,196,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,50,23,21,38,35,34,6,7,22,22,21,20,7,21,22,21,20,6,7,14,2,21,20,22,51,50,55,55,50,23,21,38,38,35,7,6,35,34,38,53,52,54,55,36,53,52,38,35,35,53,51,32,53,52,35,34,6,7,39,54,55,38,39,53,51,22,23,54,54,2,248,51,45,24,41,47,103,45,122,140,211,248,242,225,93,109,48,75,89,86,122,175,125,39,21,84,55,179,130,92,144,159,190,180,1,78,156,159,148,119,1,55,252,74,143,88,59,124,126,92,103,123,75,140,88,134,5,78,15,112,10,79,62,28,138,107,184,57,8,71,202,148,168,3,2,23,42,44,49,43,5,5,39,143,19,24,5,5,119,112,116,125,3,4,190,97,90,141,172,162,34,36,135,55,15,117,98,27,52,137,110,85,255,255,0,109,0,0,5,242,5,182,2,6,1,117,0,0,255,255,0,164,254,20,5,135,6,18,2,6,1,149,0,0,0,3,0,125,255,236,5,190,5,205,0,11,0,18,0,25,0,71,64,37,22,16,16,6,23,15,15,0,6,0,26,27,22,16,73,89,15,22,1,11,3,22,22,3,9,9,19,73,89,9,4,3,12,73,89,3,19,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,0,1,50,18,19,33,18,18,19,34,2,3,33,38,2,5,190,254,157,254,196,254,189,254,161,1,96,1,68,1,59,1,98,253,97,229,247,13,252,43,13,249,232,224,251,19,3,211,17,244,2,221,254,161,254,110,1,139,1,104,1,101,1,137,254,112,252,68,1,17,1,12,254,245,254,238,4,180,254,254,255,0,254,1,4,0,0,3,0,115,255,236,4,98,4,92,0,12,0,19,0,26,0,73,64,39,23,17,17,7,24,16,16,0,7,0,27,28,23,17,70,89,15,23,31,23,2,11,3,23,23,3,10,10,20,70,89,10,16,3,13,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,16,0,35,34,38,2,53,16,0,51,50,0,1,50,54,55,33,22,22,19,34,6,7,33,38,38,4,98,254,242,238,147,228,124,1,12,238,230,1,15,254,8,158,164,10,253,105,9,160,160,156,158,13,2,147,15,161,2,37,254,244,254,211,138,1,2,173,1,12,1,43,254,206,253,77,184,191,186,189,3,88,173,167,168,172,0,0,1,0,0,0,0,5,72,5,195,0,21,0,32,64,16,6,22,19,23,17,0,74,89,17,4,10,5,6,3,5,18,0,63,63,18,57,63,43,17,1,51,18,57,49,48,1,34,6,7,1,35,1,51,1,22,23,54,55,19,62,2,51,50,23,21,38,4,225,59,78,57,254,184,197,253,238,180,1,82,72,35,32,70,162,59,84,110,89,42,79,56,5,55,103,181,251,229,5,182,252,86,199,143,144,223,2,6,191,152,65,19,141,20,0,1,0,0,0,0,4,61,4,82,0,22,0,30,64,15,1,23,15,24,13,18,71,89,13,16,5,1,15,0,21,0,63,63,57,63,43,17,1,51,18,57,49,48,33,1,51,19,18,23,51,54,19,19,62,2,51,50,23,21,38,35,34,6,7,3,1,150,254,106,174,225,100,19,8,23,82,96,37,71,91,84,45,30,29,38,47,58,28,248,4,72,253,155,254,244,100,118,1,11,1,53,122,123,52,10,127,8,84,92,252,223,255,255,0,0,0,0,5,72,7,115,2,38,2,128,0,0,1,7,3,118,4,215,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,0,0,0,0,4,61,6,33,2,38,2,129,0,0,1,7,3,118,4,100,0,0,0,10,180,2,1,34,17,38,0,43,53,53,0,3,0,125,254,20,9,162,5,205,0,11,0,23,0,46,0,68,64,38,12,6,18,0,33,46,39,24,0,6,6,47,48,37,42,74,89,37,27,29,28,28,3,32,24,15,9,21,73,89,9,4,3,15,73,89,3,19,0,63,43,0,24,63,43,0,24,63,51,18,57,17,51,63,43,17,18,1,23,57,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,37,51,19,22,23,51,54,54,19,51,1,6,6,35,34,39,53,22,51,50,54,55,55,5,84,254,185,254,220,254,215,254,189,1,67,1,44,1,35,1,69,251,221,223,217,218,221,220,216,218,225,4,111,176,246,78,20,8,11,83,228,176,254,43,69,188,136,76,74,55,66,94,117,35,61,2,221,254,160,254,111,1,139,1,104,1,102,1,136,254,112,254,160,254,215,254,205,1,49,1,43,1,41,1,47,254,210,65,253,139,207,102,44,251,2,131,251,32,182,158,17,133,12,103,89,156,255,255,0,115,254,20,8,123,4,92,0,38,0,82,0,0,0,7,0,92,4,117,0,0,0,2,0,125,255,135,6,16,6,45,0,19,0,40,0,81,64,42,20,10,38,13,7,17,34,34,3,28,31,0,0,28,7,23,10,5,41,42,36,34,38,13,38,73,89,17,15,13,3,28,26,23,7,23,73,89,5,3,7,18,0,63,51,51,43,17,0,51,51,24,63,51,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,51,17,51,49,48,1,16,0,5,6,35,34,39,36,0,17,16,0,37,54,51,50,23,4,0,1,20,18,23,54,54,51,50,23,54,18,53,52,2,39,6,35,34,39,6,2,6,16,254,209,254,248,26,119,124,20,254,244,254,209,1,43,1,16,20,124,121,22,1,12,1,45,251,33,202,189,17,73,54,110,31,189,202,202,189,31,110,113,31,189,202,2,221,254,210,254,115,44,111,111,41,1,138,1,54,1,49,1,133,44,108,108,44,254,115,254,213,244,254,207,41,48,38,86,41,1,49,244,244,1,47,39,88,86,39,254,211,0,0,2,0,115,255,147,4,207,4,180,0,23,0,45,0,80,64,42,24,12,15,9,43,27,37,21,3,35,0,0,3,32,27,9,12,6,46,47,40,37,43,15,43,70,89,21,18,15,16,32,30,27,9,27,70,89,6,3,9,21,0,63,51,51,43,17,0,51,51,24,63,51,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,20,2,7,6,6,35,34,38,39,38,2,53,52,18,55,54,54,51,50,22,23,22,18,5,20,22,23,54,54,51,50,23,54,54,53,16,37,6,6,35,34,38,39,6,6,4,207,224,204,9,64,56,57,61,9,203,229,224,208,8,62,57,56,64,9,202,226,252,80,125,137,12,60,53,103,24,134,124,254,252,13,61,51,53,60,12,137,125,2,37,233,254,223,37,54,45,43,56,36,1,38,229,233,1,32,36,56,42,43,57,38,254,220,225,177,210,31,42,34,74,31,210,175,1,96,62,42,32,32,44,31,209,0,0,3,0,125,255,236,7,127,8,59,0,21,0,69,0,84,0,85,64,46,67,55,31,43,43,1,38,70,75,80,72,60,12,55,10,85,86,21,2,2,7,7,16,12,82,64,72,58,34,64,58,64,73,89,40,58,4,28,22,52,22,73,89,46,52,19,0,63,51,43,17,0,51,24,63,51,43,17,0,51,24,16,214,26,220,212,205,50,18,57,47,51,17,18,1,23,57,17,51,17,51,49,48,1,21,35,34,46,2,35,34,6,21,21,35,53,52,54,51,50,30,2,51,1,50,54,55,22,22,51,50,18,17,16,2,35,34,6,7,39,54,51,50,0,17,16,0,33,34,38,39,6,6,35,32,0,17,16,0,51,50,23,7,38,38,35,34,2,17,16,18,1,20,7,53,54,53,52,46,2,53,52,51,50,22,5,162,17,84,142,120,102,43,47,60,125,116,112,58,112,119,133,78,253,40,88,171,61,55,171,93,188,210,165,147,60,95,43,70,121,154,228,1,1,254,224,254,253,104,170,76,75,167,110,254,252,254,227,1,1,228,154,121,70,43,94,60,148,165,210,2,128,237,120,31,36,31,92,56,67,7,199,121,36,43,36,52,51,16,28,103,110,36,44,36,248,186,66,63,57,72,1,78,1,45,1,11,1,40,43,31,146,82,254,136,254,173,254,140,254,98,40,48,45,43,1,157,1,117,1,85,1,118,82,146,31,43,254,217,254,244,254,209,254,180,6,104,162,61,72,41,53,20,18,17,26,28,73,68,0,0,3,0,115,255,236,6,4,7,6,0,42,0,63,0,78,0,92,64,51,19,7,28,40,40,44,34,64,69,13,74,66,54,7,10,79,80,50,58,63,45,45,54,76,66,10,64,31,16,10,16,70,89,2,23,70,89,2,4,37,10,16,26,21,4,21,70,89,0,4,22,0,63,51,43,17,0,51,24,63,51,18,57,43,43,17,0,51,26,24,16,222,220,212,50,17,51,205,50,17,18,1,23,57,17,51,17,51,49,48,5,34,39,6,35,34,2,17,16,18,51,50,22,23,7,38,35,34,6,21,16,33,50,55,22,22,51,32,17,52,38,35,34,7,39,54,54,51,50,18,17,16,2,3,21,35,34,46,2,35,34,21,21,35,53,52,54,51,50,30,2,51,5,20,7,53,54,53,52,46,2,53,52,51,50,22,4,43,148,94,92,143,225,250,207,186,62,119,40,57,89,71,116,109,1,49,123,112,62,111,67,1,45,110,115,71,89,57,40,119,62,187,206,247,81,16,84,143,120,101,43,107,125,115,112,58,113,118,131,78,254,240,238,119,30,36,30,92,56,67,20,65,65,1,35,1,14,1,23,1,40,32,25,139,51,214,214,254,94,80,42,38,1,162,214,214,51,139,25,32,254,215,254,234,254,245,254,218,6,165,120,36,42,36,102,17,31,100,111,37,43,37,221,161,62,72,40,56,20,17,17,25,27,74,68,0,0,2,0,94,255,236,7,127,7,4,0,13,0,64,0,95,64,52,48,36,57,54,62,23,23,1,18,54,41,12,36,7,65,66,14,45,39,45,73,89,30,55,55,33,39,5,9,9,13,64,9,15,72,13,7,3,11,64,20,39,4,59,51,33,51,73,89,26,33,19,0,63,51,43,17,0,51,24,63,51,26,222,50,50,205,43,50,17,51,17,18,57,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,7,35,39,35,7,35,39,35,7,35,39,53,1,34,6,7,39,54,51,50,18,17,16,0,33,34,38,39,35,6,6,35,32,0,17,16,0,51,50,23,7,38,38,35,34,2,17,16,18,51,50,54,55,17,51,17,22,51,50,18,17,16,2,5,139,80,32,50,186,49,33,49,188,47,33,80,3,67,60,93,45,70,124,153,228,255,254,226,254,253,116,172,76,9,78,172,112,254,252,254,227,1,1,229,150,126,70,45,93,60,147,165,210,190,65,130,51,170,102,145,188,212,165,7,4,27,172,103,103,103,103,172,27,254,43,41,31,146,80,254,136,254,173,254,139,254,99,48,48,49,47,1,160,1,114,1,85,1,118,80,146,31,41,254,215,254,246,254,209,254,180,38,38,1,201,254,55,76,1,74,1,49,1,11,1,40,0,0,2,0,0,0,0,6,29,5,164,0,13,0,42,0,63,64,36,36,1,14,26,27,12,18,7,43,44,40,21,14,31,22,3,17,18,5,9,9,13,64,9,15,72,13,7,3,11,35,27,18,15,17,21,0,63,63,51,51,222,50,50,205,43,50,17,51,17,18,23,57,63,17,18,1,23,57,49,48,1,21,7,35,39,35,7,35,39,35,7,35,39,53,1,7,3,35,1,51,19,22,23,51,54,54,19,3,51,0,22,23,51,54,18,17,51,16,2,7,35,3,38,4,182,82,30,50,188,49,31,49,188,50,30,80,1,172,39,170,213,254,127,172,246,39,41,8,12,35,186,172,178,1,9,45,10,8,173,153,166,195,219,182,125,33,5,164,27,172,103,103,103,103,172,27,252,37,95,254,150,4,72,253,73,111,171,35,81,1,136,1,213,252,255,144,44,184,1,179,1,82,254,150,254,7,229,1,90,92,0,0,1,0,125,254,20,4,227,5,203,0,23,0,45,64,24,3,15,9,10,21,10,15,3,24,25,19,0,73,89,19,4,12,6,73,89,12,19,10,27,0,63,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,1,34,0,17,16,0,33,50,55,17,35,17,35,32,0,17,52,18,36,51,50,23,7,38,3,72,245,254,224,1,10,1,2,111,57,170,20,254,181,254,159,175,1,72,216,237,170,71,171,5,51,254,192,254,232,254,218,254,212,23,253,116,1,216,1,132,1,109,224,1,86,184,84,146,78,0,1,0,115,254,20,3,162,4,92,0,24,0,47,64,24,15,3,23,22,9,22,3,3,25,26,23,27,6,12,70,89,6,16,0,18,70,89,0,22,0,63,43,0,24,63,43,0,24,63,17,18,1,23,57,17,51,17,51,49,48,5,34,0,17,16,0,51,50,22,23,7,38,35,34,6,21,20,22,51,50,54,55,17,35,17,2,117,254,254,252,1,17,251,79,164,48,49,142,104,177,171,171,171,53,80,57,166,20,1,31,1,18,1,20,1,43,34,23,141,51,205,221,220,200,17,26,253,110,1,216,0,0,1,0,106,255,252,4,117,5,6,0,19,0,47,64,33,4,2,8,3,6,0,17,7,10,16,13,18,12,14,14,21,20,19,0,3,17,6,15,5,16,7,13,10,9,12,11,1,18,0,63,205,23,57,17,18,1,23,57,49,48,1,3,39,19,37,55,5,19,37,55,5,19,23,3,5,7,37,3,5,7,2,2,182,121,182,254,225,66,1,33,205,254,223,67,1,33,185,118,184,1,33,68,254,225,204,1,30,65,1,57,254,195,67,1,66,166,115,168,1,100,166,117,168,1,61,67,254,192,166,115,166,254,158,168,115,0,1,0,203,4,145,3,172,5,180,0,19,0,30,64,12,0,6,10,16,6,16,20,21,3,0,13,9,0,47,51,51,50,17,18,1,57,57,17,51,17,51,49,48,1,6,6,35,34,38,53,52,54,51,33,54,54,51,50,22,21,20,6,35,1,135,6,42,48,51,41,42,54,1,193,6,43,47,51,45,44,54,4,240,45,50,50,53,53,41,46,48,49,51,56,40,0,1,0,248,4,229,3,219,5,215,0,19,0,28,64,11,7,18,21,20,0,18,18,12,4,128,9,0,47,26,204,50,51,17,51,17,18,1,57,57,49,48,1,50,55,54,51,50,22,21,21,35,53,52,35,34,14,2,35,35,53,1,4,120,150,149,81,111,116,125,106,43,102,121,142,84,16,5,98,59,58,111,100,31,17,102,36,43,36,121,0,1,1,223,4,215,2,205,6,53,0,14,0,24,64,10,10,0,12,5,0,3,15,16,3,13,0,47,204,17,18,1,23,57,17,51,49,48,1,52,54,51,50,21,20,14,2,21,20,23,21,38,1,223,67,56,92,30,36,30,119,238,5,184,56,69,76,27,25,16,18,20,54,40,74,64,0,1,1,225,4,215,2,207,6,53,0,14,0,24,64,10,5,0,0,10,2,3,15,16,12,2,0,47,204,17,18,1,23,57,17,51,49,48,1,20,7,53,54,53,52,46,2,53,52,51,50,22,2,207,238,119,30,36,30,92,56,67,5,184,161,64,74,40,54,20,18,16,25,27,76,69,0,8,0,41,254,193,7,193,5,145,0,12,0,26,0,40,0,54,0,68,0,82,0,95,0,109,0,128,64,73,95,40,68,90,34,62,12,26,7,20,82,54,109,76,48,103,16,110,111,0,7,58,72,72,65,79,69,68,62,76,86,99,99,92,106,102,95,90,109,30,44,44,37,51,47,34,40,3,54,16,23,7,79,76,106,109,51,54,23,23,54,51,109,106,76,79,7,8,9,13,20,3,9,0,47,51,47,51,18,23,57,47,47,47,47,47,47,47,47,17,51,17,23,51,17,51,51,17,51,17,51,51,51,17,51,51,17,51,17,51,51,51,17,51,51,17,51,17,51,17,18,1,23,57,49,48,1,38,38,35,34,6,7,35,54,51,50,22,23,3,38,38,35,34,6,7,35,54,54,51,50,22,23,1,38,38,35,34,6,7,35,54,54,51,50,22,23,33,38,38,35,34,6,7,35,54,54,51,50,22,23,1,38,38,35,34,6,7,35,54,54,51,50,22,23,33,38,38,35,34,6,7,35,54,54,51,50,22,23,1,38,38,35,34,6,7,35,54,51,50,22,23,33,38,38,35,34,6,7,35,54,54,51,50,22,23,4,111,5,60,69,78,50,5,75,11,197,93,113,7,79,5,60,69,78,50,5,75,5,100,103,92,115,6,1,244,5,60,68,78,50,5,76,5,101,103,92,115,6,251,47,5,60,68,78,50,5,76,5,101,103,92,115,6,4,49,5,60,68,78,50,5,76,5,101,103,92,115,6,251,47,5,60,68,78,50,5,76,5,101,103,92,115,6,4,240,5,60,68,78,51,5,75,11,198,92,115,6,249,190,5,60,68,78,50,5,76,5,101,103,92,115,6,4,207,44,44,41,47,194,101,93,249,242,44,44,41,47,89,105,102,92,1,22,45,43,39,49,90,105,102,93,45,43,39,49,90,105,102,93,3,219,45,43,39,49,90,105,102,93,45,43,39,49,90,105,102,93,254,25,44,44,40,48,194,104,90,45,43,39,49,90,104,102,92,0,0,8,0,41,254,127,7,125,5,211,0,7,0,15,0,23,0,31,0,39,0,46,0,53,0,62,0,52,64,37,21,23,37,32,62,58,5,1,41,44,31,28,50,53,9,13,16,63,64,59,43,7,46,54,25,21,29,17,47,39,15,36,51,14,5,12,5,0,47,47,18,23,57,17,18,1,23,57,49,48,5,23,6,6,7,35,54,55,3,39,54,54,55,51,6,7,1,55,22,22,23,21,38,39,5,7,38,38,39,53,22,23,1,55,54,54,55,23,6,7,1,7,6,7,39,54,55,3,39,38,39,55,22,23,1,23,22,22,23,7,38,38,39,4,55,11,17,70,36,97,53,17,59,11,19,73,31,97,52,18,2,35,14,71,200,65,221,129,251,104,14,66,191,79,221,129,3,166,2,67,190,67,69,177,120,252,234,2,155,169,69,177,120,43,17,82,69,67,123,76,3,106,17,39,90,22,67,31,130,38,35,14,66,191,79,221,129,4,152,14,71,200,65,220,130,254,22,11,19,73,31,97,53,17,59,11,17,70,36,97,53,17,1,170,16,39,88,25,68,110,88,252,149,16,89,63,68,110,88,2,222,2,140,183,70,198,99,252,233,2,69,194,60,70,50,195,52,0,0,2,0,201,254,131,6,8,7,94,0,20,0,34,0,89,64,47,13,10,12,7,14,14,9,19,2,2,20,20,24,32,9,10,5,36,35,20,18,6,5,17,18,5,18,14,0,14,9,73,89,14,18,12,34,31,15,24,1,24,28,21,7,0,3,0,63,50,222,50,205,93,50,63,63,43,17,18,0,57,57,17,51,17,51,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,51,17,51,49,48,19,51,17,20,7,7,51,1,51,17,51,3,35,19,35,17,52,55,35,1,35,1,34,38,39,51,22,22,51,50,54,55,51,6,6,201,161,10,4,8,3,52,184,184,143,197,156,160,19,9,252,201,186,2,67,186,168,10,155,10,93,110,105,99,9,158,12,181,5,182,252,209,118,206,83,4,198,250,226,253,235,1,125,3,37,175,247,251,53,6,43,143,164,108,78,93,93,159,148,0,2,0,176,254,135,5,18,6,12,0,17,0,31,0,79,64,42,10,7,9,4,11,11,6,15,1,1,16,16,21,29,6,7,5,33,32,3,14,16,17,15,11,6,70,89,11,16,21,9,34,28,15,21,1,21,25,18,4,15,0,63,222,50,205,93,50,63,63,51,43,0,24,63,18,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,51,17,51,49,48,1,17,20,7,1,51,17,51,3,35,19,35,17,52,55,1,35,17,37,34,38,39,51,22,22,51,50,54,55,51,6,6,1,76,10,2,81,207,176,129,172,125,155,8,253,174,205,1,236,185,170,10,156,7,90,116,103,100,10,157,12,178,4,72,253,106,136,136,3,166,252,71,253,248,1,121,2,160,158,104,252,90,4,72,145,143,164,102,84,90,96,158,149,0,2,0,47,0,0,4,125,5,182,0,17,0,25,0,77,64,41,8,4,18,18,1,15,21,11,11,6,15,17,4,26,27,8,25,73,89,7,17,0,17,73,89,4,0,8,0,8,0,15,2,15,18,74,89,15,18,2,3,0,63,63,43,17,18,0,57,57,24,47,47,17,51,43,17,0,51,43,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,19,51,53,51,21,33,21,33,17,51,32,17,20,4,33,33,17,35,1,51,32,17,52,38,35,35,47,154,170,1,86,254,170,192,2,74,254,236,254,241,254,111,154,1,68,221,1,123,184,201,215,4,252,186,186,150,254,224,254,100,210,216,4,102,252,43,1,25,132,128,0,0,2,0,20,0,0,4,76,6,20,0,18,0,26,0,75,64,40,4,0,20,20,16,12,23,8,8,2,12,14,4,27,28,4,19,70,89,3,14,15,14,71,89,0,15,4,15,4,15,12,17,0,12,20,70,89,12,21,0,63,43,0,24,63,18,57,57,47,47,17,51,43,17,0,51,43,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,1,33,21,33,17,33,50,22,21,20,6,35,33,17,35,53,51,53,51,17,17,33,32,53,52,38,35,1,86,1,39,254,217,1,64,223,215,224,221,254,33,156,156,166,1,49,1,31,132,159,5,31,129,253,229,154,155,164,170,4,158,129,245,251,224,254,151,185,92,84,0,0,2,0,201,0,0,4,121,5,182,0,15,0,28,0,72,64,41,16,10,10,11,24,0,0,4,5,3,22,6,21,19,20,11,10,29,30,22,19,28,16,12,28,74,89,9,16,74,89,6,3,12,9,9,11,12,3,11,18,0,63,63,18,57,47,18,57,57,43,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,6,7,23,7,39,6,35,35,17,35,17,33,32,4,1,51,50,55,39,55,23,54,53,52,38,35,35,4,121,115,108,120,100,149,102,136,184,170,1,137,1,18,1,21,252,250,166,87,76,108,108,140,127,194,202,200,4,12,127,201,57,157,84,192,27,253,193,5,182,215,253,242,10,141,82,176,72,178,145,142,0,2,0,176,254,20,4,117,4,92,0,24,0,41,0,85,64,49,29,11,4,7,7,8,39,18,18,21,22,20,37,23,34,36,35,8,10,42,43,37,34,25,32,15,25,70,89,12,11,11,4,20,23,4,0,15,16,9,15,8,27,0,32,70,89,0,22,0,63,43,0,24,63,63,63,18,23,57,17,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,51,51,49,48,5,34,38,39,35,22,21,17,35,17,51,23,51,54,54,51,50,18,17,16,7,23,7,39,6,3,34,6,7,21,20,22,51,50,55,39,55,23,54,53,52,38,2,174,107,177,60,12,12,166,135,25,8,64,169,109,218,237,183,115,100,131,71,109,168,150,2,154,170,47,41,121,106,129,101,150,20,79,82,148,34,254,61,6,52,150,90,80,254,214,254,243,254,174,145,156,80,174,24,3,227,186,203,37,231,199,12,158,80,170,103,249,215,209,0,0,1,0,47,0,0,4,8,5,182,0,13,0,60,64,31,3,7,7,12,8,0,5,8,10,4,14,15,6,10,11,10,73,89,3,11,11,8,13,13,2,73,89,13,3,8,18,0,63,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,21,33,17,33,21,33,17,35,17,35,53,51,17,4,8,253,107,1,168,254,88,170,154,154,5,182,153,254,2,150,253,119,2,137,150,2,151,0,1,0,18,0,0,3,66,4,72,0,13,0,60,64,31,2,6,6,11,7,0,4,7,9,4,14,15,5,9,10,9,71,89,2,10,10,7,12,12,1,70,89,12,15,7,21,0,63,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,33,17,33,21,33,17,35,17,35,53,51,17,33,3,66,254,20,1,90,254,166,166,158,158,2,146,3,188,254,168,127,254,27,1,229,127,1,228,0,0,1,0,201,254,0,4,219,5,182,0,27,0,65,64,35,9,3,3,4,25,14,14,7,20,4,4,28,29,17,23,73,89,17,28,11,0,73,89,11,11,4,5,5,8,73,89,5,3,4,18,0,63,63,43,17,18,0,57,24,47,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,7,17,35,17,33,21,33,17,54,51,32,0,17,16,0,33,34,38,39,53,22,51,32,17,52,0,2,49,100,90,170,3,73,253,97,90,121,1,64,1,85,254,226,254,253,83,125,70,123,137,1,127,255,0,2,143,12,253,125,5,182,153,253,252,10,254,173,254,198,254,197,254,165,21,28,152,49,1,254,245,1,4,0,0,1,0,176,254,10,3,250,4,72,0,27,0,65,64,35,8,25,20,14,14,15,15,2,18,25,4,29,28,22,11,70,89,22,22,15,16,16,19,70,89,16,15,15,21,0,5,70,89,0,27,0,63,43,0,24,63,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,54,53,52,38,35,34,7,17,35,17,33,21,33,17,54,51,32,0,17,16,2,2,70,145,101,116,123,133,136,178,181,69,74,166,2,154,254,12,82,59,1,16,1,7,228,254,10,60,149,63,202,215,223,208,17,254,37,4,72,142,254,183,12,254,229,254,217,254,245,254,218,0,0,1,0,2,254,131,6,248,5,182,0,21,0,77,64,41,6,17,17,3,18,13,12,12,8,9,18,0,1,21,7,22,23,18,21,18,19,16,9,6,3,0,0,15,1,15,10,73,89,15,18,13,34,7,4,1,3,0,63,51,51,63,63,43,17,18,0,57,17,51,51,51,51,51,24,63,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,1,51,1,17,51,17,1,51,1,1,51,17,35,17,35,1,17,35,17,1,35,2,86,253,193,190,2,57,164,2,58,190,253,192,1,218,180,162,94,253,186,164,253,187,199,2,240,2,198,253,60,2,196,253,60,2,196,253,60,253,168,253,233,1,125,2,229,253,27,2,229,253,27,0,0,1,0,4,254,135,6,31,4,72,0,21,0,75,64,40,2,13,13,21,14,9,8,8,4,5,14,18,19,17,7,22,23,21,15,12,5,2,18,18,11,3,0,19,15,14,17,21,11,6,70,89,11,21,9,34,0,63,63,43,0,24,63,51,63,51,51,18,57,17,51,51,51,51,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,51,17,1,51,1,1,51,17,35,17,35,1,17,35,17,1,35,1,1,51,1,2,164,153,1,197,182,254,54,1,112,193,162,94,254,30,153,254,31,191,1,240,254,55,182,1,195,4,72,253,237,2,19,253,237,254,90,253,248,1,121,2,45,253,211,2,45,253,211,2,53,2,19,253,237,0,255,255,0,74,254,66,4,53,5,203,2,38,1,177,0,0,0,7,3,127,1,88,0,0,255,255,0,68,254,66,3,127,4,92,2,38,1,209,0,0,0,7,3,127,1,8,0,0,0,1,0,201,254,131,5,43,5,182,0,15,0,59,64,32,12,8,8,9,3,2,2,14,15,6,9,5,16,17,15,12,6,3,5,13,10,3,9,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,23,57,17,18,1,23,57,17,51,17,51,17,51,49,48,37,51,17,35,17,35,1,7,17,35,17,51,17,1,51,1,4,127,172,162,102,253,233,153,170,170,2,151,201,253,180,154,253,233,1,125,2,197,136,253,195,5,182,253,43,2,213,253,133,0,1,0,176,254,133,4,61,4,72,0,14,0,58,64,31,14,10,10,11,6,5,5,1,2,11,4,15,16,2,14,9,3,8,0,12,15,11,21,8,3,70,89,8,21,6,34,0,63,63,43,0,24,63,63,51,18,23,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,51,1,1,51,17,35,17,35,1,17,35,17,51,17,3,47,182,254,39,1,127,178,159,84,254,12,166,166,4,72,253,239,254,88,253,246,1,123,2,43,253,213,4,72,253,235,0,0,1,0,201,0,0,4,233,5,182,0,18,0,56,64,30,6,2,2,3,10,17,17,7,18,14,12,18,3,4,19,20,8,10,6,0,16,18,6,3,11,4,3,15,3,18,0,63,51,63,51,18,23,57,17,18,1,23,57,17,51,51,17,51,17,51,17,51,49,48,1,7,17,35,17,51,17,55,17,51,21,1,51,1,1,35,1,17,35,1,240,125,170,170,125,125,1,155,203,253,180,2,98,200,254,76,125,2,168,107,253,195,5,182,253,37,139,1,93,211,1,198,253,133,252,197,2,92,254,207,0,1,0,176,0,0,4,59,4,72,0,19,0,58,64,31,6,2,2,3,14,10,18,18,7,19,15,12,19,3,4,20,21,8,10,6,1,17,19,6,3,11,4,15,16,3,21,0,63,51,63,51,18,23,57,17,18,1,23,57,17,51,51,17,51,51,17,51,17,51,49,48,1,39,17,35,17,51,17,55,17,51,21,1,51,1,21,1,35,1,21,35,1,205,119,166,166,119,131,1,14,182,254,60,1,235,194,254,213,129,1,178,121,253,213,4,72,253,235,121,1,74,205,1,31,254,37,107,253,254,1,59,221,0,0,1,0,47,0,0,4,233,5,182,0,19,0,71,64,38,8,4,16,16,1,17,11,14,12,10,6,14,17,19,6,20,21,7,19,0,19,73,89,4,11,8,14,3,17,0,0,2,13,17,18,9,2,3,0,63,51,63,51,18,57,47,18,23,57,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,19,51,53,51,21,51,21,35,17,1,51,1,1,35,1,7,17,35,17,35,47,154,170,221,221,2,149,203,253,180,2,98,206,253,241,153,170,154,5,4,178,178,151,254,110,2,219,253,133,252,197,2,197,134,253,193,4,109,0,0,1,0,20,0,0,4,27,6,20,0,25,0,77,64,43,10,8,4,22,22,1,23,18,16,6,17,23,25,6,26,27,20,10,15,19,23,21,7,25,0,25,71,89,4,15,0,31,0,47,0,3,0,0,2,15,15,2,0,0,63,63,18,57,47,93,51,43,17,0,51,24,63,51,18,57,57,17,18,1,23,57,17,51,51,17,51,51,51,49,48,19,51,53,51,21,33,21,33,17,7,7,51,55,54,54,1,51,1,1,35,1,7,17,35,17,35,20,156,164,1,125,254,131,3,3,8,18,55,40,1,112,199,254,68,1,217,199,254,125,125,164,156,5,90,186,186,127,253,232,91,55,24,74,48,1,133,254,45,253,139,2,4,106,254,102,4,219,0,1,0,16,0,0,5,131,5,182,0,13,0,53,64,27,2,10,10,11,5,8,6,4,8,11,4,14,15,8,2,0,7,11,18,3,3,0,13,73,89,0,3,0,63,43,0,24,63,63,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,19,33,17,1,51,1,1,35,1,7,17,35,17,33,16,1,252,2,150,203,253,180,2,98,201,253,236,154,170,254,174,5,182,253,37,2,219,253,133,252,197,2,197,136,253,195,5,29,0,0,1,0,41,0,0,4,227,4,72,0,12,0,53,64,27,5,1,1,9,9,10,12,10,4,6,4,14,13,8,2,0,7,10,21,3,15,0,12,70,89,0,15,0,63,43,0,24,63,63,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,19,33,17,1,51,1,1,35,1,17,35,17,33,41,2,2,1,219,182,254,39,2,0,194,254,10,164,254,162,4,72,253,235,2,21,253,237,253,203,2,43,253,213,3,188,0,1,0,201,254,131,5,193,5,182,0,15,0,68,64,36,12,8,8,9,13,5,5,0,3,2,2,0,9,3,16,17,12,7,73,89,12,12,5,14,10,3,9,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,37,51,17,35,17,35,17,33,17,35,17,51,17,33,17,51,5,31,162,162,170,252,254,170,170,3,2,170,154,253,233,1,125,2,176,253,80,5,182,253,146,2,110,0,0,1,0,176,254,135,4,248,4,72,0,15,0,78,64,43,1,13,13,14,2,10,10,5,8,7,7,5,14,3,16,17,1,12,70,89,15,1,31,1,2,11,3,1,1,10,3,15,15,14,21,10,5,70,89,10,21,8,34,0,63,63,43,0,24,63,63,51,18,57,47,95,94,93,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,17,33,17,51,17,51,17,35,17,35,17,33,17,35,17,1,86,2,102,166,150,166,150,253,154,166,4,72,254,53,1,203,252,71,253,248,1,121,1,238,254,18,4,72,0,0,1,0,201,0,0,6,111,5,182,0,13,0,63,64,33,10,6,6,7,11,3,3,2,0,2,7,3,14,15,10,5,73,89,10,10,7,12,12,1,73,89,12,3,8,3,3,7,18,0,63,51,63,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,33,17,35,17,33,17,35,17,51,17,33,17,33,6,111,254,176,172,253,0,170,170,3,0,1,252,5,29,250,227,2,176,253,80,5,182,253,146,2,110,0,1,0,176,0,0,5,193,4,72,0,13,0,73,64,39,1,11,11,12,2,8,8,7,4,7,12,3,14,15,13,15,1,10,70,89,15,1,31,1,2,11,3,1,1,3,8,12,21,3,6,70,89,3,15,0,63,43,0,24,63,51,18,57,47,95,94,93,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,17,33,17,33,21,33,17,35,17,33,17,35,17,1,86,2,102,2,5,254,161,166,253,154,166,4,72,254,53,1,203,140,252,68,1,238,254,18,4,72,0,1,0,201,254,0,8,29,5,182,0,29,0,71,64,38,4,5,8,0,0,1,23,13,13,18,1,5,4,30,31,16,21,73,89,16,28,10,26,73,89,10,10,5,6,6,3,73,89,6,3,1,5,18,0,63,51,63,43,17,18,0,57,24,47,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,33,35,17,33,17,35,17,33,17,54,51,32,0,17,16,0,33,34,39,53,22,51,32,17,52,2,35,34,6,7,4,217,170,253,68,170,4,16,68,125,1,50,1,81,254,229,254,254,156,123,134,127,1,122,230,232,42,127,24,5,29,250,227,5,182,253,97,12,254,168,254,200,254,199,254,166,49,152,49,1,254,242,1,5,7,5,0,0,1,0,176,254,10,6,168,4,72,0,28,0,71,64,38,17,18,21,13,13,14,7,26,26,2,14,18,4,29,30,23,10,70,89,23,23,18,19,19,16,70,89,19,15,14,18,21,0,5,70,89,0,27,0,63,43,0,24,63,51,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,17,52,38,35,34,7,17,35,17,33,17,35,17,33,17,54,51,50,0,17,16,2,5,23,131,97,109,108,240,166,172,67,72,168,253,223,166,3,111,75,66,246,1,6,209,254,10,60,149,63,1,161,223,208,21,254,41,3,184,252,72,4,72,254,39,14,254,215,254,231,254,244,254,219,0,2,0,125,255,172,5,225,5,205,0,40,0,52,0,80,64,44,27,17,47,35,41,0,8,0,3,22,32,35,17,7,53,54,38,44,74,89,12,50,38,38,14,20,20,25,73,89,20,4,10,5,73,89,10,14,14,30,73,89,14,19,0,63,43,0,24,16,196,43,0,24,63,43,17,18,0,57,24,47,57,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,2,7,22,51,50,55,21,6,35,34,39,6,35,32,0,17,16,0,33,50,23,7,38,35,32,17,16,18,51,50,55,38,2,53,52,18,51,50,18,3,52,38,35,34,6,21,20,22,23,54,54,5,184,138,116,66,90,78,61,56,91,178,148,102,144,254,202,254,161,1,73,1,58,127,92,47,84,90,254,51,255,235,54,46,86,92,198,175,181,193,176,103,93,94,103,93,83,102,115,2,166,181,254,203,86,30,22,153,25,100,36,1,137,1,86,1,120,1,138,35,145,28,253,158,254,224,254,206,10,103,1,28,160,244,1,10,254,246,254,254,177,204,201,176,140,254,85,67,255,0,0,2,0,115,255,199,4,211,4,92,0,10,0,53,0,80,64,44,30,19,0,38,6,44,52,44,47,24,36,38,19,7,54,55,41,8,71,89,13,3,41,41,15,22,22,27,70,89,22,16,11,49,70,89,11,15,15,33,70,89,15,22,0,63,43,0,24,16,196,43,0,24,63,43,17,18,0,57,24,47,57,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,22,23,54,54,53,52,35,34,6,1,34,39,6,35,34,38,38,53,16,18,51,50,23,7,38,35,34,6,21,20,22,51,50,54,55,38,53,52,54,51,50,22,21,20,6,7,22,51,50,55,21,6,2,238,68,63,68,83,135,72,75,1,102,147,130,96,123,149,226,122,248,227,91,77,37,54,79,156,145,170,164,37,53,6,139,168,151,148,157,107,94,52,67,66,49,39,1,242,94,161,53,44,158,110,235,125,253,99,77,40,139,254,164,1,19,1,48,22,138,19,209,231,206,210,9,3,148,225,173,193,189,177,125,209,64,26,14,137,14,0,255,255,0,125,254,66,4,207,5,203,2,38,0,38,0,0,0,7,3,127,2,37,0,0,255,255,0,115,254,66,3,139,4,92,2,38,0,70,0,0,0,7,3,127,1,131,0,0,0,1,0,16,254,131,4,90,5,182,0,11,0,50,64,27,6,11,8,9,3,9,11,1,4,12,13,11,6,73,89,11,18,9,34,5,1,2,1,73,89,2,3,0,63,43,17,0,51,24,63,63,43,17,18,1,23,57,17,51,17,51,49,48,1,33,53,33,21,33,17,51,17,35,17,35,1,223,254,49,4,74,254,49,162,162,172,5,29,153,153,251,125,253,233,1,125,0,0,1,0,41,254,135,3,145,4,72,0,11,0,52,64,27,6,11,8,9,3,9,11,1,4,12,13,9,34,5,1,2,1,70,89,2,15,11,6,70,89,11,21,0,63,43,0,24,63,43,17,0,51,24,63,17,18,1,23,57,17,51,17,51,49,48,1,33,53,33,21,33,17,51,17,35,17,35,1,137,254,160,3,104,254,158,150,166,150,3,188,140,140,252,211,253,248,1,121,0,255,255,0,0,0,0,4,123,5,182,2,6,0,60,0,0,0,1,0,0,254,20,4,2,4,72,0,13,0,41,64,20,0,1,12,1,3,3,14,15,8,7,13,7,2,11,3,15,2,21,1,27,0,63,63,63,51,18,57,57,17,51,17,18,1,23,57,17,51,49,48,1,35,17,1,51,19,22,23,51,54,55,19,51,1,2,84,166,254,82,172,236,83,19,8,33,70,233,172,254,82,254,20,1,232,4,76,253,155,222,97,138,181,2,101,251,180,0,0,1,0,0,0,0,4,123,5,182,0,16,0,58,64,30,4,8,8,13,9,2,6,9,11,15,5,17,18,7,11,12,11,73,89,4,0,15,12,12,9,1,15,3,9,18,0,63,63,51,18,57,47,18,57,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,1,51,1,21,33,21,33,17,35,17,33,53,33,53,1,51,2,61,1,134,184,254,24,1,43,254,213,172,254,211,1,45,254,25,186,2,219,2,219,252,129,59,152,254,156,1,100,152,51,3,135,0,1,0,0,254,20,4,2,4,72,0,19,0,60,64,31,17,1,1,6,2,16,19,2,4,7,5,20,21,12,11,11,5,15,7,15,0,4,5,4,71,89,17,5,21,2,27,0,63,63,51,43,17,0,51,24,63,51,18,57,17,51,17,18,1,23,57,17,51,51,17,51,49,48,5,17,35,17,33,53,33,1,51,19,22,23,51,54,55,19,51,1,33,21,2,84,166,254,234,1,20,254,84,172,236,83,19,8,33,70,233,172,254,84,1,18,129,254,149,1,107,129,4,72,253,155,222,97,138,181,2,101,251,184,129,0,0,1,0,8,254,131,4,213,5,182,0,15,0,55,64,32,3,2,2,14,15,12,6,9,10,8,8,16,17,12,15,9,6,4,5,13,10,3,8,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,23,57,17,18,1,23,57,17,51,49,48,37,51,17,35,17,35,1,1,35,1,1,51,1,1,51,1,4,51,162,162,94,254,119,254,112,180,1,230,254,59,188,1,107,1,110,181,254,59,154,253,233,1,125,2,131,253,125,2,252,2,186,253,189,2,67,253,76,0,1,0,39,254,133,4,55,4,72,0,15,0,57,64,33,10,9,9,5,6,3,13,0,1,15,8,16,17,15,21,3,6,0,13,4,12,1,12,7,70,89,12,21,10,34,4,1,15,0,63,51,63,63,43,17,18,0,23,57,24,63,17,18,1,23,57,17,51,49,48,1,1,51,1,1,51,1,1,51,17,35,17,35,1,1,35,1,184,254,131,189,1,33,1,32,187,254,131,1,43,149,166,69,254,205,254,202,188,2,49,2,23,254,92,1,164,253,233,254,94,253,246,1,123,1,188,254,68,0,0,1,0,16,254,131,6,168,5,182,0,15,0,64,64,34,12,5,0,13,3,2,2,13,10,5,7,5,16,17,14,3,11,7,8,7,73,89,8,3,0,12,5,12,73,89,5,18,3,34,0,63,63,43,17,0,51,24,63,43,17,0,51,24,63,17,18,1,23,57,17,51,17,51,17,51,49,48,37,51,17,35,17,33,17,33,53,33,21,33,17,33,17,51,5,254,170,162,251,180,254,86,4,47,254,37,2,240,170,154,253,233,1,125,5,29,153,153,251,125,5,28,0,1,0,41,254,135,5,152,4,70,0,15,0,63,64,34,2,11,6,3,9,8,8,3,0,11,13,5,16,17,1,13,14,13,70,89,14,15,6,2,11,2,70,89,11,21,9,34,4,15,0,63,63,63,43,17,0,51,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,33,17,33,17,51,17,51,17,35,17,33,17,33,53,33,3,121,254,151,2,70,166,156,166,252,120,254,191,3,80,3,186,252,213,3,183,252,73,253,248,1,121,3,186,140,0,0,1,0,170,254,131,5,104,5,182,0,23,0,59,64,31,21,0,5,3,2,15,12,2,5,12,3,24,25,18,9,73,89,18,18,5,22,13,3,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,51,49,48,37,51,17,35,17,35,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,4,199,161,161,170,149,198,106,207,223,170,127,143,97,177,169,170,154,253,233,1,125,2,92,53,39,190,179,2,69,253,207,121,116,29,55,2,202,0,0,1,0,156,254,133,4,195,4,72,0,22,0,59,64,31,1,21,9,6,14,12,11,11,14,21,3,23,24,3,18,70,89,3,3,14,7,22,15,14,9,70,89,14,21,12,34,0,63,63,43,0,24,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,17,20,51,50,54,55,17,51,17,51,17,35,17,35,17,6,6,35,34,38,53,17,1,66,219,91,166,105,166,150,166,150,105,179,113,164,186,4,72,254,112,192,56,67,1,213,252,71,253,246,1,123,1,240,72,59,172,147,1,156,0,1,0,170,0,0,4,199,5,182,0,22,0,74,64,38,5,2,11,21,21,8,22,13,17,17,16,16,22,2,3,23,24,20,0,8,0,73,89,11,8,22,8,9,9,8,22,3,3,17,18,14,3,3,0,63,51,63,18,23,57,47,47,47,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,49,48,1,32,17,17,51,17,20,22,51,17,51,17,54,55,17,51,17,35,17,6,7,17,35,2,117,254,53,170,135,154,125,134,163,172,172,168,129,125,2,0,1,113,2,69,253,207,119,118,1,92,254,170,13,60,2,207,250,74,2,88,65,17,254,207,0,1,0,156,0,0,4,29,4,72,0,23,0,74,64,38,1,22,6,16,16,3,17,8,12,12,11,11,17,22,3,24,25,15,19,3,19,70,89,6,3,17,3,4,4,3,17,3,12,9,23,15,12,21,0,63,63,51,18,23,57,47,47,47,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,49,48,1,17,20,23,17,51,17,54,55,17,51,17,35,17,6,7,21,35,53,35,34,38,53,17,1,66,200,119,113,133,166,166,128,118,119,22,160,184,4,72,254,112,186,6,1,45,254,221,24,89,1,213,251,184,1,240,91,26,248,234,170,149,1,156,0,1,0,201,0,0,4,229,5,182,0,18,0,47,64,23,2,17,17,18,9,8,8,18,20,19,4,13,73,89,2,18,4,4,9,18,18,0,3,0,63,63,51,57,47,18,57,43,17,18,1,57,57,17,51,17,51,17,51,49,48,19,51,17,36,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,201,170,1,0,196,207,223,170,127,143,107,186,149,170,5,182,253,164,92,191,177,253,186,2,49,120,118,34,50,253,53,0,0,1,0,176,0,0,4,66,4,72,0,18,0,47,64,23,0,18,11,7,7,8,18,8,20,19,14,3,70,89,11,14,14,8,9,15,0,8,21,0,63,51,63,18,57,47,57,43,17,18,1,57,57,17,51,17,51,17,51,49,48,33,17,52,35,34,6,7,17,35,17,51,17,54,54,51,50,22,21,17,3,154,217,88,156,119,166,166,95,186,114,163,190,1,141,193,49,74,254,45,4,72,254,14,69,62,168,151,254,102,0,2,0,61,255,236,6,63,5,205,0,32,0,39,0,81,64,42,5,3,0,36,17,17,8,30,37,16,16,24,30,0,4,40,41,17,30,7,30,73,89,36,7,2,7,2,27,12,27,20,73,89,27,19,12,33,73,89,12,4,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,51,49,48,19,52,55,51,6,21,20,51,51,55,18,0,33,32,0,17,21,33,18,0,51,50,54,55,21,6,6,35,32,0,3,34,38,1,34,2,7,33,16,38,61,27,145,20,113,34,5,29,1,77,1,23,1,41,1,40,251,220,14,1,5,247,101,202,141,114,221,130,254,198,254,163,19,142,155,3,175,209,240,16,3,110,203,3,135,73,54,50,60,103,43,1,42,1,71,254,133,254,143,69,254,248,254,239,31,43,156,39,30,1,100,1,76,118,2,35,254,245,249,1,9,251,0,0,2,0,51,255,236,4,221,4,90,0,31,0,38,0,76,64,40,10,8,5,22,13,36,21,21,29,13,3,5,5,39,40,22,3,12,3,70,89,35,12,7,12,7,0,17,17,32,70,89,17,16,0,25,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,51,49,48,5,34,0,39,36,53,52,55,51,6,21,20,51,51,55,54,54,51,50,18,21,21,33,22,22,51,50,54,55,21,6,6,3,34,6,7,33,52,38,3,74,243,254,236,6,254,246,25,141,20,106,21,6,34,250,183,207,241,253,12,6,172,173,101,159,98,88,157,160,134,151,14,2,61,140,20,1,30,252,4,221,69,50,47,59,103,35,202,224,254,247,226,105,198,195,32,42,148,38,33,3,227,164,158,157,165,0,2,0,61,254,131,6,63,5,205,0,34,0,41,0,93,64,49,11,9,6,38,23,23,14,3,33,34,39,22,22,30,34,3,6,5,42,43,34,34,32,19,23,3,13,3,73,89,38,13,8,13,8,0,18,18,35,73,89,18,4,0,26,74,89,0,19,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,24,63,63,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,51,49,48,5,36,0,3,34,38,53,52,55,51,6,21,20,51,51,55,18,0,33,32,0,17,21,33,18,0,51,50,54,55,21,6,7,17,35,19,34,2,7,33,16,38,3,160,254,254,254,219,19,142,155,27,145,20,113,34,5,29,1,77,1,23,1,41,1,40,251,220,14,1,5,247,101,202,141,176,235,166,76,209,240,16,3,110,203,12,29,1,90,1,49,118,117,73,54,50,60,103,43,1,42,1,71,254,133,254,143,69,254,248,254,239,31,43,156,62,5,254,149,6,178,254,245,249,1,9,251,0,2,0,51,254,135,4,221,4,90,0,33,0,40,0,88,64,47,10,8,5,22,13,32,33,38,21,21,29,33,13,3,5,6,41,42,33,34,31,22,22,3,12,3,70,89,37,12,7,12,7,0,17,17,34,70,89,17,16,0,25,70,89,0,21,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,24,63,63,17,18,1,23,57,17,51,17,51,17,51,17,51,51,49,48,5,38,2,39,36,53,52,55,51,6,21,20,51,51,55,54,54,51,50,18,21,21,33,22,22,51,50,54,55,21,6,7,17,35,19,34,6,7,33,52,38,2,213,191,211,6,254,246,25,141,20,106,21,6,34,250,183,207,241,253,12,6,172,173,101,159,98,142,165,166,68,134,151,14,2,61,140,10,31,1,17,224,4,221,69,50,47,59,103,35,202,224,254,247,226,105,198,195,32,42,148,65,4,254,153,5,72,164,158,157,165,0,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,2,0,0,6,188,7,96,2,38,1,176,0,0,1,7,2,54,1,16,1,84,0,8,179,1,18,5,38,0,43,53,255,255,0,4,0,0,5,223,6,12,2,38,1,208,0,0,1,7,2,54,0,164,0,0,0,8,179,1,18,17,38,0,43,53,0,1,0,201,254,0,5,25,5,182,0,28,0,66,64,37,7,3,3,4,26,14,14,9,10,20,4,5,29,30,17,23,73,89,17,28,7,2,73,89,11,0,74,89,7,11,11,4,8,5,3,4,18,0,63,63,51,18,57,47,57,43,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,7,17,35,17,51,17,1,51,1,55,32,0,17,16,0,33,34,38,39,53,22,51,50,18,53,52,36,2,94,140,95,170,170,2,137,205,253,133,26,1,79,1,98,254,217,254,245,82,124,70,122,152,187,200,254,235,2,123,31,253,164,5,182,253,60,2,196,253,84,2,254,187,254,207,254,198,254,164,20,29,152,49,1,13,241,232,253,0,0,1,0,176,254,10,4,33,4,72,0,28,0,66,64,37,4,0,0,1,23,10,16,10,6,7,1,5,29,30,14,20,70,89,14,27,4,28,71,89,7,26,70,89,4,7,7,1,5,2,15,1,21,0,63,63,51,18,57,47,57,43,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,33,35,17,51,17,1,51,1,4,18,17,20,6,6,35,34,39,53,22,22,51,50,54,53,52,38,35,34,7,1,84,164,164,1,227,183,254,55,1,0,252,110,204,133,136,95,46,108,71,135,152,187,190,82,92,4,72,253,250,2,6,254,30,4,254,228,254,245,177,252,132,60,145,25,38,217,200,211,207,24,0,1,0,0,254,131,5,145,5,182,0,23,0,57,64,31,3,0,5,4,1,1,5,14,3,24,25,22,7,73,89,22,3,12,17,74,89,12,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,49,48,37,51,3,35,19,35,17,33,7,2,2,6,39,34,39,53,22,51,50,54,54,18,19,33,4,217,184,143,197,156,170,254,37,31,61,93,152,126,74,59,54,59,53,79,61,93,56,3,18,154,253,233,1,125,5,31,240,254,33,254,69,174,2,25,143,26,87,215,2,89,1,184,0,0,1,0,16,254,135,4,143,4,70,0,20,0,57,64,31,3,0,5,4,1,1,5,13,3,21,22,19,7,70,89,19,15,11,16,71,89,11,21,5,0,70,89,5,21,3,34,0,63,63,43,0,24,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,49,48,37,51,3,35,19,35,17,33,2,2,6,35,34,39,53,22,51,50,18,19,33,3,223,176,129,172,125,166,254,181,28,94,152,118,58,28,22,28,113,137,34,2,129,143,253,248,1,121,3,184,254,152,254,100,192,10,127,6,1,217,1,246,0,0,1,0,201,254,0,5,31,5,182,0,21,0,61,64,32,18,14,14,15,19,11,11,0,0,6,15,3,22,23,18,13,73,89,18,18,15,20,16,3,15,18,3,9,73,89,3,28,0,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,37,16,0,33,34,38,39,53,22,51,32,17,17,33,17,35,17,51,17,33,17,51,5,31,254,230,254,251,82,122,77,123,135,1,140,252,254,170,170,3,2,170,150,254,194,254,168,19,30,150,49,1,247,2,35,253,80,5,182,253,146,2,110,0,1,0,176,254,10,4,98,4,72,0,21,0,71,64,39,15,11,11,12,16,8,8,19,19,2,12,3,22,23,15,10,70,89,15,15,31,15,2,11,3,15,15,12,17,13,15,12,21,0,5,70,89,0,27,0,63,43,0,24,63,63,51,18,57,47,95,94,93,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,54,53,17,33,17,35,17,51,17,33,17,51,17,16,2,2,211,132,93,111,102,125,118,253,156,166,166,2,100,168,207,254,10,58,149,61,198,207,1,189,254,18,4,72,254,53,1,203,251,235,254,244,254,227,0,1,0,201,254,131,5,215,5,182,0,15,0,68,64,36,12,8,8,9,13,3,0,5,4,1,1,5,9,3,16,17,12,7,73,89,12,12,5,14,10,3,9,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,51,51,17,51,17,51,49,48,37,51,3,35,19,35,17,33,17,35,17,51,17,33,17,51,5,31,184,145,197,158,170,252,254,170,170,3,2,170,154,253,233,1,125,2,176,253,80,5,182,253,146,2,110,0,0,1,0,176,254,135,5,18,4,70,0,15,0,68,64,36,1,13,13,14,8,5,2,10,9,6,6,10,14,3,16,17,1,12,70,89,1,1,10,3,15,15,14,21,10,5,70,89,10,21,8,34,0,63,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,51,51,17,51,17,51,49,48,1,17,33,17,51,17,51,3,35,19,35,17,33,17,35,17,1,86,2,102,166,176,129,172,125,166,253,154,166,4,70,254,55,1,201,252,73,253,248,1,121,1,238,254,18,4,70,0,0,1,0,170,254,131,4,199,5,182,0,23,0,61,64,32,15,12,2,3,21,5,5,0,0,3,12,3,24,25,18,9,73,89,18,18,1,22,13,3,3,34,1,4,73,89,1,18,0,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,33,35,17,35,17,51,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,4,199,170,162,162,149,198,106,207,223,170,127,143,97,177,169,170,254,131,2,23,1,194,53,39,190,179,2,69,253,207,121,116,29,55,2,202,0,1,0,156,254,133,4,45,4,72,0,22,0,61,64,32,1,21,11,12,6,14,14,9,9,12,21,3,23,24,3,18,70,89,3,3,10,7,22,15,12,34,10,13,70,89,10,21,0,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,17,20,51,50,54,55,17,51,17,35,17,35,17,51,17,6,6,35,34,38,53,17,1,66,219,91,166,105,166,149,166,149,105,179,113,164,186,4,72,254,112,192,56,67,1,213,251,184,254,133,2,10,1,97,72,59,172,147,1,156,0,1,0,201,254,131,7,41,5,182,0,24,0,72,64,37,9,6,6,7,17,14,12,19,18,15,15,19,7,3,25,26,23,22,2,11,2,19,8,19,14,73,89,19,18,17,34,12,8,3,0,7,18,0,63,51,63,51,63,63,43,17,18,0,57,57,17,51,51,17,18,1,23,57,17,51,17,51,51,51,17,51,17,51,49,48,33,1,35,23,22,21,17,35,17,33,1,51,1,51,17,51,3,35,19,35,17,52,55,35,1,3,80,254,16,8,7,7,157,1,0,1,209,8,1,209,254,184,143,199,158,170,14,8,254,12,5,16,127,192,47,252,94,5,182,251,74,4,182,250,228,253,233,1,125,3,174,132,220,250,242,0,0,1,0,176,254,135,5,223,4,70,0,24,0,63,64,32,19,20,8,5,10,9,6,6,10,20,3,25,26,11,18,0,18,15,3,21,15,20,21,10,5,70,89,10,15,21,8,34,0,63,63,51,43,0,24,63,63,51,18,57,57,17,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,55,55,1,51,17,51,3,35,19,35,17,7,7,1,35,1,38,39,17,35,17,51,1,22,2,233,31,43,1,41,211,176,129,172,125,147,20,58,254,229,139,254,229,53,20,148,203,1,41,45,160,93,118,2,211,252,73,253,248,1,121,3,137,58,153,253,74,2,184,134,75,252,119,4,70,253,45,110,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,0,0,0,5,16,7,94,2,38,0,36,0,0,1,7,2,54,0,57,1,82,0,8,179,2,15,5,38,0,43,53,255,255,0,94,255,236,3,205,6,12,2,38,0,68,0,0,1,6,2,54,232,0,0,8,179,2,37,17,38,0,43,53,255,255,0,0,0,0,5,16,7,37,2,38,0,36,0,0,1,7,0,106,0,61,1,82,0,10,180,3,2,36,5,38,0,43,53,53,255,255,0,94,255,236,3,205,5,211,2,38,0,68,0,0,1,6,0,106,243,0,0,10,180,3,2,58,17,38,0,43,53,53,255,255,255,254,0,0,6,129,5,182,2,6,0,136,0,0,255,255,0,94,255,236,6,115,4,92,2,6,0,168,0,0,255,255,0,201,0,0,3,248,7,94,2,38,0,40,0,0,1,7,2,54,0,16,1,82,0,8,179,1,12,5,38,0,43,53,255,255,0,115,255,236,4,18,6,12,2,38,0,72,0,0,1,6,2,54,12,0,0,8,179,2,27,17,38,0,43,53,0,2,0,117,255,236,5,88,5,205,0,18,0,25,0,61,64,32,23,14,16,22,22,9,9,2,14,3,26,27,15,23,73,89,15,15,12,6,12,19,73,89,12,19,6,0,73,89,6,4,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,7,53,54,54,51,32,0,17,16,0,33,32,17,53,33,2,0,3,50,18,55,33,16,22,2,152,227,226,115,210,134,1,75,1,111,254,166,254,203,253,172,4,47,17,254,249,195,210,249,16,252,135,204,5,53,76,158,38,32,254,113,254,155,254,162,254,113,2,235,70,1,10,1,14,251,78,1,13,247,254,248,252,0,0,2,0,102,255,236,4,6,4,92,0,20,0,27,0,59,64,31,25,9,24,11,3,3,17,9,3,28,29,10,25,70,89,10,10,6,0,6,21,70,89,6,22,0,14,70,89,0,16,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,51,17,51,49,48,1,50,0,17,16,0,35,34,2,53,53,33,38,38,35,34,6,7,53,54,54,19,50,54,55,33,20,22,1,250,245,1,23,254,253,218,208,243,2,244,5,179,166,98,165,95,89,162,154,133,154,12,253,195,141,4,92,254,212,254,251,254,248,254,201,1,12,225,105,204,187,33,41,147,40,34,252,27,165,156,157,164,0,255,255,0,117,255,236,5,88,7,37,2,38,2,225,0,0,1,7,0,106,0,147,1,82,0,10,180,3,2,47,5,38,0,43,53,53,255,255,0,102,255,236,4,6,5,211,2,38,2,226,0,0,1,6,0,106,234,0,0,10,180,3,2,49,17,38,0,43,53,53,255,255,0,2,0,0,6,188,7,37,2,38,1,176,0,0,1,7,0,106,1,16,1,82,0,10,180,2,1,39,5,38,0,43,53,53,255,255,0,4,0,0,5,223,5,211,2,38,1,208,0,0,1,7,0,106,0,162,0,0,0,10,180,2,1,39,17,38,0,43,53,53,255,255,0,74,255,236,4,53,7,37,2,38,1,177,0,0,1,7,0,106,255,243,1,82,0,10,180,2,1,62,5,38,0,43,53,53,255,255,0,68,255,236,3,127,5,211,2,38,1,209,0,0,1,6,0,106,148,0,0,10,180,2,1,56,17,38,0,43,53,53,0,1,0,74,255,236,4,55,5,182,0,25,0,64,64,35,0,19,21,25,15,3,3,25,19,22,8,5,26,27,25,22,23,22,73,89,0,18,74,89,0,0,6,23,3,6,12,74,89,6,19,0,63,43,0,24,63,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,4,4,21,20,4,33,32,39,53,22,22,51,50,54,53,52,38,35,35,53,1,33,53,33,21,1,252,1,23,1,36,254,205,254,234,254,255,163,96,222,106,199,202,225,223,140,1,238,253,78,3,135,3,63,9,211,193,206,232,79,158,46,50,153,144,134,138,141,1,222,153,139,0,0,1,0,27,254,20,3,166,4,72,0,25,0,64,64,35,0,19,21,25,15,4,4,25,19,22,9,5,26,27,25,22,23,22,70,89,0,18,71,89,0,0,7,23,15,7,12,70,89,7,27,0,63,43,0,24,63,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,30,2,21,20,0,35,34,39,53,22,51,50,54,53,52,38,35,35,53,1,33,53,33,21,1,172,149,230,127,254,216,239,234,138,183,200,161,197,214,202,121,1,197,253,137,3,56,1,207,7,114,202,136,222,254,238,70,154,86,190,160,164,170,114,1,254,142,123,0,255,255,0,203,0,0,5,82,6,180,2,38,1,178,0,0,1,7,1,77,0,180,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,176,0,0,4,98,5,98,2,38,1,210,0,0,1,6,1,77,49,0,0,8,179,1,17,17,38,0,43,53,255,255,0,203,0,0,5,82,7,37,2,38,1,178,0,0,1,7,0,106,0,190,1,82,0,10,180,2,1,37,5,38,0,43,53,53,255,255,0,176,0,0,4,98,5,211,2,38,1,210,0,0,1,6,0,106,61,0,0,10,180,2,1,35,17,38,0,43,53,53,255,255,0,125,255,236,5,190,7,37,2,38,0,50,0,0,1,7,0,106,0,209,1,82,0,10,180,3,2,45,5,38,0,43,53,53,255,255,0,115,255,236,4,98,5,211,2,38,0,82,0,0,1,6,0,106,29,0,0,10,180,3,2,46,17,38,0,43,53,53,255,255,0,125,255,236,5,190,5,205,2,6,2,126,0,0,255,255,0,115,255,236,4,98,4,92,2,6,2,127,0,0,255,255,0,125,255,236,5,190,7,37,2,38,2,126,0,0,1,7,0,106,0,209,1,82,0,10,180,4,3,47,5,38,0,43,53,53,255,255,0,115,255,236,4,98,5,211,2,38,2,127,0,0,1,6,0,106,27,0,0,10,180,4,3,48,17,38,0,43,53,53,255,255,0,61,255,236,4,137,7,37,2,38,1,199,0,0,1,7,0,106,255,237,1,82,0,10,180,2,1,48,5,38,0,43,53,53,255,255,0,57,255,236,3,125,5,211,2,38,1,231,0,0,1,6,0,106,142,0,0,10,180,2,1,48,17,38,0,43,53,53,255,255,0,27,255,236,4,248,6,180,2,38,1,189,0,0,1,7,1,77,0,47,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,2,254,20,4,6,5,98,2,38,0,92,0,0,1,6,1,77,173,0,0,8,179,1,25,17,38,0,43,53,255,255,0,27,255,236,4,248,7,37,2,38,1,189,0,0,1,7,0,106,0,59,1,82,0,10,180,2,1,44,5,38,0,43,53,53,255,255,0,2,254,20,4,6,5,211,2,38,0,92,0,0,1,6,0,106,183,0,0,10,180,2,1,43,17,38,0,43,53,53,255,255,0,27,255,236,4,248,7,115,2,38,1,189,0,0,1,7,1,83,0,141,1,82,0,10,180,2,1,42,5,38,0,43,53,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,6,1,83,4,0,0,10,180,2,1,41,17,38,0,43,53,53,255,255,0,170,0,0,4,199,7,37,2,38,1,193,0,0,1,7,0,106,0,106,1,82,0,10,180,2,1,41,5,38,0,43,53,53,255,255,0,156,0,0,4,45,5,211,2,38,1,225,0,0,1,6,0,106,23,0,0,10,180,2,1,40,17,38,0,43,53,53,0,1,0,201,254,131,4,8,5,182,0,9,0,45,64,24,4,9,6,7,1,7,9,3,10,11,9,4,73,89,9,18,7,34,0,3,73,89,0,3,0,63,43,0,24,63,63,43,17,18,1,23,57,17,51,17,51,49,48,19,33,21,33,17,51,17,35,17,35,201,3,63,253,107,161,161,170,5,182,153,251,125,253,233,1,125,0,1,0,176,254,135,3,66,4,70,0,9,0,45,64,24,4,9,6,7,1,7,9,3,10,11,9,4,70,89,9,21,7,34,0,3,70,89,0,15,0,63,43,0,24,63,63,43,17,18,1,23,57,17,51,17,51,49,48,19,33,21,33,17,51,17,35,17,35,176,2,146,254,20,150,166,150,4,70,140,252,213,253,248,1,121,255,255,0,201,0,0,6,10,7,37,2,38,1,197,0,0,1,7,0,106,1,27,1,82,0,10,180,4,3,45,5,38,0,43,53,53,255,255,0,176,0,0,5,121,5,211,2,38,1,229,0,0,1,7,0,106,0,197,0,0,0,10,180,4,3,44,17,38,0,43,53,53,255,255,0,47,254,117,4,8,5,182,2,38,2,155,0,0,0,7,3,128,0,147,0,0,255,255,0,18,254,117,3,66,4,72,2,38,2,156,0,0,0,6,3,129,117,0,255,255,0,8,254,117,4,201,5,182,0,38,0,59,0,0,0,7,3,128,3,88,0,0,255,255,0,39,254,117,4,52,4,72,0,38,0,91,0,0,0,7,3,129,2,195,0,0,0,1,0,6,0,0,4,150,5,182,0,17,0,59,64,34,15,2,17,1,16,13,4,10,7,9,6,11,12,19,18,10,17,0,17,73,89,7,13,15,4,0,0,2,12,15,18,5,2,3,0,63,51,63,51,18,57,47,57,18,57,51,43,17,0,51,17,18,1,23,57,49,48,19,33,1,51,1,1,51,1,33,21,33,1,35,1,1,35,1,33,127,1,51,254,119,188,1,107,1,108,183,254,112,1,60,254,186,1,189,193,254,119,254,112,182,1,191,254,186,3,84,2,98,253,187,2,69,253,158,152,253,68,2,131,253,125,2,188,0,0,1,0,39,0,0,4,8,4,72,0,17,0,59,64,34,15,2,17,1,16,13,4,10,7,9,6,11,12,19,18,10,17,0,17,71,89,7,13,15,4,0,0,2,12,15,21,5,2,15,0,63,51,63,51,18,57,47,57,18,57,51,43,17,0,51,17,18,1,23,57,49,48,19,33,1,51,1,1,51,1,33,21,33,1,35,1,1,35,1,33,117,1,18,254,180,189,1,33,1,32,187,254,178,1,24,254,226,1,104,188,254,205,254,202,188,1,102,254,232,2,119,1,209,254,92,1,164,254,47,129,254,10,1,188,254,68,1,246,0,0,2,0,131,0,0,4,55,5,182,0,10,0,19,0,52,64,26,4,19,19,7,15,0,7,0,21,20,3,12,73,89,3,3,8,5,8,18,74,89,8,18,5,3,0,63,63,43,17,18,0,57,24,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,19,52,36,33,51,17,51,17,33,32,36,1,35,34,6,21,20,22,51,51,131,1,36,1,32,198,170,254,99,254,245,254,244,3,10,186,222,194,182,203,217,1,164,212,206,2,112,250,74,213,1,219,124,142,143,132,255,255,0,115,255,236,4,55,6,20,2,6,0,71,0,0,0,2,0,131,255,236,6,119,5,182,0,25,0,35,0,70,64,36,30,3,24,10,10,7,35,15,18,18,35,3,3,36,37,6,27,73,89,24,6,16,6,16,0,8,3,12,32,0,32,74,89,21,0,19,0,63,50,43,17,0,51,24,63,18,57,57,47,47,57,43,17,18,1,23,57,17,51,17,51,51,18,57,17,51,49,48,5,34,38,53,52,36,33,51,17,51,17,20,51,50,54,53,17,51,17,20,6,35,34,38,39,6,19,35,34,6,21,16,33,50,54,53,2,78,226,233,1,42,1,34,145,170,230,100,121,170,207,184,118,159,51,113,41,151,212,194,1,33,127,141,18,209,208,217,222,2,112,251,183,236,123,110,1,230,254,24,174,206,82,90,170,2,192,139,150,254,244,119,112,0,0,2,0,115,255,236,6,135,6,20,0,34,0,46,0,81,64,41,44,19,12,32,32,29,26,38,3,6,6,38,19,3,47,48,30,0,13,16,26,22,4,4,16,22,22,42,70,89,22,16,0,35,16,35,70,89,9,16,22,0,63,51,43,17,0,51,24,63,43,17,18,0,57,24,47,18,57,18,57,63,17,18,1,23,57,17,51,17,51,51,51,18,57,17,51,49,48,37,50,54,53,17,51,17,20,6,35,34,38,39,35,6,6,35,34,2,17,16,18,51,50,22,23,51,38,38,53,17,51,17,20,22,33,50,54,53,53,52,38,35,32,17,20,22,4,254,118,107,168,200,189,129,158,43,8,75,185,129,208,232,231,207,106,159,63,12,2,8,166,109,253,185,162,146,148,162,254,226,139,119,132,136,1,57,254,189,200,197,91,113,113,91,1,41,1,12,1,12,1,47,77,85,17,112,27,1,190,251,140,160,137,185,206,35,231,201,254,78,214,210,0,1,0,78,255,236,6,129,5,203,0,42,0,75,64,40,6,19,40,25,31,34,34,22,25,19,1,13,6,43,44,23,2,1,2,1,74,89,2,32,2,32,37,16,37,28,73,89,37,19,16,9,74,89,16,4,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,21,20,6,7,21,4,19,22,22,51,50,54,53,17,51,17,20,6,35,34,38,39,38,38,1,174,201,193,192,213,154,128,103,177,103,84,93,246,130,214,245,178,156,1,98,6,2,108,124,119,112,168,210,189,202,208,2,2,205,2,172,143,147,132,108,127,55,69,114,72,80,196,167,141,183,26,8,51,254,209,150,127,121,135,1,205,254,41,198,199,209,200,150,145,0,1,0,80,255,236,5,197,4,92,0,37,0,75,64,40,18,30,10,36,2,5,5,36,30,32,14,24,6,38,39,33,15,14,15,14,70,89,15,3,15,3,8,27,27,20,70,89,27,16,8,0,70,89,8,22,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,37,50,17,17,51,17,20,6,35,32,3,38,38,35,35,53,51,32,53,52,35,34,6,7,39,54,54,51,50,22,21,20,7,21,22,22,23,22,4,66,221,166,187,196,254,134,16,5,141,148,140,111,1,33,242,75,135,77,57,85,163,104,184,211,192,99,123,5,9,119,1,12,1,57,254,189,202,195,1,77,99,88,141,172,162,36,34,135,40,36,155,134,184,57,8,20,122,106,211,0,1,0,78,254,131,4,209,5,203,0,35,0,74,64,40,25,26,30,35,33,32,32,22,26,35,4,16,6,36,37,26,5,4,5,4,74,89,5,5,35,19,35,30,73,89,35,18,33,34,19,12,74,89,19,4,0,63,43,0,24,63,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,52,38,35,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,21,20,6,7,21,22,22,21,17,51,17,35,17,35,3,131,229,226,217,209,205,225,164,135,105,195,105,84,97,254,132,220,253,189,163,184,195,172,162,172,1,156,133,139,143,147,132,107,128,58,66,114,74,78,196,167,140,183,25,8,25,179,148,254,254,253,233,1,125,0,0,1,0,80,254,135,4,16,4,90,0,30,0,74,64,40,7,18,25,30,28,27,27,21,30,18,3,13,6,32,31,21,4,3,4,3,70,89,4,4,30,15,30,25,70,89,30,21,28,34,15,10,70,89,15,16,0,63,43,0,24,63,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,52,33,35,53,51,32,53,52,38,35,34,7,39,54,51,50,22,21,20,7,21,22,22,21,21,51,17,35,17,35,2,213,254,203,150,117,1,57,133,119,153,150,61,161,203,191,213,203,126,112,157,166,149,1,45,199,141,172,82,80,70,135,74,154,135,182,57,11,37,137,102,156,253,248,1,121,0,0,1,0,0,255,233,7,33,5,182,0,35,0,58,64,29,20,35,26,29,29,35,9,3,36,37,27,27,7,18,18,1,73,89,18,3,23,12,7,12,74,89,32,7,19,0,63,51,43,17,0,51,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,49,48,1,33,7,2,2,6,6,35,34,39,53,22,51,50,54,54,18,18,19,33,17,20,22,51,50,54,53,17,51,17,20,6,35,34,38,53,4,12,254,72,31,43,76,83,130,100,69,64,50,63,49,64,44,56,74,55,2,239,111,115,112,113,168,205,188,196,200,5,31,240,254,174,254,68,210,102,25,143,26,62,104,1,2,1,233,1,174,251,207,137,121,121,135,1,205,254,41,193,204,204,197,0,0,1,0,16,255,236,6,41,4,70,0,29,0,58,64,29,0,14,5,8,8,14,22,3,31,30,6,6,20,28,28,16,70,89,28,15,3,25,20,25,71,89,11,20,22,0,63,51,43,17,0,51,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,49,48,1,20,22,51,50,17,17,51,17,20,6,35,34,38,53,17,33,2,2,6,35,34,39,53,22,51,50,18,19,33,3,207,104,119,213,166,187,190,188,203,254,197,28,94,152,118,58,28,22,28,113,137,34,2,113,1,131,137,131,1,10,1,59,254,189,202,195,196,203,2,61,254,152,254,100,192,10,127,6,1,217,1,246,0,0,1,0,201,255,236,7,94,5,182,0,25,0,67,64,35,23,0,15,6,9,22,18,18,19,9,15,19,3,26,27,22,17,73,89,22,7,22,7,19,24,20,3,19,18,12,3,73,89,12,19,0,63,43,0,24,63,63,51,18,57,57,47,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,51,49,48,1,20,22,51,50,54,53,17,51,17,20,6,35,34,38,53,17,33,17,35,17,51,17,33,17,51,4,246,110,115,112,113,166,200,191,195,200,253,39,170,170,2,217,170,1,133,137,121,121,135,1,205,254,41,191,206,203,198,1,51,253,80,5,182,253,146,2,110,0,0,1,0,176,255,236,6,168,4,72,0,24,0,77,64,42,5,2,19,10,13,1,22,22,23,13,19,23,3,25,26,1,21,70,89,15,1,31,1,2,11,3,1,11,1,11,23,3,24,15,23,21,16,8,70,89,16,22,0,63,43,0,24,63,63,51,18,57,57,47,47,95,94,93,43,17,18,1,23,57,17,51,17,51,17,51,17,51,51,49,48,1,17,33,17,51,17,20,22,51,50,17,17,51,17,20,6,35,34,38,53,53,33,17,35,17,1,86,2,80,166,106,119,213,166,187,192,186,205,253,176,166,4,72,254,53,1,203,253,61,137,133,1,12,1,57,254,189,202,195,198,201,115,254,18,4,72,0,0,1,0,125,255,236,5,154,5,203,0,28,0,58,64,31,22,8,27,2,2,15,28,8,4,29,30,0,28,73,89,0,0,5,12,12,19,73,89,12,4,5,25,73,89,5,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,33,21,16,0,33,32,0,17,52,18,36,51,50,22,23,7,38,38,35,32,0,17,16,0,51,32,17,33,3,102,2,52,254,204,254,201,254,187,254,147,179,1,85,234,120,237,83,66,90,214,87,254,245,254,222,1,11,247,1,180,254,127,2,240,86,254,161,254,177,1,145,1,96,229,1,84,181,49,39,148,38,46,254,197,254,227,254,227,254,195,1,215,0,0,1,0,115,255,236,4,176,4,92,0,25,0,58,64,31,18,7,24,2,2,12,25,7,4,26,27,0,25,70,89,0,0,4,10,10,15,70,89,10,16,4,21,70,89,4,22,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,33,21,16,33,32,0,17,16,0,33,50,23,7,38,35,34,6,21,20,22,51,50,54,53,33,2,178,1,254,253,254,254,238,254,215,1,67,1,33,212,175,59,168,166,205,229,204,197,169,175,254,170,2,63,67,253,240,1,39,1,16,1,14,1,43,80,131,74,222,210,207,223,160,157,0,0,1,0,16,255,236,4,244,5,182,0,20,0,57,64,29,5,19,10,13,13,3,19,0,4,21,22,11,11,16,1,16,8,73,89,16,19,4,0,1,0,73,89,1,3,0,63,43,17,0,51,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,49,48,19,53,33,21,33,17,20,22,51,50,17,17,51,17,20,6,35,34,38,53,17,16,4,60,254,47,119,114,232,168,211,189,198,205,5,29,153,153,252,104,137,123,1,0,1,207,254,41,192,205,206,195,3,160,0,0,1,0,41,255,236,4,135,4,70,0,20,0,54,64,28,2,16,7,10,10,0,16,18,4,21,22,1,18,19,18,70,89,8,8,13,19,15,13,5,70,89,13,22,0,63,43,0,24,63,18,57,47,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,1,33,17,20,22,51,50,17,17,51,17,20,6,35,34,38,53,17,33,53,33,3,129,254,166,109,118,215,166,189,192,192,201,254,168,3,88,3,186,253,201,137,131,1,4,1,65,254,189,202,195,203,196,2,63,140,0,1,0,111,255,236,4,88,5,203,0,38,0,71,64,38,21,32,12,0,36,35,5,27,17,35,0,32,6,39,40,35,15,18,15,18,74,89,15,15,29,3,29,24,74,89,29,19,3,9,74,89,3,4,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,19,52,36,51,32,23,7,38,38,35,34,6,21,20,22,51,51,21,35,34,6,21,20,22,51,50,55,21,6,33,32,36,53,52,54,55,53,38,38,156,1,8,225,1,2,209,94,105,181,101,140,159,209,200,217,213,222,232,202,183,233,199,175,254,251,254,244,254,219,207,188,170,180,4,92,169,198,144,120,68,52,123,114,128,147,141,142,138,142,141,92,158,77,220,197,151,192,22,8,25,178,255,255,0,90,255,236,3,135,4,92,2,6,1,130,0,0,255,255,0,0,254,117,5,107,5,182,0,38,1,181,0,0,0,7,3,128,3,250,0,0,255,255,0,16,254,117,4,115,4,72,2,38,1,213,0,0,0,7,3,129,3,2,0,0,255,255,0,0,254,160,5,16,5,188,2,38,0,36,0,0,0,7,2,103,4,233,0,0,255,255,0,94,254,160,3,205,4,90,2,38,0,68,0,0,0,7,2,103,4,121,0,0,255,255,0,0,0,0,5,16,7,225,2,38,0,36,0,0,1,7,2,102,4,252,1,82,0,8,179,2,19,5,38,0,43,53,255,255,0,94,255,236,3,205,6,143,2,38,0,68,0,0,1,7,2,102,4,166,0,0,0,8,179,2,41,17,38,0,43,53,255,255,0,0,0,0,5,16,7,209,2,38,0,36,0,0,1,7,3,119,4,229,1,82,0,10,180,3,2,21,5,38,0,43,53,53,255,255,0,94,255,236,4,65,6,127,2,38,0,68,0,0,1,7,3,119,4,147,0,0,0,10,180,3,2,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,7,209,2,38,0,36,0,0,1,7,3,120,4,221,1,82,0,10,180,3,2,21,5,38,0,43,53,53,255,255,0,45,255,236,3,205,6,127,2,38,0,68,0,0,1,7,3,120,4,147,0,0,0,10,180,3,2,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,74,2,38,0,36,0,0,1,7,3,121,4,217,1,82,0,10,180,3,2,21,5,38,0,43,53,53,255,255,0,94,255,236,4,23,6,248,2,38,0,68,0,0,1,7,3,121,4,156,0,0,0,10,180,3,2,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,98,2,38,0,36,0,0,1,7,3,122,4,229,1,82,0,10,180,3,2,45,5,38,0,43,53,53,255,255,0,94,255,236,3,205,7,16,2,38,0,68,0,0,1,7,3,122,4,145,0,0,0,10,180,3,2,67,17,38,0,43,53,53,255,255,0,0,254,160,5,16,7,115,2,38,0,36,0,0,0,39,2,103,4,233,0,0,1,7,1,75,0,43,1,82,0,8,179,3,41,5,38,0,43,53,255,255,0,94,254,160,3,205,6,33,2,38,0,68,0,0,0,39,2,103,4,121,0,0,1,6,1,75,212,0,0,8,179,3,62,17,38,0,43,53,255,255,0,0,0,0,5,16,8,19,2,38,0,36,0,0,1,7,3,123,4,236,1,82,0,10,180,3,2,23,5,38,0,43,53,53,255,255,0,94,255,236,3,205,6,193,2,38,0,68,0,0,1,7,3,123,4,154,0,0,0,10,180,3,2,45,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,19,2,38,0,36,0,0,1,7,3,124,4,233,1,82,0,10,180,3,2,23,5,38,0,43,53,53,255,255,0,94,255,236,3,205,6,193,2,38,0,68,0,0,1,7,3,124,4,152,0,0,0,10,180,3,2,45,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,88,2,38,0,36,0,0,1,7,3,125,4,233,1,82,0,10,180,3,2,33,5,38,0,43,53,53,255,255,0,94,255,236,3,205,7,6,2,38,0,68,0,0,1,7,3,125,4,160,0,0,0,10,180,3,2,55,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,94,2,38,0,36,0,0,1,7,3,126,4,227,1,82,0,10,180,3,2,39,5,38,0,43,53,53,255,255,0,94,255,236,3,205,7,12,2,38,0,68,0,0,1,7,3,126,4,152,0,0,0,10,180,3,2,61,17,38,0,43,53,53,255,255,0,0,254,160,5,16,7,73,2,38,0,36,0,0,0,39,1,78,0,45,1,100,1,7,2,103,4,233,0,0,0,8,179,2,15,5,38,0,43,53,255,255,0,94,254,160,3,205,5,229,2,38,0,68,0,0,0,38,1,78,216,0,1,7,2,103,4,121,0,0,0,8,179,2,37,17,38,0,43,53,255,255,0,201,254,160,3,248,5,182,2,38,0,40,0,0,0,7,2,103,4,193,0,0,255,255,0,115,254,160,4,18,4,92,2,38,0,72,0,0,0,7,2,103,4,184,0,0,255,255,0,201,0,0,3,248,7,225,2,38,0,40,0,0,1,7,2,102,4,209,1,82,0,8,179,1,16,5,38,0,43,53,255,255,0,115,255,236,4,18,6,143,2,38,0,72,0,0,1,7,2,102,4,201,0,0,0,8,179,2,31,17,38,0,43,53,255,255,0,201,0,0,3,248,7,47,2,38,0,40,0,0,1,7,1,82,255,228,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,115,255,236,4,18,5,221,2,38,0,72,0,0,1,6,1,82,208,0,0,8,179,2,36,17,38,0,43,53,255,255,0,201,0,0,4,111,7,209,2,38,0,40,0,0,1,7,3,119,4,193,1,82,0,10,180,2,1,18,5,38,0,43,53,53,255,255,0,115,255,236,4,92,6,127,2,38,0,72,0,0,1,7,3,119,4,174,0,0,0,10,180,3,2,33,17,38,0,43,53,53,255,255,0,93,0,0,3,248,7,209,2,38,0,40,0,0,1,7,3,120,4,195,1,82,0,10,180,2,1,18,5,38,0,43,53,53,255,255,0,74,255,236,4,18,6,127,2,38,0,72,0,0,1,7,3,120,4,176,0,0,0,10,180,3,2,33,17,38,0,43,53,53,255,255,0,201,0,0,4,57,8,74,2,38,0,40,0,0,1,7,3,121,4,190,1,82,0,10,180,2,1,18,5,38,0,43,53,53,255,255,0,115,255,236,4,29,6,248,2,38,0,72,0,0,1,7,3,121,4,162,0,0,0,10,180,3,2,33,17,38,0,43,53,53,255,255,0,201,0,0,3,248,8,98,2,38,0,40,0,0,1,7,3,122,4,184,1,82,0,10,180,2,1,42,5,38,0,43,53,53,255,255,0,115,255,236,4,18,7,16,2,38,0,72,0,0,1,7,3,122,4,162,0,0,0,10,180,3,2,57,17,38,0,43,53,53,255,255,0,201,254,160,3,248,7,115,2,38,0,40,0,0,0,39,2,103,4,190,0,0,1,7,1,75,0,2,1,82,0,8,179,2,37,5,38,0,43,53,255,255,0,115,254,160,4,18,6,33,2,38,0,72,0,0,0,39,2,103,4,176,0,0,1,6,1,75,241,0,0,8,179,3,52,17,38,0,43,53,255,255,0,84,0,0,2,86,7,225,2,38,0,44,0,0,1,7,2,102,3,201,1,82,0,8,179,1,16,5,38,0,43,53,255,255,0,123,0,0,1,230,6,143,2,38,0,243,0,0,1,7,2,102,3,115,0,0,0,8,179,1,8,17,38,0,43,53,255,255,0,84,254,160,2,86,5,182,2,38,0,44,0,0,0,7,2,103,3,180,0,0,255,255,0,157,254,160,1,102,5,223,2,38,0,76,0,0,0,7,2,103,3,98,0,0,255,255,0,125,254,160,5,190,5,205,2,38,0,50,0,0,0,7,2,103,5,127,0,0,255,255,0,115,254,160,4,98,4,92,2,38,0,82,0,0,0,7,2,103,4,201,0,0,255,255,0,125,255,236,5,190,7,225,2,38,0,50,0,0,1,7,2,102,5,143,1,82,0,8,179,2,28,5,38,0,43,53,255,255,0,115,255,236,4,98,6,143,2,38,0,82,0,0,1,7,2,102,4,217,0,0,0,8,179,2,29,17,38,0,43,53,255,255,0,125,255,236,5,190,7,209,2,38,0,50,0,0,1,7,3,119,5,125,1,82,0,10,180,3,2,30,5,38,0,43,53,53,255,255,0,115,255,236,4,117,6,127,2,38,0,82,0,0,1,7,3,119,4,199,0,0,0,10,180,3,2,31,17,38,0,43,53,53,255,255,0,125,255,236,5,190,7,209,2,38,0,50,0,0,1,7,3,120,5,125,1,82,0,10,180,3,2,30,5,38,0,43,53,53,255,255,0,97,255,236,4,98,6,127,2,38,0,82,0,0,1,7,3,120,4,199,0,0,0,10,180,3,2,31,17,38,0,43,53,53,255,255,0,125,255,236,5,190,8,74,2,38,0,50,0,0,1,7,3,121,5,123,1,82,0,10,180,3,2,30,5,38,0,43,53,53,255,255,0,115,255,236,4,98,6,248,2,38,0,82,0,0,1,7,3,121,4,199,0,0,0,10,180,3,2,31,17,38,0,43,53,53,255,255,0,125,255,236,5,190,8,98,2,38,0,50,0,0,1,7,3,122,5,121,1,82,0,10,180,3,2,54,5,38,0,43,53,53,255,255,0,115,255,236,4,98,7,16,2,38,0,82,0,0,1,7,3,122,4,197,0,0,0,10,180,3,2,55,17,38,0,43,53,53,255,255,0,125,254,160,5,190,7,115,2,38,0,50,0,0,0,39,2,103,5,127,0,0,1,7,1,75,0,193,1,82,0,8,179,3,49,5,38,0,43,53,255,255,0,115,254,160,4,98,6,33,2,38,0,82,0,0,0,39,2,103,4,205,0,0,1,6,1,75,14,0,0,8,179,3,50,17,38,0,43,53,255,255,0,125,255,236,6,100,7,115,2,38,2,95,0,0,1,7,0,118,1,43,1,82,0,8,179,2,43,5,38,0,43,53,255,255,0,115,255,236,5,25,6,33,2,38,2,96,0,0,1,6,0,118,109,0,0,8,179,2,43,17,38,0,43,53,255,255,0,125,255,236,6,100,7,115,2,38,2,95,0,0,1,7,0,67,0,135,1,82,0,8,179,2,35,5,38,0,43,53,255,255,0,115,255,236,5,25,6,33,2,38,2,96,0,0,1,6,0,67,212,0,0,8,179,2,36,17,38,0,43,53,255,255,0,125,255,236,6,100,7,225,2,38,2,95,0,0,1,7,2,102,5,143,1,82,0,8,179,2,38,5,38,0,43,53,255,255,0,115,255,236,5,25,6,143,2,38,2,96,0,0,1,7,2,102,4,217,0,0,0,8,179,2,39,17,38,0,43,53,255,255,0,125,255,236,6,100,7,47,2,38,2,95,0,0,1,7,1,82,0,160,1,82,0,8,179,2,43,5,38,0,43,53,255,255,0,115,255,236,5,25,5,221,2,38,2,96,0,0,1,6,1,82,245,0,0,8,179,2,35,17,38,0,43,53,255,255,0,125,254,160,6,100,6,20,2,38,2,95,0,0,0,7,2,103,5,123,0,0,255,255,0,115,254,160,5,25,4,240,2,38,2,96,0,0,0,7,2,103,4,201,0,0,255,255,0,186,254,160,5,25,5,182,2,38,0,56,0,0,0,7,2,103,5,74,0,0,255,255,0,164,254,160,4,57,4,72,2,38,0,88,0,0,0,7,2,103,4,184,0,0,255,255,0,186,255,236,5,25,7,225,2,38,0,56,0,0,1,7,2,102,5,84,1,82,0,8,179,1,22,5,38,0,43,53,255,255,0,164,255,236,4,57,6,143,2,38,0,88,0,0,1,7,2,102,4,213,0,0,0,8,179,1,25,17,38,0,43,53,255,255,0,186,255,236,6,123,7,115,2,38,2,97,0,0,1,7,0,118,0,238,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,164,255,236,5,150,6,33,2,38,2,98,0,0,1,6,0,118,121,0,0,8,179,1,38,17,38,0,43,53,255,255,0,186,255,236,6,123,7,115,2,38,2,97,0,0,1,7,0,67,0,90,1,82,0,8,179,1,29,5,38,0,43,53,255,255,0,164,255,236,5,150,6,33,2,38,2,98,0,0,1,6,0,67,187,0,0,8,179,1,31,17,38,0,43,53,255,255,0,186,255,236,6,123,7,225,2,38,2,97,0,0,1,7,2,102,5,96,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,164,255,236,5,150,6,143,2,38,2,98,0,0,1,7,2,102,4,219,0,0,0,8,179,1,34,17,38,0,43,53,255,255,0,186,255,236,6,123,7,47,2,38,2,97,0,0,1,7,1,82,0,127,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,164,255,236,5,150,5,221,2,38,2,98,0,0,1,6,1,82,255,0,0,8,179,1,30,17,38,0,43,53,255,255,0,186,254,160,6,123,6,20,2,38,2,97,0,0,0,7,2,103,5,76,0,0,255,255,0,164,254,160,5,150,4,242,2,38,2,98,0,0,0,7,2,103,4,178,0,0,255,255,0,0,254,160,4,123,5,182,2,38,0,60,0,0,0,7,2,103,4,156,0,0,255,255,0,2,254,20,4,6,4,72,2,38,0,92,0,0,0,7,2,103,5,158,255,253,255,255,0,0,0,0,4,123,7,225,2,38,0,60,0,0,1,7,2,102,4,170,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,2,254,20,4,6,6,143,2,38,0,92,0,0,1,7,2,102,4,106,0,0,0,8,179,1,26,17,38,0,43,53,255,255,0,0,0,0,4,123,7,47,2,38,0,60,0,0,1,7,1,82,255,194,1,82,0,8,179,1,18,5,38,0,43,53,255,255,0,2,254,20,4,6,5,221,2,38,0,92,0,0,1,6,1,82,138,0,0,8,179,1,31,17,38,0,43,53,255,255,0,115,254,197,4,211,6,20,2,38,0,211,0,0,0,7,0,66,0,180,0,0,0,2,251,229,4,217,254,180,6,33,0,9,0,19,0,30,64,12,4,10,14,14,0,0,21,15,6,128,11,1,0,47,51,26,205,50,17,1,51,17,51,18,57,57,49,48,1,35,38,38,39,53,51,22,22,23,5,35,38,38,39,53,51,22,22,23,254,180,96,52,177,37,186,28,99,49,254,156,96,56,174,37,187,28,99,49,4,217,42,202,63,21,61,174,68,25,44,200,63,21,61,174,68,0,0,2,252,113,4,217,255,174,6,127,0,13,0,21,0,40,64,17,21,0,6,17,17,23,3,6,10,21,10,21,10,17,192,6,1,0,47,51,26,204,57,57,47,47,17,18,57,17,1,51,17,51,57,57,49,48,1,35,38,39,6,7,35,53,55,54,55,51,22,23,39,54,55,51,21,6,7,35,254,211,94,112,99,114,97,94,53,112,52,176,66,151,80,73,54,172,83,120,96,4,217,75,91,101,65,25,60,123,77,94,166,194,91,112,21,110,96,0,0,2,251,154,4,217,254,215,6,127,0,13,0,21,0,42,64,18,6,14,17,17,0,0,23,3,6,10,15,10,15,10,19,192,6,1,0,47,51,26,204,57,57,47,47,17,18,57,17,1,51,17,51,18,57,57,49,48,1,35,38,39,6,7,35,53,55,54,55,51,22,23,37,35,38,39,53,51,22,23,254,215,94,97,114,106,105,94,53,112,52,176,66,151,253,238,95,120,84,172,52,75,4,217,65,101,96,70,23,60,123,77,94,166,172,94,112,21,108,97,0,2,252,113,4,217,255,123,6,248,0,13,0,31,0,52,64,24,16,19,0,19,27,3,6,6,22,14,14,33,3,10,6,18,10,18,10,25,30,192,6,1,0,47,51,26,204,50,57,57,47,47,17,18,57,17,1,51,17,51,51,18,23,57,17,51,49,48,1,35,38,39,6,7,35,53,55,54,55,51,22,23,19,20,7,7,35,39,54,54,53,52,38,35,34,7,53,54,51,50,254,211,94,112,99,114,97,94,53,112,52,176,66,151,168,127,6,80,10,57,63,57,43,46,26,25,55,195,4,217,75,91,101,65,25,60,123,77,94,166,1,123,103,29,81,131,9,32,38,37,25,6,80,6,0,2,252,104,4,217,254,231,7,16,0,23,0,37,0,58,64,27,24,30,9,9,21,21,39,27,30,34,30,25,17,9,0,5,12,34,0,12,12,0,34,3,21,192,25,0,47,26,204,23,57,47,47,47,17,51,16,196,51,17,51,17,18,57,17,1,51,17,51,18,57,57,49,48,1,34,46,2,35,34,6,7,35,54,54,51,50,30,2,51,50,54,55,51,6,6,19,35,38,39,6,7,35,53,55,54,55,51,22,23,254,45,37,71,67,63,28,40,42,14,91,13,101,75,37,73,67,62,27,40,42,12,90,11,99,94,94,97,114,106,105,94,53,112,52,176,66,151,6,53,30,37,30,49,50,106,113,30,36,30,49,49,104,115,254,164,65,101,96,70,23,60,123,77,94,166,0,2,252,121,4,217,254,199,6,193,0,7,0,20,0,36,64,15,7,4,10,10,18,18,22,3,64,7,17,10,128,14,8,0,47,51,26,221,50,212,26,205,17,1,51,17,51,18,57,57,49,48,1,54,55,51,21,6,7,35,19,32,3,51,22,22,51,50,54,55,51,6,6,253,94,80,49,172,86,119,96,62,254,236,15,102,9,76,106,98,86,8,105,11,149,5,244,104,101,21,114,93,254,252,1,4,72,57,65,64,120,140,0,2,252,121,4,217,254,199,6,193,0,7,0,20,0,36,64,15,7,4,10,10,18,18,22,4,64,1,17,10,128,14,8,0,47,51,26,221,50,212,26,205,17,1,51,17,51,18,57,57,49,48,1,35,38,39,53,51,22,23,3,32,3,51,22,22,51,50,54,55,51,6,6,253,209,94,119,86,172,52,75,53,254,236,15,102,9,76,106,98,86,8,105,11,149,5,221,93,114,21,108,97,254,229,1,4,72,57,65,64,120,140,0,2,252,121,4,217,254,199,7,6,0,17,0,30,0,46,64,21,8,0,0,5,13,3,20,20,28,28,32,11,16,4,4,24,24,27,20,128,18,0,47,26,205,50,51,17,57,47,196,50,17,1,51,17,51,18,23,57,17,51,49,48,1,20,7,7,35,39,54,54,53,52,38,35,34,7,53,54,51,50,3,32,3,51,22,22,51,50,54,55,51,6,6,254,49,127,6,82,10,57,66,57,44,37,36,22,62,192,149,254,236,15,102,9,76,106,98,86,8,105,11,149,6,121,100,29,41,90,9,32,37,37,26,6,78,8,253,211,1,4,72,57,65,64,120,140,0,2,252,104,4,217,254,231,7,12,0,23,0,36,0,48,64,21,26,34,9,9,21,38,5,12,12,30,30,24,21,64,17,9,0,33,26,128,24,0,47,26,221,50,214,196,51,26,205,17,51,17,57,47,51,17,1,51,50,17,57,57,49,48,1,34,46,2,35,34,6,7,35,54,54,51,50,30,2,51,50,54,55,51,6,6,3,32,3,51,22,22,51,50,54,55,51,6,6,254,45,37,71,67,63,28,40,42,14,91,13,100,76,37,73,67,62,27,40,42,12,90,11,99,221,254,236,15,102,9,76,106,98,86,8,105,11,149,6,51,30,36,30,48,50,104,113,30,36,30,49,49,103,114,254,166,1,4,72,57,65,64,120,140,0,1,0,49,254,66,1,109,0,0,0,15,0,26,64,11,0,5,5,2,10,3,16,17,13,8,3,0,47,204,50,17,18,1,23,57,17,51,49,48,23,52,39,51,22,21,20,6,35,34,39,53,22,51,50,54,223,139,123,158,102,99,65,50,32,54,37,51,238,103,135,120,132,91,103,16,108,10,48,0,0,1,0,25,254,117,1,113,0,154,0,11,0,24,64,9,10,0,6,0,12,13,8,3,0,0,47,204,50,17,18,1,57,57,17,51,49,48,37,17,16,35,34,39,53,22,51,50,53,17,1,113,228,56,60,41,61,94,154,254,223,254,252,24,140,19,100,1,48,0,0,1,0,25,254,117,1,113,0,143,0,11,0,24,64,9,10,0,6,0,12,13,8,3,0,0,47,204,50,17,18,1,57,57,17,51,49,48,37,17,16,35,34,39,53,22,51,50,53,17,1,113,228,56,60,41,61,94,143,254,234,254,252,24,140,19,100,1,37,0,255,255,0,52,0,0,2,67,5,182,0,7,0,20,255,120,0,0,0,2,0,115,255,236,4,23,4,115,0,11,0,23,0,40,64,20,12,6,18,0,6,0,24,25,9,21,75,89,9,38,3,15,77,89,3,25,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,2,35,34,2,17,16,18,51,50,18,1,20,22,51,50,54,53,52,38,35,34,6,4,23,247,222,217,246,249,218,216,249,253,4,155,142,141,158,158,143,141,154,2,47,254,245,254,200,1,53,1,14,1,15,1,53,254,203,254,241,208,232,234,206,204,236,233,0,0,1,0,45,0,0,2,55,4,94,0,10,0,38,64,17,9,1,1,0,8,0,11,12,7,4,7,4,1,9,16,1,24,0,63,63,18,57,57,47,47,17,18,1,57,57,17,51,17,51,49,48,33,35,17,52,55,6,7,7,39,1,51,2,55,161,8,67,62,150,90,1,127,139,2,49,239,140,67,48,112,114,1,35,0,1,0,41,0,0,3,215,4,115,0,25,0,44,64,24,7,19,0,19,23,14,1,5,26,27,16,10,75,89,16,38,24,23,1,23,76,89,1,24,0,63,43,17,0,51,24,63,43,17,18,1,23,57,17,51,49,48,33,33,53,1,62,2,53,52,38,35,34,6,7,39,54,51,50,22,21,20,6,7,5,23,33,3,215,252,82,1,145,157,113,44,139,119,88,156,92,90,192,242,198,218,130,186,254,185,2,2,190,133,1,47,119,104,83,65,87,103,61,74,109,168,168,150,115,187,128,231,6,0,0,1,0,94,254,149,4,27,4,116,0,39,0,71,64,38,3,4,27,0,19,7,7,0,4,22,34,13,6,40,41,4,23,22,23,22,75,89,23,23,10,37,37,30,75,89,37,38,10,17,75,89,10,37,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,4,33,34,38,39,53,22,22,51,32,17,16,33,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,3,238,157,144,176,170,254,222,254,245,116,193,91,95,215,96,1,123,254,94,144,146,171,200,147,126,96,170,109,84,90,235,130,213,236,3,7,140,178,30,8,22,180,146,209,225,35,44,158,47,49,1,41,1,10,143,151,134,107,122,52,70,112,71,81,195,0,0,2,0,23,254,168,4,102,4,94,0,10,0,18,0,66,64,33,18,5,9,2,2,11,7,3,0,3,5,3,19,20,1,5,18,5,77,89,9,18,14,15,15,7,18,18,3,7,16,3,36,0,63,63,18,57,47,18,57,17,51,17,51,43,17,0,51,17,18,1,23,57,17,51,51,51,17,51,17,51,49,48,37,35,17,35,17,33,53,1,51,17,51,33,17,52,55,35,6,7,1,4,102,217,168,253,50,2,190,184,217,254,134,12,10,41,68,254,57,27,254,141,1,115,125,3,198,252,68,1,92,218,222,86,92,253,158,0,0,1,0,133,254,149,4,29,4,95,0,26,0,58,64,31,15,3,25,20,8,20,23,3,4,28,27,0,17,75,89,0,0,6,21,21,24,76,89,21,16,6,12,75,89,6,37,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,50,4,21,20,0,35,34,39,53,22,22,51,50,54,53,16,33,34,7,39,19,33,21,33,3,54,2,45,231,1,9,254,223,254,247,130,70,208,101,176,195,254,137,94,160,86,55,2,215,253,183,37,115,2,38,229,199,227,254,254,79,160,45,51,166,157,1,50,29,55,2,172,153,254,73,23,0,255,255,0,117,255,236,4,47,5,203,2,6,0,25,0,0,0,1,0,94,254,169,4,43,4,95,0,6,0,31,64,16,1,5,5,0,2,3,7,8,3,2,76,89,3,16,0,36,0,63,63,43,17,18,1,23,57,17,51,49,48,1,1,33,53,33,21,1,1,29,2,94,252,227,3,205,253,170,254,169,5,29,153,133,250,207,255,255,0,104,255,236,4,41,5,203,2,6,0,27,0,0,0,2,0,106,254,149,4,37,4,116,0,23,0,37,0,65,64,34,27,17,34,10,10,0,0,4,17,3,38,39,14,30,77,89,10,20,14,14,2,20,20,24,75,89,20,38,2,7,77,89,2,37,0,63,43,0,24,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,33,34,39,53,22,51,50,18,19,35,6,6,35,34,38,53,52,18,51,50,22,18,1,34,6,21,20,22,51,50,54,54,53,52,38,38,4,37,253,104,116,68,80,102,240,245,11,12,55,182,114,194,228,255,208,149,223,120,254,20,143,156,144,147,91,153,88,82,147,1,239,252,166,20,143,26,1,41,1,51,83,87,232,208,228,1,8,153,254,219,1,48,184,164,144,165,74,128,70,105,178,102,0,255,255,0,29,0,0,5,196,6,31,0,39,0,73,2,182,0,0,0,6,0,73,0,0,0,2,0,92,2,221,5,170,5,193,0,34,0,51,0,90,64,46,44,48,48,46,42,38,38,40,10,0,28,17,5,17,22,0,40,46,6,53,52,43,49,36,3,45,47,45,41,47,35,35,40,28,10,20,8,3,3,40,41,25,20,20,41,3,0,63,51,47,51,16,205,50,47,51,18,57,57,17,51,17,51,17,51,17,18,23,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,1,20,6,35,34,39,53,22,51,50,53,52,38,38,39,38,38,53,52,54,51,50,23,7,38,35,34,6,21,20,22,22,23,22,22,1,3,35,23,17,35,17,51,19,19,51,17,35,17,55,35,3,2,72,149,124,145,74,106,119,148,23,54,85,120,81,142,110,125,92,34,100,83,60,75,18,43,95,129,80,1,166,201,8,6,119,188,195,203,180,127,6,8,211,3,172,98,109,33,108,40,100,33,40,33,31,44,91,76,86,105,39,99,37,46,40,29,36,28,36,50,90,254,236,2,47,129,254,82,2,209,253,209,2,47,253,47,1,164,137,253,211,255,255,0,18,254,20,4,90,5,182,2,38,0,55,0,0,0,7,0,122,1,63,0,0,255,255,0,31,254,20,2,168,5,70,2,38,0,87,0,0,0,7,0,122,0,197,0,0,0,2,0,113,254,20,4,55,4,92,0,12,0,42,0,71,64,38,10,21,26,3,42,42,30,30,36,21,3,43,44,33,39,70,89,36,33,27,28,15,26,15,24,18,24,7,70,89,24,16,18,0,70,89,18,22,0,63,43,0,24,63,43,17,18,0,57,57,24,63,63,51,43,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,50,54,55,53,52,38,35,34,6,21,20,22,5,52,55,35,6,35,34,2,17,16,18,51,50,23,51,55,51,17,20,6,35,34,39,53,22,22,51,50,54,53,2,76,170,151,4,158,171,144,153,151,1,219,9,11,112,230,217,239,243,211,223,123,11,24,131,236,249,242,149,75,210,118,142,165,119,183,202,43,226,204,224,208,209,217,107,36,99,167,1,45,1,10,1,8,1,49,166,146,251,164,236,236,70,158,42,46,169,146,255,255,0,113,254,20,4,55,6,33,2,38,3,145,0,0,1,6,1,75,6,0,0,8,179,2,57,17,38,0,43,53,255,255,0,113,254,20,4,55,5,229,2,38,3,145,0,0,1,6,1,78,12,0,0,8,179,2,43,17,38,0,43,53,255,255,0,113,254,20,4,55,5,223,2,38,3,145,0,0,1,7,1,79,1,86,0,0,0,8,179,2,52,17,38,0,43,53,255,255,0,113,254,20,4,55,6,33,2,38,3,145,0,0,1,6,2,58,119,0,0,8,179,2,47,17,38,0,43,53,0,1,0,201,0,0,1,115,5,182,0,3,0,17,182,0,4,5,1,3,0,18,0,63,63,17,18,1,57,49,48,51,17,51,17,201,170,5,182,250,74,0,255,255,0,5,0,0,1,142,7,115,2,38,3,150,0,0,1,7,0,67,254,124,1,82,0,8,179,1,5,5,38,0,43,53,255,255,0,179,0,0,2,60,7,115,2,38,3,150,0,0,1,7,0,118,255,42,1,82,0,8,179,1,13,5,38,0,43,53,255,255,255,199,0,0,2,105,7,115,2,38,3,150,0,0,1,7,1,75,254,187,1,82,0,8,179,1,18,5,38,0,43,53,255,255,0,5,0,0,2,56,7,37,2,38,3,150,0,0,1,7,0,106,254,208,1,82,0,10,180,2,1,25,5,38,0,43,53,53,255,255,255,171,0,0,2,147,7,47,2,38,3,150,0,0,1,7,1,82,254,163,1,82,0,8,179,1,13,5,38,0,43,53,255,255,255,243,0,0,2,75,6,180,2,38,3,150,0,0,1,7,1,77,254,198,1,82,0,8,179,1,7,5,38,0,43,53,255,255,255,231,0,0,2,83,7,55,2,38,3,150,0,0,1,7,1,78,254,194,1,82,0,8,179,1,4,5,38,0,43,53,255,255,0,86,254,66,1,162,5,182,2,38,3,150,0,0,0,6,1,81,49,0,255,255,0,187,0,0,1,127,7,49,2,38,3,150,0,0,1,7,1,79,0,25,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,201,254,127,3,163,5,182,0,38,3,150,0,0,0,7,0,45,2,59,0,0,255,255,255,228,0,0,2,29,6,10,0,39,3,150,0,170,0,0,1,7,1,84,253,232,255,151,0,7,178,1,8,0,0,63,53,0,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,5,0,0,2,56,7,37,2,38,3,150,0,0,1,7,0,106,254,208,1,82,0,10,180,2,1,25,5,38,0,43,53,53,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,5,0,0,2,56,7,37,2,38,3,150,0,0,1,7,0,106,254,208,1,82,0,10,180,2,1,25,5,38,0,43,53,53,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,153,0,0,2,4,7,225,2,38,3,150,0,0,1,7,2,102,3,145,1,82,0,8,179,1,8,5,38,0,43,53,255,255,0,184,254,160,1,127,5,182,2,38,3,150,0,0,0,7,2,103,3,125,0,0,0,0,0,1,0,0,182,50,0,1,73,6,128,0,0,14,54,36,0,5,0,36,255,113,0,5,0,55,0,41,0,5,0,57,0,41,0,5,0,58,0,41,0,5,0,60,0,20,0,5,0,68,255,174,0,5,0,70,255,133,0,5,0,71,255,133,0,5,0,72,255,133,0,5,0,74,255,195,0,5,0,80,255,195,0,5,0,81,255,195,0,5,0,82,255,133,0,5,0,83,255,195,0,5,0,84,255,133,0,5,0,85,255,195,0,5,0,86,255,195,0,5,0,88,255,195,0,5,0,130,255,113,0,5,0,131,255,113,0,5,0,132,255,113,0,5,0,133,255,113,0,5,0,134,255,113,0,5,0,135,255,113,0,5,0,159,0,20,0,5,0,162,255,133,0,5,0,163,255,174,0,5,0,164,255,174,0,5,0,165,255,174,0,5,0,166,255,174,0,5,0,167,255,174,0,5,0,168,255,174,0,5,0,169,255,133,0,5,0,170,255,133,0,5,0,171,255,133,0,5,0,172,255,133,0,5,0,173,255,133,0,5,0,180,255,133,0,5,0,181,255,133,0,5,0,182,255,133,0,5,0,183,255,133,0,5,0,184,255,133,0,5,0,186,255,133,0,5,0,187,255,195,0,5,0,188,255,195,0,5,0,189,255,195,0,5,0,190,255,195,0,5,0,194,255,113,0,5,0,195,255,174,0,5,0,196,255,113,0,5,0,197,255,174,0,5,0,198,255,113,0,5,0,199,255,174,0,5,0,201,255,133,0,5,0,203,255,133,0,5,0,205,255,133,0,5,0,207,255,133,0,5,0,209,255,133,0,5,0,211,255,133,0,5,0,213,255,133,0,5,0,215,255,133,0,5,0,217,255,133,0,5,0,219,255,133,0,5,0,221,255,133,0,5,0,223,255,195,0,5,0,225,255,195,0,5,0,227,255,195,0,5,0,229,255,195,0,5,0,250,255,195,0,5,1,6,255,195,0,5,1,8,255,195,0,5,1,13,255,195,0,5,1,15,255,133,0,5,1,17,255,133,0,5,1,19,255,133,0,5,1,21,255,133,0,5,1,23,255,195,0,5,1,25,255,195,0,5,1,29,255,195,0,5,1,33,255,195,0,5,1,36,0,41,0,5,1,38,0,41,0,5,1,43,255,195,0,5,1,45,255,195,0,5,1,47,255,195,0,5,1,49,255,195,0,5,1,51,255,195,0,5,1,53,255,195,0,5,1,54,0,41,0,5,1,56,0,20,0,5,1,58,0,20,0,5,1,67,255,113,0,5,1,68,255,174,0,5,1,70,255,174,0,5,1,72,255,133,0,5,1,74,255,195,0,5,1,86,255,113,0,5,1,95,255,113,0,5,1,98,255,113,0,5,1,105,255,113,0,5,1,121,255,174,0,5,1,122,255,215,0,5,1,123,255,215,0,5,1,126,255,174,0,5,1,129,255,195,0,5,1,130,255,215,0,5,1,131,255,215,0,5,1,132,255,215,0,5,1,135,255,215,0,5,1,137,255,215,0,5,1,140,255,174,0,5,1,142,255,195,0,5,1,143,255,174,0,5,1,144,255,174,0,5,1,147,255,174,0,5,1,153,255,174,0,5,1,164,255,133,0,5,1,170,255,113,0,5,1,174,255,133,0,5,1,181,255,133,0,5,1,202,255,215,0,5,1,206,255,113,0,5,1,207,255,133,0,5,1,213,255,113,0,5,1,216,255,133,0,5,1,219,255,133,0,5,1,222,255,133,0,5,1,234,255,133,0,5,1,237,255,133,0,5,1,238,255,195,0,5,1,242,255,113,0,5,1,250,0,41,0,5,1,252,0,41,0,5,1,254,0,41,0,5,2,0,0,20,0,5,2,87,255,195,0,5,2,88,255,113,0,5,2,89,255,174,0,5,2,96,255,133,0,5,2,98,255,195,0,5,2,106,255,133,0,5,2,114,255,113,0,5,2,115,255,113,0,5,2,125,255,236,0,5,2,127,255,133,0,5,2,133,255,133,0,5,2,135,255,133,0,5,2,137,255,133,0,5,2,141,255,133,0,5,2,178,255,133,0,5,2,180,255,133,0,5,2,206,255,133,0,5,2,207,255,113,0,5,2,217,255,113,0,5,2,218,255,215,0,5,2,219,255,113,0,5,2,220,255,215,0,5,2,221,255,113,0,5,2,222,255,215,0,5,2,224,255,133,0,5,2,226,255,215,0,5,2,228,255,215,0,5,2,240,255,133,0,5,2,242,255,133,0,5,2,244,255,133,0,5,3,9,255,113,0,5,3,10,255,133,0,5,3,11,255,113,0,5,3,12,255,133,0,5,3,17,255,133,0,5,3,18,255,113,0,5,3,22,255,133,0,5,3,26,255,133,0,5,3,27,255,133,0,5,3,28,255,113,0,5,3,29,255,113,0,5,3,30,255,174,0,5,3,31,255,113,0,5,3,32,255,174,0,5,3,33,255,113,0,5,3,34,255,174,0,5,3,35,255,113,0,5,3,37,255,113,0,5,3,38,255,174,0,5,3,39,255,113,0,5,3,40,255,174,0,5,3,41,255,113,0,5,3,42,255,174,0,5,3,43,255,113,0,5,3,44,255,174,0,5,3,45,255,113,0,5,3,46,255,174,0,5,3,47,255,113,0,5,3,48,255,174,0,5,3,49,255,113,0,5,3,50,255,174,0,5,3,51,255,113,0,5,3,52,255,174,0,5,3,54,255,133,0,5,3,56,255,133,0,5,3,58,255,133,0,5,3,60,255,133,0,5,3,64,255,133,0,5,3,66,255,133,0,5,3,68,255,133,0,5,3,74,255,133,0,5,3,76,255,133,0,5,3,78,255,133,0,5,3,82,255,133,0,5,3,84,255,133,0,5,3,86,255,133,0,5,3,88,255,133,0,5,3,90,255,133,0,5,3,92,255,133,0,5,3,94,255,133,0,5,3,96,255,133,0,5,3,98,255,195,0,5,3,100,255,195,0,5,3,102,255,195,0,5,3,104,255,195,0,5,3,106,255,195,0,5,3,108,255,195,0,5,3,110,255,195,0,5,3,111,0,20,0,5,3,113,0,20,0,5,3,115,0,20,0,5,3,143,0,41,0,10,0,36,255,113,0,10,0,55,0,41,0,10,0,57,0,41,0,10,0,58,0,41,0,10,0,60,0,20,0,10,0,68,255,174,0,10,0,70,255,133,0,10,0,71,255,133,0,10,0,72,255,133,0,10,0,74,255,195,0,10,0,80,255,195,0,10,0,81,255,195,0,10,0,82,255,133,0,10,0,83,255,195,0,10,0,84,255,133,0,10,0,85,255,195,0,10,0,86,255,195,0,10,0,88,255,195,0,10,0,130,255,113,0,10,0,131,255,113,0,10,0,132,255,113,0,10,0,133,255,113,0,10,0,134,255,113,0,10,0,135,255,113,0,10,0,159,0,20,0,10,0,162,255,133,0,10,0,163,255,174,0,10,0,164,255,174,0,10,0,165,255,174,0,10,0,166,255,174,0,10,0,167,255,174,0,10,0,168,255,174,0,10,0,169,255,133,0,10,0,170,255,133,0,10,0,171,255,133,0,10,0,172,255,133,0,10,0,173,255,133,0,10,0,180,255,133,0,10,0,181,255,133,0,10,0,182,255,133,0,10,0,183,255,133,0,10,0,184,255,133,0,10,0,186,255,133,0,10,0,187,255,195,0,10,0,188,255,195,0,10,0,189,255,195,0,10,0,190,255,195,0,10,0,194,255,113,0,10,0,195,255,174,0,10,0,196,255,113,0,10,0,197,255,174,0,10,0,198,255,113,0,10,0,199,255,174,0,10,0,201,255,133,0,10,0,203,255,133,0,10,0,205,255,133,0,10,0,207,255,133,0,10,0,209,255,133,0,10,0,211,255,133,0,10,0,213,255,133,0,10,0,215,255,133,0,10,0,217,255,133,0,10,0,219,255,133,0,10,0,221,255,133,0,10,0,223,255,195,0,10,0,225,255,195,0,10,0,227,255,195,0,10,0,229,255,195,0,10,0,250,255,195,0,10,1,6,255,195,0,10,1,8,255,195,0,10,1,13,255,195,0,10,1,15,255,133,0,10,1,17,255,133,0,10,1,19,255,133,0,10,1,21,255,133,0,10,1,23,255,195,0,10,1,25,255,195,0,10,1,29,255,195,0,10,1,33,255,195,0,10,1,36,0,41,0,10,1,38,0,41,0,10,1,43,255,195,0,10,1,45,255,195,0,10,1,47,255,195,0,10,1,49,255,195,0,10,1,51,255,195,0,10,1,53,255,195,0,10,1,54,0,41,0,10,1,56,0,20,0,10,1,58,0,20,0,10,1,67,255,113,0,10,1,68,255,174,0,10,1,70,255,174,0,10,1,72,255,133,0,10,1,74,255,195,0,10,1,86,255,113,0,10,1,95,255,113,0,10,1,98,255,113,0,10,1,105,255,113,0,10,1,121,255,174,0,10,1,122,255,215,0,10,1,123,255,215,0,10,1,126,255,174,0,10,1,129,255,195,0,10,1,130,255,215,0,10,1,131,255,215,0,10,1,132,255,215,0,10,1,135,255,215,0,10,1,137,255,215,0,10,1,140,255,174,0,10,1,142,255,195,0,10,1,143,255,174,0,10,1,144,255,174,0,10,1,147,255,174,0,10,1,153,255,174,0,10,1,164,255,133,0,10,1,170,255,113,0,10,1,174,255,133,0,10,1,181,255,133,0,10,1,202,255,215,0,10,1,206,255,113,0,10,1,207,255,133,0,10,1,213,255,113,0,10,1,216,255,133,0,10,1,219,255,133,0,10,1,222,255,133,0,10,1,234,255,133,0,10,1,237,255,133,0,10,1,238,255,195,0,10,1,242,255,113,0,10,1,250,0,41,0,10,1,252,0,41,0,10,1,254,0,41,0,10,2,0,0,20,0,10,2,87,255,195,0,10,2,88,255,113,0,10,2,89,255,174,0,10,2,96,255,133,0,10,2,98,255,195,0,10,2,106,255,133,0,10,2,114,255,113,0,10,2,115,255,113,0,10,2,125,255,236,0,10,2,127,255,133,0,10,2,133,255,133,0,10,2,135,255,133,0,10,2,137,255,133,0,10,2,141,255,133,0,10,2,178,255,133,0,10,2,180,255,133,0,10,2,206,255,133,0,10,2,207,255,113,0,10,2,217,255,113,0,10,2,218,255,215,0,10,2,219,255,113,0,10,2,220,255,215,0,10,2,221,255,113,0,10,2,222,255,215,0,10,2,224,255,133,0,10,2,226,255,215,0,10,2,228,255,215,0,10,2,240,255,133,0,10,2,242,255,133,0,10,2,244,255,133,0,10,3,9,255,113,0,10,3,10,255,133,0,10,3,11,255,113,0,10,3,12,255,133,0,10,3,17,255,133,0,10,3,18,255,113,0,10,3,22,255,133,0,10,3,26,255,133,0,10,3,27,255,133,0,10,3,28,255,113,0,10,3,29,255,113,0,10,3,30,255,174,0,10,3,31,255,113,0,10,3,32,255,174,0,10,3,33,255,113,0,10,3,34,255,174,0,10,3,35,255,113,0,10,3,37,255,113,0,10,3,38,255,174,0,10,3,39,255,113,0,10,3,40,255,174,0,10,3,41,255,113,0,10,3,42,255,174,0,10,3,43,255,113,0,10,3,44,255,174,0,10,3,45,255,113,0,10,3,46,255,174,0,10,3,47,255,113,0,10,3,48,255,174,0,10,3,49,255,113,0,10,3,50,255,174,0,10,3,51,255,113,0,10,3,52,255,174,0,10,3,54,255,133,0,10,3,56,255,133,0,10,3,58,255,133,0,10,3,60,255,133,0,10,3,64,255,133,0,10,3,66,255,133,0,10,3,68,255,133,0,10,3,74,255,133,0,10,3,76,255,133,0,10,3,78,255,133,0,10,3,82,255,133,0,10,3,84,255,133,0,10,3,86,255,133,0,10,3,88,255,133,0,10,3,90,255,133,0,10,3,92,255,133,0,10,3,94,255,133,0,10,3,96,255,133,0,10,3,98,255,195,0,10,3,100,255,195,0,10,3,102,255,195,0,10,3,104,255,195,0,10,3,106,255,195,0,10,3,108,255,195,0,10,3,110,255,195,0,10,3,111,0,20,0,10,3,113,0,20,0,10,3,115,0,20,0,10,3,143,0,41,0,11,0,45,0,184,0,15,0,38,255,154,0,15,0,42,255,154,0,15,0,50,255,154,0,15,0,52,255,154,0,15,0,55,255,113,0,15,0,56,255,215,0,15,0,57,255,133,0,15,0,58,255,133,0,15,0,60,255,133,0,15,0,137,255,154,0,15,0,148,255,154,0,15,0,149,255,154,0,15,0,150,255,154,0,15,0,151,255,154,0,15,0,152,255,154,0,15,0,154,255,154,0,15,0,155,255,215,0,15,0,156,255,215,0,15,0,157,255,215,0,15,0,158,255,215,0,15,0,159,255,133,0,15,0,200,255,154,0,15,0,202,255,154,0,15,0,204,255,154,0,15,0,206,255,154,0,15,0,222,255,154,0,15,0,224,255,154,0,15,0,226,255,154,0,15,0,228,255,154,0,15,1,14,255,154,0,15,1,16,255,154,0,15,1,18,255,154,0,15,1,20,255,154,0,15,1,36,255,113,0,15,1,38,255,113,0,15,1,42,255,215,0,15,1,44,255,215,0,15,1,46,255,215,0,15,1,48,255,215,0,15,1,50,255,215,0,15,1,52,255,215,0,15,1,54,255,133,0,15,1,56,255,133,0,15,1,58,255,133,0,15,1,71,255,154,0,15,1,102,255,174,0,15,1,109,255,174,0,15,1,113,255,113,0,15,1,114,255,133,0,15,1,115,255,154,0,15,1,117,255,133,0,15,1,120,255,133,0,15,1,133,255,215,0,15,1,157,255,113,0,15,1,159,255,154,0,15,1,166,255,113,0,15,1,184,255,154,0,15,1,187,255,154,0,15,1,188,255,113,0,15,1,190,255,174,0,15,1,193,255,92,0,15,1,196,255,113,0,15,1,220,255,154,0,15,1,225,255,133,0,15,1,228,255,154,0,15,1,250,255,133,0,15,1,252,255,133,0,15,1,254,255,133,0,15,2,0,255,133,0,15,2,84,255,133,0,15,2,95,255,154,0,15,2,97,255,215,0,15,2,108,255,154,0,15,2,124,255,92,0,15,2,126,255,154,0,15,2,128,255,133,0,15,2,130,255,133,0,15,2,132,255,154,0,15,2,134,255,154,0,15,2,136,255,154,0,15,2,138,255,154,0,15,2,140,255,154,0,15,2,169,255,113,0,15,2,170,255,154,0,15,2,177,255,154,0,15,2,179,255,154,0,15,2,181,255,113,0,15,2,182,255,154,0,15,2,183,255,133,0,15,2,185,255,133,0,15,2,189,255,113,0,15,2,190,255,154,0,15,2,191,255,92,0,15,2,192,255,133,0,15,2,193,255,92,0,15,2,194,255,133,0,15,2,197,255,133,0,15,2,199,255,133,0,15,2,212,255,92,0,15,2,213,255,133,0,15,2,239,255,154,0,15,2,241,255,154,0,15,2,243,255,154,0,15,2,253,255,92,0,15,2,254,255,133,0,15,3,13,255,133,0,15,3,14,255,154,0,15,3,15,255,133,0,15,3,16,255,154,0,15,3,21,255,154,0,15,3,23,255,113,0,15,3,24,255,154,0,15,3,73,255,154,0,15,3,75,255,154,0,15,3,77,255,154,0,15,3,79,255,154,0,15,3,81,255,154,0,15,3,83,255,154,0,15,3,85,255,154,0,15,3,87,255,154,0,15,3,89,255,154,0,15,3,91,255,154,0,15,3,93,255,154,0,15,3,95,255,154,0,15,3,97,255,215,0,15,3,99,255,215,0,15,3,101,255,215,0,15,3,103,255,215,0,15,3,105,255,215,0,15,3,107,255,215,0,15,3,109,255,215,0,15,3,111,255,133,0,15,3,113,255,133,0,15,3,115,255,133,0,15,3,143,255,113,0,16,0,55,255,174,0,16,1,36,255,174,0,16,1,38,255,174,0,16,1,113,255,174,0,16,1,157,255,174,0,16,1,166,255,174,0,16,1,188,255,174,0,16,1,196,255,174,0,16,1,220,255,215,0,16,1,228,255,215,0,16,2,169,255,174,0,16,2,170,255,215,0,16,2,181,255,174,0,16,2,182,255,215,0,16,2,189,255,174,0,16,2,190,255,215,0,16,3,23,255,174,0,16,3,24,255,215,0,16,3,143,255,174,0,17,0,38,255,154,0,17,0,42,255,154,0,17,0,50,255,154,0,17,0,52,255,154,0,17,0,55,255,113,0,17,0,56,255,215,0,17,0,57,255,133,0,17,0,58,255,133,0,17,0,60,255,133,0,17,0,137,255,154,0,17,0,148,255,154,0,17,0,149,255,154,0,17,0,150,255,154,0,17,0,151,255,154,0,17,0,152,255,154,0,17,0,154,255,154,0,17,0,155,255,215,0,17,0,156,255,215,0,17,0,157,255,215,0,17,0,158,255,215,0,17,0,159,255,133,0,17,0,200,255,154,0,17,0,202,255,154,0,17,0,204,255,154,0,17,0,206,255,154,0,17,0,222,255,154,0,17,0,224,255,154,0,17,0,226,255,154,0,17,0,228,255,154,0,17,1,14,255,154,0,17,1,16,255,154,0,17,1,18,255,154,0,17,1,20,255,154,0,17,1,36,255,113,0,17,1,38,255,113,0,17,1,42,255,215,0,17,1,44,255,215,0,17,1,46,255,215,0,17,1,48,255,215,0,17,1,50,255,215,0,17,1,52,255,215,0,17,1,54,255,133,0,17,1,56,255,133,0,17,1,58,255,133,0,17,1,71,255,154,0,17,1,102,255,174,0,17,1,109,255,174,0,17,1,113,255,113,0,17,1,114,255,133,0,17,1,115,255,154,0,17,1,117,255,133,0,17,1,120,255,133,0,17,1,133,255,215,0,17,1,157,255,113,0,17,1,159,255,154,0,17,1,166,255,113,0,17,1,184,255,154,0,17,1,187,255,154,0,17,1,188,255,113,0,17,1,190,255,174,0,17,1,193,255,92,0,17,1,196,255,113,0,17,1,220,255,154,0,17,1,225,255,133,0,17,1,228,255,154,0,17,1,250,255,133,0,17,1,252,255,133,0,17,1,254,255,133,0,17,2,0,255,133,0,17,2,84,255,133,0,17,2,95,255,154,0,17,2,97,255,215,0,17,2,108,255,154,0,17,2,124,255,92,0,17,2,126,255,154,0,17,2,128,255,133,0,17,2,130,255,133,0,17,2,132,255,154,0,17,2,134,255,154,0,17,2,136,255,154,0,17,2,138,255,154,0,17,2,140,255,154,0,17,2,169,255,113,0,17,2,170,255,154,0,17,2,177,255,154,0,17,2,179,255,154,0,17,2,181,255,113,0,17,2,182,255,154,0,17,2,183,255,133,0,17,2,185,255,133,0,17,2,189,255,113,0,17,2,190,255,154,0,17,2,191,255,92,0,17,2,192,255,133,0,17,2,193,255,92,0,17,2,194,255,133,0,17,2,197,255,133,0,17,2,199,255,133,0,17,2,212,255,92,0,17,2,213,255,133,0,17,2,239,255,154,0,17,2,241,255,154,0,17,2,243,255,154,0,17,2,253,255,92,0,17,2,254,255,133,0,17,3,13,255,133,0,17,3,14,255,154,0,17,3,15,255,133,0,17,3,16,255,154,0,17,3,21,255,154,0,17,3,23,255,113,0,17,3,24,255,154,0,17,3,73,255,154,0,17,3,75,255,154,0,17,3,77,255,154,0,17,3,79,255,154,0,17,3,81,255,154,0,17,3,83,255,154,0,17,3,85,255,154,0,17,3,87,255,154,0,17,3,89,255,154,0,17,3,91,255,154,0,17,3,93,255,154,0,17,3,95,255,154,0,17,3,97,255,215,0,17,3,99,255,215,0,17,3,101,255,215,0,17,3,103,255,215,0,17,3,105,255,215,0,17,3,107,255,215,0,17,3,109,255,215,0,17,3,111,255,133,0,17,3,113,255,133,0,17,3,115,255,133,0,17,3,143,255,113,0,36,0,5,255,113,0,36,0,10,255,113,0,36,0,38,255,215,0,36,0,42,255,215,0,36,0,45,1,10,0,36,0,50,255,215,0,36,0,52,255,215,0,36,0,55,255,113,0,36,0,57,255,174,0,36,0,58,255,174,0,36,0,60,255,133,0,36,0,137,255,215,0,36,0,148,255,215,0,36,0,149,255,215,0,36,0,150,255,215,0,36,0,151,255,215,0,36,0,152,255,215,0,36,0,154,255,215,0,36,0,159,255,133,0,36,0,200,255,215,0,36,0,202,255,215,0,36,0,204,255,215,0,36,0,206,255,215,0,36,0,222,255,215,0,36,0,224,255,215,0,36,0,226,255,215,0,36,0,228,255,215,0,36,1,14,255,215,0,36,1,16,255,215,0,36,1,18,255,215,0,36,1,20,255,215,0,36,1,36,255,113,0,36,1,38,255,113,0,36,1,54,255,174,0,36,1,56,255,133,0,36,1,58,255,133,0,36,1,71,255,215,0,36,1,250,255,174,0,36,1,252,255,174,0,36,1,254,255,174,0,36,2,0,255,133,0,36,2,7,255,113,0,36,2,11,255,113,0,36,2,95,255,215,0,36,3,73,255,215,0,36,3,75,255,215,0,36,3,77,255,215,0,36,3,79,255,215,0,36,3,81,255,215,0,36,3,83,255,215,0,36,3,85,255,215,0,36,3,87,255,215,0,36,3,89,255,215,0,36,3,91,255,215,0,36,3,93,255,215,0,36,3,95,255,215,0,36,3,111,255,133,0,36,3,113,255,133,0,36,3,115,255,133,0,36,3,143,255,113,0,37,0,15,255,174,0,37,0,17,255,174,0,37,0,36,255,215,0,37,0,55,255,195,0,37,0,57,255,236,0,37,0,58,255,236,0,37,0,59,255,215,0,37,0,60,255,236,0,37,0,61,255,236,0,37,0,130,255,215,0,37,0,131,255,215,0,37,0,132,255,215,0,37,0,133,255,215,0,37,0,134,255,215,0,37,0,135,255,215,0,37,0,159,255,236,0,37,0,194,255,215,0,37,0,196,255,215,0,37,0,198,255,215,0,37,1,36,255,195,0,37,1,38,255,195,0,37,1,54,255,236,0,37,1,56,255,236,0,37,1,58,255,236,0,37,1,59,255,236,0,37,1,61,255,236,0,37,1,63,255,236,0,37,1,67,255,215,0,37,1,160,255,236,0,37,1,250,255,236,0,37,1,252,255,236,0,37,1,254,255,236,0,37,2,0,255,236,0,37,2,8,255,174,0,37,2,12,255,174,0,37,2,88,255,215,0,37,3,29,255,215,0,37,3,31,255,215,0,37,3,33,255,215,0,37,3,35,255,215,0,37,3,37,255,215,0,37,3,39,255,215,0,37,3,41,255,215,0,37,3,43,255,215,0,37,3,45,255,215,0,37,3,47,255,215,0,37,3,49,255,215,0,37,3,51,255,215,0,37,3,111,255,236,0,37,3,113,255,236,0,37,3,115,255,236,0,37,3,143,255,195,0,38,0,38,255,215,0,38,0,42,255,215,0,38,0,50,255,215,0,38,0,52,255,215,0,38,0,137,255,215,0,38,0,148,255,215,0,38,0,149,255,215,0,38,0,150,255,215,0,38,0,151,255,215,0,38,0,152,255,215,0,38,0,154,255,215,0,38,0,200,255,215,0,38,0,202,255,215,0,38,0,204,255,215,0,38,0,206,255,215,0,38,0,222,255,215,0,38,0,224,255,215,0,38,0,226,255,215,0,38,0,228,255,215,0,38,1,14,255,215,0,38,1,16,255,215,0,38,1,18,255,215,0,38,1,20,255,215,0,38,1,71,255,215,0,38,2,95,255,215,0,38,3,73,255,215,0,38,3,75,255,215,0,38,3,77,255,215,0,38,3,79,255,215,0,38,3,81,255,215,0,38,3,83,255,215,0,38,3,85,255,215,0,38,3,87,255,215,0,38,3,89,255,215,0,38,3,91,255,215,0,38,3,93,255,215,0,38,3,95,255,215,0,39,0,15,255,174,0,39,0,17,255,174,0,39,0,36,255,215,0,39,0,55,255,195,0,39,0,57,255,236,0,39,0,58,255,236,0,39,0,59,255,215,0,39,0,60,255,236,0,39,0,61,255,236,0,39,0,130,255,215,0,39,0,131,255,215,0,39,0,132,255,215,0,39,0,133,255,215,0,39,0,134,255,215,0,39,0,135,255,215,0,39,0,159,255,236,0,39,0,194,255,215,0,39,0,196,255,215,0,39,0,198,255,215,0,39,1,36,255,195,0,39,1,38,255,195,0,39,1,54,255,236,0,39,1,56,255,236,0,39,1,58,255,236,0,39,1,59,255,236,0,39,1,61,255,236,0,39,1,63,255,236,0,39,1,67,255,215,0,39,1,160,255,236,0,39,1,250,255,236,0,39,1,252,255,236,0,39,1,254,255,236,0,39,2,0,255,236,0,39,2,8,255,174,0,39,2,12,255,174,0,39,2,88,255,215,0,39,3,29,255,215,0,39,3,31,255,215,0,39,3,33,255,215,0,39,3,35,255,215,0,39,3,37,255,215,0,39,3,39,255,215,0,39,3,41,255,215,0,39,3,43,255,215,0,39,3,45,255,215,0,39,3,47,255,215,0,39,3,49,255,215,0,39,3,51,255,215,0,39,3,111,255,236,0,39,3,113,255,236,0,39,3,115,255,236,0,39,3,143,255,195,0,40,0,45,0,123,0,41,0,15,255,133,0,41,0,17,255,133,0,41,0,34,0,41,0,41,0,36,255,215,0,41,0,130,255,215,0,41,0,131,255,215,0,41,0,132,255,215,0,41,0,133,255,215,0,41,0,134,255,215,0,41,0,135,255,215,0,41,0,194,255,215,0,41,0,196,255,215,0,41,0,198,255,215,0,41,1,67,255,215,0,41,2,8,255,133,0,41,2,12,255,133,0,41,2,88,255,215,0,41,3,29,255,215,0,41,3,31,255,215,0,41,3,33,255,215,0,41,3,35,255,215,0,41,3,37,255,215,0,41,3,39,255,215,0,41,3,41,255,215,0,41,3,43,255,215,0,41,3,45,255,215,0,41,3,47,255,215,0,41,3,49,255,215,0,41,3,51,255,215,0,46,0,38,255,215,0,46,0,42,255,215,0,46,0,50,255,215,0,46,0,52,255,215,0,46,0,137,255,215,0,46,0,148,255,215,0,46,0,149,255,215,0,46,0,150,255,215,0,46,0,151,255,215,0,46,0,152,255,215,0,46,0,154,255,215,0,46,0,200,255,215,0,46,0,202,255,215,0,46,0,204,255,215,0,46,0,206,255,215,0,46,0,222,255,215,0,46,0,224,255,215,0,46,0,226,255,215,0,46,0,228,255,215,0,46,1,14,255,215,0,46,1,16,255,215,0,46,1,18,255,215,0,46,1,20,255,215,0,46,1,71,255,215,0,46,2,95,255,215,0,46,3,73,255,215,0,46,3,75,255,215,0,46,3,77,255,215,0,46,3,79,255,215,0,46,3,81,255,215,0,46,3,83,255,215,0,46,3,85,255,215,0,46,3,87,255,215,0,46,3,89,255,215,0,46,3,91,255,215,0,46,3,93,255,215,0,46,3,95,255,215,0,47,0,5,255,92,0,47,0,10,255,92,0,47,0,38,255,215,0,47,0,42,255,215,0,47,0,50,255,215,0,47,0,52,255,215,0,47,0,55,255,215,0,47,0,56,255,236,0,47,0,57,255,215,0,47,0,58,255,215,0,47,0,60,255,195,0,47,0,137,255,215,0,47,0,148,255,215,0,47,0,149,255,215,0,47,0,150,255,215,0,47,0,151,255,215,0,47,0,152,255,215,0,47,0,154,255,215,0,47,0,155,255,236,0,47,0,156,255,236,0,47,0,157,255,236,0,47,0,158,255,236,0,47,0,159,255,195,0,47,0,200,255,215,0,47,0,202,255,215,0,47,0,204,255,215,0,47,0,206,255,215,0,47,0,222,255,215,0,47,0,224,255,215,0,47,0,226,255,215,0,47,0,228,255,215,0,47,1,14,255,215,0,47,1,16,255,215,0,47,1,18,255,215,0,47,1,20,255,215,0,47,1,36,255,215,0,47,1,38,255,215,0,47,1,42,255,236,0,47,1,44,255,236,0,47,1,46,255,236,0,47,1,48,255,236,0,47,1,50,255,236,0,47,1,52,255,236,0,47,1,54,255,215,0,47,1,56,255,195,0,47,1,58,255,195,0,47,1,71,255,215,0,47,1,250,255,215,0,47,1,252,255,215,0,47,1,254,255,215,0,47,2,0,255,195,0,47,2,7,255,92,0,47,2,11,255,92,0,47,2,95,255,215,0,47,2,97,255,236,0,47,3,73,255,215,0,47,3,75,255,215,0,47,3,77,255,215,0,47,3,79,255,215,0,47,3,81,255,215,0,47,3,83,255,215,0,47,3,85,255,215,0,47,3,87,255,215,0,47,3,89,255,215,0,47,3,91,255,215,0,47,3,93,255,215,0,47,3,95,255,215,0,47,3,97,255,236,0,47,3,99,255,236,0,47,3,101,255,236,0,47,3,103,255,236,0,47,3,105,255,236,0,47,3,107,255,236,0,47,3,109,255,236,0,47,3,111,255,195,0,47,3,113,255,195,0,47,3,115,255,195,0,47,3,143,255,215,0,50,0,15,255,174,0,50,0,17,255,174,0,50,0,36,255,215,0,50,0,55,255,195,0,50,0,57,255,236,0,50,0,58,255,236,0,50,0,59,255,215,0,50,0,60,255,236,0,50,0,61,255,236,0,50,0,130,255,215,0,50,0,131,255,215,0,50,0,132,255,215,0,50,0,133,255,215,0,50,0,134,255,215,0,50,0,135,255,215,0,50,0,159,255,236,0,50,0,194,255,215,0,50,0,196,255,215,0,50,0,198,255,215,0,50,1,36,255,195,0,50,1,38,255,195,0,50,1,54,255,236,0,50,1,56,255,236,0,50,1,58,255,236,0,50,1,59,255,236,0,50,1,61,255,236,0,50,1,63,255,236,0,50,1,67,255,215,0,50,1,160,255,236,0,50,1,250,255,236,0,50,1,252,255,236,0,50,1,254,255,236,0,50,2,0,255,236,0,50,2,8,255,174,0,50,2,12,255,174,0,50,2,88,255,215,0,50,3,29,255,215,0,50,3,31,255,215,0,50,3,33,255,215,0,50,3,35,255,215,0,50,3,37,255,215,0,50,3,39,255,215,0,50,3,41,255,215,0,50,3,43,255,215,0,50,3,45,255,215,0,50,3,47,255,215,0,50,3,49,255,215,0,50,3,51,255,215,0,50,3,111,255,236,0,50,3,113,255,236,0,50,3,115,255,236,0,50,3,143,255,195,0,51,0,15,254,246,0,51,0,17,254,246,0,51,0,36,255,154,0,51,0,59,255,215,0,51,0,61,255,236,0,51,0,130,255,154,0,51,0,131,255,154,0,51,0,132,255,154,0,51,0,133,255,154,0,51,0,134,255,154,0,51,0,135,255,154,0,51,0,194,255,154,0,51,0,196,255,154,0,51,0,198,255,154,0,51,1,59,255,236,0,51,1,61,255,236,0,51,1,63,255,236,0,51,1,67,255,154,0,51,2,8,254,246,0,51,2,12,254,246,0,51,2,88,255,154,0,51,3,29,255,154,0,51,3,31,255,154,0,51,3,33,255,154,0,51,3,35,255,154,0,51,3,37,255,154,0,51,3,39,255,154,0,51,3,41,255,154,0,51,3,43,255,154,0,51,3,45,255,154,0,51,3,47,255,154,0,51,3,49,255,154,0,51,3,51,255,154,0,52,0,15,255,174,0,52,0,17,255,174,0,52,0,36,255,215,0,52,0,55,255,195,0,52,0,57,255,236,0,52,0,58,255,236,0,52,0,59,255,215,0,52,0,60,255,236,0,52,0,61,255,236,0,52,0,130,255,215,0,52,0,131,255,215,0,52,0,132,255,215,0,52,0,133,255,215,0,52,0,134,255,215,0,52,0,135,255,215,0,52,0,159,255,236,0,52,0,194,255,215,0,52,0,196,255,215,0,52,0,198,255,215,0,52,1,36,255,195,0,52,1,38,255,195,0,52,1,54,255,236,0,52,1,56,255,236,0,52,1,58,255,236,0,52,1,59,255,236,0,52,1,61,255,236,0,52,1,63,255,236,0,52,1,67,255,215,0,52,1,160,255,236,0,52,1,250,255,236,0,52,1,252,255,236,0,52,1,254,255,236,0,52,2,0,255,236,0,52,2,8,255,174,0,52,2,12,255,174,0,52,2,88,255,215,0,52,3,29,255,215,0,52,3,31,255,215,0,52,3,33,255,215,0,52,3,35,255,215,0,52,3,37,255,215,0,52,3,39,255,215,0,52,3,41,255,215,0,52,3,43,255,215,0,52,3,45,255,215,0,52,3,47,255,215,0,52,3,49,255,215,0,52,3,51,255,215,0,52,3,111,255,236,0,52,3,113,255,236,0,52,3,115,255,236,0,52,3,143,255,195,0,55,0,15,255,133,0,55,0,16,255,174,0,55,0,17,255,133,0,55,0,34,0,41,0,55,0,36,255,113,0,55,0,38,255,215,0,55,0,42,255,215,0,55,0,50,255,215,0,55,0,52,255,215,0,55,0,55,0,41,0,55,0,68,255,92,0,55,0,70,255,113,0,55,0,71,255,113,0,55,0,72,255,113,0,55,0,74,255,113,0,55,0,80,255,154,0,55,0,81,255,154,0,55,0,82,255,113,0,55,0,83,255,154,0,55,0,84,255,113,0,55,0,85,255,154,0,55,0,86,255,133,0,55,0,88,255,154,0,55,0,89,255,215,0,55,0,90,255,215,0,55,0,91,255,215,0,55,0,92,255,215,0,55,0,93,255,174,0,55,0,130,255,113,0,55,0,131,255,113,0,55,0,132,255,113,0,55,0,133,255,113,0,55,0,134,255,113,0,55,0,135,255,113,0,55,0,137,255,215,0,55,0,148,255,215,0,55,0,149,255,215,0,55,0,150,255,215,0,55,0,151,255,215,0,55,0,152,255,215,0,55,0,154,255,215,0,55,0,162,255,113,0,55,0,163,255,92,0,55,0,164,255,92,0,55,0,165,255,92,0,55,0,166,255,92,0,55,0,167,255,92,0,55,0,168,255,92,0,55,0,169,255,113,0,55,0,170,255,113,0,55,0,171,255,113,0,55,0,172,255,113,0,55,0,173,255,113,0,55,0,180,255,113,0,55,0,181,255,113,0,55,0,182,255,113,0,55,0,183,255,113,0,55,0,184,255,113,0,55,0,186,255,113,0,55,0,187,255,154,0,55,0,188,255,154,0,55,0,189,255,154,0,55,0,190,255,154,0,55,0,191,255,215,0,55,0,194,255,113,0,55,0,195,255,92,0,55,0,196,255,113,0,55,0,197,255,92,0,55,0,198,255,113,0,55,0,199,255,92,0,55,0,200,255,215,0,55,0,201,255,113,0,55,0,202,255,215,0,55,0,203,255,113,0,55,0,204,255,215,0,55,0,205,255,113,0,55,0,206,255,215,0,55,0,207,255,113,0,55,0,209,255,113,0,55,0,211,255,113,0,55,0,213,255,113,0,55,0,215,255,113,0,55,0,217,255,113,0,55,0,219,255,113,0,55,0,221,255,113,0,55,0,222,255,215,0,55,0,223,255,113,0,55,0,224,255,215,0,55,0,225,255,113,0,55,0,226,255,215,0,55,0,227,255,113,0,55,0,228,255,215,0,55,0,229,255,113,0,55,0,250,255,154,0,55,1,6,255,154,0,55,1,8,255,154,0,55,1,13,255,154,0,55,1,14,255,215,0,55,1,15,255,113,0,55,1,16,255,215,0,55,1,17,255,113,0,55,1,18,255,215,0,55,1,19,255,113,0,55,1,20,255,215,0,55,1,21,255,113,0,55,1,23,255,154,0,55,1,25,255,154,0,55,1,29,255,133,0,55,1,33,255,133,0,55,1,36,0,41,0,55,1,38,0,41,0,55,1,43,255,154,0,55,1,45,255,154,0,55,1,47,255,154,0,55,1,49,255,154,0,55,1,51,255,154,0,55,1,53,255,154,0,55,1,55,255,215,0,55,1,60,255,174,0,55,1,62,255,174,0,55,1,64,255,174,0,55,1,67,255,113,0,55,1,68,255,92,0,55,1,70,255,92,0,55,1,71,255,215,0,55,1,72,255,113,0,55,1,74,255,133,0,55,1,251,255,215,0,55,1,253,255,215,0,55,2,2,255,174,0,55,2,3,255,174,0,55,2,4,255,174,0,55,2,8,255,133,0,55,2,12,255,133,0,55,2,87,255,154,0,55,2,88,255,113,0,55,2,89,255,92,0,55,2,95,255,215,0,55,2,96,255,113,0,55,2,98,255,154,0,55,3,29,255,113,0,55,3,30,255,92,0,55,3,31,255,113,0,55,3,32,255,92,0,55,3,33,255,113,0,55,3,34,255,92,0,55,3,35,255,113,0,55,3,37,255,113,0,55,3,38,255,92,0,55,3,39,255,113,0,55,3,40,255,92,0,55,3,41,255,113,0,55,3,42,255,92,0,55,3,43,255,113,0,55,3,44,255,92,0,55,3,45,255,113,0,55,3,46,255,92,0,55,3,47,255,113,0,55,3,48,255,92,0,55,3,49,255,113,0,55,3,50,255,92,0,55,3,51,255,113,0,55,3,52,255,92,0,55,3,54,255,113,0,55,3,56,255,113,0,55,3,58,255,113,0,55,3,60,255,113,0,55,3,64,255,113,0,55,3,66,255,113,0,55,3,68,255,113,0,55,3,73,255,215,0,55,3,74,255,113,0,55,3,75,255,215,0,55,3,76,255,113,0,55,3,77,255,215,0,55,3,78,255,113,0,55,3,79,255,215,0,55,3,81,255,215,0,55,3,82,255,113,0,55,3,83,255,215,0,55,3,84,255,113,0,55,3,85,255,215,0,55,3,86,255,113,0,55,3,87,255,215,0,55,3,88,255,113,0,55,3,89,255,215,0,55,3,90,255,113,0,55,3,91,255,215,0,55,3,92,255,113,0,55,3,93,255,215,0,55,3,94,255,113,0,55,3,95,255,215,0,55,3,96,255,113,0,55,3,98,255,154,0,55,3,100,255,154,0,55,3,102,255,154,0,55,3,104,255,154,0,55,3,106,255,154,0,55,3,108,255,154,0,55,3,110,255,154,0,55,3,112,255,215,0,55,3,143,0,41,0,56,0,15,255,215,0,56,0,17,255,215,0,56,0,36,255,236,0,56,0,130,255,236,0,56,0,131,255,236,0,56,0,132,255,236,0,56,0,133,255,236,0,56,0,134,255,236,0,56,0,135,255,236,0,56,0,194,255,236,0,56,0,196,255,236,0,56,0,198,255,236,0,56,1,67,255,236,0,56,2,8,255,215,0,56,2,12,255,215,0,56,2,88,255,236,0,56,3,29,255,236,0,56,3,31,255,236,0,56,3,33,255,236,0,56,3,35,255,236,0,56,3,37,255,236,0,56,3,39,255,236,0,56,3,41,255,236,0,56,3,43,255,236,0,56,3,45,255,236,0,56,3,47,255,236,0,56,3,49,255,236,0,56,3,51,255,236,0,57,0,15,255,154,0,57,0,17,255,154,0,57,0,34,0,41,0,57,0,36,255,174,0,57,0,38,255,236,0,57,0,42,255,236,0,57,0,50,255,236,0,57,0,52,255,236,0,57,0,68,255,215,0,57,0,70,255,215,0,57,0,71,255,215,0,57,0,72,255,215,0,57,0,74,255,236,0,57,0,80,255,236,0,57,0,81,255,236,0,57,0,82,255,215,0,57,0,83,255,236,0,57,0,84,255,215,0,57,0,85,255,236,0,57,0,86,255,236,0,57,0,88,255,236,0,57,0,130,255,174,0,57,0,131,255,174,0,57,0,132,255,174,0,57,0,133,255,174,0,57,0,134,255,174,0,57,0,135,255,174,0,57,0,137,255,236,0,57,0,148,255,236,0,57,0,149,255,236,0,57,0,150,255,236,0,57,0,151,255,236,0,57,0,152,255,236,0,57,0,154,255,236,0,57,0,162,255,215,0,57,0,163,255,215,0,57,0,164,255,215,0,57,0,165,255,215,0,57,0,166,255,215,0,57,0,167,255,215,0,57,0,168,255,215,0,57,0,169,255,215,0,57,0,170,255,215,0,57,0,171,255,215,0,57,0,172,255,215,0,57,0,173,255,215,0,57,0,180,255,215,0,57,0,181,255,215,0,57,0,182,255,215,0,57,0,183,255,215,0,57,0,184,255,215,0,57,0,186,255,215,0,57,0,187,255,236,0,57,0,188,255,236,0,57,0,189,255,236,0,57,0,190,255,236,0,57,0,194,255,174,0,57,0,195,255,215,0,57,0,196,255,174,0,57,0,197,255,215,0,57,0,198,255,174,0,57,0,199,255,215,0,57,0,200,255,236,0,57,0,201,255,215,0,57,0,202,255,236,0,57,0,203,255,215,0,57,0,204,255,236,0,57,0,205,255,215,0,57,0,206,255,236,0,57,0,207,255,215,0,57,0,209,255,215,0,57,0,211,255,215,0,57,0,213,255,215,0,57,0,215,255,215,0,57,0,217,255,215,0,57,0,219,255,215,0,57,0,221,255,215,0,57,0,222,255,236,0,57,0,223,255,236,0,57,0,224,255,236,0,57,0,225,255,236,0,57,0,226,255,236,0,57,0,227,255,236,0,57,0,228,255,236,0,57,0,229,255,236,0,57,0,250,255,236,0,57,1,6,255,236,0,57,1,8,255,236,0,57,1,13,255,236,0,57,1,14,255,236,0,57,1,15,255,215,0,57,1,16,255,236,0,57,1,17,255,215,0,57,1,18,255,236,0,57,1,19,255,215,0,57,1,20,255,236,0,57,1,21,255,215,0,57,1,23,255,236,0,57,1,25,255,236,0,57,1,29,255,236,0,57,1,33,255,236,0,57,1,43,255,236,0,57,1,45,255,236,0,57,1,47,255,236,0,57,1,49,255,236,0,57,1,51,255,236,0,57,1,53,255,236,0,57,1,67,255,174,0,57,1,68,255,215,0,57,1,70,255,215,0,57,1,71,255,236,0,57,1,72,255,215,0,57,1,74,255,236,0,57,2,8,255,154,0,57,2,12,255,154,0,57,2,87,255,236,0,57,2,88,255,174,0,57,2,89,255,215,0,57,2,95,255,236,0,57,2,96,255,215,0,57,2,98,255,236,0,57,3,29,255,174,0,57,3,30,255,215,0,57,3,31,255,174,0,57,3,32,255,215,0,57,3,33,255,174,0,57,3,34,255,215,0,57,3,35,255,174,0,57,3,37,255,174,0,57,3,38,255,215,0,57,3,39,255,174,0,57,3,40,255,215,0,57,3,41,255,174,0,57,3,42,255,215,0,57,3,43,255,174,0,57,3,44,255,215,0,57,3,45,255,174,0,57,3,46,255,215,0,57,3,47,255,174,0,57,3,48,255,215,0,57,3,49,255,174,0,57,3,50,255,215,0,57,3,51,255,174,0,57,3,52,255,215,0,57,3,54,255,215,0,57,3,56,255,215,0,57,3,58,255,215,0,57,3,60,255,215,0,57,3,64,255,215,0,57,3,66,255,215,0,57,3,68,255,215,0,57,3,73,255,236,0,57,3,74,255,215,0,57,3,75,255,236,0,57,3,76,255,215,0,57,3,77,255,236,0,57,3,78,255,215,0,57,3,79,255,236,0,57,3,81,255,236,0,57,3,82,255,215,0,57,3,83,255,236,0,57,3,84,255,215,0,57,3,85,255,236,0,57,3,86,255,215,0,57,3,87,255,236,0,57,3,88,255,215,0,57,3,89,255,236,0,57,3,90,255,215,0,57,3,91,255,236,0,57,3,92,255,215,0,57,3,93,255,236,0,57,3,94,255,215,0,57,3,95,255,236,0,57,3,96,255,215,0,57,3,98,255,236,0,57,3,100,255,236,0,57,3,102,255,236,0,57,3,104,255,236,0,57,3,106,255,236,0,57,3,108,255,236,0,57,3,110,255,236,0,58,0,15,255,154,0,58,0,17,255,154,0,58,0,34,0,41,0,58,0,36,255,174,0,58,0,38,255,236,0,58,0,42,255,236,0,58,0,50,255,236,0,58,0,52,255,236,0,58,0,68,255,215,0,58,0,70,255,215,0,58,0,71,255,215,0,58,0,72,255,215,0,58,0,74,255,236,0,58,0,80,255,236,0,58,0,81,255,236,0,58,0,82,255,215,0,58,0,83,255,236,0,58,0,84,255,215,0,58,0,85,255,236,0,58,0,86,255,236,0,58,0,88,255,236,0,58,0,130,255,174,0,58,0,131,255,174,0,58,0,132,255,174,0,58,0,133,255,174,0,58,0,134,255,174,0,58,0,135,255,174,0,58,0,137,255,236,0,58,0,148,255,236,0,58,0,149,255,236,0,58,0,150,255,236,0,58,0,151,255,236,0,58,0,152,255,236,0,58,0,154,255,236,0,58,0,162,255,215,0,58,0,163,255,215,0,58,0,164,255,215,0,58,0,165,255,215,0,58,0,166,255,215,0,58,0,167,255,215,0,58,0,168,255,215,0,58,0,169,255,215,0,58,0,170,255,215,0,58,0,171,255,215,0,58,0,172,255,215,0,58,0,173,255,215,0,58,0,180,255,215,0,58,0,181,255,215,0,58,0,182,255,215,0,58,0,183,255,215,0,58,0,184,255,215,0,58,0,186,255,215,0,58,0,187,255,236,0,58,0,188,255,236,0,58,0,189,255,236,0,58,0,190,255,236,0,58,0,194,255,174,0,58,0,195,255,215,0,58,0,196,255,174,0,58,0,197,255,215,0,58,0,198,255,174,0,58,0,199,255,215,0,58,0,200,255,236,0,58,0,201,255,215,0,58,0,202,255,236,0,58,0,203,255,215,0,58,0,204,255,236,0,58,0,205,255,215,0,58,0,206,255,236,0,58,0,207,255,215,0,58,0,209,255,215,0,58,0,211,255,215,0,58,0,213,255,215,0,58,0,215,255,215,0,58,0,217,255,215,0,58,0,219,255,215,0,58,0,221,255,215,0,58,0,222,255,236,0,58,0,223,255,236,0,58,0,224,255,236,0,58,0,225,255,236,0,58,0,226,255,236,0,58,0,227,255,236,0,58,0,228,255,236,0,58,0,229,255,236,0,58,0,250,255,236,0,58,1,6,255,236,0,58,1,8,255,236,0,58,1,13,255,236,0,58,1,14,255,236,0,58,1,15,255,215,0,58,1,16,255,236,0,58,1,17,255,215,0,58,1,18,255,236,0,58,1,19,255,215,0,58,1,20,255,236,0,58,1,21,255,215,0,58,1,23,255,236,0,58,1,25,255,236,0,58,1,29,255,236,0,58,1,33,255,236,0,58,1,43,255,236,0,58,1,45,255,236,0,58,1,47,255,236,0,58,1,49,255,236,0,58,1,51,255,236,0,58,1,53,255,236,0,58,1,67,255,174,0,58,1,68,255,215,0,58,1,70,255,215,0,58,1,71,255,236,0,58,1,72,255,215,0,58,1,74,255,236,0,58,2,8,255,154,0,58,2,12,255,154,0,58,2,87,255,236,0,58,2,88,255,174,0,58,2,89,255,215,0,58,2,95,255,236,0,58,2,96,255,215,0,58,2,98,255,236,0,58,3,29,255,174,0,58,3,30,255,215,0,58,3,31,255,174,0,58,3,32,255,215,0,58,3,33,255,174,0,58,3,34,255,215,0,58,3,35,255,174,0,58,3,37,255,174,0,58,3,38,255,215,0,58,3,39,255,174,0,58,3,40,255,215,0,58,3,41,255,174,0,58,3,42,255,215,0,58,3,43,255,174,0,58,3,44,255,215,0,58,3,45,255,174,0,58,3,46,255,215,0,58,3,47,255,174,0,58,3,48,255,215,0,58,3,49,255,174,0,58,3,50,255,215,0,58,3,51,255,174,0,58,3,52,255,215,0,58,3,54,255,215,0,58,3,56,255,215,0,58,3,58,255,215,0,58,3,60,255,215,0,58,3,64,255,215,0,58,3,66,255,215,0,58,3,68,255,215,0,58,3,73,255,236,0,58,3,74,255,215,0,58,3,75,255,236,0,58,3,76,255,215,0,58,3,77,255,236,0,58,3,78,255,215,0,58,3,79,255,236,0,58,3,81,255,236,0,58,3,82,255,215,0,58,3,83,255,236,0,58,3,84,255,215,0,58,3,85,255,236,0,58,3,86,255,215,0,58,3,87,255,236,0,58,3,88,255,215,0,58,3,89,255,236,0,58,3,90,255,215,0,58,3,91,255,236,0,58,3,92,255,215,0,58,3,93,255,236,0,58,3,94,255,215,0,58,3,95,255,236,0,58,3,96,255,215,0,58,3,98,255,236,0,58,3,100,255,236,0,58,3,102,255,236,0,58,3,104,255,236,0,58,3,106,255,236,0,58,3,108,255,236,0,58,3,110,255,236,0,59,0,38,255,215,0,59,0,42,255,215,0,59,0,50,255,215,0,59,0,52,255,215,0,59,0,137,255,215,0,59,0,148,255,215,0,59,0,149,255,215,0,59,0,150,255,215,0,59,0,151,255,215,0,59,0,152,255,215,0,59,0,154,255,215,0,59,0,200,255,215,0,59,0,202,255,215,0,59,0,204,255,215,0,59,0,206,255,215,0,59,0,222,255,215,0,59,0,224,255,215,0,59,0,226,255,215,0,59,0,228,255,215,0,59,1,14,255,215,0,59,1,16,255,215,0,59,1,18,255,215,0,59,1,20,255,215,0,59,1,71,255,215,0,59,2,95,255,215,0,59,3,73,255,215,0,59,3,75,255,215,0,59,3,77,255,215,0,59,3,79,255,215,0,59,3,81,255,215,0,59,3,83,255,215,0,59,3,85,255,215,0,59,3,87,255,215,0,59,3,89,255,215,0,59,3,91,255,215,0,59,3,93,255,215,0,59,3,95,255,215,0,60,0,15,255,133,0,60,0,17,255,133,0,60,0,34,0,41,0,60,0,36,255,133,0,60,0,38,255,215,0,60,0,42,255,215,0,60,0,50,255,215,0,60,0,52,255,215,0,60,0,68,255,154,0,60,0,70,255,154,0,60,0,71,255,154,0,60,0,72,255,154,0,60,0,74,255,215,0,60,0,80,255,195,0,60,0,81,255,195,0,60,0,82,255,154,0,60,0,83,255,195,0,60,0,84,255,154,0,60,0,85,255,195,0,60,0,86,255,174,0,60,0,88,255,195,0,60,0,93,255,215,0,60,0,130,255,133,0,60,0,131,255,133,0,60,0,132,255,133,0,60,0,133,255,133,0,60,0,134,255,133,0,60,0,135,255,133,0,60,0,137,255,215,0,60,0,148,255,215,0,60,0,149,255,215,0,60,0,150,255,215,0,60,0,151,255,215,0,60,0,152,255,215,0,60,0,154,255,215,0,60,0,162,255,154,0,60,0,163,255,154,0,60,0,164,255,154,0,60,0,165,255,154,0,60,0,166,255,154,0,60,0,167,255,154,0,60,0,168,255,154,0,60,0,169,255,154,0,60,0,170,255,154,0,60,0,171,255,154,0,60,0,172,255,154,0,60,0,173,255,154,0,60,0,180,255,154,0,60,0,181,255,154,0,60,0,182,255,154,0,60,0,183,255,154,0,60,0,184,255,154,0,60,0,186,255,154,0,60,0,187,255,195,0,60,0,188,255,195,0,60,0,189,255,195,0,60,0,190,255,195,0,60,0,194,255,133,0,60,0,195,255,154,0,60,0,196,255,133,0,60,0,197,255,154,0,60,0,198,255,133,0,60,0,199,255,154,0,60,0,200,255,215,0,60,0,201,255,154,0,60,0,202,255,215,0,60,0,203,255,154,0,60,0,204,255,215,0,60,0,205,255,154,0,60,0,206,255,215,0,60,0,207,255,154,0,60,0,209,255,154,0,60,0,211,255,154,0,60,0,213,255,154,0,60,0,215,255,154,0,60,0,217,255,154,0,60,0,219,255,154,0,60,0,221,255,154,0,60,0,222,255,215,0,60,0,223,255,215,0,60,0,224,255,215,0,60,0,225,255,215,0,60,0,226,255,215,0,60,0,227,255,215,0,60,0,228,255,215,0,60,0,229,255,215,0,60,0,250,255,195,0,60,1,6,255,195,0,60,1,8,255,195,0,60,1,13,255,195,0,60,1,14,255,215,0,60,1,15,255,154,0,60,1,16,255,215,0,60,1,17,255,154,0,60,1,18,255,215,0,60,1,19,255,154,0,60,1,20,255,215,0,60,1,21,255,154,0,60,1,23,255,195,0,60,1,25,255,195,0,60,1,29,255,174,0,60,1,33,255,174,0,60,1,43,255,195,0,60,1,45,255,195,0,60,1,47,255,195,0,60,1,49,255,195,0,60,1,51,255,195,0,60,1,53,255,195,0,60,1,60,255,215,0,60,1,62,255,215,0,60,1,64,255,215,0,60,1,67,255,133,0,60,1,68,255,154,0,60,1,70,255,154,0,60,1,71,255,215,0,60,1,72,255,154,0,60,1,74,255,174,0,60,2,8,255,133,0,60,2,12,255,133,0,60,2,87,255,195,0,60,2,88,255,133,0,60,2,89,255,154,0,60,2,95,255,215,0,60,2,96,255,154,0,60,2,98,255,195,0,60,3,29,255,133,0,60,3,30,255,154,0,60,3,31,255,133,0,60,3,32,255,154,0,60,3,33,255,133,0,60,3,34,255,154,0,60,3,35,255,133,0,60,3,37,255,133,0,60,3,38,255,154,0,60,3,39,255,133,0,60,3,40,255,154,0,60,3,41,255,133,0,60,3,42,255,154,0,60,3,43,255,133,0,60,3,44,255,154,0,60,3,45,255,133,0,60,3,46,255,154,0,60,3,47,255,133,0,60,3,48,255,154,0,60,3,49,255,133,0,60,3,50,255,154,0,60,3,51,255,133,0,60,3,52,255,154,0,60,3,54,255,154,0,60,3,56,255,154,0,60,3,58,255,154,0,60,3,60,255,154,0,60,3,64,255,154,0,60,3,66,255,154,0,60,3,68,255,154,0,60,3,73,255,215,0,60,3,74,255,154,0,60,3,75,255,215,0,60,3,76,255,154,0,60,3,77,255,215,0,60,3,78,255,154,0,60,3,79,255,215,0,60,3,81,255,215,0,60,3,82,255,154,0,60,3,83,255,215,0,60,3,84,255,154,0,60,3,85,255,215,0,60,3,86,255,154,0,60,3,87,255,215,0,60,3,88,255,154,0,60,3,89,255,215,0,60,3,90,255,154,0,60,3,91,255,215,0,60,3,92,255,154,0,60,3,93,255,215,0,60,3,94,255,154,0,60,3,95,255,215,0,60,3,96,255,154,0,60,3,98,255,195,0,60,3,100,255,195,0,60,3,102,255,195,0,60,3,104,255,195,0,60,3,106,255,195,0,60,3,108,255,195,0,60,3,110,255,195,0,61,0,38,255,236,0,61,0,42,255,236,0,61,0,50,255,236,0,61,0,52,255,236,0,61,0,137,255,236,0,61,0,148,255,236,0,61,0,149,255,236,0,61,0,150,255,236,0,61,0,151,255,236,0,61,0,152,255,236,0,61,0,154,255,236,0,61,0,200,255,236,0,61,0,202,255,236,0,61,0,204,255,236,0,61,0,206,255,236,0,61,0,222,255,236,0,61,0,224,255,236,0,61,0,226,255,236,0,61,0,228,255,236,0,61,1,14,255,236,0,61,1,16,255,236,0,61,1,18,255,236,0,61,1,20,255,236,0,61,1,71,255,236,0,61,2,95,255,236,0,61,3,73,255,236,0,61,3,75,255,236,0,61,3,77,255,236,0,61,3,79,255,236,0,61,3,81,255,236,0,61,3,83,255,236,0,61,3,85,255,236,0,61,3,87,255,236,0,61,3,89,255,236,0,61,3,91,255,236,0,61,3,93,255,236,0,61,3,95,255,236,0,62,0,45,0,184,0,68,0,5,255,236,0,68,0,10,255,236,0,68,2,7,255,236,0,68,2,11,255,236,0,69,0,5,255,236,0,69,0,10,255,236,0,69,0,89,255,215,0,69,0,90,255,215,0,69,0,91,255,215,0,69,0,92,255,215,0,69,0,93,255,236,0,69,0,191,255,215,0,69,1,55,255,215,0,69,1,60,255,236,0,69,1,62,255,236,0,69,1,64,255,236,0,69,1,251,255,215,0,69,1,253,255,215,0,69,2,7,255,236,0,69,2,11,255,236,0,69,3,112,255,215,0,70,0,5,0,41,0,70,0,10,0,41,0,70,2,7,0,41,0,70,2,11,0,41,0,72,0,5,255,236,0,72,0,10,255,236,0,72,0,89,255,215,0,72,0,90,255,215,0,72,0,91,255,215,0,72,0,92,255,215,0,72,0,93,255,236,0,72,0,191,255,215,0,72,1,55,255,215,0,72,1,60,255,236,0,72,1,62,255,236,0,72,1,64,255,236,0,72,1,251,255,215,0,72,1,253,255,215,0,72,2,7,255,236,0,72,2,11,255,236,0,72,3,112,255,215,0,73,0,5,0,123,0,73,0,10,0,123,0,73,2,7,0,123,0,73,2,11,0,123,0,75,0,5,255,236,0,75,0,10,255,236,0,75,2,7,255,236,0,75,2,11,255,236,0,78,0,70,255,215,0,78,0,71,255,215,0,78,0,72,255,215,0,78,0,82,255,215,0,78,0,84,255,215,0,78,0,162,255,215,0,78,0,169,255,215,0,78,0,170,255,215,0,78,0,171,255,215,0,78,0,172,255,215,0,78,0,173,255,215,0,78,0,180,255,215,0,78,0,181,255,215,0,78,0,182,255,215,0,78,0,183,255,215,0,78,0,184,255,215,0,78,0,186,255,215,0,78,0,201,255,215,0,78,0,203,255,215,0,78,0,205,255,215,0,78,0,207,255,215,0,78,0,209,255,215,0,78,0,211,255,215,0,78,0,213,255,215,0,78,0,215,255,215,0,78,0,217,255,215,0,78,0,219,255,215,0,78,0,221,255,215,0,78,1,15,255,215,0,78,1,17,255,215,0,78,1,19,255,215,0,78,1,21,255,215,0,78,1,72,255,215,0,78,2,96,255,215,0,78,3,54,255,215,0,78,3,56,255,215,0,78,3,58,255,215,0,78,3,60,255,215,0,78,3,64,255,215,0,78,3,66,255,215,0,78,3,68,255,215,0,78,3,74,255,215,0,78,3,76,255,215,0,78,3,78,255,215,0,78,3,82,255,215,0,78,3,84,255,215,0,78,3,86,255,215,0,78,3,88,255,215,0,78,3,90,255,215,0,78,3,92,255,215,0,78,3,94,255,215,0,78,3,96,255,215,0,80,0,5,255,236,0,80,0,10,255,236,0,80,2,7,255,236,0,80,2,11,255,236,0,81,0,5,255,236,0,81,0,10,255,236,0,81,2,7,255,236,0,81,2,11,255,236,0,82,0,5,255,236,0,82,0,10,255,236,0,82,0,89,255,215,0,82,0,90,255,215,0,82,0,91,255,215,0,82,0,92,255,215,0,82,0,93,255,236,0,82,0,191,255,215,0,82,1,55,255,215,0,82,1,60,255,236,0,82,1,62,255,236,0,82,1,64,255,236,0,82,1,251,255,215,0,82,1,253,255,215,0,82,2,7,255,236,0,82,2,11,255,236,0,82,3,112,255,215,0,83,0,5,255,236,0,83,0,10,255,236,0,83,0,89,255,215,0,83,0,90,255,215,0,83,0,91,255,215,0,83,0,92,255,215,0,83,0,93,255,236,0,83,0,191,255,215,0,83,1,55,255,215,0,83,1,60,255,236,0,83,1,62,255,236,0,83,1,64,255,236,0,83,1,251,255,215,0,83,1,253,255,215,0,83,2,7,255,236,0,83,2,11,255,236,0,83,3,112,255,215,0,85,0,5,0,82,0,85,0,10,0,82,0,85,0,68,255,215,0,85,0,70,255,215,0,85,0,71,255,215,0,85,0,72,255,215,0,85,0,74,255,236,0,85,0,82,255,215,0,85,0,84,255,215,0,85,0,162,255,215,0,85,0,163,255,215,0,85,0,164,255,215,0,85,0,165,255,215,0,85,0,166,255,215,0,85,0,167,255,215,0,85,0,168,255,215,0,85,0,169,255,215,0,85,0,170,255,215,0,85,0,171,255,215,0,85,0,172,255,215,0,85,0,173,255,215,0,85,0,180,255,215,0,85,0,181,255,215,0,85,0,182,255,215,0,85,0,183,255,215,0,85,0,184,255,215,0,85,0,186,255,215,0,85,0,195,255,215,0,85,0,197,255,215,0,85,0,199,255,215,0,85,0,201,255,215,0,85,0,203,255,215,0,85,0,205,255,215,0,85,0,207,255,215,0,85,0,209,255,215,0,85,0,211,255,215,0,85,0,213,255,215,0,85,0,215,255,215,0,85,0,217,255,215,0,85,0,219,255,215,0,85,0,221,255,215,0,85,0,223,255,236,0,85,0,225,255,236,0,85,0,227,255,236,0,85,0,229,255,236,0,85,1,15,255,215,0,85,1,17,255,215,0,85,1,19,255,215,0,85,1,21,255,215,0,85,1,68,255,215,0,85,1,70,255,215,0,85,1,72,255,215,0,85,2,7,0,82,0,85,2,11,0,82,0,85,2,89,255,215,0,85,2,96,255,215,0,85,3,30,255,215,0,85,3,32,255,215,0,85,3,34,255,215,0,85,3,38,255,215,0,85,3,40,255,215,0,85,3,42,255,215,0,85,3,44,255,215,0,85,3,46,255,215,0,85,3,48,255,215,0,85,3,50,255,215,0,85,3,52,255,215,0,85,3,54,255,215,0,85,3,56,255,215,0,85,3,58,255,215,0,85,3,60,255,215,0,85,3,64,255,215,0,85,3,66,255,215,0,85,3,68,255,215,0,85,3,74,255,215,0,85,3,76,255,215,0,85,3,78,255,215,0,85,3,82,255,215,0,85,3,84,255,215,0,85,3,86,255,215,0,85,3,88,255,215,0,85,3,90,255,215,0,85,3,92,255,215,0,85,3,94,255,215,0,85,3,96,255,215,0,87,0,5,0,41,0,87,0,10,0,41,0,87,2,7,0,41,0,87,2,11,0,41,0,89,0,5,0,82,0,89,0,10,0,82,0,89,0,15,255,174,0,89,0,17,255,174,0,89,0,34,0,41,0,89,2,7,0,82,0,89,2,8,255,174,0,89,2,11,0,82,0,89,2,12,255,174,0,90,0,5,0,82,0,90,0,10,0,82,0,90,0,15,255,174,0,90,0,17,255,174,0,90,0,34,0,41,0,90,2,7,0,82,0,90,2,8,255,174,0,90,2,11,0,82,0,90,2,12,255,174,0,91,0,70,255,215,0,91,0,71,255,215,0,91,0,72,255,215,0,91,0,82,255,215,0,91,0,84,255,215,0,91,0,162,255,215,0,91,0,169,255,215,0,91,0,170,255,215,0,91,0,171,255,215,0,91,0,172,255,215,0,91,0,173,255,215,0,91,0,180,255,215,0,91,0,181,255,215,0,91,0,182,255,215,0,91,0,183,255,215,0,91,0,184,255,215,0,91,0,186,255,215,0,91,0,201,255,215,0,91,0,203,255,215,0,91,0,205,255,215,0,91,0,207,255,215,0,91,0,209,255,215,0,91,0,211,255,215,0,91,0,213,255,215,0,91,0,215,255,215,0,91,0,217,255,215,0,91,0,219,255,215,0,91,0,221,255,215,0,91,1,15,255,215,0,91,1,17,255,215,0,91,1,19,255,215,0,91,1,21,255,215,0,91,1,72,255,215,0,91,2,96,255,215,0,91,3,54,255,215,0,91,3,56,255,215,0,91,3,58,255,215,0,91,3,60,255,215,0,91,3,64,255,215,0,91,3,66,255,215,0,91,3,68,255,215,0,91,3,74,255,215,0,91,3,76,255,215,0,91,3,78,255,215,0,91,3,82,255,215,0,91,3,84,255,215,0,91,3,86,255,215,0,91,3,88,255,215,0,91,3,90,255,215,0,91,3,92,255,215,0,91,3,94,255,215,0,91,3,96,255,215,0,92,0,5,0,82,0,92,0,10,0,82,0,92,0,15,255,174,0,92,0,17,255,174,0,92,0,34,0,41,0,92,2,7,0,82,0,92,2,8,255,174,0,92,2,11,0,82,0,92,2,12,255,174,0,94,0,45,0,184,0,130,0,5,255,113,0,130,0,10,255,113,0,130,0,38,255,215,0,130,0,42,255,215,0,130,0,45,1,10,0,130,0,50,255,215,0,130,0,52,255,215,0,130,0,55,255,113,0,130,0,57,255,174,0,130,0,58,255,174,0,130,0,60,255,133,0,130,0,137,255,215,0,130,0,148,255,215,0,130,0,149,255,215,0,130,0,150,255,215,0,130,0,151,255,215,0,130,0,152,255,215,0,130,0,154,255,215,0,130,0,159,255,133,0,130,0,200,255,215,0,130,0,202,255,215,0,130,0,204,255,215,0,130,0,206,255,215,0,130,0,222,255,215,0,130,0,224,255,215,0,130,0,226,255,215,0,130,0,228,255,215,0,130,1,14,255,215,0,130,1,16,255,215,0,130,1,18,255,215,0,130,1,20,255,215,0,130,1,36,255,113,0,130,1,38,255,113,0,130,1,54,255,174,0,130,1,56,255,133,0,130,1,58,255,133,0,130,1,71,255,215,0,130,1,250,255,174,0,130,1,252,255,174,0,130,1,254,255,174,0,130,2,0,255,133,0,130,2,7,255,113,0,130,2,11,255,113,0,130,2,95,255,215,0,130,3,73,255,215,0,130,3,75,255,215,0,130,3,77,255,215,0,130,3,79,255,215,0,130,3,81,255,215,0,130,3,83,255,215,0,130,3,85,255,215,0,130,3,87,255,215,0,130,3,89,255,215,0,130,3,91,255,215,0,130,3,93,255,215,0,130,3,95,255,215,0,130,3,111,255,133,0,130,3,113,255,133,0,130,3,115,255,133,0,130,3,143,255,113,0,131,0,5,255,113,0,131,0,10,255,113,0,131,0,38,255,215,0,131,0,42,255,215,0,131,0,45,1,10,0,131,0,50,255,215,0,131,0,52,255,215,0,131,0,55,255,113,0,131,0,57,255,174,0,131,0,58,255,174,0,131,0,60,255,133,0,131,0,137,255,215,0,131,0,148,255,215,0,131,0,149,255,215,0,131,0,150,255,215,0,131,0,151,255,215,0,131,0,152,255,215,0,131,0,154,255,215,0,131,0,159,255,133,0,131,0,200,255,215,0,131,0,202,255,215,0,131,0,204,255,215,0,131,0,206,255,215,0,131,0,222,255,215,0,131,0,224,255,215,0,131,0,226,255,215,0,131,0,228,255,215,0,131,1,14,255,215,0,131,1,16,255,215,0,131,1,18,255,215,0,131,1,20,255,215,0,131,1,36,255,113,0,131,1,38,255,113,0,131,1,54,255,174,0,131,1,56,255,133,0,131,1,58,255,133,0,131,1,71,255,215,0,131,1,250,255,174,0,131,1,252,255,174,0,131,1,254,255,174,0,131,2,0,255,133,0,131,2,7,255,113,0,131,2,11,255,113,0,131,2,95,255,215,0,131,3,73,255,215,0,131,3,75,255,215,0,131,3,77,255,215,0,131,3,79,255,215,0,131,3,81,255,215,0,131,3,83,255,215,0,131,3,85,255,215,0,131,3,87,255,215,0,131,3,89,255,215,0,131,3,91,255,215,0,131,3,93,255,215,0,131,3,95,255,215,0,131,3,111,255,133,0,131,3,113,255,133,0,131,3,115,255,133,0,131,3,143,255,113,0,132,0,5,255,113,0,132,0,10,255,113,0,132,0,38,255,215,0,132,0,42,255,215,0,132,0,45,1,10,0,132,0,50,255,215,0,132,0,52,255,215,0,132,0,55,255,113,0,132,0,57,255,174,0,132,0,58,255,174,0,132,0,60,255,133,0,132,0,137,255,215,0,132,0,148,255,215,0,132,0,149,255,215,0,132,0,150,255,215,0,132,0,151,255,215,0,132,0,152,255,215,0,132,0,154,255,215,0,132,0,159,255,133,0,132,0,200,255,215,0,132,0,202,255,215,0,132,0,204,255,215,0,132,0,206,255,215,0,132,0,222,255,215,0,132,0,224,255,215,0,132,0,226,255,215,0,132,0,228,255,215,0,132,1,14,255,215,0,132,1,16,255,215,0,132,1,18,255,215,0,132,1,20,255,215,0,132,1,36,255,113,0,132,1,38,255,113,0,132,1,54,255,174,0,132,1,56,255,133,0,132,1,58,255,133,0,132,1,71,255,215,0,132,1,250,255,174,0,132,1,252,255,174,0,132,1,254,255,174,0,132,2,0,255,133,0,132,2,7,255,113,0,132,2,11,255,113,0,132,2,95,255,215,0,132,3,73,255,215,0,132,3,75,255,215,0,132,3,77,255,215,0,132,3,79,255,215,0,132,3,81,255,215,0,132,3,83,255,215,0,132,3,85,255,215,0,132,3,87,255,215,0,132,3,89,255,215,0,132,3,91,255,215,0,132,3,93,255,215,0,132,3,95,255,215,0,132,3,111,255,133,0,132,3,113,255,133,0,132,3,115,255,133,0,132,3,143,255,113,0,133,0,5,255,113,0,133,0,10,255,113,0,133,0,38,255,215,0,133,0,42,255,215,0,133,0,45,1,10,0,133,0,50,255,215,0,133,0,52,255,215,0,133,0,55,255,113,0,133,0,57,255,174,0,133,0,58,255,174,0,133,0,60,255,133,0,133,0,137,255,215,0,133,0,148,255,215,0,133,0,149,255,215,0,133,0,150,255,215,0,133,0,151,255,215,0,133,0,152,255,215,0,133,0,154,255,215,0,133,0,159,255,133,0,133,0,200,255,215,0,133,0,202,255,215,0,133,0,204,255,215,0,133,0,206,255,215,0,133,0,222,255,215,0,133,0,224,255,215,0,133,0,226,255,215,0,133,0,228,255,215,0,133,1,14,255,215,0,133,1,16,255,215,0,133,1,18,255,215,0,133,1,20,255,215,0,133,1,36,255,113,0,133,1,38,255,113,0,133,1,54,255,174,0,133,1,56,255,133,0,133,1,58,255,133,0,133,1,71,255,215,0,133,1,250,255,174,0,133,1,252,255,174,0,133,1,254,255,174,0,133,2,0,255,133,0,133,2,7,255,113,0,133,2,11,255,113,0,133,2,95,255,215,0,133,3,73,255,215,0,133,3,75,255,215,0,133,3,77,255,215,0,133,3,79,255,215,0,133,3,81,255,215,0,133,3,83,255,215,0,133,3,85,255,215,0,133,3,87,255,215,0,133,3,89,255,215,0,133,3,91,255,215,0,133,3,93,255,215,0,133,3,95,255,215,0,133,3,111,255,133,0,133,3,113,255,133,0,133,3,115,255,133,0,133,3,143,255,113,0,134,0,5,255,113,0,134,0,10,255,113,0,134,0,38,255,215,0,134,0,42,255,215,0,134,0,45,1,10,0,134,0,50,255,215,0,134,0,52,255,215,0,134,0,55,255,113,0,134,0,57,255,174,0,134,0,58,255,174,0,134,0,60,255,133,0,134,0,137,255,215,0,134,0,148,255,215,0,134,0,149,255,215,0,134,0,150,255,215,0,134,0,151,255,215,0,134,0,152,255,215,0,134,0,154,255,215,0,134,0,159,255,133,0,134,0,200,255,215,0,134,0,202,255,215,0,134,0,204,255,215,0,134,0,206,255,215,0,134,0,222,255,215,0,134,0,224,255,215,0,134,0,226,255,215,0,134,0,228,255,215,0,134,1,14,255,215,0,134,1,16,255,215,0,134,1,18,255,215,0,134,1,20,255,215,0,134,1,36,255,113,0,134,1,38,255,113,0,134,1,54,255,174,0,134,1,56,255,133,0,134,1,58,255,133,0,134,1,71,255,215,0,134,1,250,255,174,0,134,1,252,255,174,0,134,1,254,255,174,0,134,2,0,255,133,0,134,2,7,255,113,0,134,2,11,255,113,0,134,2,95,255,215,0,134,3,73,255,215,0,134,3,75,255,215,0,134,3,77,255,215,0,134,3,79,255,215,0,134,3,81,255,215,0,134,3,83,255,215,0,134,3,85,255,215,0,134,3,87,255,215,0,134,3,89,255,215,0,134,3,91,255,215,0,134,3,93,255,215,0,134,3,95,255,215,0,134,3,111,255,133,0,134,3,113,255,133,0,134,3,115,255,133,0,134,3,143,255,113,0,135,0,5,255,113,0,135,0,10,255,113,0,135,0,38,255,215,0,135,0,42,255,215,0,135,0,45,1,10,0,135,0,50,255,215,0,135,0,52,255,215,0,135,0,55,255,113,0,135,0,57,255,174,0,135,0,58,255,174,0,135,0,60,255,133,0,135,0,137,255,215,0,135,0,148,255,215,0,135,0,149,255,215,0,135,0,150,255,215,0,135,0,151,255,215,0,135,0,152,255,215,0,135,0,154,255,215,0,135,0,159,255,133,0,135,0,200,255,215,0,135,0,202,255,215,0,135,0,204,255,215,0,135,0,206,255,215,0,135,0,222,255,215,0,135,0,224,255,215,0,135,0,226,255,215,0,135,0,228,255,215,0,135,1,14,255,215,0,135,1,16,255,215,0,135,1,18,255,215,0,135,1,20,255,215,0,135,1,36,255,113,0,135,1,38,255,113,0,135,1,54,255,174,0,135,1,56,255,133,0,135,1,58,255,133,0,135,1,71,255,215,0,135,1,250,255,174,0,135,1,252,255,174,0,135,1,254,255,174,0,135,2,0,255,133,0,135,2,7,255,113,0,135,2,11,255,113,0,135,2,95,255,215,0,135,3,73,255,215,0,135,3,75,255,215,0,135,3,77,255,215,0,135,3,79,255,215,0,135,3,81,255,215,0,135,3,83,255,215,0,135,3,85,255,215,0,135,3,87,255,215,0,135,3,89,255,215,0,135,3,91,255,215,0,135,3,93,255,215,0,135,3,95,255,215,0,135,3,111,255,133,0,135,3,113,255,133,0,135,3,115,255,133,0,135,3,143,255,113,0,136,0,45,0,123,0,137,0,38,255,215,0,137,0,42,255,215,0,137,0,50,255,215,0,137,0,52,255,215,0,137,0,137,255,215,0,137,0,148,255,215,0,137,0,149,255,215,0,137,0,150,255,215,0,137,0,151,255,215,0,137,0,152,255,215,0,137,0,154,255,215,0,137,0,200,255,215,0,137,0,202,255,215,0,137,0,204,255,215,0,137,0,206,255,215,0,137,0,222,255,215,0,137,0,224,255,215,0,137,0,226,255,215,0,137,0,228,255,215,0,137,1,14,255,215,0,137,1,16,255,215,0,137,1,18,255,215,0,137,1,20,255,215,0,137,1,71,255,215,0,137,2,95,255,215,0,137,3,73,255,215,0,137,3,75,255,215,0,137,3,77,255,215,0,137,3,79,255,215,0,137,3,81,255,215,0,137,3,83,255,215,0,137,3,85,255,215,0,137,3,87,255,215,0,137,3,89,255,215,0,137,3,91,255,215,0,137,3,93,255,215,0,137,3,95,255,215,0,138,0,45,0,123,0,139,0,45,0,123,0,140,0,45,0,123,0,141,0,45,0,123,0,146,0,15,255,174,0,146,0,17,255,174,0,146,0,36,255,215,0,146,0,55,255,195,0,146,0,57,255,236,0,146,0,58,255,236,0,146,0,59,255,215,0,146,0,60,255,236,0,146,0,61,255,236,0,146,0,130,255,215,0,146,0,131,255,215,0,146,0,132,255,215,0,146,0,133,255,215,0,146,0,134,255,215,0,146,0,135,255,215,0,146,0,159,255,236,0,146,0,194,255,215,0,146,0,196,255,215,0,146,0,198,255,215,0,146,1,36,255,195,0,146,1,38,255,195,0,146,1,54,255,236,0,146,1,56,255,236,0,146,1,58,255,236,0,146,1,59,255,236,0,146,1,61,255,236,0,146,1,63,255,236,0,146,1,67,255,215,0,146,1,160,255,236,0,146,1,250,255,236,0,146,1,252,255,236,0,146,1,254,255,236,0,146,2,0,255,236,0,146,2,8,255,174,0,146,2,12,255,174,0,146,2,88,255,215,0,146,3,29,255,215,0,146,3,31,255,215,0,146,3,33,255,215,0,146,3,35,255,215,0,146,3,37,255,215,0,146,3,39,255,215,0,146,3,41,255,215,0,146,3,43,255,215,0,146,3,45,255,215,0,146,3,47,255,215,0,146,3,49,255,215,0,146,3,51,255,215,0,146,3,111,255,236,0,146,3,113,255,236,0,146,3,115,255,236,0,146,3,143,255,195,0,148,0,15,255,174,0,148,0,17,255,174,0,148,0,36,255,215,0,148,0,55,255,195,0,148,0,57,255,236,0,148,0,58,255,236,0,148,0,59,255,215,0,148,0,60,255,236,0,148,0,61,255,236,0,148,0,130,255,215,0,148,0,131,255,215,0,148,0,132,255,215,0,148,0,133,255,215,0,148,0,134,255,215,0,148,0,135,255,215,0,148,0,159,255,236,0,148,0,194,255,215,0,148,0,196,255,215,0,148,0,198,255,215,0,148,1,36,255,195,0,148,1,38,255,195,0,148,1,54,255,236,0,148,1,56,255,236,0,148,1,58,255,236,0,148,1,59,255,236,0,148,1,61,255,236,0,148,1,63,255,236,0,148,1,67,255,215,0,148,1,160,255,236,0,148,1,250,255,236,0,148,1,252,255,236,0,148,1,254,255,236,0,148,2,0,255,236,0,148,2,8,255,174,0,148,2,12,255,174,0,148,2,88,255,215,0,148,3,29,255,215,0,148,3,31,255,215,0,148,3,33,255,215,0,148,3,35,255,215,0,148,3,37,255,215,0,148,3,39,255,215,0,148,3,41,255,215,0,148,3,43,255,215,0,148,3,45,255,215,0,148,3,47,255,215,0,148,3,49,255,215,0,148,3,51,255,215,0,148,3,111,255,236,0,148,3,113,255,236,0,148,3,115,255,236,0,148,3,143,255,195,0,149,0,15,255,174,0,149,0,17,255,174,0,149,0,36,255,215,0,149,0,55,255,195,0,149,0,57,255,236,0,149,0,58,255,236,0,149,0,59,255,215,0,149,0,60,255,236,0,149,0,61,255,236,0,149,0,130,255,215,0,149,0,131,255,215,0,149,0,132,255,215,0,149,0,133,255,215,0,149,0,134,255,215,0,149,0,135,255,215,0,149,0,159,255,236,0,149,0,194,255,215,0,149,0,196,255,215,0,149,0,198,255,215,0,149,1,36,255,195,0,149,1,38,255,195,0,149,1,54,255,236,0,149,1,56,255,236,0,149,1,58,255,236,0,149,1,59,255,236,0,149,1,61,255,236,0,149,1,63,255,236,0,149,1,67,255,215,0,149,1,160,255,236,0,149,1,250,255,236,0,149,1,252,255,236,0,149,1,254,255,236,0,149,2,0,255,236,0,149,2,8,255,174,0,149,2,12,255,174,0,149,2,88,255,215,0,149,3,29,255,215,0,149,3,31,255,215,0,149,3,33,255,215,0,149,3,35,255,215,0,149,3,37,255,215,0,149,3,39,255,215,0,149,3,41,255,215,0,149,3,43,255,215,0,149,3,45,255,215,0,149,3,47,255,215,0,149,3,49,255,215,0,149,3,51,255,215,0,149,3,111,255,236,0,149,3,113,255,236,0,149,3,115,255,236,0,149,3,143,255,195,0,150,0,15,255,174,0,150,0,17,255,174,0,150,0,36,255,215,0,150,0,55,255,195,0,150,0,57,255,236,0,150,0,58,255,236,0,150,0,59,255,215,0,150,0,60,255,236,0,150,0,61,255,236,0,150,0,130,255,215,0,150,0,131,255,215,0,150,0,132,255,215,0,150,0,133,255,215,0,150,0,134,255,215,0,150,0,135,255,215,0,150,0,159,255,236,0,150,0,194,255,215,0,150,0,196,255,215,0,150,0,198,255,215,0,150,1,36,255,195,0,150,1,38,255,195,0,150,1,54,255,236,0,150,1,56,255,236,0,150,1,58,255,236,0,150,1,59,255,236,0,150,1,61,255,236,0,150,1,63,255,236,0,150,1,67,255,215,0,150,1,160,255,236,0,150,1,250,255,236,0,150,1,252,255,236,0,150,1,254,255,236,0,150,2,0,255,236,0,150,2,8,255,174,0,150,2,12,255,174,0,150,2,88,255,215,0,150,3,29,255,215,0,150,3,31,255,215,0,150,3,33,255,215,0,150,3,35,255,215,0,150,3,37,255,215,0,150,3,39,255,215,0,150,3,41,255,215,0,150,3,43,255,215,0,150,3,45,255,215,0,150,3,47,255,215,0,150,3,49,255,215,0,150,3,51,255,215,0,150,3,111,255,236,0,150,3,113,255,236,0,150,3,115,255,236,0,150,3,143,255,195,0,151,0,15,255,174,0,151,0,17,255,174,0,151,0,36,255,215,0,151,0,55,255,195,0,151,0,57,255,236,0,151,0,58,255,236,0,151,0,59,255,215,0,151,0,60,255,236,0,151,0,61,255,236,0,151,0,130,255,215,0,151,0,131,255,215,0,151,0,132,255,215,0,151,0,133,255,215,0,151,0,134,255,215,0,151,0,135,255,215,0,151,0,159,255,236,0,151,0,194,255,215,0,151,0,196,255,215,0,151,0,198,255,215,0,151,1,36,255,195,0,151,1,38,255,195,0,151,1,54,255,236,0,151,1,56,255,236,0,151,1,58,255,236,0,151,1,59,255,236,0,151,1,61,255,236,0,151,1,63,255,236,0,151,1,67,255,215,0,151,1,160,255,236,0,151,1,250,255,236,0,151,1,252,255,236,0,151,1,254,255,236,0,151,2,0,255,236,0,151,2,8,255,174,0,151,2,12,255,174,0,151,2,88,255,215,0,151,3,29,255,215,0,151,3,31,255,215,0,151,3,33,255,215,0,151,3,35,255,215,0,151,3,37,255,215,0,151,3,39,255,215,0,151,3,41,255,215,0,151,3,43,255,215,0,151,3,45,255,215,0,151,3,47,255,215,0,151,3,49,255,215,0,151,3,51,255,215,0,151,3,111,255,236,0,151,3,113,255,236,0,151,3,115,255,236,0,151,3,143,255,195,0,152,0,15,255,174,0,152,0,17,255,174,0,152,0,36,255,215,0,152,0,55,255,195,0,152,0,57,255,236,0,152,0,58,255,236,0,152,0,59,255,215,0,152,0,60,255,236,0,152,0,61,255,236,0,152,0,130,255,215,0,152,0,131,255,215,0,152,0,132,255,215,0,152,0,133,255,215,0,152,0,134,255,215,0,152,0,135,255,215,0,152,0,159,255,236,0,152,0,194,255,215,0,152,0,196,255,215,0,152,0,198,255,215,0,152,1,36,255,195,0,152,1,38,255,195,0,152,1,54,255,236,0,152,1,56,255,236,0,152,1,58,255,236,0,152,1,59,255,236,0,152,1,61,255,236,0,152,1,63,255,236,0,152,1,67,255,215,0,152,1,160,255,236,0,152,1,250,255,236,0,152,1,252,255,236,0,152,1,254,255,236,0,152,2,0,255,236,0,152,2,8,255,174,0,152,2,12,255,174,0,152,2,88,255,215,0,152,3,29,255,215,0,152,3,31,255,215,0,152,3,33,255,215,0,152,3,35,255,215,0,152,3,37,255,215,0,152,3,39,255,215,0,152,3,41,255,215,0,152,3,43,255,215,0,152,3,45,255,215,0,152,3,47,255,215,0,152,3,49,255,215,0,152,3,51,255,215,0,152,3,111,255,236,0,152,3,113,255,236,0,152,3,115,255,236,0,152,3,143,255,195,0,154,0,15,255,174,0,154,0,17,255,174,0,154,0,36,255,215,0,154,0,55,255,195,0,154,0,57,255,236,0,154,0,58,255,236,0,154,0,59,255,215,0,154,0,60,255,236,0,154,0,61,255,236,0,154,0,130,255,215,0,154,0,131,255,215,0,154,0,132,255,215,0,154,0,133,255,215,0,154,0,134,255,215,0,154,0,135,255,215,0,154,0,159,255,236,0,154,0,194,255,215,0,154,0,196,255,215,0,154,0,198,255,215,0,154,1,36,255,195,0,154,1,38,255,195,0,154,1,54,255,236,0,154,1,56,255,236,0,154,1,58,255,236,0,154,1,59,255,236,0,154,1,61,255,236,0,154,1,63,255,236,0,154,1,67,255,215,0,154,1,160,255,236,0,154,1,250,255,236,0,154,1,252,255,236,0,154,1,254,255,236,0,154,2,0,255,236,0,154,2,8,255,174,0,154,2,12,255,174,0,154,2,88,255,215,0,154,3,29,255,215,0,154,3,31,255,215,0,154,3,33,255,215,0,154,3,35,255,215,0,154,3,37,255,215,0,154,3,39,255,215,0,154,3,41,255,215,0,154,3,43,255,215,0,154,3,45,255,215,0,154,3,47,255,215,0,154,3,49,255,215,0,154,3,51,255,215,0,154,3,111,255,236,0,154,3,113,255,236,0,154,3,115,255,236,0,154,3,143,255,195,0,155,0,15,255,215,0,155,0,17,255,215,0,155,0,36,255,236,0,155,0,130,255,236,0,155,0,131,255,236,0,155,0,132,255,236,0,155,0,133,255,236,0,155,0,134,255,236,0,155,0,135,255,236,0,155,0,194,255,236,0,155,0,196,255,236,0,155,0,198,255,236,0,155,1,67,255,236,0,155,2,8,255,215,0,155,2,12,255,215,0,155,2,88,255,236,0,155,3,29,255,236,0,155,3,31,255,236,0,155,3,33,255,236,0,155,3,35,255,236,0,155,3,37,255,236,0,155,3,39,255,236,0,155,3,41,255,236,0,155,3,43,255,236,0,155,3,45,255,236,0,155,3,47,255,236,0,155,3,49,255,236,0,155,3,51,255,236,0,156,0,15,255,215,0,156,0,17,255,215,0,156,0,36,255,236,0,156,0,130,255,236,0,156,0,131,255,236,0,156,0,132,255,236,0,156,0,133,255,236,0,156,0,134,255,236,0,156,0,135,255,236,0,156,0,194,255,236,0,156,0,196,255,236,0,156,0,198,255,236,0,156,1,67,255,236,0,156,2,8,255,215,0,156,2,12,255,215,0,156,2,88,255,236,0,156,3,29,255,236,0,156,3,31,255,236,0,156,3,33,255,236,0,156,3,35,255,236,0,156,3,37,255,236,0,156,3,39,255,236,0,156,3,41,255,236,0,156,3,43,255,236,0,156,3,45,255,236,0,156,3,47,255,236,0,156,3,49,255,236,0,156,3,51,255,236,0,157,0,15,255,215,0,157,0,17,255,215,0,157,0,36,255,236,0,157,0,130,255,236,0,157,0,131,255,236,0,157,0,132,255,236,0,157,0,133,255,236,0,157,0,134,255,236,0,157,0,135,255,236,0,157,0,194,255,236,0,157,0,196,255,236,0,157,0,198,255,236,0,157,1,67,255,236,0,157,2,8,255,215,0,157,2,12,255,215,0,157,2,88,255,236,0,157,3,29,255,236,0,157,3,31,255,236,0,157,3,33,255,236,0,157,3,35,255,236,0,157,3,37,255,236,0,157,3,39,255,236,0,157,3,41,255,236,0,157,3,43,255,236,0,157,3,45,255,236,0,157,3,47,255,236,0,157,3,49,255,236,0,157,3,51,255,236,0,158,0,15,255,215,0,158,0,17,255,215,0,158,0,36,255,236,0,158,0,130,255,236,0,158,0,131,255,236,0,158,0,132,255,236,0,158,0,133,255,236,0,158,0,134,255,236,0,158,0,135,255,236,0,158,0,194,255,236,0,158,0,196,255,236,0,158,0,198,255,236,0,158,1,67,255,236,0,158,2,8,255,215,0,158,2,12,255,215,0,158,2,88,255,236,0,158,3,29,255,236,0,158,3,31,255,236,0,158,3,33,255,236,0,158,3,35,255,236,0,158,3,37,255,236,0,158,3,39,255,236,0,158,3,41,255,236,0,158,3,43,255,236,0,158,3,45,255,236,0,158,3,47,255,236,0,158,3,49,255,236,0,158,3,51,255,236,0,159,0,15,255,133,0,159,0,17,255,133,0,159,0,34,0,41,0,159,0,36,255,133,0,159,0,38,255,215,0,159,0,42,255,215,0,159,0,50,255,215,0,159,0,52,255,215,0,159,0,68,255,154,0,159,0,70,255,154,0,159,0,71,255,154,0,159,0,72,255,154,0,159,0,74,255,215,0,159,0,80,255,195,0,159,0,81,255,195,0,159,0,82,255,154,0,159,0,83,255,195,0,159,0,84,255,154,0,159,0,85,255,195,0,159,0,86,255,174,0,159,0,88,255,195,0,159,0,93,255,215,0,159,0,130,255,133,0,159,0,131,255,133,0,159,0,132,255,133,0,159,0,133,255,133,0,159,0,134,255,133,0,159,0,135,255,133,0,159,0,137,255,215,0,159,0,148,255,215,0,159,0,149,255,215,0,159,0,150,255,215,0,159,0,151,255,215,0,159,0,152,255,215,0,159,0,154,255,215,0,159,0,162,255,154,0,159,0,163,255,154,0,159,0,164,255,154,0,159,0,165,255,154,0,159,0,166,255,154,0,159,0,167,255,154,0,159,0,168,255,154,0,159,0,169,255,154,0,159,0,170,255,154,0,159,0,171,255,154,0,159,0,172,255,154,0,159,0,173,255,154,0,159,0,180,255,154,0,159,0,181,255,154,0,159,0,182,255,154,0,159,0,183,255,154,0,159,0,184,255,154,0,159,0,186,255,154,0,159,0,187,255,195,0,159,0,188,255,195,0,159,0,189,255,195,0,159,0,190,255,195,0,159,0,194,255,133,0,159,0,195,255,154,0,159,0,196,255,133,0,159,0,197,255,154,0,159,0,198,255,133,0,159,0,199,255,154,0,159,0,200,255,215,0,159,0,201,255,154,0,159,0,202,255,215,0,159,0,203,255,154,0,159,0,204,255,215,0,159,0,205,255,154,0,159,0,206,255,215,0,159,0,207,255,154,0,159,0,209,255,154,0,159,0,211,255,154,0,159,0,213,255,154,0,159,0,215,255,154,0,159,0,217,255,154,0,159,0,219,255,154,0,159,0,221,255,154,0,159,0,222,255,215,0,159,0,223,255,215,0,159,0,224,255,215,0,159,0,225,255,215,0,159,0,226,255,215,0,159,0,227,255,215,0,159,0,228,255,215,0,159,0,229,255,215,0,159,0,250,255,195,0,159,1,6,255,195,0,159,1,8,255,195,0,159,1,13,255,195,0,159,1,14,255,215,0,159,1,15,255,154,0,159,1,16,255,215,0,159,1,17,255,154,0,159,1,18,255,215,0,159,1,19,255,154,0,159,1,20,255,215,0,159,1,21,255,154,0,159,1,23,255,195,0,159,1,25,255,195,0,159,1,29,255,174,0,159,1,33,255,174,0,159,1,43,255,195,0,159,1,45,255,195,0,159,1,47,255,195,0,159,1,49,255,195,0,159,1,51,255,195,0,159,1,53,255,195,0,159,1,60,255,215,0,159,1,62,255,215,0,159,1,64,255,215,0,159,1,67,255,133,0,159,1,68,255,154,0,159,1,70,255,154,0,159,1,71,255,215,0,159,1,72,255,154,0,159,1,74,255,174,0,159,2,8,255,133,0,159,2,12,255,133,0,159,2,87,255,195,0,159,2,88,255,133,0,159,2,89,255,154,0,159,2,95,255,215,0,159,2,96,255,154,0,159,2,98,255,195,0,159,3,29,255,133,0,159,3,30,255,154,0,159,3,31,255,133,0,159,3,32,255,154,0,159,3,33,255,133,0,159,3,34,255,154,0,159,3,35,255,133,0,159,3,37,255,133,0,159,3,38,255,154,0,159,3,39,255,133,0,159,3,40,255,154,0,159,3,41,255,133,0,159,3,42,255,154,0,159,3,43,255,133,0,159,3,44,255,154,0,159,3,45,255,133,0,159,3,46,255,154,0,159,3,47,255,133,0,159,3,48,255,154,0,159,3,49,255,133,0,159,3,50,255,154,0,159,3,51,255,133,0,159,3,52,255,154,0,159,3,54,255,154,0,159,3,56,255,154,0,159,3,58,255,154,0,159,3,60,255,154,0,159,3,64,255,154,0,159,3,66,255,154,0,159,3,68,255,154,0,159,3,73,255,215,0,159,3,74,255,154,0,159,3,75,255,215,0,159,3,76,255,154,0,159,3,77,255,215,0,159,3,78,255,154,0,159,3,79,255,215,0,159,3,81,255,215,0,159,3,82,255,154,0,159,3,83,255,215,0,159,3,84,255,154,0,159,3,85,255,215,0,159,3,86,255,154,0,159,3,87,255,215,0,159,3,88,255,154,0,159,3,89,255,215,0,159,3,90,255,154,0,159,3,91,255,215,0,159,3,92,255,154,0,159,3,93,255,215,0,159,3,94,255,154,0,159,3,95,255,215,0,159,3,96,255,154,0,159,3,98,255,195,0,159,3,100,255,195,0,159,3,102,255,195,0,159,3,104,255,195,0,159,3,106,255,195,0,159,3,108,255,195,0,159,3,110,255,195,0,160,0,15,254,246,0,160,0,17,254,246,0,160,0,36,255,154,0,160,0,59,255,215,0,160,0,61,255,236,0,160,0,130,255,154,0,160,0,131,255,154,0,160,0,132,255,154,0,160,0,133,255,154,0,160,0,134,255,154,0,160,0,135,255,154,0,160,0,194,255,154,0,160,0,196,255,154,0,160,0,198,255,154,0,160,1,59,255,236,0,160,1,61,255,236,0,160,1,63,255,236,0,160,1,67,255,154,0,160,2,8,254,246,0,160,2,12,254,246,0,160,2,88,255,154,0,160,3,29,255,154,0,160,3,31,255,154,0,160,3,33,255,154,0,160,3,35,255,154,0,160,3,37,255,154,0,160,3,39,255,154,0,160,3,41,255,154,0,160,3,43,255,154,0,160,3,45,255,154,0,160,3,47,255,154,0,160,3,49,255,154,0,160,3,51,255,154,0,162,0,5,255,236,0,162,0,10,255,236,0,162,2,7,255,236,0,162,2,11,255,236,0,163,0,5,255,236,0,163,0,10,255,236,0,163,2,7,255,236,0,163,2,11,255,236,0,164,0,5,255,236,0,164,0,10,255,236,0,164,2,7,255,236,0,164,2,11,255,236,0,165,0,5,255,236,0,165,0,10,255,236,0,165,2,7,255,236,0,165,2,11,255,236,0,166,0,5,255,236,0,166,0,10,255,236,0,166,2,7,255,236,0,166,2,11,255,236,0,167,0,5,255,236,0,167,0,10,255,236,0,167,2,7,255,236,0,167,2,11,255,236,0,170,0,5,255,236,0,170,0,10,255,236,0,170,0,89,255,215,0,170,0,90,255,215,0,170,0,91,255,215,0,170,0,92,255,215,0,170,0,93,255,236,0,170,0,191,255,215,0,170,1,55,255,215,0,170,1,60,255,236,0,170,1,62,255,236,0,170,1,64,255,236,0,170,1,251,255,215,0,170,1,253,255,215,0,170,2,7,255,236,0,170,2,11,255,236,0,170,3,112,255,215,0,171,0,5,255,236,0,171,0,10,255,236,0,171,0,89,255,215,0,171,0,90,255,215,0,171,0,91,255,215,0,171,0,92,255,215,0,171,0,93,255,236,0,171,0,191,255,215,0,171,1,55,255,215,0,171,1,60,255,236,0,171,1,62,255,236,0,171,1,64,255,236,0,171,1,251,255,215,0,171,1,253,255,215,0,171,2,7,255,236,0,171,2,11,255,236,0,171,3,112,255,215,0,172,0,5,255,236,0,172,0,10,255,236,0,172,0,89,255,215,0,172,0,90,255,215,0,172,0,91,255,215,0,172,0,92,255,215,0,172,0,93,255,236,0,172,0,191,255,215,0,172,1,55,255,215,0,172,1,60,255,236,0,172,1,62,255,236,0,172,1,64,255,236,0,172,1,251,255,215,0,172,1,253,255,215,0,172,2,7,255,236,0,172,2,11,255,236,0,172,3,112,255,215,0,173,0,5,255,236,0,173,0,10,255,236,0,173,0,89,255,215,0,173,0,90,255,215,0,173,0,91,255,215,0,173,0,92,255,215,0,173,0,93,255,236,0,173,0,191,255,215,0,173,1,55,255,215,0,173,1,60,255,236,0,173,1,62,255,236,0,173,1,64,255,236,0,173,1,251,255,215,0,173,1,253,255,215,0,173,2,7,255,236,0,173,2,11,255,236,0,173,3,112,255,215,0,178,0,5,255,236,0,178,0,10,255,236,0,178,0,89,255,215,0,178,0,90,255,215,0,178,0,91,255,215,0,178,0,92,255,215,0,178,0,93,255,236,0,178,0,191,255,215,0,178,1,55,255,215,0,178,1,60,255,236,0,178,1,62,255,236,0,178,1,64,255,236,0,178,1,251,255,215,0,178,1,253,255,215,0,178,2,7,255,236,0,178,2,11,255,236,0,178,3,112,255,215,0,180,0,5,255,236,0,180,0,10,255,236,0,180,0,89,255,215,0,180,0,90,255,215,0,180,0,91,255,215,0,180,0,92,255,215,0,180,0,93,255,236,0,180,0,191,255,215,0,180,1,55,255,215,0,180,1,60,255,236,0,180,1,62,255,236,0,180,1,64,255,236,0,180,1,251,255,215,0,180,1,253,255,215,0,180,2,7,255,236,0,180,2,11,255,236,0,180,3,112,255,215,0,181,0,5,255,236,0,181,0,10,255,236,0,181,0,89,255,215,0,181,0,90,255,215,0,181,0,91,255,215,0,181,0,92,255,215,0,181,0,93,255,236,0,181,0,191,255,215,0,181,1,55,255,215,0,181,1,60,255,236,0,181,1,62,255,236,0,181,1,64,255,236,0,181,1,251,255,215,0,181,1,253,255,215,0,181,2,7,255,236,0,181,2,11,255,236,0,181,3,112,255,215,0,182,0,5,255,236,0,182,0,10,255,236,0,182,0,89,255,215,0,182,0,90,255,215,0,182,0,91,255,215,0,182,0,92,255,215,0,182,0,93,255,236,0,182,0,191,255,215,0,182,1,55,255,215,0,182,1,60,255,236,0,182,1,62,255,236,0,182,1,64,255,236,0,182,1,251,255,215,0,182,1,253,255,215,0,182,2,7,255,236,0,182,2,11,255,236,0,182,3,112,255,215,0,184,0,5,255,215,0,184,0,10,255,215,0,184,2,7,255,215,0,184,2,11,255,215,0,186,0,5,255,236,0,186,0,10,255,236,0,186,0,89,255,215,0,186,0,90,255,215,0,186,0,91,255,215,0,186,0,92,255,215,0,186,0,93,255,236,0,186,0,191,255,215,0,186,1,55,255,215,0,186,1,60,255,236,0,186,1,62,255,236,0,186,1,64,255,236,0,186,1,251,255,215,0,186,1,253,255,215,0,186,2,7,255,236,0,186,2,11,255,236,0,186,3,112,255,215,0,191,0,5,0,82,0,191,0,10,0,82,0,191,0,15,255,174,0,191,0,17,255,174,0,191,0,34,0,41,0,191,2,7,0,82,0,191,2,8,255,174,0,191,2,11,0,82,0,191,2,12,255,174,0,192,0,5,255,236,0,192,0,10,255,236,0,192,0,89,255,215,0,192,0,90,255,215,0,192,0,91,255,215,0,192,0,92,255,215,0,192,0,93,255,236,0,192,0,191,255,215,0,192,1,55,255,215,0,192,1,60,255,236,0,192,1,62,255,236,0,192,1,64,255,236,0,192,1,251,255,215,0,192,1,253,255,215,0,192,2,7,255,236,0,192,2,11,255,236,0,192,3,112,255,215,0,193,0,5,0,82,0,193,0,10,0,82,0,193,0,15,255,174,0,193,0,17,255,174,0,193,0,34,0,41,0,193,2,7,0,82,0,193,2,8,255,174,0,193,2,11,0,82,0,193,2,12,255,174,0,194,0,5,255,113,0,194,0,10,255,113,0,194,0,38,255,215,0,194,0,42,255,215,0,194,0,45,1,10,0,194,0,50,255,215,0,194,0,52,255,215,0,194,0,55,255,113,0,194,0,57,255,174,0,194,0,58,255,174,0,194,0,60,255,133,0,194,0,137,255,215,0,194,0,148,255,215,0,194,0,149,255,215,0,194,0,150,255,215,0,194,0,151,255,215,0,194,0,152,255,215,0,194,0,154,255,215,0,194,0,159,255,133,0,194,0,200,255,215,0,194,0,202,255,215,0,194,0,204,255,215,0,194,0,206,255,215,0,194,0,222,255,215,0,194,0,224,255,215,0,194,0,226,255,215,0,194,0,228,255,215,0,194,1,14,255,215,0,194,1,16,255,215,0,194,1,18,255,215,0,194,1,20,255,215,0,194,1,36,255,113,0,194,1,38,255,113,0,194,1,54,255,174,0,194,1,56,255,133,0,194,1,58,255,133,0,194,1,71,255,215,0,194,1,250,255,174,0,194,1,252,255,174,0,194,1,254,255,174,0,194,2,0,255,133,0,194,2,7,255,113,0,194,2,11,255,113,0,194,2,95,255,215,0,194,3,73,255,215,0,194,3,75,255,215,0,194,3,77,255,215,0,194,3,79,255,215,0,194,3,81,255,215,0,194,3,83,255,215,0,194,3,85,255,215,0,194,3,87,255,215,0,194,3,89,255,215,0,194,3,91,255,215,0,194,3,93,255,215,0,194,3,95,255,215,0,194,3,111,255,133,0,194,3,113,255,133,0,194,3,115,255,133,0,194,3,143,255,113,0,195,0,5,255,236,0,195,0,10,255,236,0,195,2,7,255,236,0,195,2,11,255,236,0,196,0,5,255,113,0,196,0,10,255,113,0,196,0,38,255,215,0,196,0,42,255,215,0,196,0,45,1,10,0,196,0,50,255,215,0,196,0,52,255,215,0,196,0,55,255,113,0,196,0,57,255,174,0,196,0,58,255,174,0,196,0,60,255,133,0,196,0,137,255,215,0,196,0,148,255,215,0,196,0,149,255,215,0,196,0,150,255,215,0,196,0,151,255,215,0,196,0,152,255,215,0,196,0,154,255,215,0,196,0,159,255,133,0,196,0,200,255,215,0,196,0,202,255,215,0,196,0,204,255,215,0,196,0,206,255,215,0,196,0,222,255,215,0,196,0,224,255,215,0,196,0,226,255,215,0,196,0,228,255,215,0,196,1,14,255,215,0,196,1,16,255,215,0,196,1,18,255,215,0,196,1,20,255,215,0,196,1,36,255,113,0,196,1,38,255,113,0,196,1,54,255,174,0,196,1,56,255,133,0,196,1,58,255,133,0,196,1,71,255,215,0,196,1,250,255,174,0,196,1,252,255,174,0,196,1,254,255,174,0,196,2,0,255,133,0,196,2,7,255,113,0,196,2,11,255,113,0,196,2,95,255,215,0,196,3,73,255,215,0,196,3,75,255,215,0,196,3,77,255,215,0,196,3,79,255,215,0,196,3,81,255,215,0,196,3,83,255,215,0,196,3,85,255,215,0,196,3,87,255,215,0,196,3,89,255,215,0,196,3,91,255,215,0,196,3,93,255,215,0,196,3,95,255,215,0,196,3,111,255,133,0,196,3,113,255,133,0,196,3,115,255,133,0,196,3,143,255,113,0,197,0,5,255,236,0,197,0,10,255,236,0,197,2,7,255,236,0,197,2,11,255,236,0,198,0,5,255,113,0,198,0,10,255,113,0,198,0,38,255,215,0,198,0,42,255,215,0,198,0,45,1,10,0,198,0,50,255,215,0,198,0,52,255,215,0,198,0,55,255,113,0,198,0,57,255,174,0,198,0,58,255,174,0,198,0,60,255,133,0,198,0,137,255,215,0,198,0,148,255,215,0,198,0,149,255,215,0,198,0,150,255,215,0,198,0,151,255,215,0,198,0,152,255,215,0,198,0,154,255,215,0,198,0,159,255,133,0,198,0,200,255,215,0,198,0,202,255,215,0,198,0,204,255,215,0,198,0,206,255,215,0,198,0,222,255,215,0,198,0,224,255,215,0,198,0,226,255,215,0,198,0,228,255,215,0,198,1,14,255,215,0,198,1,16,255,215,0,198,1,18,255,215,0,198,1,20,255,215,0,198,1,36,255,113,0,198,1,38,255,113,0,198,1,54,255,174,0,198,1,56,255,133,0,198,1,58,255,133,0,198,1,71,255,215,0,198,1,250,255,174,0,198,1,252,255,174,0,198,1,254,255,174,0,198,2,0,255,133,0,198,2,7,255,113,0,198,2,11,255,113,0,198,2,95,255,215,0,198,3,73,255,215,0,198,3,75,255,215,0,198,3,77,255,215,0,198,3,79,255,215,0,198,3,81,255,215,0,198,3,83,255,215,0,198,3,85,255,215,0,198,3,87,255,215,0,198,3,89,255,215,0,198,3,91,255,215,0,198,3,93,255,215,0,198,3,95,255,215,0,198,3,111,255,133,0,198,3,113,255,133,0,198,3,115,255,133,0,198,3,143,255,113,0,199,0,5,255,236,0,199,0,10,255,236,0,199,2,7,255,236,0,199,2,11,255,236,0,200,0,38,255,215,0,200,0,42,255,215,0,200,0,50,255,215,0,200,0,52,255,215,0,200,0,137,255,215,0,200,0,148,255,215,0,200,0,149,255,215,0,200,0,150,255,215,0,200,0,151,255,215,0,200,0,152,255,215,0,200,0,154,255,215,0,200,0,200,255,215,0,200,0,202,255,215,0,200,0,204,255,215,0,200,0,206,255,215,0,200,0,222,255,215,0,200,0,224,255,215,0,200,0,226,255,215,0,200,0,228,255,215,0,200,1,14,255,215,0,200,1,16,255,215,0,200,1,18,255,215,0,200,1,20,255,215,0,200,1,71,255,215,0,200,2,95,255,215,0,200,3,73,255,215,0,200,3,75,255,215,0,200,3,77,255,215,0,200,3,79,255,215,0,200,3,81,255,215,0,200,3,83,255,215,0,200,3,85,255,215,0,200,3,87,255,215,0,200,3,89,255,215,0,200,3,91,255,215,0,200,3,93,255,215,0,200,3,95,255,215,0,202,0,38,255,215,0,202,0,42,255,215,0,202,0,50,255,215,0,202,0,52,255,215,0,202,0,137,255,215,0,202,0,148,255,215,0,202,0,149,255,215,0,202,0,150,255,215,0,202,0,151,255,215,0,202,0,152,255,215,0,202,0,154,255,215,0,202,0,200,255,215,0,202,0,202,255,215,0,202,0,204,255,215,0,202,0,206,255,215,0,202,0,222,255,215,0,202,0,224,255,215,0,202,0,226,255,215,0,202,0,228,255,215,0,202,1,14,255,215,0,202,1,16,255,215,0,202,1,18,255,215,0,202,1,20,255,215,0,202,1,71,255,215,0,202,2,95,255,215,0,202,3,73,255,215,0,202,3,75,255,215,0,202,3,77,255,215,0,202,3,79,255,215,0,202,3,81,255,215,0,202,3,83,255,215,0,202,3,85,255,215,0,202,3,87,255,215,0,202,3,89,255,215,0,202,3,91,255,215,0,202,3,93,255,215,0,202,3,95,255,215,0,204,0,38,255,215,0,204,0,42,255,215,0,204,0,50,255,215,0,204,0,52,255,215,0,204,0,137,255,215,0,204,0,148,255,215,0,204,0,149,255,215,0,204,0,150,255,215,0,204,0,151,255,215,0,204,0,152,255,215,0,204,0,154,255,215,0,204,0,200,255,215,0,204,0,202,255,215,0,204,0,204,255,215,0,204,0,206,255,215,0,204,0,222,255,215,0,204,0,224,255,215,0,204,0,226,255,215,0,204,0,228,255,215,0,204,1,14,255,215,0,204,1,16,255,215,0,204,1,18,255,215,0,204,1,20,255,215,0,204,1,71,255,215,0,204,2,95,255,215,0,204,3,73,255,215,0,204,3,75,255,215,0,204,3,77,255,215,0,204,3,79,255,215,0,204,3,81,255,215,0,204,3,83,255,215,0,204,3,85,255,215,0,204,3,87,255,215,0,204,3,89,255,215,0,204,3,91,255,215,0,204,3,93,255,215,0,204,3,95,255,215,0,206,0,38,255,215,0,206,0,42,255,215,0,206,0,50,255,215,0,206,0,52,255,215,0,206,0,137,255,215,0,206,0,148,255,215,0,206,0,149,255,215,0,206,0,150,255,215,0,206,0,151,255,215,0,206,0,152,255,215,0,206,0,154,255,215,0,206,0,200,255,215,0,206,0,202,255,215,0,206,0,204,255,215,0,206,0,206,255,215,0,206,0,222,255,215,0,206,0,224,255,215,0,206,0,226,255,215,0,206,0,228,255,215,0,206,1,14,255,215,0,206,1,16,255,215,0,206,1,18,255,215,0,206,1,20,255,215,0,206,1,71,255,215,0,206,2,95,255,215,0,206,3,73,255,215,0,206,3,75,255,215,0,206,3,77,255,215,0,206,3,79,255,215,0,206,3,81,255,215,0,206,3,83,255,215,0,206,3,85,255,215,0,206,3,87,255,215,0,206,3,89,255,215,0,206,3,91,255,215,0,206,3,93,255,215,0,206,3,95,255,215,0,208,0,15,255,174,0,208,0,17,255,174,0,208,0,36,255,215,0,208,0,55,255,195,0,208,0,57,255,236,0,208,0,58,255,236,0,208,0,59,255,215,0,208,0,60,255,236,0,208,0,61,255,236,0,208,0,130,255,215,0,208,0,131,255,215,0,208,0,132,255,215,0,208,0,133,255,215,0,208,0,134,255,215,0,208,0,135,255,215,0,208,0,159,255,236,0,208,0,194,255,215,0,208,0,196,255,215,0,208,0,198,255,215,0,208,1,36,255,195,0,208,1,38,255,195,0,208,1,54,255,236,0,208,1,56,255,236,0,208,1,58,255,236,0,208,1,59,255,236,0,208,1,61,255,236,0,208,1,63,255,236,0,208,1,67,255,215,0,208,1,160,255,236,0,208,1,250,255,236,0,208,1,252,255,236,0,208,1,254,255,236,0,208,2,0,255,236,0,208,2,8,255,174,0,208,2,12,255,174,0,208,2,88,255,215,0,208,3,29,255,215,0,208,3,31,255,215,0,208,3,33,255,215,0,208,3,35,255,215,0,208,3,37,255,215,0,208,3,39,255,215,0,208,3,41,255,215,0,208,3,43,255,215,0,208,3,45,255,215,0,208,3,47,255,215,0,208,3,49,255,215,0,208,3,51,255,215,0,208,3,111,255,236,0,208,3,113,255,236,0,208,3,115,255,236,0,208,3,143,255,195,0,209,0,5,0,82,0,209,0,10,0,82,0,209,0,12,0,143,0,209,0,34,0,164,0,209,0,64,0,143,0,209,0,69,0,61,0,209,0,75,0,61,0,209,0,78,0,61,0,209,0,79,0,61,0,209,0,96,0,143,0,209,0,231,0,61,0,209,0,233,0,123,0,209,2,7,0,82,0,209,2,11,0,82,0,210,0,15,255,174,0,210,0,17,255,174,0,210,0,36,255,215,0,210,0,55,255,195,0,210,0,57,255,236,0,210,0,58,255,236,0,210,0,59,255,215,0,210,0,60,255,236,0,210,0,61,255,236,0,210,0,130,255,215,0,210,0,131,255,215,0,210,0,132,255,215,0,210,0,133,255,215,0,210,0,134,255,215,0,210,0,135,255,215,0,210,0,159,255,236,0,210,0,194,255,215,0,210,0,196,255,215,0,210,0,198,255,215,0,210,1,36,255,195,0,210,1,38,255,195,0,210,1,54,255,236,0,210,1,56,255,236,0,210,1,58,255,236,0,210,1,59,255,236,0,210,1,61,255,236,0,210,1,63,255,236,0,210,1,67,255,215,0,210,1,160,255,236,0,210,1,250,255,236,0,210,1,252,255,236,0,210,1,254,255,236,0,210,2,0,255,236,0,210,2,8,255,174,0,210,2,12,255,174,0,210,2,88,255,215,0,210,3,29,255,215,0,210,3,31,255,215,0,210,3,33,255,215,0,210,3,35,255,215,0,210,3,37,255,215,0,210,3,39,255,215,0,210,3,41,255,215,0,210,3,43,255,215,0,210,3,45,255,215,0,210,3,47,255,215,0,210,3,49,255,215,0,210,3,51,255,215,0,210,3,111,255,236,0,210,3,113,255,236,0,210,3,115,255,236,0,210,3,143,255,195,0,212,0,45,0,123,0,213,0,5,255,236,0,213,0,10,255,236,0,213,0,89,255,215,0,213,0,90,255,215,0,213,0,91,255,215,0,213,0,92,255,215,0,213,0,93,255,236,0,213,0,191,255,215,0,213,1,55,255,215,0,213,1,60,255,236,0,213,1,62,255,236,0,213,1,64,255,236,0,213,1,251,255,215,0,213,1,253,255,215,0,213,2,7,255,236,0,213,2,11,255,236,0,213,3,112,255,215,0,214,0,45,0,123,0,215,0,5,255,236,0,215,0,10,255,236,0,215,0,89,255,215,0,215,0,90,255,215,0,215,0,91,255,215,0,215,0,92,255,215,0,215,0,93,255,236,0,215,0,191,255,215,0,215,1,55,255,215,0,215,1,60,255,236,0,215,1,62,255,236,0,215,1,64,255,236,0,215,1,251,255,215,0,215,1,253,255,215,0,215,2,7,255,236,0,215,2,11,255,236,0,215,3,112,255,215,0,216,0,45,0,123,0,217,0,5,255,236,0,217,0,10,255,236,0,217,0,89,255,215,0,217,0,90,255,215,0,217,0,91,255,215,0,217,0,92,255,215,0,217,0,93,255,236,0,217,0,191,255,215,0,217,1,55,255,215,0,217,1,60,255,236,0,217,1,62,255,236,0,217,1,64,255,236,0,217,1,251,255,215,0,217,1,253,255,215,0,217,2,7,255,236,0,217,2,11,255,236,0,217,3,112,255,215,0,218,0,45,0,123,0,219,0,5,255,236,0,219,0,10,255,236,0,219,0,89,255,215,0,219,0,90,255,215,0,219,0,91,255,215,0,219,0,92,255,215,0,219,0,93,255,236,0,219,0,191,255,215,0,219,1,55,255,215,0,219,1,60,255,236,0,219,1,62,255,236,0,219,1,64,255,236,0,219,1,251,255,215,0,219,1,253,255,215,0,219,2,7,255,236,0,219,2,11,255,236,0,219,3,112,255,215,0,220,0,45,0,123,0,221,0,5,255,236,0,221,0,10,255,236,0,221,0,89,255,215,0,221,0,90,255,215,0,221,0,91,255,215,0,221,0,92,255,215,0,221,0,93,255,236,0,221,0,191,255,215,0,221,1,55,255,215,0,221,1,60,255,236,0,221,1,62,255,236,0,221,1,64,255,236,0,221,1,251,255,215,0,221,1,253,255,215,0,221,2,7,255,236,0,221,2,11,255,236,0,221,3,112,255,215,0,231,0,5,255,236,0,231,0,10,255,236,0,231,2,7,255,236,0,231,2,11,255,236,0,248,0,38,255,215,0,248,0,42,255,215,0,248,0,50,255,215,0,248,0,52,255,215,0,248,0,137,255,215,0,248,0,148,255,215,0,248,0,149,255,215,0,248,0,150,255,215,0,248,0,151,255,215,0,248,0,152,255,215,0,248,0,154,255,215,0,248,0,200,255,215,0,248,0,202,255,215,0,248,0,204,255,215,0,248,0,206,255,215,0,248,0,222,255,215,0,248,0,224,255,215,0,248,0,226,255,215,0,248,0,228,255,215,0,248,1,14,255,215,0,248,1,16,255,215,0,248,1,18,255,215,0,248,1,20,255,215,0,248,1,71,255,215,0,248,2,95,255,215,0,248,3,73,255,215,0,248,3,75,255,215,0,248,3,77,255,215,0,248,3,79,255,215,0,248,3,81,255,215,0,248,3,83,255,215,0,248,3,85,255,215,0,248,3,87,255,215,0,248,3,89,255,215,0,248,3,91,255,215,0,248,3,93,255,215,0,248,3,95,255,215,0,249,0,70,255,215,0,249,0,71,255,215,0,249,0,72,255,215,0,249,0,82,255,215,0,249,0,84,255,215,0,249,0,162,255,215,0,249,0,169,255,215,0,249,0,170,255,215,0,249,0,171,255,215,0,249,0,172,255,215,0,249,0,173,255,215,0,249,0,180,255,215,0,249,0,181,255,215,0,249,0,182,255,215,0,249,0,183,255,215,0,249,0,184,255,215,0,249,0,186,255,215,0,249,0,201,255,215,0,249,0,203,255,215,0,249,0,205,255,215,0,249,0,207,255,215,0,249,0,209,255,215,0,249,0,211,255,215,0,249,0,213,255,215,0,249,0,215,255,215,0,249,0,217,255,215,0,249,0,219,255,215,0,249,0,221,255,215,0,249,1,15,255,215,0,249,1,17,255,215,0,249,1,19,255,215,0,249,1,21,255,215,0,249,1,72,255,215,0,249,2,96,255,215,0,249,3,54,255,215,0,249,3,56,255,215,0,249,3,58,255,215,0,249,3,60,255,215,0,249,3,64,255,215,0,249,3,66,255,215,0,249,3,68,255,215,0,249,3,74,255,215,0,249,3,76,255,215,0,249,3,78,255,215,0,249,3,82,255,215,0,249,3,84,255,215,0,249,3,86,255,215,0,249,3,88,255,215,0,249,3,90,255,215,0,249,3,92,255,215,0,249,3,94,255,215,0,249,3,96,255,215,0,250,0,70,255,215,0,250,0,71,255,215,0,250,0,72,255,215,0,250,0,82,255,215,0,250,0,84,255,215,0,250,0,162,255,215,0,250,0,169,255,215,0,250,0,170,255,215,0,250,0,171,255,215,0,250,0,172,255,215,0,250,0,173,255,215,0,250,0,180,255,215,0,250,0,181,255,215,0,250,0,182,255,215,0,250,0,183,255,215,0,250,0,184,255,215,0,250,0,186,255,215,0,250,0,201,255,215,0,250,0,203,255,215,0,250,0,205,255,215,0,250,0,207,255,215,0,250,0,209,255,215,0,250,0,211,255,215,0,250,0,213,255,215,0,250,0,215,255,215,0,250,0,217,255,215,0,250,0,219,255,215,0,250,0,221,255,215,0,250,1,15,255,215,0,250,1,17,255,215,0,250,1,19,255,215,0,250,1,21,255,215,0,250,1,72,255,215,0,250,2,96,255,215,0,250,3,54,255,215,0,250,3,56,255,215,0,250,3,58,255,215,0,250,3,60,255,215,0,250,3,64,255,215,0,250,3,66,255,215,0,250,3,68,255,215,0,250,3,74,255,215,0,250,3,76,255,215,0,250,3,78,255,215,0,250,3,82,255,215,0,250,3,84,255,215,0,250,3,86,255,215,0,250,3,88,255,215,0,250,3,90,255,215,0,250,3,92,255,215,0,250,3,94,255,215,0,250,3,96,255,215,0,251,0,5,255,92,0,251,0,10,255,92,0,251,0,38,255,215,0,251,0,42,255,215,0,251,0,50,255,215,0,251,0,52,255,215,0,251,0,55,255,215,0,251,0,56,255,236,0,251,0,57,255,215,0,251,0,58,255,215,0,251,0,60,255,195,0,251,0,137,255,215,0,251,0,148,255,215,0,251,0,149,255,215,0,251,0,150,255,215,0,251,0,151,255,215,0,251,0,152,255,215,0,251,0,154,255,215,0,251,0,155,255,236,0,251,0,156,255,236,0,251,0,157,255,236,0,251,0,158,255,236,0,251,0,159,255,195,0,251,0,200,255,215,0,251,0,202,255,215,0,251,0,204,255,215,0,251,0,206,255,215,0,251,0,222,255,215,0,251,0,224,255,215,0,251,0,226,255,215,0,251,0,228,255,215,0,251,1,14,255,215,0,251,1,16,255,215,0,251,1,18,255,215,0,251,1,20,255,215,0,251,1,36,255,215,0,251,1,38,255,215,0,251,1,42,255,236,0,251,1,44,255,236,0,251,1,46,255,236,0,251,1,48,255,236,0,251,1,50,255,236,0,251,1,52,255,236,0,251,1,54,255,215,0,251,1,56,255,195,0,251,1,58,255,195,0,251,1,71,255,215,0,251,1,250,255,215,0,251,1,252,255,215,0,251,1,254,255,215,0,251,2,0,255,195,0,251,2,7,255,92,0,251,2,11,255,92,0,251,2,95,255,215,0,251,2,97,255,236,0,251,3,73,255,215,0,251,3,75,255,215,0,251,3,77,255,215,0,251,3,79,255,215,0,251,3,81,255,215,0,251,3,83,255,215,0,251,3,85,255,215,0,251,3,87,255,215,0,251,3,89,255,215,0,251,3,91,255,215,0,251,3,93,255,215,0,251,3,95,255,215,0,251,3,97,255,236,0,251,3,99,255,236,0,251,3,101,255,236,0,251,3,103,255,236,0,251,3,105,255,236,0,251,3,107,255,236,0,251,3,109,255,236,0,251,3,111,255,195,0,251,3,113,255,195,0,251,3,115,255,195,0,251,3,143,255,215,0,253,0,5,255,92,0,253,0,10,255,92,0,253,0,38,255,215,0,253,0,42,255,215,0,253,0,50,255,215,0,253,0,52,255,215,0,253,0,55,255,215,0,253,0,56,255,236,0,253,0,57,255,215,0,253,0,58,255,215,0,253,0,60,255,195,0,253,0,137,255,215,0,253,0,148,255,215,0,253,0,149,255,215,0,253,0,150,255,215,0,253,0,151,255,215,0,253,0,152,255,215,0,253,0,154,255,215,0,253,0,155,255,236,0,253,0,156,255,236,0,253,0,157,255,236,0,253,0,158,255,236,0,253,0,159,255,195,0,253,0,200,255,215,0,253,0,202,255,215,0,253,0,204,255,215,0,253,0,206,255,215,0,253,0,222,255,215,0,253,0,224,255,215,0,253,0,226,255,215,0,253,0,228,255,215,0,253,1,14,255,215,0,253,1,16,255,215,0,253,1,18,255,215,0,253,1,20,255,215,0,253,1,36,255,215,0,253,1,38,255,215,0,253,1,42,255,236,0,253,1,44,255,236,0,253,1,46,255,236,0,253,1,48,255,236,0,253,1,50,255,236,0,253,1,52,255,236,0,253,1,54,255,215,0,253,1,56,255,195,0,253,1,58,255,195,0,253,1,71,255,215,0,253,1,250,255,215,0,253,1,252,255,215,0,253,1,254,255,215,0,253,2,0,255,195,0,253,2,7,255,92,0,253,2,11,255,92,0,253,2,95,255,215,0,253,2,97,255,236,0,253,3,73,255,215,0,253,3,75,255,215,0,253,3,77,255,215,0,253,3,79,255,215,0,253,3,81,255,215,0,253,3,83,255,215,0,253,3,85,255,215,0,253,3,87,255,215,0,253,3,89,255,215,0,253,3,91,255,215,0,253,3,93,255,215,0,253,3,95,255,215,0,253,3,97,255,236,0,253,3,99,255,236,0,253,3,101,255,236,0,253,3,103,255,236,0,253,3,105,255,236,0,253,3,107,255,236,0,253,3,109,255,236,0,253,3,111,255,195,0,253,3,113,255,195,0,253,3,115,255,195,0,253,3,143,255,215,0,255,0,5,255,92,0,255,0,10,255,92,0,255,0,38,255,215,0,255,0,42,255,215,0,255,0,50,255,215,0,255,0,52,255,215,0,255,0,55,255,215,0,255,0,56,255,236,0,255,0,57,255,215,0,255,0,58,255,215,0,255,0,60,255,195,0,255,0,137,255,215,0,255,0,148,255,215,0,255,0,149,255,215,0,255,0,150,255,215,0,255,0,151,255,215,0,255,0,152,255,215,0,255,0,154,255,215,0,255,0,155,255,236,0,255,0,156,255,236,0,255,0,157,255,236,0,255,0,158,255,236,0,255,0,159,255,195,0,255,0,200,255,215,0,255,0,202,255,215,0,255,0,204,255,215,0,255,0,206,255,215,0,255,0,222,255,215,0,255,0,224,255,215,0,255,0,226,255,215,0,255,0,228,255,215,0,255,1,14,255,215,0,255,1,16,255,215,0,255,1,18,255,215,0,255,1,20,255,215,0,255,1,36,255,215,0,255,1,38,255,215,0,255,1,42,255,236,0,255,1,44,255,236,0,255,1,46,255,236,0,255,1,48,255,236,0,255,1,50,255,236,0,255,1,52,255,236,0,255,1,54,255,215,0,255,1,56,255,195,0,255,1,58,255,195,0,255,1,71,255,215,0,255,1,250,255,215,0,255,1,252,255,215,0,255,1,254,255,215,0,255,2,0,255,195,0,255,2,7,255,92,0,255,2,11,255,92,0,255,2,95,255,215,0,255,2,97,255,236,0,255,3,73,255,215,0,255,3,75,255,215,0,255,3,77,255,215,0,255,3,79,255,215,0,255,3,81,255,215,0,255,3,83,255,215,0,255,3,85,255,215,0,255,3,87,255,215,0,255,3,89,255,215,0,255,3,91,255,215,0,255,3,93,255,215,0,255,3,95,255,215,0,255,3,97,255,236,0,255,3,99,255,236,0,255,3,101,255,236,0,255,3,103,255,236,0,255,3,105,255,236,0,255,3,107,255,236,0,255,3,109,255,236,0,255,3,111,255,195,0,255,3,113,255,195,0,255,3,115,255,195,0,255,3,143,255,215,1,0,0,5,0,82,1,0,0,10,0,82,1,0,0,12,0,143,1,0,0,34,0,143,1,0,0,64,0,143,1,0,0,69,0,61,1,0,0,75,0,61,1,0,0,78,0,61,1,0,0,79,0,61,1,0,0,96,0,143,1,0,0,231,0,61,1,0,0,233,0,143,1,0,2,7,0,82,1,0,2,11,0,82,1,1,0,5,255,92,1,1,0,10,255,92,1,1,0,38,255,215,1,1,0,42,255,215,1,1,0,50,255,215,1,1,0,52,255,215,1,1,0,55,255,215,1,1,0,56,255,236,1,1,0,57,255,215,1,1,0,58,255,215,1,1,0,60,255,195,1,1,0,137,255,215,1,1,0,148,255,215,1,1,0,149,255,215,1,1,0,150,255,215,1,1,0,151,255,215,1,1,0,152,255,215,1,1,0,154,255,215,1,1,0,155,255,236,1,1,0,156,255,236,1,1,0,157,255,236,1,1,0,158,255,236,1,1,0,159,255,195,1,1,0,200,255,215,1,1,0,202,255,215,1,1,0,204,255,215,1,1,0,206,255,215,1,1,0,222,255,215,1,1,0,224,255,215,1,1,0,226,255,215,1,1,0,228,255,215,1,1,1,14,255,215,1,1,1,16,255,215,1,1,1,18,255,215,1,1,1,20,255,215,1,1,1,36,255,215,1,1,1,38,255,215,1,1,1,42,255,236,1,1,1,44,255,236,1,1,1,46,255,236,1,1,1,48,255,236,1,1,1,50,255,236,1,1,1,52,255,236,1,1,1,54,255,215,1,1,1,56,255,195,1,1,1,58,255,195,1,1,1,71,255,215,1,1,1,250,255,215,1,1,1,252,255,215,1,1,1,254,255,215,1,1,2,0,255,195,1,1,2,7,255,92,1,1,2,11,255,92,1,1,2,95,255,215,1,1,2,97,255,236,1,1,3,73,255,215,1,1,3,75,255,215,1,1,3,77,255,215,1,1,3,79,255,215,1,1,3,81,255,215,1,1,3,83,255,215,1,1,3,85,255,215,1,1,3,87,255,215,1,1,3,89,255,215,1,1,3,91,255,215,1,1,3,93,255,215,1,1,3,95,255,215,1,1,3,97,255,236,1,1,3,99,255,236,1,1,3,101,255,236,1,1,3,103,255,236,1,1,3,105,255,236,1,1,3,107,255,236,1,1,3,109,255,236,1,1,3,111,255,195,1,1,3,113,255,195,1,1,3,115,255,195,1,1,3,143,255,215,1,3,0,5,255,92,1,3,0,10,255,92,1,3,0,38,255,215,1,3,0,42,255,215,1,3,0,50,255,215,1,3,0,52,255,215,1,3,0,55,255,215,1,3,0,56,255,236,1,3,0,57,255,215,1,3,0,58,255,215,1,3,0,60,255,195,1,3,0,137,255,215,1,3,0,148,255,215,1,3,0,149,255,215,1,3,0,150,255,215,1,3,0,151,255,215,1,3,0,152,255,215,1,3,0,154,255,215,1,3,0,155,255,236,1,3,0,156,255,236,1,3,0,157,255,236,1,3,0,158,255,236,1,3,0,159,255,195,1,3,0,200,255,215,1,3,0,202,255,215,1,3,0,204,255,215,1,3,0,206,255,215,1,3,0,222,255,215,1,3,0,224,255,215,1,3,0,226,255,215,1,3,0,228,255,215,1,3,1,14,255,215,1,3,1,16,255,215,1,3,1,18,255,215,1,3,1,20,255,215,1,3,1,36,255,215,1,3,1,38,255,215,1,3,1,42,255,236,1,3,1,44,255,236,1,3,1,46,255,236,1,3,1,48,255,236,1,3,1,50,255,236,1,3,1,52,255,236,1,3,1,54,255,215,1,3,1,56,255,195,1,3,1,58,255,195,1,3,1,71,255,215,1,3,1,250,255,215,1,3,1,252,255,215,1,3,1,254,255,215,1,3,2,0,255,195,1,3,2,7,255,92,1,3,2,11,255,92,1,3,2,95,255,215,1,3,2,97,255,236,1,3,3,73,255,215,1,3,3,75,255,215,1,3,3,77,255,215,1,3,3,79,255,215,1,3,3,81,255,215,1,3,3,83,255,215,1,3,3,85,255,215,1,3,3,87,255,215,1,3,3,89,255,215,1,3,3,91,255,215,1,3,3,93,255,215,1,3,3,95,255,215,1,3,3,97,255,236,1,3,3,99,255,236,1,3,3,101,255,236,1,3,3,103,255,236,1,3,3,105,255,236,1,3,3,107,255,236,1,3,3,109,255,236,1,3,3,111,255,195,1,3,3,113,255,195,1,3,3,115,255,195,1,3,3,143,255,215,1,8,0,5,255,236,1,8,0,10,255,236,1,8,2,7,255,236,1,8,2,11,255,236,1,14,0,15,255,174,1,14,0,17,255,174,1,14,0,36,255,215,1,14,0,55,255,195,1,14,0,57,255,236,1,14,0,58,255,236,1,14,0,59,255,215,1,14,0,60,255,236,1,14,0,61,255,236,1,14,0,130,255,215,1,14,0,131,255,215,1,14,0,132,255,215,1,14,0,133,255,215,1,14,0,134,255,215,1,14,0,135,255,215,1,14,0,159,255,236,1,14,0,194,255,215,1,14,0,196,255,215,1,14,0,198,255,215,1,14,1,36,255,195,1,14,1,38,255,195,1,14,1,54,255,236,1,14,1,56,255,236,1,14,1,58,255,236,1,14,1,59,255,236,1,14,1,61,255,236,1,14,1,63,255,236,1,14,1,67,255,215,1,14,1,160,255,236,1,14,1,250,255,236,1,14,1,252,255,236,1,14,1,254,255,236,1,14,2,0,255,236,1,14,2,8,255,174,1,14,2,12,255,174,1,14,2,88,255,215,1,14,3,29,255,215,1,14,3,31,255,215,1,14,3,33,255,215,1,14,3,35,255,215,1,14,3,37,255,215,1,14,3,39,255,215,1,14,3,41,255,215,1,14,3,43,255,215,1,14,3,45,255,215,1,14,3,47,255,215,1,14,3,49,255,215,1,14,3,51,255,215,1,14,3,111,255,236,1,14,3,113,255,236,1,14,3,115,255,236,1,14,3,143,255,195,1,16,0,15,255,174,1,16,0,17,255,174,1,16,0,36,255,215,1,16,0,55,255,195,1,16,0,57,255,236,1,16,0,58,255,236,1,16,0,59,255,215,1,16,0,60,255,236,1,16,0,61,255,236,1,16,0,130,255,215,1,16,0,131,255,215,1,16,0,132,255,215,1,16,0,133,255,215,1,16,0,134,255,215,1,16,0,135,255,215,1,16,0,159,255,236,1,16,0,194,255,215,1,16,0,196,255,215,1,16,0,198,255,215,1,16,1,36,255,195,1,16,1,38,255,195,1,16,1,54,255,236,1,16,1,56,255,236,1,16,1,58,255,236,1,16,1,59,255,236,1,16,1,61,255,236,1,16,1,63,255,236,1,16,1,67,255,215,1,16,1,160,255,236,1,16,1,250,255,236,1,16,1,252,255,236,1,16,1,254,255,236,1,16,2,0,255,236,1,16,2,8,255,174,1,16,2,12,255,174,1,16,2,88,255,215,1,16,3,29,255,215,1,16,3,31,255,215,1,16,3,33,255,215,1,16,3,35,255,215,1,16,3,37,255,215,1,16,3,39,255,215,1,16,3,41,255,215,1,16,3,43,255,215,1,16,3,45,255,215,1,16,3,47,255,215,1,16,3,49,255,215,1,16,3,51,255,215,1,16,3,111,255,236,1,16,3,113,255,236,1,16,3,115,255,236,1,16,3,143,255,195,1,18,0,15,255,174,1,18,0,17,255,174,1,18,0,36,255,215,1,18,0,55,255,195,1,18,0,57,255,236,1,18,0,58,255,236,1,18,0,59,255,215,1,18,0,60,255,236,1,18,0,61,255,236,1,18,0,130,255,215,1,18,0,131,255,215,1,18,0,132,255,215,1,18,0,133,255,215,1,18,0,134,255,215,1,18,0,135,255,215,1,18,0,159,255,236,1,18,0,194,255,215,1,18,0,196,255,215,1,18,0,198,255,215,1,18,1,36,255,195,1,18,1,38,255,195,1,18,1,54,255,236,1,18,1,56,255,236,1,18,1,58,255,236,1,18,1,59,255,236,1,18,1,61,255,236,1,18,1,63,255,236,1,18,1,67,255,215,1,18,1,160,255,236,1,18,1,250,255,236,1,18,1,252,255,236,1,18,1,254,255,236,1,18,2,0,255,236,1,18,2,8,255,174,1,18,2,12,255,174,1,18,2,88,255,215,1,18,3,29,255,215,1,18,3,31,255,215,1,18,3,33,255,215,1,18,3,35,255,215,1,18,3,37,255,215,1,18,3,39,255,215,1,18,3,41,255,215,1,18,3,43,255,215,1,18,3,45,255,215,1,18,3,47,255,215,1,18,3,49,255,215,1,18,3,51,255,215,1,18,3,111,255,236,1,18,3,113,255,236,1,18,3,115,255,236,1,18,3,143,255,195,1,20,0,45,0,123,1,23,0,5,0,82,1,23,0,10,0,82,1,23,0,68,255,215,1,23,0,70,255,215,1,23,0,71,255,215,1,23,0,72,255,215,1,23,0,74,255,236,1,23,0,82,255,215,1,23,0,84,255,215,1,23,0,162,255,215,1,23,0,163,255,215,1,23,0,164,255,215,1,23,0,165,255,215,1,23,0,166,255,215,1,23,0,167,255,215,1,23,0,168,255,215,1,23,0,169,255,215,1,23,0,170,255,215,1,23,0,171,255,215,1,23,0,172,255,215,1,23,0,173,255,215,1,23,0,180,255,215,1,23,0,181,255,215,1,23,0,182,255,215,1,23,0,183,255,215,1,23,0,184,255,215,1,23,0,186,255,215,1,23,0,195,255,215,1,23,0,197,255,215,1,23,0,199,255,215,1,23,0,201,255,215,1,23,0,203,255,215,1,23,0,205,255,215,1,23,0,207,255,215,1,23,0,209,255,215,1,23,0,211,255,215,1,23,0,213,255,215,1,23,0,215,255,215,1,23,0,217,255,215,1,23,0,219,255,215,1,23,0,221,255,215,1,23,0,223,255,236,1,23,0,225,255,236,1,23,0,227,255,236,1,23,0,229,255,236,1,23,1,15,255,215,1,23,1,17,255,215,1,23,1,19,255,215,1,23,1,21,255,215,1,23,1,68,255,215,1,23,1,70,255,215,1,23,1,72,255,215,1,23,2,7,0,82,1,23,2,11,0,82,1,23,2,89,255,215,1,23,2,96,255,215,1,23,3,30,255,215,1,23,3,32,255,215,1,23,3,34,255,215,1,23,3,38,255,215,1,23,3,40,255,215,1,23,3,42,255,215,1,23,3,44,255,215,1,23,3,46,255,215,1,23,3,48,255,215,1,23,3,50,255,215,1,23,3,52,255,215,1,23,3,54,255,215,1,23,3,56,255,215,1,23,3,58,255,215,1,23,3,60,255,215,1,23,3,64,255,215,1,23,3,66,255,215,1,23,3,68,255,215,1,23,3,74,255,215,1,23,3,76,255,215,1,23,3,78,255,215,1,23,3,82,255,215,1,23,3,84,255,215,1,23,3,86,255,215,1,23,3,88,255,215,1,23,3,90,255,215,1,23,3,92,255,215,1,23,3,94,255,215,1,23,3,96,255,215,1,25,0,5,0,82,1,25,0,10,0,82,1,25,0,68,255,215,1,25,0,70,255,215,1,25,0,71,255,215,1,25,0,72,255,215,1,25,0,74,255,236,1,25,0,82,255,215,1,25,0,84,255,215,1,25,0,162,255,215,1,25,0,163,255,215,1,25,0,164,255,215,1,25,0,165,255,215,1,25,0,166,255,215,1,25,0,167,255,215,1,25,0,168,255,215,1,25,0,169,255,215,1,25,0,170,255,215,1,25,0,171,255,215,1,25,0,172,255,215,1,25,0,173,255,215,1,25,0,180,255,215,1,25,0,181,255,215,1,25,0,182,255,215,1,25,0,183,255,215,1,25,0,184,255,215,1,25,0,186,255,215,1,25,0,195,255,215,1,25,0,197,255,215,1,25,0,199,255,215,1,25,0,201,255,215,1,25,0,203,255,215,1,25,0,205,255,215,1,25,0,207,255,215,1,25,0,209,255,215,1,25,0,211,255,215,1,25,0,213,255,215,1,25,0,215,255,215,1,25,0,217,255,215,1,25,0,219,255,215,1,25,0,221,255,215,1,25,0,223,255,236,1,25,0,225,255,236,1,25,0,227,255,236,1,25,0,229,255,236,1,25,1,15,255,215,1,25,1,17,255,215,1,25,1,19,255,215,1,25,1,21,255,215,1,25,1,68,255,215,1,25,1,70,255,215,1,25,1,72,255,215,1,25,2,7,0,82,1,25,2,11,0,82,1,25,2,89,255,215,1,25,2,96,255,215,1,25,3,30,255,215,1,25,3,32,255,215,1,25,3,34,255,215,1,25,3,38,255,215,1,25,3,40,255,215,1,25,3,42,255,215,1,25,3,44,255,215,1,25,3,46,255,215,1,25,3,48,255,215,1,25,3,50,255,215,1,25,3,52,255,215,1,25,3,54,255,215,1,25,3,56,255,215,1,25,3,58,255,215,1,25,3,60,255,215,1,25,3,64,255,215,1,25,3,66,255,215,1,25,3,68,255,215,1,25,3,74,255,215,1,25,3,76,255,215,1,25,3,78,255,215,1,25,3,82,255,215,1,25,3,84,255,215,1,25,3,86,255,215,1,25,3,88,255,215,1,25,3,90,255,215,1,25,3,92,255,215,1,25,3,94,255,215,1,25,3,96,255,215,1,27,0,5,0,82,1,27,0,10,0,82,1,27,0,68,255,215,1,27,0,70,255,215,1,27,0,71,255,215,1,27,0,72,255,215,1,27,0,74,255,236,1,27,0,82,255,215,1,27,0,84,255,215,1,27,0,162,255,215,1,27,0,163,255,215,1,27,0,164,255,215,1,27,0,165,255,215,1,27,0,166,255,215,1,27,0,167,255,215,1,27,0,168,255,215,1,27,0,169,255,215,1,27,0,170,255,215,1,27,0,171,255,215,1,27,0,172,255,215,1,27,0,173,255,215,1,27,0,180,255,215,1,27,0,181,255,215,1,27,0,182,255,215,1,27,0,183,255,215,1,27,0,184,255,215,1,27,0,186,255,215,1,27,0,195,255,215,1,27,0,197,255,215,1,27,0,199,255,215,1,27,0,201,255,215,1,27,0,203,255,215,1,27,0,205,255,215,1,27,0,207,255,215,1,27,0,209,255,215,1,27,0,211,255,215,1,27,0,213,255,215,1,27,0,215,255,215,1,27,0,217,255,215,1,27,0,219,255,215,1,27,0,221,255,215,1,27,0,223,255,236,1,27,0,225,255,236,1,27,0,227,255,236,1,27,0,229,255,236,1,27,1,15,255,215,1,27,1,17,255,215,1,27,1,19,255,215,1,27,1,21,255,215,1,27,1,68,255,215,1,27,1,70,255,215,1,27,1,72,255,215,1,27,2,7,0,82,1,27,2,11,0,82,1,27,2,89,255,215,1,27,2,96,255,215,1,27,3,30,255,215,1,27,3,32,255,215,1,27,3,34,255,215,1,27,3,38,255,215,1,27,3,40,255,215,1,27,3,42,255,215,1,27,3,44,255,215,1,27,3,46,255,215,1,27,3,48,255,215,1,27,3,50,255,215,1,27,3,52,255,215,1,27,3,54,255,215,1,27,3,56,255,215,1,27,3,58,255,215,1,27,3,60,255,215,1,27,3,64,255,215,1,27,3,66,255,215,1,27,3,68,255,215,1,27,3,74,255,215,1,27,3,76,255,215,1,27,3,78,255,215,1,27,3,82,255,215,1,27,3,84,255,215,1,27,3,86,255,215,1,27,3,88,255,215,1,27,3,90,255,215,1,27,3,92,255,215,1,27,3,94,255,215,1,27,3,96,255,215,1,36,0,15,255,133,1,36,0,16,255,174,1,36,0,17,255,133,1,36,0,34,0,41,1,36,0,36,255,113,1,36,0,38,255,215,1,36,0,42,255,215,1,36,0,50,255,215,1,36,0,52,255,215,1,36,0,55,0,41,1,36,0,68,255,92,1,36,0,70,255,113,1,36,0,71,255,113,1,36,0,72,255,113,1,36,0,74,255,113,1,36,0,80,255,154,1,36,0,81,255,154,1,36,0,82,255,113,1,36,0,83,255,154,1,36,0,84,255,113,1,36,0,85,255,154,1,36,0,86,255,133,1,36,0,88,255,154,1,36,0,89,255,215,1,36,0,90,255,215,1,36,0,91,255,215,1,36,0,92,255,215,1,36,0,93,255,174,1,36,0,130,255,113,1,36,0,131,255,113,1,36,0,132,255,113,1,36,0,133,255,113,1,36,0,134,255,113,1,36,0,135,255,113,1,36,0,137,255,215,1,36,0,148,255,215,1,36,0,149,255,215,1,36,0,150,255,215,1,36,0,151,255,215,1,36,0,152,255,215,1,36,0,154,255,215,1,36,0,162,255,113,1,36,0,163,255,92,1,36,0,164,255,92,1,36,0,165,255,92,1,36,0,166,255,92,1,36,0,167,255,92,1,36,0,168,255,92,1,36,0,169,255,113,1,36,0,170,255,113,1,36,0,171,255,113,1,36,0,172,255,113,1,36,0,173,255,113,1,36,0,180,255,113,1,36,0,181,255,113,1,36,0,182,255,113,1,36,0,183,255,113,1,36,0,184,255,113,1,36,0,186,255,113,1,36,0,187,255,154,1,36,0,188,255,154,1,36,0,189,255,154,1,36,0,190,255,154,1,36,0,191,255,215,1,36,0,194,255,113,1,36,0,195,255,92,1,36,0,196,255,113,1,36,0,197,255,92,1,36,0,198,255,113,1,36,0,199,255,92,1,36,0,200,255,215,1,36,0,201,255,113,1,36,0,202,255,215,1,36,0,203,255,113,1,36,0,204,255,215,1,36,0,205,255,113,1,36,0,206,255,215,1,36,0,207,255,113,1,36,0,209,255,113,1,36,0,211,255,113,1,36,0,213,255,113,1,36,0,215,255,113,1,36,0,217,255,113,1,36,0,219,255,113,1,36,0,221,255,113,1,36,0,222,255,215,1,36,0,223,255,113,1,36,0,224,255,215,1,36,0,225,255,113,1,36,0,226,255,215,1,36,0,227,255,113,1,36,0,228,255,215,1,36,0,229,255,113,1,36,0,250,255,154,1,36,1,6,255,154,1,36,1,8,255,154,1,36,1,13,255,154,1,36,1,14,255,215,1,36,1,15,255,113,1,36,1,16,255,215,1,36,1,17,255,113,1,36,1,18,255,215,1,36,1,19,255,113,1,36,1,20,255,215,1,36,1,21,255,113,1,36,1,23,255,154,1,36,1,25,255,154,1,36,1,29,255,133,1,36,1,33,255,133,1,36,1,36,0,41,1,36,1,38,0,41,1,36,1,43,255,154,1,36,1,45,255,154,1,36,1,47,255,154,1,36,1,49,255,154,1,36,1,51,255,154,1,36,1,53,255,154,1,36,1,55,255,215,1,36,1,60,255,174,1,36,1,62,255,174,1,36,1,64,255,174,1,36,1,67,255,113,1,36,1,68,255,92,1,36,1,70,255,92,1,36,1,71,255,215,1,36,1,72,255,113,1,36,1,74,255,133,1,36,1,251,255,215,1,36,1,253,255,215,1,36,2,2,255,174,1,36,2,3,255,174,1,36,2,4,255,174,1,36,2,8,255,133,1,36,2,12,255,133,1,36,2,87,255,154,1,36,2,88,255,113,1,36,2,89,255,92,1,36,2,95,255,215,1,36,2,96,255,113,1,36,2,98,255,154,1,36,3,29,255,113,1,36,3,30,255,92,1,36,3,31,255,113,1,36,3,32,255,92,1,36,3,33,255,113,1,36,3,34,255,92,1,36,3,35,255,113,1,36,3,37,255,113,1,36,3,38,255,92,1,36,3,39,255,113,1,36,3,40,255,92,1,36,3,41,255,113,1,36,3,42,255,92,1,36,3,43,255,113,1,36,3,44,255,92,1,36,3,45,255,113,1,36,3,46,255,92,1,36,3,47,255,113,1,36,3,48,255,92,1,36,3,49,255,113,1,36,3,50,255,92,1,36,3,51,255,113,1,36,3,52,255,92,1,36,3,54,255,113,1,36,3,56,255,113,1,36,3,58,255,113,1,36,3,60,255,113,1,36,3,64,255,113,1,36,3,66,255,113,1,36,3,68,255,113,1,36,3,73,255,215,1,36,3,74,255,113,1,36,3,75,255,215,1,36,3,76,255,113,1,36,3,77,255,215,1,36,3,78,255,113,1,36,3,79,255,215,1,36,3,81,255,215,1,36,3,82,255,113,1,36,3,83,255,215,1,36,3,84,255,113,1,36,3,85,255,215,1,36,3,86,255,113,1,36,3,87,255,215,1,36,3,88,255,113,1,36,3,89,255,215,1,36,3,90,255,113,1,36,3,91,255,215,1,36,3,92,255,113,1,36,3,93,255,215,1,36,3,94,255,113,1,36,3,95,255,215,1,36,3,96,255,113,1,36,3,98,255,154,1,36,3,100,255,154,1,36,3,102,255,154,1,36,3,104,255,154,1,36,3,106,255,154,1,36,3,108,255,154,1,36,3,110,255,154,1,36,3,112,255,215,1,36,3,143,0,41,1,37,0,5,0,41,1,37,0,10,0,41,1,37,2,7,0,41,1,37,2,11,0,41,1,38,0,15,255,133,1,38,0,16,255,174,1,38,0,17,255,133,1,38,0,34,0,41,1,38,0,36,255,113,1,38,0,38,255,215,1,38,0,42,255,215,1,38,0,50,255,215,1,38,0,52,255,215,1,38,0,55,0,41,1,38,0,68,255,92,1,38,0,70,255,113,1,38,0,71,255,113,1,38,0,72,255,113,1,38,0,74,255,113,1,38,0,80,255,154,1,38,0,81,255,154,1,38,0,82,255,113,1,38,0,83,255,154,1,38,0,84,255,113,1,38,0,85,255,154,1,38,0,86,255,133,1,38,0,88,255,154,1,38,0,89,255,215,1,38,0,90,255,215,1,38,0,91,255,215,1,38,0,92,255,215,1,38,0,93,255,174,1,38,0,130,255,113,1,38,0,131,255,113,1,38,0,132,255,113,1,38,0,133,255,113,1,38,0,134,255,113,1,38,0,135,255,113,1,38,0,137,255,215,1,38,0,148,255,215,1,38,0,149,255,215,1,38,0,150,255,215,1,38,0,151,255,215,1,38,0,152,255,215,1,38,0,154,255,215,1,38,0,162,255,113,1,38,0,163,255,92,1,38,0,164,255,92,1,38,0,165,255,92,1,38,0,166,255,92,1,38,0,167,255,92,1,38,0,168,255,92,1,38,0,169,255,113,1,38,0,170,255,113,1,38,0,171,255,113,1,38,0,172,255,113,1,38,0,173,255,113,1,38,0,180,255,113,1,38,0,181,255,113,1,38,0,182,255,113,1,38,0,183,255,113,1,38,0,184,255,113,1,38,0,186,255,113,1,38,0,187,255,154,1,38,0,188,255,154,1,38,0,189,255,154,1,38,0,190,255,154,1,38,0,191,255,215,1,38,0,194,255,113,1,38,0,195,255,92,1,38,0,196,255,113,1,38,0,197,255,92,1,38,0,198,255,113,1,38,0,199,255,92,1,38,0,200,255,215,1,38,0,201,255,113,1,38,0,202,255,215,1,38,0,203,255,113,1,38,0,204,255,215,1,38,0,205,255,113,1,38,0,206,255,215,1,38,0,207,255,113,1,38,0,209,255,113,1,38,0,211,255,113,1,38,0,213,255,113,1,38,0,215,255,113,1,38,0,217,255,113,1,38,0,219,255,113,1,38,0,221,255,113,1,38,0,222,255,215,1,38,0,223,255,113,1,38,0,224,255,215,1,38,0,225,255,113,1,38,0,226,255,215,1,38,0,227,255,113,1,38,0,228,255,215,1,38,0,229,255,113,1,38,0,250,255,154,1,38,1,6,255,154,1,38,1,8,255,154,1,38,1,13,255,154,1,38,1,14,255,215,1,38,1,15,255,113,1,38,1,16,255,215,1,38,1,17,255,113,1,38,1,18,255,215,1,38,1,19,255,113,1,38,1,20,255,215,1,38,1,21,255,113,1,38,1,23,255,154,1,38,1,25,255,154,1,38,1,29,255,133,1,38,1,33,255,133,1,38,1,36,0,41,1,38,1,38,0,41,1,38,1,43,255,154,1,38,1,45,255,154,1,38,1,47,255,154,1,38,1,49,255,154,1,38,1,51,255,154,1,38,1,53,255,154,1,38,1,55,255,215,1,38,1,60,255,174,1,38,1,62,255,174,1,38,1,64,255,174,1,38,1,67,255,113,1,38,1,68,255,92,1,38,1,70,255,92,1,38,1,71,255,215,1,38,1,72,255,113,1,38,1,74,255,133,1,38,1,251,255,215,1,38,1,253,255,215,1,38,2,2,255,174,1,38,2,3,255,174,1,38,2,4,255,174,1,38,2,8,255,133,1,38,2,12,255,133,1,38,2,87,255,154,1,38,2,88,255,113,1,38,2,89,255,92,1,38,2,95,255,215,1,38,2,96,255,113,1,38,2,98,255,154,1,38,3,29,255,113,1,38,3,30,255,92,1,38,3,31,255,113,1,38,3,32,255,92,1,38,3,33,255,113,1,38,3,34,255,92,1,38,3,35,255,113,1,38,3,37,255,113,1,38,3,38,255,92,1,38,3,39,255,113,1,38,3,40,255,92,1,38,3,41,255,113,1,38,3,42,255,92,1,38,3,43,255,113,1,38,3,44,255,92,1,38,3,45,255,113,1,38,3,46,255,92,1,38,3,47,255,113,1,38,3,48,255,92,1,38,3,49,255,113,1,38,3,50,255,92,1,38,3,51,255,113,1,38,3,52,255,92,1,38,3,54,255,113,1,38,3,56,255,113,1,38,3,58,255,113,1,38,3,60,255,113,1,38,3,64,255,113,1,38,3,66,255,113,1,38,3,68,255,113,1,38,3,73,255,215,1,38,3,74,255,113,1,38,3,75,255,215,1,38,3,76,255,113,1,38,3,77,255,215,1,38,3,78,255,113,1,38,3,79,255,215,1,38,3,81,255,215,1,38,3,82,255,113,1,38,3,83,255,215,1,38,3,84,255,113,1,38,3,85,255,215,1,38,3,86,255,113,1,38,3,87,255,215,1,38,3,88,255,113,1,38,3,89,255,215,1,38,3,90,255,113,1,38,3,91,255,215,1,38,3,92,255,113,1,38,3,93,255,215,1,38,3,94,255,113,1,38,3,95,255,215,1,38,3,96,255,113,1,38,3,98,255,154,1,38,3,100,255,154,1,38,3,102,255,154,1,38,3,104,255,154,1,38,3,106,255,154,1,38,3,108,255,154,1,38,3,110,255,154,1,38,3,112,255,215,1,38,3,143,0,41,1,39,0,5,0,41,1,39,0,10,0,41,1,39,2,7,0,41,1,39,2,11,0,41,1,40,0,15,255,133,1,40,0,16,255,174,1,40,0,17,255,133,1,40,0,34,0,41,1,40,0,36,255,113,1,40,0,38,255,215,1,40,0,42,255,215,1,40,0,50,255,215,1,40,0,52,255,215,1,40,0,55,0,41,1,40,0,68,255,92,1,40,0,70,255,113,1,40,0,71,255,113,1,40,0,72,255,113,1,40,0,74,255,113,1,40,0,80,255,154,1,40,0,81,255,154,1,40,0,82,255,113,1,40,0,83,255,154,1,40,0,84,255,113,1,40,0,85,255,154,1,40,0,86,255,133,1,40,0,88,255,154,1,40,0,89,255,215,1,40,0,90,255,215,1,40,0,91,255,215,1,40,0,92,255,215,1,40,0,93,255,174,1,40,0,130,255,113,1,40,0,131,255,113,1,40,0,132,255,113,1,40,0,133,255,113,1,40,0,134,255,113,1,40,0,135,255,113,1,40,0,137,255,215,1,40,0,148,255,215,1,40,0,149,255,215,1,40,0,150,255,215,1,40,0,151,255,215,1,40,0,152,255,215,1,40,0,154,255,215,1,40,0,162,255,113,1,40,0,163,255,92,1,40,0,164,255,92,1,40,0,165,255,92,1,40,0,166,255,92,1,40,0,167,255,92,1,40,0,168,255,92,1,40,0,169,255,113,1,40,0,170,255,113,1,40,0,171,255,113,1,40,0,172,255,113,1,40,0,173,255,113,1,40,0,180,255,113,1,40,0,181,255,113,1,40,0,182,255,113,1,40,0,183,255,113,1,40,0,184,255,113,1,40,0,186,255,113,1,40,0,187,255,154,1,40,0,188,255,154,1,40,0,189,255,154,1,40,0,190,255,154,1,40,0,191,255,215,1,40,0,194,255,113,1,40,0,195,255,92,1,40,0,196,255,113,1,40,0,197,255,92,1,40,0,198,255,113,1,40,0,199,255,92,1,40,0,200,255,215,1,40,0,201,255,113,1,40,0,202,255,215,1,40,0,203,255,113,1,40,0,204,255,215,1,40,0,205,255,113,1,40,0,206,255,215,1,40,0,207,255,113,1,40,0,209,255,113,1,40,0,211,255,113,1,40,0,213,255,113,1,40,0,215,255,113,1,40,0,217,255,113,1,40,0,219,255,113,1,40,0,221,255,113,1,40,0,222,255,215,1,40,0,223,255,113,1,40,0,224,255,215,1,40,0,225,255,113,1,40,0,226,255,215,1,40,0,227,255,113,1,40,0,228,255,215,1,40,0,229,255,113,1,40,0,250,255,154,1,40,1,6,255,154,1,40,1,8,255,154,1,40,1,13,255,154,1,40,1,14,255,215,1,40,1,15,255,113,1,40,1,16,255,215,1,40,1,17,255,113,1,40,1,18,255,215,1,40,1,19,255,113,1,40,1,20,255,215,1,40,1,21,255,113,1,40,1,23,255,154,1,40,1,25,255,154,1,40,1,29,255,133,1,40,1,33,255,133,1,40,1,36,0,41,1,40,1,38,0,41,1,40,1,43,255,154,1,40,1,45,255,154,1,40,1,47,255,154,1,40,1,49,255,154,1,40,1,51,255,154,1,40,1,53,255,154,1,40,1,55,255,215,1,40,1,60,255,174,1,40,1,62,255,174,1,40,1,64,255,174,1,40,1,67,255,113,1,40,1,68,255,92,1,40,1,70,255,92,1,40,1,71,255,215,1,40,1,72,255,113,1,40,1,74,255,133,1,40,1,251,255,215,1,40,1,253,255,215,1,40,2,2,255,174,1,40,2,3,255,174,1,40,2,4,255,174,1,40,2,8,255,133,1,40,2,12,255,133,1,40,2,87,255,154,1,40,2,88,255,113,1,40,2,89,255,92,1,40,2,95,255,215,1,40,2,96,255,113,1,40,2,98,255,154,1,40,3,29,255,113,1,40,3,30,255,92,1,40,3,31,255,113,1,40,3,32,255,92,1,40,3,33,255,113,1,40,3,34,255,92,1,40,3,35,255,113,1,40,3,37,255,113,1,40,3,38,255,92,1,40,3,39,255,113,1,40,3,40,255,92,1,40,3,41,255,113,1,40,3,42,255,92,1,40,3,43,255,113,1,40,3,44,255,92,1,40,3,45,255,113,1,40,3,46,255,92,1,40,3,47,255,113,1,40,3,48,255,92,1,40,3,49,255,113,1,40,3,50,255,92,1,40,3,51,255,113,1,40,3,52,255,92,1,40,3,54,255,113,1,40,3,56,255,113,1,40,3,58,255,113,1,40,3,60,255,113,1,40,3,64,255,113,1,40,3,66,255,113,1,40,3,68,255,113,1,40,3,73,255,215,1,40,3,74,255,113,1,40,3,75,255,215,1,40,3,76,255,113,1,40,3,77,255,215,1,40,3,78,255,113,1,40,3,79,255,215,1,40,3,81,255,215,1,40,3,82,255,113,1,40,3,83,255,215,1,40,3,84,255,113,1,40,3,85,255,215,1,40,3,86,255,113,1,40,3,87,255,215,1,40,3,88,255,113,1,40,3,89,255,215,1,40,3,90,255,113,1,40,3,91,255,215,1,40,3,92,255,113,1,40,3,93,255,215,1,40,3,94,255,113,1,40,3,95,255,215,1,40,3,96,255,113,1,40,3,98,255,154,1,40,3,100,255,154,1,40,3,102,255,154,1,40,3,104,255,154,1,40,3,106,255,154,1,40,3,108,255,154,1,40,3,110,255,154,1,40,3,112,255,215,1,40,3,143,0,41,1,42,0,15,255,215,1,42,0,17,255,215,1,42,0,36,255,236,1,42,0,130,255,236,1,42,0,131,255,236,1,42,0,132,255,236,1,42,0,133,255,236,1,42,0,134,255,236,1,42,0,135,255,236,1,42,0,194,255,236,1,42,0,196,255,236,1,42,0,198,255,236,1,42,1,67,255,236,1,42,2,8,255,215,1,42,2,12,255,215,1,42,2,88,255,236,1,42,3,29,255,236,1,42,3,31,255,236,1,42,3,33,255,236,1,42,3,35,255,236,1,42,3,37,255,236,1,42,3,39,255,236,1,42,3,41,255,236,1,42,3,43,255,236,1,42,3,45,255,236,1,42,3,47,255,236,1,42,3,49,255,236,1,42,3,51,255,236,1,44,0,15,255,215,1,44,0,17,255,215,1,44,0,36,255,236,1,44,0,130,255,236,1,44,0,131,255,236,1,44,0,132,255,236,1,44,0,133,255,236,1,44,0,134,255,236,1,44,0,135,255,236,1,44,0,194,255,236,1,44,0,196,255,236,1,44,0,198,255,236,1,44,1,67,255,236,1,44,2,8,255,215,1,44,2,12,255,215,1,44,2,88,255,236,1,44,3,29,255,236,1,44,3,31,255,236,1,44,3,33,255,236,1,44,3,35,255,236,1,44,3,37,255,236,1,44,3,39,255,236,1,44,3,41,255,236,1,44,3,43,255,236,1,44,3,45,255,236,1,44,3,47,255,236,1,44,3,49,255,236,1,44,3,51,255,236,1,46,0,15,255,215,1,46,0,17,255,215,1,46,0,36,255,236,1,46,0,130,255,236,1,46,0,131,255,236,1,46,0,132,255,236,1,46,0,133,255,236,1,46,0,134,255,236,1,46,0,135,255,236,1,46,0,194,255,236,1,46,0,196,255,236,1,46,0,198,255,236,1,46,1,67,255,236,1,46,2,8,255,215,1,46,2,12,255,215,1,46,2,88,255,236,1,46,3,29,255,236,1,46,3,31,255,236,1,46,3,33,255,236,1,46,3,35,255,236,1,46,3,37,255,236,1,46,3,39,255,236,1,46,3,41,255,236,1,46,3,43,255,236,1,46,3,45,255,236,1,46,3,47,255,236,1,46,3,49,255,236,1,46,3,51,255,236,1,48,0,15,255,215,1,48,0,17,255,215,1,48,0,36,255,236,1,48,0,130,255,236,1,48,0,131,255,236,1,48,0,132,255,236,1,48,0,133,255,236,1,48,0,134,255,236,1,48,0,135,255,236,1,48,0,194,255,236,1,48,0,196,255,236,1,48,0,198,255,236,1,48,1,67,255,236,1,48,2,8,255,215,1,48,2,12,255,215,1,48,2,88,255,236,1,48,3,29,255,236,1,48,3,31,255,236,1,48,3,33,255,236,1,48,3,35,255,236,1,48,3,37,255,236,1,48,3,39,255,236,1,48,3,41,255,236,1,48,3,43,255,236,1,48,3,45,255,236,1,48,3,47,255,236,1,48,3,49,255,236,1,48,3,51,255,236,1,50,0,15,255,215,1,50,0,17,255,215,1,50,0,36,255,236,1,50,0,130,255,236,1,50,0,131,255,236,1,50,0,132,255,236,1,50,0,133,255,236,1,50,0,134,255,236,1,50,0,135,255,236,1,50,0,194,255,236,1,50,0,196,255,236,1,50,0,198,255,236,1,50,1,67,255,236,1,50,2,8,255,215,1,50,2,12,255,215,1,50,2,88,255,236,1,50,3,29,255,236,1,50,3,31,255,236,1,50,3,33,255,236,1,50,3,35,255,236,1,50,3,37,255,236,1,50,3,39,255,236,1,50,3,41,255,236,1,50,3,43,255,236,1,50,3,45,255,236,1,50,3,47,255,236,1,50,3,49,255,236,1,50,3,51,255,236,1,52,0,15,255,215,1,52,0,17,255,215,1,52,0,36,255,236,1,52,0,130,255,236,1,52,0,131,255,236,1,52,0,132,255,236,1,52,0,133,255,236,1,52,0,134,255,236,1,52,0,135,255,236,1,52,0,194,255,236,1,52,0,196,255,236,1,52,0,198,255,236,1,52,1,67,255,236,1,52,2,8,255,215,1,52,2,12,255,215,1,52,2,88,255,236,1,52,3,29,255,236,1,52,3,31,255,236,1,52,3,33,255,236,1,52,3,35,255,236,1,52,3,37,255,236,1,52,3,39,255,236,1,52,3,41,255,236,1,52,3,43,255,236,1,52,3,45,255,236,1,52,3,47,255,236,1,52,3,49,255,236,1,52,3,51,255,236,1,54,0,15,255,154,1,54,0,17,255,154,1,54,0,34,0,41,1,54,0,36,255,174,1,54,0,38,255,236,1,54,0,42,255,236,1,54,0,50,255,236,1,54,0,52,255,236,1,54,0,68,255,215,1,54,0,70,255,215,1,54,0,71,255,215,1,54,0,72,255,215,1,54,0,74,255,236,1,54,0,80,255,236,1,54,0,81,255,236,1,54,0,82,255,215,1,54,0,83,255,236,1,54,0,84,255,215,1,54,0,85,255,236,1,54,0,86,255,236,1,54,0,88,255,236,1,54,0,130,255,174,1,54,0,131,255,174,1,54,0,132,255,174,1,54,0,133,255,174,1,54,0,134,255,174,1,54,0,135,255,174,1,54,0,137,255,236,1,54,0,148,255,236,1,54,0,149,255,236,1,54,0,150,255,236,1,54,0,151,255,236,1,54,0,152,255,236,1,54,0,154,255,236,1,54,0,162,255,215,1,54,0,163,255,215,1,54,0,164,255,215,1,54,0,165,255,215,1,54,0,166,255,215,1,54,0,167,255,215,1,54,0,168,255,215,1,54,0,169,255,215,1,54,0,170,255,215,1,54,0,171,255,215,1,54,0,172,255,215,1,54,0,173,255,215,1,54,0,180,255,215,1,54,0,181,255,215,1,54,0,182,255,215,1,54,0,183,255,215,1,54,0,184,255,215,1,54,0,186,255,215,1,54,0,187,255,236,1,54,0,188,255,236,1,54,0,189,255,236,1,54,0,190,255,236,1,54,0,194,255,174,1,54,0,195,255,215,1,54,0,196,255,174,1,54,0,197,255,215,1,54,0,198,255,174,1,54,0,199,255,215,1,54,0,200,255,236,1,54,0,201,255,215,1,54,0,202,255,236,1,54,0,203,255,215,1,54,0,204,255,236,1,54,0,205,255,215,1,54,0,206,255,236,1,54,0,207,255,215,1,54,0,209,255,215,1,54,0,211,255,215,1,54,0,213,255,215,1,54,0,215,255,215,1,54,0,217,255,215,1,54,0,219,255,215,1,54,0,221,255,215,1,54,0,222,255,236,1,54,0,223,255,236,1,54,0,224,255,236,1,54,0,225,255,236,1,54,0,226,255,236,1,54,0,227,255,236,1,54,0,228,255,236,1,54,0,229,255,236,1,54,0,250,255,236,1,54,1,6,255,236,1,54,1,8,255,236,1,54,1,13,255,236,1,54,1,14,255,236,1,54,1,15,255,215,1,54,1,16,255,236,1,54,1,17,255,215,1,54,1,18,255,236,1,54,1,19,255,215,1,54,1,20,255,236,1,54,1,21,255,215,1,54,1,23,255,236,1,54,1,25,255,236,1,54,1,29,255,236,1,54,1,33,255,236,1,54,1,43,255,236,1,54,1,45,255,236,1,54,1,47,255,236,1,54,1,49,255,236,1,54,1,51,255,236,1,54,1,53,255,236,1,54,1,67,255,174,1,54,1,68,255,215,1,54,1,70,255,215,1,54,1,71,255,236,1,54,1,72,255,215,1,54,1,74,255,236,1,54,2,8,255,154,1,54,2,12,255,154,1,54,2,87,255,236,1,54,2,88,255,174,1,54,2,89,255,215,1,54,2,95,255,236,1,54,2,96,255,215,1,54,2,98,255,236,1,54,3,29,255,174,1,54,3,30,255,215,1,54,3,31,255,174,1,54,3,32,255,215,1,54,3,33,255,174,1,54,3,34,255,215,1,54,3,35,255,174,1,54,3,37,255,174,1,54,3,38,255,215,1,54,3,39,255,174,1,54,3,40,255,215,1,54,3,41,255,174,1,54,3,42,255,215,1,54,3,43,255,174,1,54,3,44,255,215,1,54,3,45,255,174,1,54,3,46,255,215,1,54,3,47,255,174,1,54,3,48,255,215,1,54,3,49,255,174,1,54,3,50,255,215,1,54,3,51,255,174,1,54,3,52,255,215,1,54,3,54,255,215,1,54,3,56,255,215,1,54,3,58,255,215,1,54,3,60,255,215,1,54,3,64,255,215,1,54,3,66,255,215,1,54,3,68,255,215,1,54,3,73,255,236,1,54,3,74,255,215,1,54,3,75,255,236,1,54,3,76,255,215,1,54,3,77,255,236,1,54,3,78,255,215,1,54,3,79,255,236,1,54,3,81,255,236,1,54,3,82,255,215,1,54,3,83,255,236,1,54,3,84,255,215,1,54,3,85,255,236,1,54,3,86,255,215,1,54,3,87,255,236,1,54,3,88,255,215,1,54,3,89,255,236,1,54,3,90,255,215,1,54,3,91,255,236,1,54,3,92,255,215,1,54,3,93,255,236,1,54,3,94,255,215,1,54,3,95,255,236,1,54,3,96,255,215,1,54,3,98,255,236,1,54,3,100,255,236,1,54,3,102,255,236,1,54,3,104,255,236,1,54,3,106,255,236,1,54,3,108,255,236,1,54,3,110,255,236,1,55,0,5,0,82,1,55,0,10,0,82,1,55,0,15,255,174,1,55,0,17,255,174,1,55,0,34,0,41,1,55,2,7,0,82,1,55,2,8,255,174,1,55,2,11,0,82,1,55,2,12,255,174,1,56,0,15,255,133,1,56,0,17,255,133,1,56,0,34,0,41,1,56,0,36,255,133,1,56,0,38,255,215,1,56,0,42,255,215,1,56,0,50,255,215,1,56,0,52,255,215,1,56,0,68,255,154,1,56,0,70,255,154,1,56,0,71,255,154,1,56,0,72,255,154,1,56,0,74,255,215,1,56,0,80,255,195,1,56,0,81,255,195,1,56,0,82,255,154,1,56,0,83,255,195,1,56,0,84,255,154,1,56,0,85,255,195,1,56,0,86,255,174,1,56,0,88,255,195,1,56,0,93,255,215,1,56,0,130,255,133,1,56,0,131,255,133,1,56,0,132,255,133,1,56,0,133,255,133,1,56,0,134,255,133,1,56,0,135,255,133,1,56,0,137,255,215,1,56,0,148,255,215,1,56,0,149,255,215,1,56,0,150,255,215,1,56,0,151,255,215,1,56,0,152,255,215,1,56,0,154,255,215,1,56,0,162,255,154,1,56,0,163,255,154,1,56,0,164,255,154,1,56,0,165,255,154,1,56,0,166,255,154,1,56,0,167,255,154,1,56,0,168,255,154,1,56,0,169,255,154,1,56,0,170,255,154,1,56,0,171,255,154,1,56,0,172,255,154,1,56,0,173,255,154,1,56,0,180,255,154,1,56,0,181,255,154,1,56,0,182,255,154,1,56,0,183,255,154,1,56,0,184,255,154,1,56,0,186,255,154,1,56,0,187,255,195,1,56,0,188,255,195,1,56,0,189,255,195,1,56,0,190,255,195,1,56,0,194,255,133,1,56,0,195,255,154,1,56,0,196,255,133,1,56,0,197,255,154,1,56,0,198,255,133,1,56,0,199,255,154,1,56,0,200,255,215,1,56,0,201,255,154,1,56,0,202,255,215,1,56,0,203,255,154,1,56,0,204,255,215,1,56,0,205,255,154,1,56,0,206,255,215,1,56,0,207,255,154,1,56,0,209,255,154,1,56,0,211,255,154,1,56,0,213,255,154,1,56,0,215,255,154,1,56,0,217,255,154,1,56,0,219,255,154,1,56,0,221,255,154,1,56,0,222,255,215,1,56,0,223,255,215,1,56,0,224,255,215,1,56,0,225,255,215,1,56,0,226,255,215,1,56,0,227,255,215,1,56,0,228,255,215,1,56,0,229,255,215,1,56,0,250,255,195,1,56,1,6,255,195,1,56,1,8,255,195,1,56,1,13,255,195,1,56,1,14,255,215,1,56,1,15,255,154,1,56,1,16,255,215,1,56,1,17,255,154,1,56,1,18,255,215,1,56,1,19,255,154,1,56,1,20,255,215,1,56,1,21,255,154,1,56,1,23,255,195,1,56,1,25,255,195,1,56,1,29,255,174,1,56,1,33,255,174,1,56,1,43,255,195,1,56,1,45,255,195,1,56,1,47,255,195,1,56,1,49,255,195,1,56,1,51,255,195,1,56,1,53,255,195,1,56,1,60,255,215,1,56,1,62,255,215,1,56,1,64,255,215,1,56,1,67,255,133,1,56,1,68,255,154,1,56,1,70,255,154,1,56,1,71,255,215,1,56,1,72,255,154,1,56,1,74,255,174,1,56,2,8,255,133,1,56,2,12,255,133,1,56,2,87,255,195,1,56,2,88,255,133,1,56,2,89,255,154,1,56,2,95,255,215,1,56,2,96,255,154,1,56,2,98,255,195,1,56,3,29,255,133,1,56,3,30,255,154,1,56,3,31,255,133,1,56,3,32,255,154,1,56,3,33,255,133,1,56,3,34,255,154,1,56,3,35,255,133,1,56,3,37,255,133,1,56,3,38,255,154,1,56,3,39,255,133,1,56,3,40,255,154,1,56,3,41,255,133,1,56,3,42,255,154,1,56,3,43,255,133,1,56,3,44,255,154,1,56,3,45,255,133,1,56,3,46,255,154,1,56,3,47,255,133,1,56,3,48,255,154,1,56,3,49,255,133,1,56,3,50,255,154,1,56,3,51,255,133,1,56,3,52,255,154,1,56,3,54,255,154,1,56,3,56,255,154,1,56,3,58,255,154,1,56,3,60,255,154,1,56,3,64,255,154,1,56,3,66,255,154,1,56,3,68,255,154,1,56,3,73,255,215,1,56,3,74,255,154,1,56,3,75,255,215,1,56,3,76,255,154,1,56,3,77,255,215,1,56,3,78,255,154,1,56,3,79,255,215,1,56,3,81,255,215,1,56,3,82,255,154,1,56,3,83,255,215,1,56,3,84,255,154,1,56,3,85,255,215,1,56,3,86,255,154,1,56,3,87,255,215,1,56,3,88,255,154,1,56,3,89,255,215,1,56,3,90,255,154,1,56,3,91,255,215,1,56,3,92,255,154,1,56,3,93,255,215,1,56,3,94,255,154,1,56,3,95,255,215,1,56,3,96,255,154,1,56,3,98,255,195,1,56,3,100,255,195,1,56,3,102,255,195,1,56,3,104,255,195,1,56,3,106,255,195,1,56,3,108,255,195,1,56,3,110,255,195,1,57,0,5,0,82,1,57,0,10,0,82,1,57,0,15,255,174,1,57,0,17,255,174,1,57,0,34,0,41,1,57,2,7,0,82,1,57,2,8,255,174,1,57,2,11,0,82,1,57,2,12,255,174,1,58,0,15,255,133,1,58,0,17,255,133,1,58,0,34,0,41,1,58,0,36,255,133,1,58,0,38,255,215,1,58,0,42,255,215,1,58,0,50,255,215,1,58,0,52,255,215,1,58,0,68,255,154,1,58,0,70,255,154,1,58,0,71,255,154,1,58,0,72,255,154,1,58,0,74,255,215,1,58,0,80,255,195,1,58,0,81,255,195,1,58,0,82,255,154,1,58,0,83,255,195,1,58,0,84,255,154,1,58,0,85,255,195,1,58,0,86,255,174,1,58,0,88,255,195,1,58,0,93,255,215,1,58,0,130,255,133,1,58,0,131,255,133,1,58,0,132,255,133,1,58,0,133,255,133,1,58,0,134,255,133,1,58,0,135,255,133,1,58,0,137,255,215,1,58,0,148,255,215,1,58,0,149,255,215,1,58,0,150,255,215,1,58,0,151,255,215,1,58,0,152,255,215,1,58,0,154,255,215,1,58,0,162,255,154,1,58,0,163,255,154,1,58,0,164,255,154,1,58,0,165,255,154,1,58,0,166,255,154,1,58,0,167,255,154,1,58,0,168,255,154,1,58,0,169,255,154,1,58,0,170,255,154,1,58,0,171,255,154,1,58,0,172,255,154,1,58,0,173,255,154,1,58,0,180,255,154,1,58,0,181,255,154,1,58,0,182,255,154,1,58,0,183,255,154,1,58,0,184,255,154,1,58,0,186,255,154,1,58,0,187,255,195,1,58,0,188,255,195,1,58,0,189,255,195,1,58,0,190,255,195,1,58,0,194,255,133,1,58,0,195,255,154,1,58,0,196,255,133,1,58,0,197,255,154,1,58,0,198,255,133,1,58,0,199,255,154,1,58,0,200,255,215,1,58,0,201,255,154,1,58,0,202,255,215,1,58,0,203,255,154,1,58,0,204,255,215,1,58,0,205,255,154,1,58,0,206,255,215,1,58,0,207,255,154,1,58,0,209,255,154,1,58,0,211,255,154,1,58,0,213,255,154,1,58,0,215,255,154,1,58,0,217,255,154,1,58,0,219,255,154,1,58,0,221,255,154,1,58,0,222,255,215,1,58,0,223,255,215,1,58,0,224,255,215,1,58,0,225,255,215,1,58,0,226,255,215,1,58,0,227,255,215,1,58,0,228,255,215,1,58,0,229,255,215,1,58,0,250,255,195,1,58,1,6,255,195,1,58,1,8,255,195,1,58,1,13,255,195,1,58,1,14,255,215,1,58,1,15,255,154,1,58,1,16,255,215,1,58,1,17,255,154,1,58,1,18,255,215,1,58,1,19,255,154,1,58,1,20,255,215,1,58,1,21,255,154,1,58,1,23,255,195,1,58,1,25,255,195,1,58,1,29,255,174,1,58,1,33,255,174,1,58,1,43,255,195,1,58,1,45,255,195,1,58,1,47,255,195,1,58,1,49,255,195,1,58,1,51,255,195,1,58,1,53,255,195,1,58,1,60,255,215,1,58,1,62,255,215,1,58,1,64,255,215,1,58,1,67,255,133,1,58,1,68,255,154,1,58,1,70,255,154,1,58,1,71,255,215,1,58,1,72,255,154,1,58,1,74,255,174,1,58,2,8,255,133,1,58,2,12,255,133,1,58,2,87,255,195,1,58,2,88,255,133,1,58,2,89,255,154,1,58,2,95,255,215,1,58,2,96,255,154,1,58,2,98,255,195,1,58,3,29,255,133,1,58,3,30,255,154,1,58,3,31,255,133,1,58,3,32,255,154,1,58,3,33,255,133,1,58,3,34,255,154,1,58,3,35,255,133,1,58,3,37,255,133,1,58,3,38,255,154,1,58,3,39,255,133,1,58,3,40,255,154,1,58,3,41,255,133,1,58,3,42,255,154,1,58,3,43,255,133,1,58,3,44,255,154,1,58,3,45,255,133,1,58,3,46,255,154,1,58,3,47,255,133,1,58,3,48,255,154,1,58,3,49,255,133,1,58,3,50,255,154,1,58,3,51,255,133,1,58,3,52,255,154,1,58,3,54,255,154,1,58,3,56,255,154,1,58,3,58,255,154,1,58,3,60,255,154,1,58,3,64,255,154,1,58,3,66,255,154,1,58,3,68,255,154,1,58,3,73,255,215,1,58,3,74,255,154,1,58,3,75,255,215,1,58,3,76,255,154,1,58,3,77,255,215,1,58,3,78,255,154,1,58,3,79,255,215,1,58,3,81,255,215,1,58,3,82,255,154,1,58,3,83,255,215,1,58,3,84,255,154,1,58,3,85,255,215,1,58,3,86,255,154,1,58,3,87,255,215,1,58,3,88,255,154,1,58,3,89,255,215,1,58,3,90,255,154,1,58,3,91,255,215,1,58,3,92,255,154,1,58,3,93,255,215,1,58,3,94,255,154,1,58,3,95,255,215,1,58,3,96,255,154,1,58,3,98,255,195,1,58,3,100,255,195,1,58,3,102,255,195,1,58,3,104,255,195,1,58,3,106,255,195,1,58,3,108,255,195,1,58,3,110,255,195,1,59,0,38,255,236,1,59,0,42,255,236,1,59,0,50,255,236,1,59,0,52,255,236,1,59,0,137,255,236,1,59,0,148,255,236,1,59,0,149,255,236,1,59,0,150,255,236,1,59,0,151,255,236,1,59,0,152,255,236,1,59,0,154,255,236,1,59,0,200,255,236,1,59,0,202,255,236,1,59,0,204,255,236,1,59,0,206,255,236,1,59,0,222,255,236,1,59,0,224,255,236,1,59,0,226,255,236,1,59,0,228,255,236,1,59,1,14,255,236,1,59,1,16,255,236,1,59,1,18,255,236,1,59,1,20,255,236,1,59,1,71,255,236,1,59,2,95,255,236,1,59,3,73,255,236,1,59,3,75,255,236,1,59,3,77,255,236,1,59,3,79,255,236,1,59,3,81,255,236,1,59,3,83,255,236,1,59,3,85,255,236,1,59,3,87,255,236,1,59,3,89,255,236,1,59,3,91,255,236,1,59,3,93,255,236,1,59,3,95,255,236,1,61,0,38,255,236,1,61,0,42,255,236,1,61,0,50,255,236,1,61,0,52,255,236,1,61,0,137,255,236,1,61,0,148,255,236,1,61,0,149,255,236,1,61,0,150,255,236,1,61,0,151,255,236,1,61,0,152,255,236,1,61,0,154,255,236,1,61,0,200,255,236,1,61,0,202,255,236,1,61,0,204,255,236,1,61,0,206,255,236,1,61,0,222,255,236,1,61,0,224,255,236,1,61,0,226,255,236,1,61,0,228,255,236,1,61,1,14,255,236,1,61,1,16,255,236,1,61,1,18,255,236,1,61,1,20,255,236,1,61,1,71,255,236,1,61,2,95,255,236,1,61,3,73,255,236,1,61,3,75,255,236,1,61,3,77,255,236,1,61,3,79,255,236,1,61,3,81,255,236,1,61,3,83,255,236,1,61,3,85,255,236,1,61,3,87,255,236,1,61,3,89,255,236,1,61,3,91,255,236,1,61,3,93,255,236,1,61,3,95,255,236,1,63,0,38,255,236,1,63,0,42,255,236,1,63,0,50,255,236,1,63,0,52,255,236,1,63,0,137,255,236,1,63,0,148,255,236,1,63,0,149,255,236,1,63,0,150,255,236,1,63,0,151,255,236,1,63,0,152,255,236,1,63,0,154,255,236,1,63,0,200,255,236,1,63,0,202,255,236,1,63,0,204,255,236,1,63,0,206,255,236,1,63,0,222,255,236,1,63,0,224,255,236,1,63,0,226,255,236,1,63,0,228,255,236,1,63,1,14,255,236,1,63,1,16,255,236,1,63,1,18,255,236,1,63,1,20,255,236,1,63,1,71,255,236,1,63,2,95,255,236,1,63,3,73,255,236,1,63,3,75,255,236,1,63,3,77,255,236,1,63,3,79,255,236,1,63,3,81,255,236,1,63,3,83,255,236,1,63,3,85,255,236,1,63,3,87,255,236,1,63,3,89,255,236,1,63,3,91,255,236,1,63,3,93,255,236,1,63,3,95,255,236,1,67,0,5,255,113,1,67,0,10,255,113,1,67,0,38,255,215,1,67,0,42,255,215,1,67,0,45,1,10,1,67,0,50,255,215,1,67,0,52,255,215,1,67,0,55,255,113,1,67,0,57,255,174,1,67,0,58,255,174,1,67,0,60,255,133,1,67,0,137,255,215,1,67,0,148,255,215,1,67,0,149,255,215,1,67,0,150,255,215,1,67,0,151,255,215,1,67,0,152,255,215,1,67,0,154,255,215,1,67,0,159,255,133,1,67,0,200,255,215,1,67,0,202,255,215,1,67,0,204,255,215,1,67,0,206,255,215,1,67,0,222,255,215,1,67,0,224,255,215,1,67,0,226,255,215,1,67,0,228,255,215,1,67,1,14,255,215,1,67,1,16,255,215,1,67,1,18,255,215,1,67,1,20,255,215,1,67,1,36,255,113,1,67,1,38,255,113,1,67,1,54,255,174,1,67,1,56,255,133,1,67,1,58,255,133,1,67,1,71,255,215,1,67,1,250,255,174,1,67,1,252,255,174,1,67,1,254,255,174,1,67,2,0,255,133,1,67,2,7,255,113,1,67,2,11,255,113,1,67,2,95,255,215,1,67,3,73,255,215,1,67,3,75,255,215,1,67,3,77,255,215,1,67,3,79,255,215,1,67,3,81,255,215,1,67,3,83,255,215,1,67,3,85,255,215,1,67,3,87,255,215,1,67,3,89,255,215,1,67,3,91,255,215,1,67,3,93,255,215,1,67,3,95,255,215,1,67,3,111,255,133,1,67,3,113,255,133,1,67,3,115,255,133,1,67,3,143,255,113,1,68,0,5,255,236,1,68,0,10,255,236,1,68,2,7,255,236,1,68,2,11,255,236,1,69,0,45,0,123,1,71,0,15,255,174,1,71,0,17,255,174,1,71,0,36,255,215,1,71,0,55,255,195,1,71,0,57,255,236,1,71,0,58,255,236,1,71,0,59,255,215,1,71,0,60,255,236,1,71,0,61,255,236,1,71,0,130,255,215,1,71,0,131,255,215,1,71,0,132,255,215,1,71,0,133,255,215,1,71,0,134,255,215,1,71,0,135,255,215,1,71,0,159,255,236,1,71,0,194,255,215,1,71,0,196,255,215,1,71,0,198,255,215,1,71,1,36,255,195,1,71,1,38,255,195,1,71,1,54,255,236,1,71,1,56,255,236,1,71,1,58,255,236,1,71,1,59,255,236,1,71,1,61,255,236,1,71,1,63,255,236,1,71,1,67,255,215,1,71,1,160,255,236,1,71,1,250,255,236,1,71,1,252,255,236,1,71,1,254,255,236,1,71,2,0,255,236,1,71,2,8,255,174,1,71,2,12,255,174,1,71,2,88,255,215,1,71,3,29,255,215,1,71,3,31,255,215,1,71,3,33,255,215,1,71,3,35,255,215,1,71,3,37,255,215,1,71,3,39,255,215,1,71,3,41,255,215,1,71,3,43,255,215,1,71,3,45,255,215,1,71,3,47,255,215,1,71,3,49,255,215,1,71,3,51,255,215,1,71,3,111,255,236,1,71,3,113,255,236,1,71,3,115,255,236,1,71,3,143,255,195,1,86,0,5,255,113,1,86,0,10,255,113,1,86,1,102,255,215,1,86,1,109,255,215,1,86,1,113,255,113,1,86,1,114,255,133,1,86,1,115,255,215,1,86,1,117,255,174,1,86,1,120,255,133,1,86,2,7,255,113,1,86,2,11,255,113,1,86,2,84,255,133,1,91,0,15,255,174,1,91,0,17,255,174,1,91,1,86,255,215,1,91,1,95,255,215,1,91,1,98,255,215,1,91,1,100,255,236,1,91,1,105,255,215,1,91,1,112,255,236,1,91,1,113,255,195,1,91,1,114,255,236,1,91,1,116,255,215,1,91,1,117,255,236,1,91,1,120,255,236,1,91,1,136,255,236,1,91,2,8,255,174,1,91,2,12,255,174,1,91,2,84,255,236,1,92,0,15,255,133,1,92,0,17,255,133,1,92,1,86,255,133,1,92,1,95,255,133,1,92,1,98,255,133,1,92,1,102,255,215,1,92,1,105,255,133,1,92,1,109,255,215,1,92,1,115,255,195,1,92,1,118,255,236,1,92,1,121,255,154,1,92,1,122,255,174,1,92,1,123,255,195,1,92,1,124,255,195,1,92,1,125,255,195,1,92,1,126,255,154,1,92,1,129,255,195,1,92,1,130,255,174,1,92,1,132,255,195,1,92,1,134,255,195,1,92,1,135,255,195,1,92,1,137,255,195,1,92,1,140,255,154,1,92,1,142,255,154,1,92,1,143,255,154,1,92,1,144,255,154,1,92,1,146,255,195,1,92,1,147,255,154,1,92,1,149,255,195,1,92,1,150,255,195,1,92,1,152,255,195,1,92,1,153,255,154,1,92,1,154,255,195,1,92,1,155,255,195,1,92,2,8,255,133,1,92,2,12,255,133,1,92,2,33,255,236,1,93,1,113,255,215,1,93,1,114,255,236,1,93,1,120,255,236,1,93,2,84,255,236,1,94,0,5,255,215,1,94,0,10,255,215,1,94,2,7,255,215,1,94,2,11,255,215,1,95,0,5,255,113,1,95,0,10,255,113,1,95,1,102,255,215,1,95,1,109,255,215,1,95,1,113,255,113,1,95,1,114,255,133,1,95,1,115,255,215,1,95,1,117,255,174,1,95,1,120,255,133,1,95,2,7,255,113,1,95,2,11,255,113,1,95,2,84,255,133,1,96,0,15,255,174,1,96,0,17,255,174,1,96,1,86,255,215,1,96,1,95,255,215,1,96,1,98,255,215,1,96,1,105,255,215,1,96,1,116,255,215,1,96,2,8,255,174,1,96,2,12,255,174,1,97,0,15,255,133,1,97,0,16,255,174,1,97,0,17,255,133,1,97,1,86,255,92,1,97,1,95,255,92,1,97,1,98,255,92,1,97,1,102,255,195,1,97,1,105,255,92,1,97,1,109,255,195,1,97,1,115,255,154,1,97,1,118,255,195,1,97,1,121,255,113,1,97,1,122,255,154,1,97,1,123,255,154,1,97,1,124,255,174,1,97,1,125,255,154,1,97,1,126,255,113,1,97,1,128,255,215,1,97,1,129,255,195,1,97,1,130,255,154,1,97,1,132,255,154,1,97,1,134,255,174,1,97,1,135,255,154,1,97,1,137,255,154,1,97,1,138,255,215,1,97,1,140,255,113,1,97,1,142,255,154,1,97,1,143,255,113,1,97,1,144,255,113,1,97,1,146,255,154,1,97,1,147,255,113,1,97,1,148,255,215,1,97,1,149,255,154,1,97,1,150,255,154,1,97,1,152,255,154,1,97,1,153,255,113,1,97,1,154,255,154,1,97,1,155,255,154,1,97,2,2,255,174,1,97,2,3,255,174,1,97,2,4,255,174,1,97,2,8,255,133,1,97,2,12,255,133,1,97,2,33,255,195,1,97,2,83,255,215,1,98,0,5,255,113,1,98,0,10,255,113,1,98,1,102,255,215,1,98,1,109,255,215,1,98,1,113,255,113,1,98,1,114,255,133,1,98,1,115,255,215,1,98,1,117,255,174,1,98,1,120,255,133,1,98,2,7,255,113,1,98,2,11,255,113,1,98,2,84,255,133,1,100,1,102,255,236,1,100,1,109,255,236,1,100,1,115,255,195,1,102,0,15,255,174,1,102,0,17,255,174,1,102,1,86,255,215,1,102,1,95,255,215,1,102,1,98,255,215,1,102,1,100,255,236,1,102,1,105,255,215,1,102,1,112,255,236,1,102,1,113,255,195,1,102,1,114,255,236,1,102,1,116,255,215,1,102,1,117,255,236,1,102,1,120,255,236,1,102,1,136,255,236,1,102,2,8,255,174,1,102,2,12,255,174,1,102,2,84,255,236,1,104,1,102,255,215,1,104,1,109,255,215,1,104,1,115,255,195,1,104,1,141,255,236,1,104,1,145,255,236,1,105,0,5,255,113,1,105,0,10,255,113,1,105,1,102,255,215,1,105,1,109,255,215,1,105,1,113,255,113,1,105,1,114,255,133,1,105,1,115,255,215,1,105,1,117,255,174,1,105,1,120,255,133,1,105,2,7,255,113,1,105,2,11,255,113,1,105,2,84,255,133,1,109,0,15,255,174,1,109,0,17,255,174,1,109,1,86,255,215,1,109,1,95,255,215,1,109,1,98,255,215,1,109,1,100,255,236,1,109,1,105,255,215,1,109,1,112,255,236,1,109,1,113,255,195,1,109,1,114,255,236,1,109,1,116,255,215,1,109,1,117,255,236,1,109,1,120,255,236,1,109,1,136,255,236,1,109,2,8,255,174,1,109,2,12,255,174,1,109,2,84,255,236,1,111,0,15,254,246,1,111,0,17,254,246,1,111,1,86,255,154,1,111,1,95,255,154,1,111,1,98,255,154,1,111,1,100,255,236,1,111,1,105,255,154,1,111,1,116,255,215,1,111,1,136,255,215,1,111,2,8,254,246,1,111,2,12,254,246,1,113,0,15,255,133,1,113,0,16,255,174,1,113,0,17,255,133,1,113,1,86,255,92,1,113,1,95,255,92,1,113,1,98,255,92,1,113,1,102,255,195,1,113,1,105,255,92,1,113,1,109,255,195,1,113,1,115,255,154,1,113,1,118,255,195,1,113,1,121,255,113,1,113,1,122,255,154,1,113,1,123,255,154,1,113,1,124,255,174,1,113,1,125,255,154,1,113,1,126,255,113,1,113,1,128,255,215,1,113,1,129,255,195,1,113,1,130,255,154,1,113,1,132,255,154,1,113,1,134,255,174,1,113,1,135,255,154,1,113,1,137,255,154,1,113,1,138,255,215,1,113,1,140,255,113,1,113,1,142,255,154,1,113,1,143,255,113,1,113,1,144,255,113,1,113,1,146,255,154,1,113,1,147,255,113,1,113,1,148,255,215,1,113,1,149,255,154,1,113,1,150,255,154,1,113,1,152,255,154,1,113,1,153,255,113,1,113,1,154,255,154,1,113,1,155,255,154,1,113,2,2,255,174,1,113,2,3,255,174,1,113,2,4,255,174,1,113,2,8,255,133,1,113,2,12,255,133,1,113,2,33,255,195,1,113,2,83,255,215,1,114,0,15,255,133,1,114,0,17,255,133,1,114,1,86,255,133,1,114,1,95,255,133,1,114,1,98,255,133,1,114,1,102,255,215,1,114,1,105,255,133,1,114,1,109,255,215,1,114,1,115,255,195,1,114,1,118,255,236,1,114,1,121,255,154,1,114,1,122,255,174,1,114,1,123,255,195,1,114,1,124,255,195,1,114,1,125,255,195,1,114,1,126,255,154,1,114,1,129,255,195,1,114,1,130,255,174,1,114,1,132,255,195,1,114,1,134,255,195,1,114,1,135,255,195,1,114,1,137,255,195,1,114,1,140,255,154,1,114,1,142,255,154,1,114,1,143,255,154,1,114,1,144,255,154,1,114,1,146,255,195,1,114,1,147,255,154,1,114,1,149,255,195,1,114,1,150,255,195,1,114,1,152,255,195,1,114,1,153,255,154,1,114,1,154,255,195,1,114,1,155,255,195,1,114,2,8,255,133,1,114,2,12,255,133,1,114,2,33,255,236,1,115,0,15,255,154,1,115,0,17,255,154,1,115,1,86,255,215,1,115,1,95,255,215,1,115,1,98,255,215,1,115,1,100,255,195,1,115,1,105,255,215,1,115,1,112,255,236,1,115,1,113,255,174,1,115,1,114,255,195,1,115,1,116,255,236,1,115,1,120,255,195,1,115,1,136,255,236,1,115,2,8,255,154,1,115,2,12,255,154,1,115,2,84,255,195,1,116,1,102,255,215,1,116,1,109,255,215,1,116,1,115,255,195,1,116,1,141,255,236,1,116,1,145,255,236,1,117,0,15,255,133,1,117,0,17,255,133,1,117,1,86,255,174,1,117,1,95,255,174,1,117,1,98,255,174,1,117,1,102,255,236,1,117,1,105,255,174,1,117,1,109,255,236,1,117,2,8,255,133,1,117,2,12,255,133,1,118,1,113,255,215,1,118,1,114,255,236,1,118,1,120,255,236,1,118,2,84,255,236,1,120,0,15,255,133,1,120,0,17,255,133,1,120,1,86,255,133,1,120,1,95,255,133,1,120,1,98,255,133,1,120,1,102,255,215,1,120,1,105,255,133,1,120,1,109,255,215,1,120,1,115,255,195,1,120,1,118,255,236,1,120,1,121,255,154,1,120,1,122,255,174,1,120,1,123,255,195,1,120,1,124,255,195,1,120,1,125,255,195,1,120,1,126,255,154,1,120,1,129,255,195,1,120,1,130,255,174,1,120,1,132,255,195,1,120,1,134,255,195,1,120,1,135,255,195,1,120,1,137,255,195,1,120,1,140,255,154,1,120,1,142,255,154,1,120,1,143,255,154,1,120,1,144,255,154,1,120,1,146,255,195,1,120,1,147,255,154,1,120,1,149,255,195,1,120,1,150,255,195,1,120,1,152,255,195,1,120,1,153,255,154,1,120,1,154,255,195,1,120,1,155,255,195,1,120,2,8,255,133,1,120,2,12,255,133,1,120,2,33,255,236,1,121,1,136,0,41,1,123,0,5,255,236,1,123,0,10,255,236,1,123,2,7,255,236,1,123,2,11,255,236,1,124,0,5,255,174,1,124,0,10,255,174,1,124,1,141,255,236,1,124,1,145,255,236,1,124,2,7,255,174,1,124,2,11,255,174,1,126,1,136,0,41,1,128,0,15,255,174,1,128,0,17,255,174,1,128,1,136,255,236,1,128,2,8,255,174,1,128,2,12,255,174,1,131,0,16,255,154,1,131,1,121,255,215,1,131,1,126,255,215,1,131,1,129,255,215,1,131,1,140,255,215,1,131,1,141,255,215,1,131,1,143,255,215,1,131,1,144,255,215,1,131,1,145,255,215,1,131,1,147,255,215,1,131,1,153,255,215,1,131,2,2,255,154,1,131,2,3,255,154,1,131,2,4,255,154,1,132,0,5,255,236,1,132,0,10,255,236,1,132,2,7,255,236,1,132,2,11,255,236,1,133,0,15,255,215,1,133,0,17,255,215,1,133,2,8,255,215,1,133,2,12,255,215,1,134,0,5,255,174,1,134,0,10,255,174,1,134,1,141,255,236,1,134,1,145,255,236,1,134,2,7,255,174,1,134,2,11,255,174,1,135,1,121,255,215,1,135,1,126,255,215,1,135,1,140,255,215,1,135,1,143,255,215,1,135,1,144,255,215,1,135,1,147,255,215,1,135,1,153,255,215,1,136,0,5,255,133,1,136,0,10,255,133,1,136,1,121,255,236,1,136,1,126,255,236,1,136,1,128,255,215,1,136,1,138,255,215,1,136,1,140,255,236,1,136,1,141,255,215,1,136,1,143,255,236,1,136,1,144,255,236,1,136,1,145,255,215,1,136,1,147,255,236,1,136,1,153,255,236,1,136,2,7,255,133,1,136,2,11,255,133,1,138,0,15,255,174,1,138,0,17,255,174,1,138,1,136,255,236,1,138,2,8,255,174,1,138,2,12,255,174,1,140,0,5,255,236,1,140,0,10,255,236,1,140,1,128,255,215,1,140,1,138,255,215,1,140,2,7,255,236,1,140,2,11,255,236,1,142,0,5,255,236,1,142,0,10,255,236,1,142,1,128,255,215,1,142,1,138,255,215,1,142,2,7,255,236,1,142,2,11,255,236,1,144,0,15,255,236,1,144,0,17,255,236,1,144,2,8,255,236,1,144,2,12,255,236,1,147,0,5,255,236,1,147,0,10,255,236,1,147,1,128,255,215,1,147,1,138,255,215,1,147,2,7,255,236,1,147,2,11,255,236,1,148,0,15,255,195,1,148,0,16,255,215,1,148,0,17,255,195,1,148,1,121,255,215,1,148,1,126,255,215,1,148,1,129,255,215,1,148,1,140,255,215,1,148,1,143,255,215,1,148,1,144,255,215,1,148,1,147,255,215,1,148,1,153,255,215,1,148,2,2,255,215,1,148,2,3,255,215,1,148,2,4,255,215,1,148,2,8,255,195,1,148,2,12,255,195,1,151,0,5,255,215,1,151,0,10,255,215,1,151,2,7,255,215,1,151,2,11,255,215,1,153,0,5,255,236,1,153,0,10,255,236,1,153,1,128,255,215,1,153,1,138,255,215,1,153,2,7,255,236,1,153,2,11,255,236,1,157,0,5,255,174,1,157,0,10,255,174,1,157,1,157,255,133,1,157,1,166,255,133,1,157,1,168,255,215,1,157,1,188,255,154,1,157,1,189,255,215,1,157,1,193,255,154,1,157,1,196,255,133,1,157,1,220,255,215,1,157,1,221,255,215,1,157,1,225,255,215,1,157,1,228,255,215,1,157,1,246,255,215,1,157,2,7,255,174,1,157,2,11,255,174,1,157,2,110,255,174,1,157,2,124,255,154,1,157,2,128,255,174,1,157,2,130,255,174,1,157,2,151,255,174,1,157,2,155,255,174,1,157,2,167,255,174,1,157,2,169,255,133,1,157,2,170,255,215,1,157,2,181,255,154,1,157,2,182,255,215,1,157,2,183,255,154,1,157,2,184,255,215,1,157,2,185,255,154,1,157,2,186,255,215,1,157,2,189,255,133,1,157,2,190,255,215,1,157,2,191,255,154,1,157,2,192,255,215,1,157,2,193,255,154,1,157,2,194,255,215,1,157,2,212,255,154,1,157,2,213,255,215,1,157,2,247,255,215,1,157,2,248,255,215,1,157,2,249,255,215,1,157,2,250,255,215,1,157,2,251,255,215,1,157,2,252,255,215,1,157,2,253,255,154,1,157,2,254,255,215,1,157,3,3,255,174,1,157,3,13,255,154,1,157,3,14,255,195,1,157,3,15,255,154,1,157,3,16,255,195,1,157,3,23,255,133,1,157,3,24,255,215,1,158,0,15,255,133,1,158,0,16,255,174,1,158,0,17,255,133,1,158,1,159,255,215,1,158,1,164,255,154,1,158,1,170,255,113,1,158,1,174,255,154,1,158,1,181,255,154,1,158,1,184,255,215,1,158,1,187,255,215,1,158,1,188,0,41,1,158,1,190,255,174,1,158,1,204,255,154,1,158,1,205,255,154,1,158,1,206,255,133,1,158,1,207,255,113,1,158,1,208,255,215,1,158,1,209,255,215,1,158,1,210,255,154,1,158,1,211,255,154,1,158,1,212,255,154,1,158,1,213,255,133,1,158,1,214,255,154,1,158,1,215,255,154,1,158,1,216,255,113,1,158,1,217,255,154,1,158,1,218,255,154,1,158,1,219,255,113,1,158,1,220,255,174,1,158,1,221,255,174,1,158,1,222,255,113,1,158,1,223,255,215,1,158,1,224,255,154,1,158,1,225,255,154,1,158,1,226,255,154,1,158,1,227,255,154,1,158,1,228,255,174,1,158,1,229,255,154,1,158,1,230,255,154,1,158,1,231,255,215,1,158,1,232,255,154,1,158,1,233,255,195,1,158,1,234,255,113,1,158,1,236,255,154,1,158,1,237,255,113,1,158,1,238,255,133,1,158,1,242,255,133,1,158,1,243,255,154,1,158,1,245,255,154,1,158,1,246,255,174,1,158,1,247,255,154,1,158,1,249,255,154,1,158,2,2,255,174,1,158,2,3,255,174,1,158,2,4,255,174,1,158,2,8,255,133,1,158,2,12,255,133,1,158,2,106,255,113,1,158,2,107,255,154,1,158,2,108,255,215,1,158,2,109,255,215,1,158,2,113,255,154,1,158,2,114,255,113,1,158,2,115,255,133,1,158,2,117,255,154,1,158,2,119,255,154,1,158,2,121,255,154,1,158,2,125,255,154,1,158,2,126,255,215,1,158,2,127,255,113,1,158,2,129,255,215,1,158,2,131,255,215,1,158,2,132,255,215,1,158,2,133,255,113,1,158,2,134,255,215,1,158,2,135,255,113,1,158,2,136,255,215,1,158,2,137,255,113,1,158,2,138,255,215,1,158,2,139,255,215,1,158,2,140,255,215,1,158,2,141,255,113,1,158,2,150,255,154,1,158,2,154,255,154,1,158,2,158,255,154,1,158,2,160,255,215,1,158,2,162,255,215,1,158,2,164,255,154,1,158,2,166,255,154,1,158,2,170,255,174,1,158,2,172,255,154,1,158,2,174,255,154,1,158,2,176,255,154,1,158,2,177,255,215,1,158,2,178,255,113,1,158,2,179,255,215,1,158,2,180,255,113,1,158,2,181,0,41,1,158,2,182,255,174,1,158,2,184,255,174,1,158,2,186,255,174,1,158,2,188,255,215,1,158,2,190,255,174,1,158,2,192,255,154,1,158,2,194,255,154,1,158,2,196,255,154,1,158,2,197,255,154,1,158,2,198,255,113,1,158,2,199,255,154,1,158,2,200,255,113,1,158,2,203,255,215,1,158,2,205,255,154,1,158,2,206,255,154,1,158,2,207,255,133,1,158,2,209,255,154,1,158,2,211,255,154,1,158,2,213,255,154,1,158,2,215,255,154,1,158,2,217,255,113,1,158,2,219,255,113,1,158,2,221,255,113,1,158,2,224,255,113,1,158,2,230,255,215,1,158,2,232,255,215,1,158,2,234,255,195,1,158,2,236,255,154,1,158,2,238,255,154,1,158,2,239,255,215,1,158,2,240,255,113,1,158,2,241,255,215,1,158,2,242,255,113,1,158,2,243,255,215,1,158,2,244,255,113,1,158,2,246,255,215,1,158,2,248,255,174,1,158,2,250,255,174,1,158,2,252,255,174,1,158,2,254,255,154,1,158,3,0,255,154,1,158,3,2,255,154,1,158,3,6,255,215,1,158,3,8,255,215,1,158,3,9,255,113,1,158,3,10,255,113,1,158,3,11,255,113,1,158,3,12,255,113,1,158,3,14,255,154,1,158,3,16,255,154,1,158,3,17,255,154,1,158,3,18,255,133,1,158,3,20,255,154,1,158,3,21,255,215,1,158,3,22,255,113,1,158,3,24,255,174,1,158,3,26,255,113,1,158,3,27,255,154,1,158,3,28,255,133,1,159,1,159,255,215,1,159,1,184,255,215,1,159,1,187,255,215,1,159,1,190,255,215,1,159,1,225,255,215,1,159,2,108,255,215,1,159,2,126,255,215,1,159,2,132,255,215,1,159,2,134,255,215,1,159,2,136,255,215,1,159,2,138,255,215,1,159,2,140,255,215,1,159,2,177,255,215,1,159,2,179,255,215,1,159,2,192,255,215,1,159,2,194,255,215,1,159,2,197,255,215,1,159,2,199,255,215,1,159,2,213,255,215,1,159,2,239,255,215,1,159,2,241,255,215,1,159,2,243,255,215,1,159,2,254,255,215,1,159,3,9,255,215,1,159,3,11,255,215,1,159,3,14,255,215,1,159,3,16,255,215,1,159,3,21,255,215,1,160,3,14,255,215,1,160,3,16,255,215,1,164,0,5,255,174,1,164,0,10,255,174,1,164,1,157,255,133,1,164,1,166,255,133,1,164,1,168,255,215,1,164,1,188,255,154,1,164,1,189,255,215,1,164,1,193,255,154,1,164,1,196,255,133,1,164,1,220,255,215,1,164,1,221,255,215,1,164,1,225,255,215,1,164,1,228,255,215,1,164,1,246,255,215,1,164,2,7,255,174,1,164,2,11,255,174,1,164,2,110,255,174,1,164,2,124,255,154,1,164,2,128,255,174,1,164,2,130,255,174,1,164,2,151,255,174,1,164,2,155,255,174,1,164,2,167,255,174,1,164,2,169,255,133,1,164,2,170,255,215,1,164,2,181,255,154,1,164,2,182,255,215,1,164,2,183,255,154,1,164,2,184,255,215,1,164,2,185,255,154,1,164,2,186,255,215,1,164,2,189,255,133,1,164,2,190,255,215,1,164,2,191,255,154,1,164,2,192,255,215,1,164,2,193,255,154,1,164,2,194,255,215,1,164,2,212,255,154,1,164,2,213,255,215,1,164,2,247,255,215,1,164,2,248,255,215,1,164,2,249,255,215,1,164,2,250,255,215,1,164,2,251,255,215,1,164,2,252,255,215,1,164,2,253,255,154,1,164,2,254,255,215,1,164,3,3,255,174,1,164,3,13,255,154,1,164,3,14,255,195,1,164,3,15,255,154,1,164,3,16,255,195,1,164,3,23,255,133,1,164,3,24,255,215,1,165,0,5,255,174,1,165,0,10,255,174,1,165,1,157,255,133,1,165,1,166,255,133,1,165,1,168,255,215,1,165,1,188,255,154,1,165,1,189,255,215,1,165,1,193,255,154,1,165,1,196,255,133,1,165,1,220,255,215,1,165,1,221,255,215,1,165,1,225,255,215,1,165,1,228,255,215,1,165,1,246,255,215,1,165,2,7,255,174,1,165,2,11,255,174,1,165,2,110,255,174,1,165,2,124,255,154,1,165,2,128,255,174,1,165,2,130,255,174,1,165,2,151,255,174,1,165,2,155,255,174,1,165,2,167,255,174,1,165,2,169,255,133,1,165,2,170,255,215,1,165,2,181,255,154,1,165,2,182,255,215,1,165,2,183,255,154,1,165,2,184,255,215,1,165,2,185,255,154,1,165,2,186,255,215,1,165,2,189,255,133,1,165,2,190,255,215,1,165,2,191,255,154,1,165,2,192,255,215,1,165,2,193,255,154,1,165,2,194,255,215,1,165,2,212,255,154,1,165,2,213,255,215,1,165,2,247,255,215,1,165,2,248,255,215,1,165,2,249,255,215,1,165,2,250,255,215,1,165,2,251,255,215,1,165,2,252,255,215,1,165,2,253,255,154,1,165,2,254,255,215,1,165,3,3,255,174,1,165,3,13,255,154,1,165,3,14,255,195,1,165,3,15,255,154,1,165,3,16,255,195,1,165,3,23,255,133,1,165,3,24,255,215,1,166,0,5,255,174,1,166,0,10,255,174,1,166,1,157,255,133,1,166,1,166,255,133,1,166,1,168,255,215,1,166,1,188,255,154,1,166,1,189,255,215,1,166,1,193,255,154,1,166,1,196,255,133,1,166,1,220,255,215,1,166,1,221,255,215,1,166,1,225,255,215,1,166,1,228,255,215,1,166,1,246,255,215,1,166,2,7,255,174,1,166,2,11,255,174,1,166,2,110,255,174,1,166,2,124,255,154,1,166,2,128,255,174,1,166,2,130,255,174,1,166,2,151,255,174,1,166,2,155,255,174,1,166,2,167,255,174,1,166,2,169,255,133,1,166,2,170,255,215,1,166,2,181,255,154,1,166,2,182,255,215,1,166,2,183,255,154,1,166,2,184,255,215,1,166,2,185,255,154,1,166,2,186,255,215,1,166,2,189,255,133,1,166,2,190,255,215,1,166,2,191,255,154,1,166,2,192,255,215,1,166,2,193,255,154,1,166,2,194,255,215,1,166,2,212,255,154,1,166,2,213,255,215,1,166,2,247,255,215,1,166,2,248,255,215,1,166,2,249,255,215,1,166,2,250,255,215,1,166,2,251,255,215,1,166,2,252,255,215,1,166,2,253,255,154,1,166,2,254,255,215,1,166,3,3,255,174,1,166,3,13,255,154,1,166,3,14,255,195,1,166,3,15,255,154,1,166,3,16,255,195,1,166,3,23,255,133,1,166,3,24,255,215,1,167,1,159,255,215,1,167,1,184,255,215,1,167,1,187,255,215,1,167,1,190,255,215,1,167,1,193,255,215,1,167,1,225,255,215,1,167,2,108,255,215,1,167,2,124,255,215,1,167,2,126,255,215,1,167,2,132,255,215,1,167,2,134,255,215,1,167,2,136,255,215,1,167,2,138,255,215,1,167,2,140,255,215,1,167,2,177,255,215,1,167,2,179,255,215,1,167,2,191,255,215,1,167,2,192,255,215,1,167,2,193,255,215,1,167,2,194,255,215,1,167,2,197,255,154,1,167,2,199,255,154,1,167,2,212,255,215,1,167,2,213,255,215,1,167,2,239,255,215,1,167,2,241,255,215,1,167,2,243,255,215,1,167,2,253,255,215,1,167,2,254,255,215,1,167,3,9,255,215,1,167,3,11,255,215,1,167,3,14,255,215,1,167,3,16,255,215,1,167,3,21,255,215,1,167,3,25,255,236,1,168,0,15,255,133,1,168,0,17,255,133,1,168,1,159,255,236,1,168,1,164,255,154,1,168,1,170,255,113,1,168,1,174,255,154,1,168,1,181,255,154,1,168,1,184,255,236,1,168,1,187,255,236,1,168,1,190,255,195,1,168,1,201,255,236,1,168,1,206,255,174,1,168,1,207,255,215,1,168,1,213,255,174,1,168,1,216,255,215,1,168,1,219,255,215,1,168,1,222,255,215,1,168,1,225,255,215,1,168,1,234,255,215,1,168,1,235,0,102,1,168,1,237,255,215,1,168,1,238,255,236,1,168,1,242,255,174,1,168,1,244,0,102,1,168,2,8,255,133,1,168,2,12,255,133,1,168,2,106,255,215,1,168,2,108,255,236,1,168,2,114,255,113,1,168,2,115,255,174,1,168,2,126,255,236,1,168,2,127,255,215,1,168,2,132,255,236,1,168,2,133,255,215,1,168,2,134,255,236,1,168,2,135,255,215,1,168,2,136,255,236,1,168,2,137,255,215,1,168,2,138,255,236,1,168,2,140,255,236,1,168,2,141,255,215,1,168,2,152,0,102,1,168,2,168,0,102,1,168,2,177,255,236,1,168,2,178,255,215,1,168,2,179,255,236,1,168,2,180,255,215,1,168,2,192,255,215,1,168,2,194,255,215,1,168,2,197,255,215,1,168,2,198,255,195,1,168,2,199,255,215,1,168,2,200,255,195,1,168,2,206,255,154,1,168,2,207,255,174,1,168,2,213,255,215,1,168,2,217,255,113,1,168,2,219,255,113,1,168,2,221,255,113,1,168,2,224,255,215,1,168,2,239,255,236,1,168,2,240,255,215,1,168,2,241,255,236,1,168,2,242,255,215,1,168,2,243,255,236,1,168,2,244,255,215,1,168,2,254,255,215,1,168,3,9,255,113,1,168,3,10,255,215,1,168,3,11,255,113,1,168,3,12,255,215,1,168,3,17,255,154,1,168,3,18,255,174,1,168,3,21,255,236,1,168,3,22,255,215,1,168,3,26,255,215,1,168,3,27,255,154,1,168,3,28,255,174,1,170,0,5,255,113,1,170,0,10,255,113,1,170,1,157,255,154,1,170,1,166,255,154,1,170,1,188,255,113,1,170,1,190,255,215,1,170,1,193,255,154,1,170,1,196,255,154,1,170,1,220,255,215,1,170,1,225,255,215,1,170,1,228,255,215,1,170,2,7,255,113,1,170,2,11,255,113,1,170,2,110,255,215,1,170,2,124,255,154,1,170,2,128,255,174,1,170,2,130,255,174,1,170,2,151,255,215,1,170,2,155,255,215,1,170,2,167,255,215,1,170,2,169,255,154,1,170,2,170,255,215,1,170,2,181,255,113,1,170,2,182,255,215,1,170,2,183,255,133,1,170,2,185,255,133,1,170,2,189,255,154,1,170,2,190,255,215,1,170,2,191,255,154,1,170,2,192,255,215,1,170,2,193,255,154,1,170,2,194,255,215,1,170,2,197,255,154,1,170,2,199,255,154,1,170,2,212,255,154,1,170,2,213,255,215,1,170,2,225,255,215,1,170,2,227,255,215,1,170,2,253,255,154,1,170,2,254,255,215,1,170,3,3,255,215,1,170,3,13,255,113,1,170,3,14,255,215,1,170,3,15,255,113,1,170,3,16,255,215,1,170,3,23,255,154,1,170,3,24,255,215,1,171,0,5,255,215,1,171,0,10,255,215,1,171,1,170,255,236,1,171,1,193,255,215,1,171,2,7,255,215,1,171,2,11,255,215,1,171,2,114,255,236,1,171,2,124,255,215,1,171,2,191,255,215,1,171,2,193,255,215,1,171,2,197,255,215,1,171,2,199,255,215,1,171,2,212,255,215,1,171,2,217,255,236,1,171,2,219,255,236,1,171,2,221,255,236,1,171,2,253,255,215,1,172,0,15,255,174,1,172,0,17,255,174,1,172,2,8,255,174,1,172,2,12,255,174,1,172,2,128,255,236,1,172,2,130,255,236,1,172,2,183,255,236,1,172,2,185,255,236,1,172,3,13,255,215,1,172,3,15,255,215,1,173,0,15,255,133,1,173,0,16,255,174,1,173,0,17,255,133,1,173,1,159,255,215,1,173,1,164,255,154,1,173,1,170,255,113,1,173,1,174,255,154,1,173,1,181,255,154,1,173,1,184,255,215,1,173,1,187,255,215,1,173,1,188,0,41,1,173,1,190,255,174,1,173,1,204,255,154,1,173,1,205,255,154,1,173,1,206,255,133,1,173,1,207,255,113,1,173,1,208,255,215,1,173,1,209,255,215,1,173,1,210,255,154,1,173,1,211,255,154,1,173,1,212,255,154,1,173,1,213,255,133,1,173,1,214,255,154,1,173,1,215,255,154,1,173,1,216,255,113,1,173,1,217,255,154,1,173,1,218,255,154,1,173,1,219,255,113,1,173,1,220,255,174,1,173,1,221,255,174,1,173,1,222,255,113,1,173,1,223,255,215,1,173,1,224,255,154,1,173,1,225,255,154,1,173,1,226,255,154,1,173,1,227,255,154,1,173,1,228,255,174,1,173,1,229,255,154,1,173,1,230,255,154,1,173,1,231,255,215,1,173,1,232,255,154,1,173,1,233,255,195,1,173,1,234,255,113,1,173,1,236,255,154,1,173,1,237,255,113,1,173,1,238,255,133,1,173,1,242,255,133,1,173,1,243,255,154,1,173,1,245,255,154,1,173,1,246,255,174,1,173,1,247,255,154,1,173,1,249,255,154,1,173,2,2,255,174,1,173,2,3,255,174,1,173,2,4,255,174,1,173,2,8,255,133,1,173,2,12,255,133,1,173,2,106,255,113,1,173,2,107,255,154,1,173,2,108,255,215,1,173,2,109,255,215,1,173,2,113,255,154,1,173,2,114,255,113,1,173,2,115,255,133,1,173,2,117,255,154,1,173,2,119,255,154,1,173,2,121,255,154,1,173,2,125,255,154,1,173,2,126,255,215,1,173,2,127,255,113,1,173,2,129,255,215,1,173,2,131,255,215,1,173,2,132,255,215,1,173,2,133,255,113,1,173,2,134,255,215,1,173,2,135,255,113,1,173,2,136,255,215,1,173,2,137,255,113,1,173,2,138,255,215,1,173,2,139,255,215,1,173,2,140,255,215,1,173,2,141,255,113,1,173,2,150,255,154,1,173,2,154,255,154,1,173,2,158,255,154,1,173,2,160,255,215,1,173,2,162,255,215,1,173,2,164,255,154,1,173,2,166,255,154,1,173,2,170,255,174,1,173,2,172,255,154,1,173,2,174,255,154,1,173,2,176,255,154,1,173,2,177,255,215,1,173,2,178,255,113,1,173,2,179,255,215,1,173,2,180,255,113,1,173,2,181,0,41,1,173,2,182,255,174,1,173,2,184,255,174,1,173,2,186,255,174,1,173,2,188,255,215,1,173,2,190,255,174,1,173,2,192,255,154,1,173,2,194,255,154,1,173,2,196,255,154,1,173,2,197,255,154,1,173,2,198,255,113,1,173,2,199,255,154,1,173,2,200,255,113,1,173,2,203,255,215,1,173,2,205,255,154,1,173,2,206,255,154,1,173,2,207,255,133,1,173,2,209,255,154,1,173,2,211,255,154,1,173,2,213,255,154,1,173,2,215,255,154,1,173,2,217,255,113,1,173,2,219,255,113,1,173,2,221,255,113,1,173,2,224,255,113,1,173,2,230,255,215,1,173,2,232,255,215,1,173,2,234,255,195,1,173,2,236,255,154,1,173,2,238,255,154,1,173,2,239,255,215,1,173,2,240,255,113,1,173,2,241,255,215,1,173,2,242,255,113,1,173,2,243,255,215,1,173,2,244,255,113,1,173,2,246,255,215,1,173,2,248,255,174,1,173,2,250,255,174,1,173,2,252,255,174,1,173,2,254,255,154,1,173,3,0,255,154,1,173,3,2,255,154,1,173,3,6,255,215,1,173,3,8,255,215,1,173,3,9,255,113,1,173,3,10,255,113,1,173,3,11,255,113,1,173,3,12,255,113,1,173,3,14,255,154,1,173,3,16,255,154,1,173,3,17,255,154,1,173,3,18,255,133,1,173,3,20,255,154,1,173,3,21,255,215,1,173,3,22,255,113,1,173,3,24,255,174,1,173,3,26,255,113,1,173,3,27,255,154,1,173,3,28,255,133,1,174,1,163,0,225,1,174,2,234,0,41,1,174,3,14,255,215,1,174,3,16,255,215,1,176,1,159,255,215,1,176,1,184,255,215,1,176,1,187,255,215,1,176,1,190,255,215,1,176,1,193,255,215,1,176,1,225,255,215,1,176,2,108,255,215,1,176,2,124,255,215,1,176,2,126,255,215,1,176,2,132,255,215,1,176,2,134,255,215,1,176,2,136,255,215,1,176,2,138,255,215,1,176,2,140,255,215,1,176,2,177,255,215,1,176,2,179,255,215,1,176,2,191,255,215,1,176,2,192,255,215,1,176,2,193,255,215,1,176,2,194,255,215,1,176,2,197,255,154,1,176,2,199,255,154,1,176,2,212,255,215,1,176,2,213,255,215,1,176,2,239,255,215,1,176,2,241,255,215,1,176,2,243,255,215,1,176,2,253,255,215,1,176,2,254,255,215,1,176,3,9,255,215,1,176,3,11,255,215,1,176,3,14,255,215,1,176,3,16,255,215,1,176,3,21,255,215,1,176,3,25,255,236,1,177,0,15,255,174,1,177,0,17,255,174,1,177,2,8,255,174,1,177,2,12,255,174,1,177,2,128,255,236,1,177,2,130,255,236,1,177,2,183,255,236,1,177,2,185,255,236,1,177,3,13,255,215,1,177,3,15,255,215,1,180,1,159,255,215,1,180,1,184,255,215,1,180,1,187,255,215,1,180,1,190,255,215,1,180,1,193,255,215,1,180,1,225,255,215,1,180,2,108,255,215,1,180,2,124,255,215,1,180,2,126,255,215,1,180,2,132,255,215,1,180,2,134,255,215,1,180,2,136,255,215,1,180,2,138,255,215,1,180,2,140,255,215,1,180,2,177,255,215,1,180,2,179,255,215,1,180,2,191,255,215,1,180,2,192,255,215,1,180,2,193,255,215,1,180,2,194,255,215,1,180,2,197,255,154,1,180,2,199,255,154,1,180,2,212,255,215,1,180,2,213,255,215,1,180,2,239,255,215,1,180,2,241,255,215,1,180,2,243,255,215,1,180,2,253,255,215,1,180,2,254,255,215,1,180,3,9,255,215,1,180,3,11,255,215,1,180,3,14,255,215,1,180,3,16,255,215,1,180,3,21,255,215,1,180,3,25,255,236,1,184,0,15,255,174,1,184,0,17,255,174,1,184,1,157,255,236,1,184,1,164,255,215,1,184,1,166,255,236,1,184,1,168,255,215,1,184,1,170,255,215,1,184,1,174,255,215,1,184,1,176,255,215,1,184,1,177,255,236,1,184,1,181,255,215,1,184,1,188,255,195,1,184,1,189,255,215,1,184,1,191,255,215,1,184,1,193,255,215,1,184,1,196,255,236,1,184,1,199,255,236,1,184,1,206,255,236,1,184,1,213,255,236,1,184,1,242,255,236,1,184,2,8,255,174,1,184,2,12,255,174,1,184,2,114,255,215,1,184,2,115,255,236,1,184,2,122,255,236,1,184,2,124,255,215,1,184,2,128,255,236,1,184,2,130,255,236,1,184,2,159,255,215,1,184,2,161,255,236,1,184,2,169,255,236,1,184,2,181,255,195,1,184,2,183,255,236,1,184,2,185,255,236,1,184,2,187,255,215,1,184,2,189,255,236,1,184,2,191,255,215,1,184,2,193,255,215,1,184,2,202,255,215,1,184,2,206,255,215,1,184,2,207,255,236,1,184,2,212,255,215,1,184,2,217,255,215,1,184,2,219,255,215,1,184,2,221,255,215,1,184,2,229,255,215,1,184,2,231,255,236,1,184,2,245,255,236,1,184,2,247,255,215,1,184,2,249,255,215,1,184,2,251,255,215,1,184,2,253,255,215,1,184,3,5,255,215,1,184,3,7,255,215,1,184,3,13,255,215,1,184,3,15,255,215,1,184,3,17,255,215,1,184,3,18,255,236,1,184,3,23,255,236,1,184,3,27,255,215,1,184,3,28,255,236,1,186,0,15,254,246,1,186,0,17,254,246,1,186,1,164,255,133,1,186,1,170,255,154,1,186,1,174,255,133,1,186,1,176,255,215,1,186,1,181,255,133,1,186,1,191,255,215,1,186,1,206,255,154,1,186,1,213,255,154,1,186,1,242,255,154,1,186,2,8,254,246,1,186,2,12,254,246,1,186,2,114,255,154,1,186,2,115,255,154,1,186,2,118,255,236,1,186,2,159,255,215,1,186,2,187,255,215,1,186,2,202,255,215,1,186,2,206,255,133,1,186,2,207,255,154,1,186,2,217,255,154,1,186,2,219,255,154,1,186,2,221,255,154,1,186,2,229,255,215,1,186,3,5,255,215,1,186,3,7,255,215,1,186,3,9,255,174,1,186,3,11,255,174,1,186,3,17,255,133,1,186,3,18,255,154,1,186,3,27,255,133,1,186,3,28,255,154,1,187,1,159,255,215,1,187,1,184,255,215,1,187,1,187,255,215,1,187,1,190,255,215,1,187,1,225,255,215,1,187,2,108,255,215,1,187,2,126,255,215,1,187,2,132,255,215,1,187,2,134,255,215,1,187,2,136,255,215,1,187,2,138,255,215,1,187,2,140,255,215,1,187,2,177,255,215,1,187,2,179,255,215,1,187,2,192,255,215,1,187,2,194,255,215,1,187,2,197,255,215,1,187,2,199,255,215,1,187,2,213,255,215,1,187,2,239,255,215,1,187,2,241,255,215,1,187,2,243,255,215,1,187,2,254,255,215,1,187,3,9,255,215,1,187,3,11,255,215,1,187,3,14,255,215,1,187,3,16,255,215,1,187,3,21,255,215,1,188,0,15,255,133,1,188,0,16,255,174,1,188,0,17,255,133,1,188,1,159,255,215,1,188,1,164,255,154,1,188,1,170,255,113,1,188,1,174,255,154,1,188,1,181,255,154,1,188,1,184,255,215,1,188,1,187,255,215,1,188,1,188,0,41,1,188,1,190,255,174,1,188,1,204,255,154,1,188,1,205,255,154,1,188,1,206,255,133,1,188,1,207,255,113,1,188,1,208,255,215,1,188,1,209,255,215,1,188,1,210,255,154,1,188,1,211,255,154,1,188,1,212,255,154,1,188,1,213,255,133,1,188,1,214,255,154,1,188,1,215,255,154,1,188,1,216,255,113,1,188,1,217,255,154,1,188,1,218,255,154,1,188,1,219,255,113,1,188,1,220,255,174,1,188,1,221,255,174,1,188,1,222,255,113,1,188,1,223,255,215,1,188,1,224,255,154,1,188,1,225,255,154,1,188,1,226,255,154,1,188,1,227,255,154,1,188,1,228,255,174,1,188,1,229,255,154,1,188,1,230,255,154,1,188,1,231,255,215,1,188,1,232,255,154,1,188,1,233,255,195,1,188,1,234,255,113,1,188,1,236,255,154,1,188,1,237,255,113,1,188,1,238,255,133,1,188,1,242,255,133,1,188,1,243,255,154,1,188,1,245,255,154,1,188,1,246,255,174,1,188,1,247,255,154,1,188,1,249,255,154,1,188,2,2,255,174,1,188,2,3,255,174,1,188,2,4,255,174,1,188,2,8,255,133,1,188,2,12,255,133,1,188,2,106,255,113,1,188,2,107,255,154,1,188,2,108,255,215,1,188,2,109,255,215,1,188,2,113,255,154,1,188,2,114,255,113,1,188,2,115,255,133,1,188,2,117,255,154,1,188,2,119,255,154,1,188,2,121,255,154,1,188,2,125,255,154,1,188,2,126,255,215,1,188,2,127,255,113,1,188,2,129,255,215,1,188,2,131,255,215,1,188,2,132,255,215,1,188,2,133,255,113,1,188,2,134,255,215,1,188,2,135,255,113,1,188,2,136,255,215,1,188,2,137,255,113,1,188,2,138,255,215,1,188,2,139,255,215,1,188,2,140,255,215,1,188,2,141,255,113,1,188,2,150,255,154,1,188,2,154,255,154,1,188,2,158,255,154,1,188,2,160,255,215,1,188,2,162,255,215,1,188,2,164,255,154,1,188,2,166,255,154,1,188,2,170,255,174,1,188,2,172,255,154,1,188,2,174,255,154,1,188,2,176,255,154,1,188,2,177,255,215,1,188,2,178,255,113,1,188,2,179,255,215,1,188,2,180,255,113,1,188,2,181,0,41,1,188,2,182,255,174,1,188,2,184,255,174,1,188,2,186,255,174,1,188,2,188,255,215,1,188,2,190,255,174,1,188,2,192,255,154,1,188,2,194,255,154,1,188,2,196,255,154,1,188,2,197,255,154,1,188,2,198,255,113,1,188,2,199,255,154,1,188,2,200,255,113,1,188,2,203,255,215,1,188,2,205,255,154,1,188,2,206,255,154,1,188,2,207,255,133,1,188,2,209,255,154,1,188,2,211,255,154,1,188,2,213,255,154,1,188,2,215,255,154,1,188,2,217,255,113,1,188,2,219,255,113,1,188,2,221,255,113,1,188,2,224,255,113,1,188,2,230,255,215,1,188,2,232,255,215,1,188,2,234,255,195,1,188,2,236,255,154,1,188,2,238,255,154,1,188,2,239,255,215,1,188,2,240,255,113,1,188,2,241,255,215,1,188,2,242,255,113,1,188,2,243,255,215,1,188,2,244,255,113,1,188,2,246,255,215,1,188,2,248,255,174,1,188,2,250,255,174,1,188,2,252,255,174,1,188,2,254,255,154,1,188,3,0,255,154,1,188,3,2,255,154,1,188,3,6,255,215,1,188,3,8,255,215,1,188,3,9,255,113,1,188,3,10,255,113,1,188,3,11,255,113,1,188,3,12,255,113,1,188,3,14,255,154,1,188,3,16,255,154,1,188,3,17,255,154,1,188,3,18,255,133,1,188,3,20,255,154,1,188,3,21,255,215,1,188,3,22,255,113,1,188,3,24,255,174,1,188,3,26,255,113,1,188,3,27,255,154,1,188,3,28,255,133,1,189,0,15,255,133,1,189,0,17,255,133,1,189,1,159,255,236,1,189,1,164,255,154,1,189,1,170,255,113,1,189,1,174,255,154,1,189,1,181,255,154,1,189,1,184,255,236,1,189,1,187,255,236,1,189,1,190,255,195,1,189,1,201,255,236,1,189,1,206,255,174,1,189,1,207,255,215,1,189,1,213,255,174,1,189,1,216,255,215,1,189,1,219,255,215,1,189,1,222,255,215,1,189,1,225,255,215,1,189,1,234,255,215,1,189,1,235,0,102,1,189,1,237,255,215,1,189,1,238,255,236,1,189,1,242,255,174,1,189,1,244,0,102,1,189,2,8,255,133,1,189,2,12,255,133,1,189,2,106,255,215,1,189,2,108,255,236,1,189,2,114,255,113,1,189,2,115,255,174,1,189,2,126,255,236,1,189,2,127,255,215,1,189,2,132,255,236,1,189,2,133,255,215,1,189,2,134,255,236,1,189,2,135,255,215,1,189,2,136,255,236,1,189,2,137,255,215,1,189,2,138,255,236,1,189,2,140,255,236,1,189,2,141,255,215,1,189,2,152,0,102,1,189,2,168,0,102,1,189,2,177,255,236,1,189,2,178,255,215,1,189,2,179,255,236,1,189,2,180,255,215,1,189,2,192,255,215,1,189,2,194,255,215,1,189,2,197,255,215,1,189,2,198,255,195,1,189,2,199,255,215,1,189,2,200,255,195,1,189,2,206,255,154,1,189,2,207,255,174,1,189,2,213,255,215,1,189,2,217,255,113,1,189,2,219,255,113,1,189,2,221,255,113,1,189,2,224,255,215,1,189,2,239,255,236,1,189,2,240,255,215,1,189,2,241,255,236,1,189,2,242,255,215,1,189,2,243,255,236,1,189,2,244,255,215,1,189,2,254,255,215,1,189,3,9,255,113,1,189,3,10,255,215,1,189,3,11,255,113,1,189,3,12,255,215,1,189,3,17,255,154,1,189,3,18,255,174,1,189,3,21,255,236,1,189,3,22,255,215,1,189,3,26,255,215,1,189,3,27,255,154,1,189,3,28,255,174,1,190,0,15,255,174,1,190,0,17,255,174,1,190,1,157,255,215,1,190,1,164,255,215,1,190,1,166,255,215,1,190,1,168,255,195,1,190,1,170,255,215,1,190,1,174,255,215,1,190,1,176,255,215,1,190,1,177,255,215,1,190,1,181,255,215,1,190,1,188,255,195,1,190,1,189,255,195,1,190,1,191,255,215,1,190,1,196,255,215,1,190,1,199,255,215,1,190,1,206,255,236,1,190,1,213,255,236,1,190,1,242,255,236,1,190,2,8,255,174,1,190,2,12,255,174,1,190,2,114,255,215,1,190,2,115,255,236,1,190,2,122,255,215,1,190,2,128,255,236,1,190,2,130,255,236,1,190,2,159,255,215,1,190,2,161,255,215,1,190,2,169,255,215,1,190,2,181,255,195,1,190,2,183,255,195,1,190,2,185,255,195,1,190,2,187,255,215,1,190,2,189,255,215,1,190,2,202,255,215,1,190,2,206,255,215,1,190,2,207,255,236,1,190,2,217,255,215,1,190,2,219,255,215,1,190,2,221,255,215,1,190,2,229,255,215,1,190,2,231,255,215,1,190,2,245,255,215,1,190,2,247,255,195,1,190,2,249,255,195,1,190,2,251,255,195,1,190,3,5,255,215,1,190,3,7,255,215,1,190,3,13,255,215,1,190,3,15,255,215,1,190,3,17,255,215,1,190,3,18,255,236,1,190,3,23,255,215,1,190,3,27,255,215,1,190,3,28,255,236,1,191,1,159,255,215,1,191,1,184,255,215,1,191,1,187,255,215,1,191,1,190,255,215,1,191,1,193,255,215,1,191,1,225,255,215,1,191,2,108,255,215,1,191,2,124,255,215,1,191,2,126,255,215,1,191,2,132,255,215,1,191,2,134,255,215,1,191,2,136,255,215,1,191,2,138,255,215,1,191,2,140,255,215,1,191,2,177,255,215,1,191,2,179,255,215,1,191,2,191,255,215,1,191,2,192,255,215,1,191,2,193,255,215,1,191,2,194,255,215,1,191,2,197,255,154,1,191,2,199,255,154,1,191,2,212,255,215,1,191,2,213,255,215,1,191,2,239,255,215,1,191,2,241,255,215,1,191,2,243,255,215,1,191,2,253,255,215,1,191,2,254,255,215,1,191,3,9,255,215,1,191,3,11,255,215,1,191,3,14,255,215,1,191,3,16,255,215,1,191,3,21,255,215,1,191,3,25,255,236,1,192,1,163,0,225,1,192,2,234,0,41,1,192,3,14,255,215,1,192,3,16,255,215,1,195,1,163,0,225,1,195,2,234,0,41,1,195,3,14,255,215,1,195,3,16,255,215,1,196,0,5,255,174,1,196,0,10,255,174,1,196,1,157,255,133,1,196,1,166,255,133,1,196,1,168,255,215,1,196,1,188,255,154,1,196,1,189,255,215,1,196,1,193,255,154,1,196,1,196,255,133,1,196,1,220,255,215,1,196,1,221,255,215,1,196,1,225,255,215,1,196,1,228,255,215,1,196,1,246,255,215,1,196,2,7,255,174,1,196,2,11,255,174,1,196,2,110,255,174,1,196,2,124,255,154,1,196,2,128,255,174,1,196,2,130,255,174,1,196,2,151,255,174,1,196,2,155,255,174,1,196,2,167,255,174,1,196,2,169,255,133,1,196,2,170,255,215,1,196,2,181,255,154,1,196,2,182,255,215,1,196,2,183,255,154,1,196,2,184,255,215,1,196,2,185,255,154,1,196,2,186,255,215,1,196,2,189,255,133,1,196,2,190,255,215,1,196,2,191,255,154,1,196,2,192,255,215,1,196,2,193,255,154,1,196,2,194,255,215,1,196,2,212,255,154,1,196,2,213,255,215,1,196,2,247,255,215,1,196,2,248,255,215,1,196,2,249,255,215,1,196,2,250,255,215,1,196,2,251,255,215,1,196,2,252,255,215,1,196,2,253,255,154,1,196,2,254,255,215,1,196,3,3,255,174,1,196,3,13,255,154,1,196,3,14,255,195,1,196,3,15,255,154,1,196,3,16,255,195,1,196,3,23,255,133,1,196,3,24,255,215,1,198,0,5,255,174,1,198,0,10,255,174,1,198,1,157,255,133,1,198,1,166,255,133,1,198,1,168,255,215,1,198,1,188,255,154,1,198,1,189,255,215,1,198,1,193,255,154,1,198,1,196,255,133,1,198,1,220,255,215,1,198,1,221,255,215,1,198,1,225,255,215,1,198,1,228,255,215,1,198,1,246,255,215,1,198,2,7,255,174,1,198,2,11,255,174,1,198,2,110,255,174,1,198,2,124,255,154,1,198,2,128,255,174,1,198,2,130,255,174,1,198,2,151,255,174,1,198,2,155,255,174,1,198,2,167,255,174,1,198,2,169,255,133,1,198,2,170,255,215,1,198,2,181,255,154,1,198,2,182,255,215,1,198,2,183,255,154,1,198,2,184,255,215,1,198,2,185,255,154,1,198,2,186,255,215,1,198,2,189,255,133,1,198,2,190,255,215,1,198,2,191,255,154,1,198,2,192,255,215,1,198,2,193,255,154,1,198,2,194,255,215,1,198,2,212,255,154,1,198,2,213,255,215,1,198,2,247,255,215,1,198,2,248,255,215,1,198,2,249,255,215,1,198,2,250,255,215,1,198,2,251,255,215,1,198,2,252,255,215,1,198,2,253,255,154,1,198,2,254,255,215,1,198,3,3,255,174,1,198,3,13,255,154,1,198,3,14,255,195,1,198,3,15,255,154,1,198,3,16,255,195,1,198,3,23,255,133,1,198,3,24,255,215,1,199,0,15,255,174,1,199,0,17,255,174,1,199,1,157,255,236,1,199,1,164,255,215,1,199,1,166,255,236,1,199,1,168,255,215,1,199,1,170,255,215,1,199,1,174,255,215,1,199,1,176,255,215,1,199,1,177,255,236,1,199,1,181,255,215,1,199,1,188,255,195,1,199,1,189,255,215,1,199,1,191,255,215,1,199,1,193,255,215,1,199,1,196,255,236,1,199,1,199,255,236,1,199,1,206,255,236,1,199,1,213,255,236,1,199,1,242,255,236,1,199,2,8,255,174,1,199,2,12,255,174,1,199,2,114,255,215,1,199,2,115,255,236,1,199,2,122,255,236,1,199,2,124,255,215,1,199,2,128,255,236,1,199,2,130,255,236,1,199,2,159,255,215,1,199,2,161,255,236,1,199,2,169,255,236,1,199,2,181,255,195,1,199,2,183,255,236,1,199,2,185,255,236,1,199,2,187,255,215,1,199,2,189,255,236,1,199,2,191,255,215,1,199,2,193,255,215,1,199,2,202,255,215,1,199,2,206,255,215,1,199,2,207,255,236,1,199,2,212,255,215,1,199,2,217,255,215,1,199,2,219,255,215,1,199,2,221,255,215,1,199,2,229,255,215,1,199,2,231,255,236,1,199,2,245,255,236,1,199,2,247,255,215,1,199,2,249,255,215,1,199,2,251,255,215,1,199,2,253,255,215,1,199,3,5,255,215,1,199,3,7,255,215,1,199,3,13,255,215,1,199,3,15,255,215,1,199,3,17,255,215,1,199,3,18,255,236,1,199,3,23,255,236,1,199,3,27,255,215,1,199,3,28,255,236,1,200,0,15,255,174,1,200,0,17,255,174,1,200,1,157,255,236,1,200,1,164,255,215,1,200,1,166,255,236,1,200,1,168,255,215,1,200,1,170,255,215,1,200,1,174,255,215,1,200,1,176,255,215,1,200,1,177,255,236,1,200,1,181,255,215,1,200,1,188,255,195,1,200,1,189,255,215,1,200,1,191,255,215,1,200,1,193,255,215,1,200,1,196,255,236,1,200,1,199,255,236,1,200,1,206,255,236,1,200,1,213,255,236,1,200,1,242,255,236,1,200,2,8,255,174,1,200,2,12,255,174,1,200,2,114,255,215,1,200,2,115,255,236,1,200,2,122,255,236,1,200,2,124,255,215,1,200,2,128,255,236,1,200,2,130,255,236,1,200,2,159,255,215,1,200,2,161,255,236,1,200,2,169,255,236,1,200,2,181,255,195,1,200,2,183,255,236,1,200,2,185,255,236,1,200,2,187,255,215,1,200,2,189,255,236,1,200,2,191,255,215,1,200,2,193,255,215,1,200,2,202,255,215,1,200,2,206,255,215,1,200,2,207,255,236,1,200,2,212,255,215,1,200,2,217,255,215,1,200,2,219,255,215,1,200,2,221,255,215,1,200,2,229,255,215,1,200,2,231,255,236,1,200,2,245,255,236,1,200,2,247,255,215,1,200,2,249,255,215,1,200,2,251,255,215,1,200,2,253,255,215,1,200,3,5,255,215,1,200,3,7,255,215,1,200,3,13,255,215,1,200,3,15,255,215,1,200,3,17,255,215,1,200,3,18,255,236,1,200,3,23,255,236,1,200,3,27,255,215,1,200,3,28,255,236,1,202,0,5,255,236,1,202,0,10,255,236,1,202,2,7,255,236,1,202,2,11,255,236,1,204,1,233,0,41,1,205,0,15,255,154,1,205,0,16,255,215,1,205,0,17,255,154,1,205,1,206,255,195,1,205,1,207,255,236,1,205,1,213,255,195,1,205,1,216,255,236,1,205,1,219,255,236,1,205,1,222,255,236,1,205,1,234,255,236,1,205,1,237,255,236,1,205,1,242,255,195,1,205,2,2,255,215,1,205,2,3,255,215,1,205,2,4,255,215,1,205,2,8,255,154,1,205,2,12,255,154,1,205,2,106,255,236,1,205,2,115,255,195,1,205,2,127,255,236,1,205,2,133,255,236,1,205,2,135,255,236,1,205,2,137,255,236,1,205,2,141,255,236,1,205,2,178,255,236,1,205,2,180,255,236,1,205,2,207,255,195,1,205,2,224,255,236,1,205,2,240,255,236,1,205,2,242,255,236,1,205,2,244,255,236,1,205,3,10,255,236,1,205,3,12,255,236,1,205,3,18,255,195,1,205,3,22,255,236,1,205,3,26,255,236,1,205,3,28,255,195,1,206,0,5,255,236,1,206,0,10,255,236,1,206,2,7,255,236,1,206,2,11,255,236,1,207,0,5,255,236,1,207,0,10,255,236,1,207,2,7,255,236,1,207,2,11,255,236,1,208,1,207,255,215,1,208,1,216,255,215,1,208,1,219,255,215,1,208,1,222,255,215,1,208,1,225,255,215,1,208,1,234,255,215,1,208,1,237,255,215,1,208,2,106,255,215,1,208,2,127,255,215,1,208,2,133,255,215,1,208,2,135,255,215,1,208,2,137,255,215,1,208,2,141,255,215,1,208,2,178,255,215,1,208,2,180,255,215,1,208,2,192,255,215,1,208,2,194,255,215,1,208,2,198,255,215,1,208,2,200,255,215,1,208,2,213,255,215,1,208,2,224,255,215,1,208,2,240,255,215,1,208,2,242,255,215,1,208,2,244,255,215,1,208,2,254,255,215,1,208,3,10,255,215,1,208,3,12,255,215,1,208,3,22,255,215,1,208,3,26,255,215,1,209,1,233,0,41,1,212,1,207,255,215,1,212,1,216,255,215,1,212,1,219,255,215,1,212,1,222,255,215,1,212,1,225,255,215,1,212,1,234,255,215,1,212,1,237,255,215,1,212,2,106,255,215,1,212,2,127,255,215,1,212,2,133,255,215,1,212,2,135,255,215,1,212,2,137,255,215,1,212,2,141,255,215,1,212,2,178,255,215,1,212,2,180,255,215,1,212,2,192,255,215,1,212,2,194,255,215,1,212,2,198,255,215,1,212,2,200,255,215,1,212,2,213,255,215,1,212,2,224,255,215,1,212,2,240,255,215,1,212,2,242,255,215,1,212,2,244,255,215,1,212,2,254,255,215,1,212,3,10,255,215,1,212,3,12,255,215,1,212,3,22,255,215,1,212,3,26,255,215,1,216,0,5,255,236,1,216,0,10,255,236,1,216,1,208,255,215,1,216,1,220,255,236,1,216,1,221,255,236,1,216,1,223,255,215,1,216,1,225,255,236,1,216,1,228,255,236,1,216,1,246,255,236,1,216,2,7,255,236,1,216,2,11,255,236,1,216,2,160,255,215,1,216,2,170,255,236,1,216,2,182,255,236,1,216,2,188,255,215,1,216,2,190,255,236,1,216,2,192,255,236,1,216,2,194,255,236,1,216,2,203,255,215,1,216,2,213,255,236,1,216,2,230,255,215,1,216,2,248,255,236,1,216,2,250,255,236,1,216,2,252,255,236,1,216,2,254,255,236,1,216,3,6,255,215,1,216,3,8,255,215,1,216,3,14,255,236,1,216,3,16,255,236,1,216,3,24,255,236,1,218,0,5,255,236,1,218,0,10,255,236,1,218,1,208,255,215,1,218,1,220,255,236,1,218,1,221,255,236,1,218,1,223,255,215,1,218,1,225,255,236,1,218,1,228,255,236,1,218,1,246,255,236,1,218,2,7,255,236,1,218,2,11,255,236,1,218,2,160,255,215,1,218,2,170,255,236,1,218,2,182,255,236,1,218,2,188,255,215,1,218,2,190,255,236,1,218,2,192,255,236,1,218,2,194,255,236,1,218,2,203,255,215,1,218,2,213,255,236,1,218,2,230,255,215,1,218,2,248,255,236,1,218,2,250,255,236,1,218,2,252,255,236,1,218,2,254,255,236,1,218,3,6,255,215,1,218,3,8,255,215,1,218,3,14,255,236,1,218,3,16,255,236,1,218,3,24,255,236,1,220,0,15,255,154,1,220,0,16,255,215,1,220,0,17,255,154,1,220,1,206,255,195,1,220,1,207,255,236,1,220,1,213,255,195,1,220,1,216,255,236,1,220,1,219,255,236,1,220,1,222,255,236,1,220,1,234,255,236,1,220,1,237,255,236,1,220,1,242,255,195,1,220,2,2,255,215,1,220,2,3,255,215,1,220,2,4,255,215,1,220,2,8,255,154,1,220,2,12,255,154,1,220,2,106,255,236,1,220,2,115,255,195,1,220,2,127,255,236,1,220,2,133,255,236,1,220,2,135,255,236,1,220,2,137,255,236,1,220,2,141,255,236,1,220,2,178,255,236,1,220,2,180,255,236,1,220,2,207,255,195,1,220,2,224,255,236,1,220,2,240,255,236,1,220,2,242,255,236,1,220,2,244,255,236,1,220,3,10,255,236,1,220,3,12,255,236,1,220,3,18,255,195,1,220,3,22,255,236,1,220,3,26,255,236,1,220,3,28,255,195,1,221,0,15,255,174,1,221,0,17,255,174,1,221,1,206,255,215,1,221,1,213,255,215,1,221,1,242,255,215,1,221,2,8,255,174,1,221,2,12,255,174,1,221,2,115,255,215,1,221,2,207,255,215,1,221,3,18,255,215,1,221,3,28,255,215,1,222,0,5,255,236,1,222,0,10,255,236,1,222,1,208,255,215,1,222,1,220,255,236,1,222,1,221,255,236,1,222,1,223,255,215,1,222,1,225,255,236,1,222,1,228,255,236,1,222,1,246,255,236,1,222,2,7,255,236,1,222,2,11,255,236,1,222,2,160,255,215,1,222,2,170,255,236,1,222,2,182,255,236,1,222,2,188,255,215,1,222,2,190,255,236,1,222,2,192,255,236,1,222,2,194,255,236,1,222,2,203,255,215,1,222,2,213,255,236,1,222,2,230,255,215,1,222,2,248,255,236,1,222,2,250,255,236,1,222,2,252,255,236,1,222,2,254,255,236,1,222,3,6,255,215,1,222,3,8,255,215,1,222,3,14,255,236,1,222,3,16,255,236,1,222,3,24,255,236,1,223,1,207,255,215,1,223,1,216,255,215,1,223,1,219,255,215,1,223,1,222,255,215,1,223,1,225,255,215,1,223,1,234,255,215,1,223,1,237,255,215,1,223,2,106,255,215,1,223,2,127,255,215,1,223,2,133,255,215,1,223,2,135,255,215,1,223,2,137,255,215,1,223,2,141,255,215,1,223,2,178,255,215,1,223,2,180,255,215,1,223,2,192,255,215,1,223,2,194,255,215,1,223,2,198,255,215,1,223,2,200,255,215,1,223,2,213,255,215,1,223,2,224,255,215,1,223,2,240,255,215,1,223,2,242,255,215,1,223,2,244,255,215,1,223,2,254,255,215,1,223,3,10,255,215,1,223,3,12,255,215,1,223,3,22,255,215,1,223,3,26,255,215,1,224,0,5,255,236,1,224,0,10,255,236,1,224,2,7,255,236,1,224,2,11,255,236,1,227,0,5,255,236,1,227,0,10,255,236,1,227,2,7,255,236,1,227,2,11,255,236,1,228,0,5,255,133,1,228,0,10,255,133,1,228,1,208,255,215,1,228,1,220,255,154,1,228,1,221,255,195,1,228,1,223,255,215,1,228,1,225,255,174,1,228,1,228,255,154,1,228,1,246,255,195,1,228,2,7,255,133,1,228,2,11,255,133,1,228,2,109,255,215,1,228,2,129,255,215,1,228,2,131,255,215,1,228,2,139,255,215,1,228,2,160,255,215,1,228,2,170,255,154,1,228,2,182,255,154,1,228,2,184,255,195,1,228,2,186,255,195,1,228,2,188,255,215,1,228,2,190,255,154,1,228,2,192,255,174,1,228,2,194,255,174,1,228,2,198,255,215,1,228,2,200,255,215,1,228,2,203,255,215,1,228,2,213,255,174,1,228,2,230,255,215,1,228,2,234,255,215,1,228,2,248,255,195,1,228,2,250,255,195,1,228,2,252,255,195,1,228,2,254,255,174,1,228,3,6,255,215,1,228,3,8,255,215,1,228,3,14,255,154,1,228,3,16,255,154,1,228,3,24,255,154,1,230,0,5,255,133,1,230,0,10,255,133,1,230,1,208,255,215,1,230,1,220,255,154,1,230,1,221,255,195,1,230,1,223,255,215,1,230,1,225,255,174,1,230,1,228,255,154,1,230,1,246,255,195,1,230,2,7,255,133,1,230,2,11,255,133,1,230,2,109,255,215,1,230,2,129,255,215,1,230,2,131,255,215,1,230,2,139,255,215,1,230,2,160,255,215,1,230,2,170,255,154,1,230,2,182,255,154,1,230,2,184,255,195,1,230,2,186,255,195,1,230,2,188,255,215,1,230,2,190,255,154,1,230,2,192,255,174,1,230,2,194,255,174,1,230,2,198,255,215,1,230,2,200,255,215,1,230,2,203,255,215,1,230,2,213,255,174,1,230,2,230,255,215,1,230,2,234,255,215,1,230,2,248,255,195,1,230,2,250,255,195,1,230,2,252,255,195,1,230,2,254,255,174,1,230,3,6,255,215,1,230,3,8,255,215,1,230,3,14,255,154,1,230,3,16,255,154,1,230,3,24,255,154,1,231,0,5,255,236,1,231,0,10,255,236,1,231,1,208,255,215,1,231,1,220,255,236,1,231,1,221,255,236,1,231,1,223,255,215,1,231,1,225,255,236,1,231,1,228,255,236,1,231,1,246,255,236,1,231,2,7,255,236,1,231,2,11,255,236,1,231,2,160,255,215,1,231,2,170,255,236,1,231,2,182,255,236,1,231,2,188,255,215,1,231,2,190,255,236,1,231,2,192,255,236,1,231,2,194,255,236,1,231,2,203,255,215,1,231,2,213,255,236,1,231,2,230,255,215,1,231,2,248,255,236,1,231,2,250,255,236,1,231,2,252,255,236,1,231,2,254,255,236,1,231,3,6,255,215,1,231,3,8,255,215,1,231,3,14,255,236,1,231,3,16,255,236,1,231,3,24,255,236,1,232,0,5,255,236,1,232,0,10,255,236,1,232,1,208,255,215,1,232,1,220,255,236,1,232,1,221,255,236,1,232,1,223,255,215,1,232,1,225,255,236,1,232,1,228,255,236,1,232,1,246,255,236,1,232,2,7,255,236,1,232,2,11,255,236,1,232,2,160,255,215,1,232,2,170,255,236,1,232,2,182,255,236,1,232,2,188,255,215,1,232,2,190,255,236,1,232,2,192,255,236,1,232,2,194,255,236,1,232,2,203,255,215,1,232,2,213,255,236,1,232,2,230,255,215,1,232,2,248,255,236,1,232,2,250,255,236,1,232,2,252,255,236,1,232,2,254,255,236,1,232,3,6,255,215,1,232,3,8,255,215,1,232,3,14,255,236,1,232,3,16,255,236,1,232,3,24,255,236,1,234,0,5,255,236,1,234,0,10,255,236,1,234,2,7,255,236,1,234,2,11,255,236,1,235,0,5,255,236,1,235,0,10,255,236,1,235,2,7,255,236,1,235,2,11,255,236,1,235,3,14,255,215,1,235,3,16,255,215,1,236,0,15,255,154,1,236,0,16,255,215,1,236,0,17,255,154,1,236,1,206,255,195,1,236,1,207,255,236,1,236,1,213,255,195,1,236,1,216,255,236,1,236,1,219,255,236,1,236,1,222,255,236,1,236,1,234,255,236,1,236,1,237,255,236,1,236,1,242,255,195,1,236,2,2,255,215,1,236,2,3,255,215,1,236,2,4,255,215,1,236,2,8,255,154,1,236,2,12,255,154,1,236,2,106,255,236,1,236,2,115,255,195,1,236,2,127,255,236,1,236,2,133,255,236,1,236,2,135,255,236,1,236,2,137,255,236,1,236,2,141,255,236,1,236,2,178,255,236,1,236,2,180,255,236,1,236,2,207,255,195,1,236,2,224,255,236,1,236,2,240,255,236,1,236,2,242,255,236,1,236,2,244,255,236,1,236,3,10,255,236,1,236,3,12,255,236,1,236,3,18,255,195,1,236,3,22,255,236,1,236,3,26,255,236,1,236,3,28,255,195,1,242,0,5,255,133,1,242,0,10,255,133,1,242,1,208,255,215,1,242,1,220,255,154,1,242,1,221,255,195,1,242,1,223,255,215,1,242,1,225,255,174,1,242,1,228,255,154,1,242,1,246,255,195,1,242,2,7,255,133,1,242,2,11,255,133,1,242,2,109,255,215,1,242,2,129,255,215,1,242,2,131,255,215,1,242,2,139,255,215,1,242,2,160,255,215,1,242,2,170,255,154,1,242,2,182,255,154,1,242,2,184,255,195,1,242,2,186,255,195,1,242,2,188,255,215,1,242,2,190,255,154,1,242,2,192,255,174,1,242,2,194,255,174,1,242,2,198,255,215,1,242,2,200,255,215,1,242,2,203,255,215,1,242,2,213,255,174,1,242,2,230,255,215,1,242,2,234,255,215,1,242,2,248,255,195,1,242,2,250,255,195,1,242,2,252,255,195,1,242,2,254,255,174,1,242,3,6,255,215,1,242,3,8,255,215,1,242,3,14,255,154,1,242,3,16,255,154,1,242,3,24,255,154,1,243,0,5,255,133,1,243,0,10,255,133,1,243,1,208,255,215,1,243,1,220,255,154,1,243,1,221,255,195,1,243,1,223,255,215,1,243,1,225,255,174,1,243,1,228,255,154,1,243,1,246,255,195,1,243,2,7,255,133,1,243,2,11,255,133,1,243,2,109,255,215,1,243,2,129,255,215,1,243,2,131,255,215,1,243,2,139,255,215,1,243,2,160,255,215,1,243,2,170,255,154,1,243,2,182,255,154,1,243,2,184,255,195,1,243,2,186,255,195,1,243,2,188,255,215,1,243,2,190,255,154,1,243,2,192,255,174,1,243,2,194,255,174,1,243,2,198,255,215,1,243,2,200,255,215,1,243,2,203,255,215,1,243,2,213,255,174,1,243,2,230,255,215,1,243,2,234,255,215,1,243,2,248,255,195,1,243,2,250,255,195,1,243,2,252,255,195,1,243,2,254,255,174,1,243,3,6,255,215,1,243,3,8,255,215,1,243,3,14,255,154,1,243,3,16,255,154,1,243,3,24,255,154,1,244,0,5,255,236,1,244,0,10,255,236,1,244,2,7,255,236,1,244,2,11,255,236,1,244,3,14,255,215,1,244,3,16,255,215,1,245,1,207,255,215,1,245,1,216,255,215,1,245,1,219,255,215,1,245,1,222,255,215,1,245,1,225,255,215,1,245,1,234,255,215,1,245,1,237,255,215,1,245,2,106,255,215,1,245,2,127,255,215,1,245,2,133,255,215,1,245,2,135,255,215,1,245,2,137,255,215,1,245,2,141,255,215,1,245,2,178,255,215,1,245,2,180,255,215,1,245,2,192,255,215,1,245,2,194,255,215,1,245,2,198,255,215,1,245,2,200,255,215,1,245,2,213,255,215,1,245,2,224,255,215,1,245,2,240,255,215,1,245,2,242,255,215,1,245,2,244,255,215,1,245,2,254,255,215,1,245,3,10,255,215,1,245,3,12,255,215,1,245,3,22,255,215,1,245,3,26,255,215,1,246,0,15,255,174,1,246,0,17,255,174,1,246,1,206,255,215,1,246,1,213,255,215,1,246,1,242,255,215,1,246,2,8,255,174,1,246,2,12,255,174,1,246,2,115,255,215,1,246,2,207,255,215,1,246,3,18,255,215,1,246,3,28,255,215,1,248,0,15,255,133,1,248,0,16,255,174,1,248,0,17,255,133,1,248,1,159,255,215,1,248,1,164,255,154,1,248,1,170,255,113,1,248,1,174,255,154,1,248,1,181,255,154,1,248,1,184,255,215,1,248,1,187,255,215,1,248,1,188,0,41,1,248,1,190,255,174,1,248,1,204,255,154,1,248,1,205,255,154,1,248,1,206,255,133,1,248,1,207,255,113,1,248,1,208,255,215,1,248,1,209,255,215,1,248,1,210,255,154,1,248,1,211,255,154,1,248,1,212,255,154,1,248,1,213,255,133,1,248,1,214,255,154,1,248,1,215,255,154,1,248,1,216,255,113,1,248,1,217,255,154,1,248,1,218,255,154,1,248,1,219,255,113,1,248,1,220,255,174,1,248,1,221,255,174,1,248,1,222,255,113,1,248,1,223,255,215,1,248,1,224,255,154,1,248,1,225,255,154,1,248,1,226,255,154,1,248,1,227,255,154,1,248,1,228,255,174,1,248,1,229,255,154,1,248,1,230,255,154,1,248,1,231,255,215,1,248,1,232,255,154,1,248,1,233,255,195,1,248,1,234,255,113,1,248,1,236,255,154,1,248,1,237,255,113,1,248,1,238,255,133,1,248,1,242,255,133,1,248,1,243,255,154,1,248,1,245,255,154,1,248,1,246,255,174,1,248,1,247,255,154,1,248,1,249,255,154,1,248,2,2,255,174,1,248,2,3,255,174,1,248,2,4,255,174,1,248,2,8,255,133,1,248,2,12,255,133,1,248,2,106,255,113,1,248,2,107,255,154,1,248,2,108,255,215,1,248,2,109,255,215,1,248,2,113,255,154,1,248,2,114,255,113,1,248,2,115,255,133,1,248,2,117,255,154,1,248,2,119,255,154,1,248,2,121,255,154,1,248,2,125,255,154,1,248,2,126,255,215,1,248,2,127,255,113,1,248,2,129,255,215,1,248,2,131,255,215,1,248,2,132,255,215,1,248,2,133,255,113,1,248,2,134,255,215,1,248,2,135,255,113,1,248,2,136,255,215,1,248,2,137,255,113,1,248,2,138,255,215,1,248,2,139,255,215,1,248,2,140,255,215,1,248,2,141,255,113,1,248,2,150,255,154,1,248,2,154,255,154,1,248,2,158,255,154,1,248,2,160,255,215,1,248,2,162,255,215,1,248,2,164,255,154,1,248,2,166,255,154,1,248,2,170,255,174,1,248,2,172,255,154,1,248,2,174,255,154,1,248,2,176,255,154,1,248,2,177,255,215,1,248,2,178,255,113,1,248,2,179,255,215,1,248,2,180,255,113,1,248,2,181,0,41,1,248,2,182,255,174,1,248,2,184,255,174,1,248,2,186,255,174,1,248,2,188,255,215,1,248,2,190,255,174,1,248,2,192,255,154,1,248,2,194,255,154,1,248,2,196,255,154,1,248,2,197,255,154,1,248,2,198,255,113,1,248,2,199,255,154,1,248,2,200,255,113,1,248,2,203,255,215,1,248,2,205,255,154,1,248,2,206,255,154,1,248,2,207,255,133,1,248,2,209,255,154,1,248,2,211,255,154,1,248,2,213,255,154,1,248,2,215,255,154,1,248,2,217,255,113,1,248,2,219,255,113,1,248,2,221,255,113,1,248,2,224,255,113,1,248,2,230,255,215,1,248,2,232,255,215,1,248,2,234,255,195,1,248,2,236,255,154,1,248,2,238,255,154,1,248,2,239,255,215,1,248,2,240,255,113,1,248,2,241,255,215,1,248,2,242,255,113,1,248,2,243,255,215,1,248,2,244,255,113,1,248,2,246,255,215,1,248,2,248,255,174,1,248,2,250,255,174,1,248,2,252,255,174,1,248,2,254,255,154,1,248,3,0,255,154,1,248,3,2,255,154,1,248,3,6,255,215,1,248,3,8,255,215,1,248,3,9,255,113,1,248,3,10,255,113,1,248,3,11,255,113,1,248,3,12,255,113,1,248,3,14,255,154,1,248,3,16,255,154,1,248,3,17,255,154,1,248,3,18,255,133,1,248,3,20,255,154,1,248,3,21,255,215,1,248,3,22,255,113,1,248,3,24,255,174,1,248,3,26,255,113,1,248,3,27,255,154,1,248,3,28,255,133,1,249,0,15,255,154,1,249,0,16,255,215,1,249,0,17,255,154,1,249,1,206,255,195,1,249,1,207,255,236,1,249,1,213,255,195,1,249,1,216,255,236,1,249,1,219,255,236,1,249,1,222,255,236,1,249,1,234,255,236,1,249,1,237,255,236,1,249,1,242,255,195,1,249,2,2,255,215,1,249,2,3,255,215,1,249,2,4,255,215,1,249,2,8,255,154,1,249,2,12,255,154,1,249,2,106,255,236,1,249,2,115,255,195,1,249,2,127,255,236,1,249,2,133,255,236,1,249,2,135,255,236,1,249,2,137,255,236,1,249,2,141,255,236,1,249,2,178,255,236,1,249,2,180,255,236,1,249,2,207,255,195,1,249,2,224,255,236,1,249,2,240,255,236,1,249,2,242,255,236,1,249,2,244,255,236,1,249,3,10,255,236,1,249,3,12,255,236,1,249,3,18,255,195,1,249,3,22,255,236,1,249,3,26,255,236,1,249,3,28,255,195,1,250,0,15,255,154,1,250,0,17,255,154,1,250,0,34,0,41,1,250,0,36,255,174,1,250,0,38,255,236,1,250,0,42,255,236,1,250,0,50,255,236,1,250,0,52,255,236,1,250,0,68,255,215,1,250,0,70,255,215,1,250,0,71,255,215,1,250,0,72,255,215,1,250,0,74,255,236,1,250,0,80,255,236,1,250,0,81,255,236,1,250,0,82,255,215,1,250,0,83,255,236,1,250,0,84,255,215,1,250,0,85,255,236,1,250,0,86,255,236,1,250,0,88,255,236,1,250,0,130,255,174,1,250,0,131,255,174,1,250,0,132,255,174,1,250,0,133,255,174,1,250,0,134,255,174,1,250,0,135,255,174,1,250,0,137,255,236,1,250,0,148,255,236,1,250,0,149,255,236,1,250,0,150,255,236,1,250,0,151,255,236,1,250,0,152,255,236,1,250,0,154,255,236,1,250,0,162,255,215,1,250,0,163,255,215,1,250,0,164,255,215,1,250,0,165,255,215,1,250,0,166,255,215,1,250,0,167,255,215,1,250,0,168,255,215,1,250,0,169,255,215,1,250,0,170,255,215,1,250,0,171,255,215,1,250,0,172,255,215,1,250,0,173,255,215,1,250,0,180,255,215,1,250,0,181,255,215,1,250,0,182,255,215,1,250,0,183,255,215,1,250,0,184,255,215,1,250,0,186,255,215,1,250,0,187,255,236,1,250,0,188,255,236,1,250,0,189,255,236,1,250,0,190,255,236,1,250,0,194,255,174,1,250,0,195,255,215,1,250,0,196,255,174,1,250,0,197,255,215,1,250,0,198,255,174,1,250,0,199,255,215,1,250,0,200,255,236,1,250,0,201,255,215,1,250,0,202,255,236,1,250,0,203,255,215,1,250,0,204,255,236,1,250,0,205,255,215,1,250,0,206,255,236,1,250,0,207,255,215,1,250,0,209,255,215,1,250,0,211,255,215,1,250,0,213,255,215,1,250,0,215,255,215,1,250,0,217,255,215,1,250,0,219,255,215,1,250,0,221,255,215,1,250,0,222,255,236,1,250,0,223,255,236,1,250,0,224,255,236,1,250,0,225,255,236,1,250,0,226,255,236,1,250,0,227,255,236,1,250,0,228,255,236,1,250,0,229,255,236,1,250,0,250,255,236,1,250,1,6,255,236,1,250,1,8,255,236,1,250,1,13,255,236,1,250,1,14,255,236,1,250,1,15,255,215,1,250,1,16,255,236,1,250,1,17,255,215,1,250,1,18,255,236,1,250,1,19,255,215,1,250,1,20,255,236,1,250,1,21,255,215,1,250,1,23,255,236,1,250,1,25,255,236,1,250,1,29,255,236,1,250,1,33,255,236,1,250,1,43,255,236,1,250,1,45,255,236,1,250,1,47,255,236,1,250,1,49,255,236,1,250,1,51,255,236,1,250,1,53,255,236,1,250,1,67,255,174,1,250,1,68,255,215,1,250,1,70,255,215,1,250,1,71,255,236,1,250,1,72,255,215,1,250,1,74,255,236,1,250,2,8,255,154,1,250,2,12,255,154,1,250,2,87,255,236,1,250,2,88,255,174,1,250,2,89,255,215,1,250,2,95,255,236,1,250,2,96,255,215,1,250,2,98,255,236,1,250,3,29,255,174,1,250,3,30,255,215,1,250,3,31,255,174,1,250,3,32,255,215,1,250,3,33,255,174,1,250,3,34,255,215,1,250,3,35,255,174,1,250,3,37,255,174,1,250,3,38,255,215,1,250,3,39,255,174,1,250,3,40,255,215,1,250,3,41,255,174,1,250,3,42,255,215,1,250,3,43,255,174,1,250,3,44,255,215,1,250,3,45,255,174,1,250,3,46,255,215,1,250,3,47,255,174,1,250,3,48,255,215,1,250,3,49,255,174,1,250,3,50,255,215,1,250,3,51,255,174,1,250,3,52,255,215,1,250,3,54,255,215,1,250,3,56,255,215,1,250,3,58,255,215,1,250,3,60,255,215,1,250,3,64,255,215,1,250,3,66,255,215,1,250,3,68,255,215,1,250,3,73,255,236,1,250,3,74,255,215,1,250,3,75,255,236,1,250,3,76,255,215,1,250,3,77,255,236,1,250,3,78,255,215,1,250,3,79,255,236,1,250,3,81,255,236,1,250,3,82,255,215,1,250,3,83,255,236,1,250,3,84,255,215,1,250,3,85,255,236,1,250,3,86,255,215,1,250,3,87,255,236,1,250,3,88,255,215,1,250,3,89,255,236,1,250,3,90,255,215,1,250,3,91,255,236,1,250,3,92,255,215,1,250,3,93,255,236,1,250,3,94,255,215,1,250,3,95,255,236,1,250,3,96,255,215,1,250,3,98,255,236,1,250,3,100,255,236,1,250,3,102,255,236,1,250,3,104,255,236,1,250,3,106,255,236,1,250,3,108,255,236,1,250,3,110,255,236,1,251,0,5,0,82,1,251,0,10,0,82,1,251,0,15,255,174,1,251,0,17,255,174,1,251,0,34,0,41,1,251,2,7,0,82,1,251,2,8,255,174,1,251,2,11,0,82,1,251,2,12,255,174,1,252,0,15,255,154,1,252,0,17,255,154,1,252,0,34,0,41,1,252,0,36,255,174,1,252,0,38,255,236,1,252,0,42,255,236,1,252,0,50,255,236,1,252,0,52,255,236,1,252,0,68,255,215,1,252,0,70,255,215,1,252,0,71,255,215,1,252,0,72,255,215,1,252,0,74,255,236,1,252,0,80,255,236,1,252,0,81,255,236,1,252,0,82,255,215,1,252,0,83,255,236,1,252,0,84,255,215,1,252,0,85,255,236,1,252,0,86,255,236,1,252,0,88,255,236,1,252,0,130,255,174,1,252,0,131,255,174,1,252,0,132,255,174,1,252,0,133,255,174,1,252,0,134,255,174,1,252,0,135,255,174,1,252,0,137,255,236,1,252,0,148,255,236,1,252,0,149,255,236,1,252,0,150,255,236,1,252,0,151,255,236,1,252,0,152,255,236,1,252,0,154,255,236,1,252,0,162,255,215,1,252,0,163,255,215,1,252,0,164,255,215,1,252,0,165,255,215,1,252,0,166,255,215,1,252,0,167,255,215,1,252,0,168,255,215,1,252,0,169,255,215,1,252,0,170,255,215,1,252,0,171,255,215,1,252,0,172,255,215,1,252,0,173,255,215,1,252,0,180,255,215,1,252,0,181,255,215,1,252,0,182,255,215,1,252,0,183,255,215,1,252,0,184,255,215,1,252,0,186,255,215,1,252,0,187,255,236,1,252,0,188,255,236,1,252,0,189,255,236,1,252,0,190,255,236,1,252,0,194,255,174,1,252,0,195,255,215,1,252,0,196,255,174,1,252,0,197,255,215,1,252,0,198,255,174,1,252,0,199,255,215,1,252,0,200,255,236,1,252,0,201,255,215,1,252,0,202,255,236,1,252,0,203,255,215,1,252,0,204,255,236,1,252,0,205,255,215,1,252,0,206,255,236,1,252,0,207,255,215,1,252,0,209,255,215,1,252,0,211,255,215,1,252,0,213,255,215,1,252,0,215,255,215,1,252,0,217,255,215,1,252,0,219,255,215,1,252,0,221,255,215,1,252,0,222,255,236,1,252,0,223,255,236,1,252,0,224,255,236,1,252,0,225,255,236,1,252,0,226,255,236,1,252,0,227,255,236,1,252,0,228,255,236,1,252,0,229,255,236,1,252,0,250,255,236,1,252,1,6,255,236,1,252,1,8,255,236,1,252,1,13,255,236,1,252,1,14,255,236,1,252,1,15,255,215,1,252,1,16,255,236,1,252,1,17,255,215,1,252,1,18,255,236,1,252,1,19,255,215,1,252,1,20,255,236,1,252,1,21,255,215,1,252,1,23,255,236,1,252,1,25,255,236,1,252,1,29,255,236,1,252,1,33,255,236,1,252,1,43,255,236,1,252,1,45,255,236,1,252,1,47,255,236,1,252,1,49,255,236,1,252,1,51,255,236,1,252,1,53,255,236,1,252,1,67,255,174,1,252,1,68,255,215,1,252,1,70,255,215,1,252,1,71,255,236,1,252,1,72,255,215,1,252,1,74,255,236,1,252,2,8,255,154,1,252,2,12,255,154,1,252,2,87,255,236,1,252,2,88,255,174,1,252,2,89,255,215,1,252,2,95,255,236,1,252,2,96,255,215,1,252,2,98,255,236,1,252,3,29,255,174,1,252,3,30,255,215,1,252,3,31,255,174,1,252,3,32,255,215,1,252,3,33,255,174,1,252,3,34,255,215,1,252,3,35,255,174,1,252,3,37,255,174,1,252,3,38,255,215,1,252,3,39,255,174,1,252,3,40,255,215,1,252,3,41,255,174,1,252,3,42,255,215,1,252,3,43,255,174,1,252,3,44,255,215,1,252,3,45,255,174,1,252,3,46,255,215,1,252,3,47,255,174,1,252,3,48,255,215,1,252,3,49,255,174,1,252,3,50,255,215,1,252,3,51,255,174,1,252,3,52,255,215,1,252,3,54,255,215,1,252,3,56,255,215,1,252,3,58,255,215,1,252,3,60,255,215,1,252,3,64,255,215,1,252,3,66,255,215,1,252,3,68,255,215,1,252,3,73,255,236,1,252,3,74,255,215,1,252,3,75,255,236,1,252,3,76,255,215,1,252,3,77,255,236,1,252,3,78,255,215,1,252,3,79,255,236,1,252,3,81,255,236,1,252,3,82,255,215,1,252,3,83,255,236,1,252,3,84,255,215,1,252,3,85,255,236,1,252,3,86,255,215,1,252,3,87,255,236,1,252,3,88,255,215,1,252,3,89,255,236,1,252,3,90,255,215,1,252,3,91,255,236,1,252,3,92,255,215,1,252,3,93,255,236,1,252,3,94,255,215,1,252,3,95,255,236,1,252,3,96,255,215,1,252,3,98,255,236,1,252,3,100,255,236,1,252,3,102,255,236,1,252,3,104,255,236,1,252,3,106,255,236,1,252,3,108,255,236,1,252,3,110,255,236,1,253,0,5,0,82,1,253,0,10,0,82,1,253,0,15,255,174,1,253,0,17,255,174,1,253,0,34,0,41,1,253,2,7,0,82,1,253,2,8,255,174,1,253,2,11,0,82,1,253,2,12,255,174,1,254,0,15,255,154,1,254,0,17,255,154,1,254,0,34,0,41,1,254,0,36,255,174,1,254,0,38,255,236,1,254,0,42,255,236,1,254,0,50,255,236,1,254,0,52,255,236,1,254,0,68,255,215,1,254,0,70,255,215,1,254,0,71,255,215,1,254,0,72,255,215,1,254,0,74,255,236,1,254,0,80,255,236,1,254,0,81,255,236,1,254,0,82,255,215,1,254,0,83,255,236,1,254,0,84,255,215,1,254,0,85,255,236,1,254,0,86,255,236,1,254,0,88,255,236,1,254,0,130,255,174,1,254,0,131,255,174,1,254,0,132,255,174,1,254,0,133,255,174,1,254,0,134,255,174,1,254,0,135,255,174,1,254,0,137,255,236,1,254,0,148,255,236,1,254,0,149,255,236,1,254,0,150,255,236,1,254,0,151,255,236,1,254,0,152,255,236,1,254,0,154,255,236,1,254,0,162,255,215,1,254,0,163,255,215,1,254,0,164,255,215,1,254,0,165,255,215,1,254,0,166,255,215,1,254,0,167,255,215,1,254,0,168,255,215,1,254,0,169,255,215,1,254,0,170,255,215,1,254,0,171,255,215,1,254,0,172,255,215,1,254,0,173,255,215,1,254,0,180,255,215,1,254,0,181,255,215,1,254,0,182,255,215,1,254,0,183,255,215,1,254,0,184,255,215,1,254,0,186,255,215,1,254,0,187,255,236,1,254,0,188,255,236,1,254,0,189,255,236,1,254,0,190,255,236,1,254,0,194,255,174,1,254,0,195,255,215,1,254,0,196,255,174,1,254,0,197,255,215,1,254,0,198,255,174,1,254,0,199,255,215,1,254,0,200,255,236,1,254,0,201,255,215,1,254,0,202,255,236,1,254,0,203,255,215,1,254,0,204,255,236,1,254,0,205,255,215,1,254,0,206,255,236,1,254,0,207,255,215,1,254,0,209,255,215,1,254,0,211,255,215,1,254,0,213,255,215,1,254,0,215,255,215,1,254,0,217,255,215,1,254,0,219,255,215,1,254,0,221,255,215,1,254,0,222,255,236,1,254,0,223,255,236,1,254,0,224,255,236,1,254,0,225,255,236,1,254,0,226,255,236,1,254,0,227,255,236,1,254,0,228,255,236,1,254,0,229,255,236,1,254,0,250,255,236,1,254,1,6,255,236,1,254,1,8,255,236,1,254,1,13,255,236,1,254,1,14,255,236,1,254,1,15,255,215,1,254,1,16,255,236,1,254,1,17,255,215,1,254,1,18,255,236,1,254,1,19,255,215,1,254,1,20,255,236,1,254,1,21,255,215,1,254,1,23,255,236,1,254,1,25,255,236,1,254,1,29,255,236,1,254,1,33,255,236,1,254,1,43,255,236,1,254,1,45,255,236,1,254,1,47,255,236,1,254,1,49,255,236,1,254,1,51,255,236,1,254,1,53,255,236,1,254,1,67,255,174,1,254,1,68,255,215,1,254,1,70,255,215,1,254,1,71,255,236,1,254,1,72,255,215,1,254,1,74,255,236,1,254,2,8,255,154,1,254,2,12,255,154,1,254,2,87,255,236,1,254,2,88,255,174,1,254,2,89,255,215,1,254,2,95,255,236,1,254,2,96,255,215,1,254,2,98,255,236,1,254,3,29,255,174,1,254,3,30,255,215,1,254,3,31,255,174,1,254,3,32,255,215,1,254,3,33,255,174,1,254,3,34,255,215,1,254,3,35,255,174,1,254,3,37,255,174,1,254,3,38,255,215,1,254,3,39,255,174,1,254,3,40,255,215,1,254,3,41,255,174,1,254,3,42,255,215,1,254,3,43,255,174,1,254,3,44,255,215,1,254,3,45,255,174,1,254,3,46,255,215,1,254,3,47,255,174,1,254,3,48,255,215,1,254,3,49,255,174,1,254,3,50,255,215,1,254,3,51,255,174,1,254,3,52,255,215,1,254,3,54,255,215,1,254,3,56,255,215,1,254,3,58,255,215,1,254,3,60,255,215,1,254,3,64,255,215,1,254,3,66,255,215,1,254,3,68,255,215,1,254,3,73,255,236,1,254,3,74,255,215,1,254,3,75,255,236,1,254,3,76,255,215,1,254,3,77,255,236,1,254,3,78,255,215,1,254,3,79,255,236,1,254,3,81,255,236,1,254,3,82,255,215,1,254,3,83,255,236,1,254,3,84,255,215,1,254,3,85,255,236,1,254,3,86,255,215,1,254,3,87,255,236,1,254,3,88,255,215,1,254,3,89,255,236,1,254,3,90,255,215,1,254,3,91,255,236,1,254,3,92,255,215,1,254,3,93,255,236,1,254,3,94,255,215,1,254,3,95,255,236,1,254,3,96,255,215,1,254,3,98,255,236,1,254,3,100,255,236,1,254,3,102,255,236,1,254,3,104,255,236,1,254,3,106,255,236,1,254,3,108,255,236,1,254,3,110,255,236,1,255,0,5,0,82,1,255,0,10,0,82,1,255,0,15,255,174,1,255,0,17,255,174,1,255,0,34,0,41,1,255,2,7,0,82,1,255,2,8,255,174,1,255,2,11,0,82,1,255,2,12,255,174,2,0,0,15,255,133,2,0,0,17,255,133,2,0,0,34,0,41,2,0,0,36,255,133,2,0,0,38,255,215,2,0,0,42,255,215,2,0,0,50,255,215,2,0,0,52,255,215,2,0,0,68,255,154,2,0,0,70,255,154,2,0,0,71,255,154,2,0,0,72,255,154,2,0,0,74,255,215,2,0,0,80,255,195,2,0,0,81,255,195,2,0,0,82,255,154,2,0,0,83,255,195,2,0,0,84,255,154,2,0,0,85,255,195,2,0,0,86,255,174,2,0,0,88,255,195,2,0,0,93,255,215,2,0,0,130,255,133,2,0,0,131,255,133,2,0,0,132,255,133,2,0,0,133,255,133,2,0,0,134,255,133,2,0,0,135,255,133,2,0,0,137,255,215,2,0,0,148,255,215,2,0,0,149,255,215,2,0,0,150,255,215,2,0,0,151,255,215,2,0,0,152,255,215,2,0,0,154,255,215,2,0,0,162,255,154,2,0,0,163,255,154,2,0,0,164,255,154,2,0,0,165,255,154,2,0,0,166,255,154,2,0,0,167,255,154,2,0,0,168,255,154,2,0,0,169,255,154,2,0,0,170,255,154,2,0,0,171,255,154,2,0,0,172,255,154,2,0,0,173,255,154,2,0,0,180,255,154,2,0,0,181,255,154,2,0,0,182,255,154,2,0,0,183,255,154,2,0,0,184,255,154,2,0,0,186,255,154,2,0,0,187,255,195,2,0,0,188,255,195,2,0,0,189,255,195,2,0,0,190,255,195,2,0,0,194,255,133,2,0,0,195,255,154,2,0,0,196,255,133,2,0,0,197,255,154,2,0,0,198,255,133,2,0,0,199,255,154,2,0,0,200,255,215,2,0,0,201,255,154,2,0,0,202,255,215,2,0,0,203,255,154,2,0,0,204,255,215,2,0,0,205,255,154,2,0,0,206,255,215,2,0,0,207,255,154,2,0,0,209,255,154,2,0,0,211,255,154,2,0,0,213,255,154,2,0,0,215,255,154,2,0,0,217,255,154,2,0,0,219,255,154,2,0,0,221,255,154,2,0,0,222,255,215,2,0,0,223,255,215,2,0,0,224,255,215,2,0,0,225,255,215,2,0,0,226,255,215,2,0,0,227,255,215,2,0,0,228,255,215,2,0,0,229,255,215,2,0,0,250,255,195,2,0,1,6,255,195,2,0,1,8,255,195,2,0,1,13,255,195,2,0,1,14,255,215,2,0,1,15,255,154,2,0,1,16,255,215,2,0,1,17,255,154,2,0,1,18,255,215,2,0,1,19,255,154,2,0,1,20,255,215,2,0,1,21,255,154,2,0,1,23,255,195,2,0,1,25,255,195,2,0,1,29,255,174,2,0,1,33,255,174,2,0,1,43,255,195,2,0,1,45,255,195,2,0,1,47,255,195,2,0,1,49,255,195,2,0,1,51,255,195,2,0,1,53,255,195,2,0,1,60,255,215,2,0,1,62,255,215,2,0,1,64,255,215,2,0,1,67,255,133,2,0,1,68,255,154,2,0,1,70,255,154,2,0,1,71,255,215,2,0,1,72,255,154,2,0,1,74,255,174,2,0,2,8,255,133,2,0,2,12,255,133,2,0,2,87,255,195,2,0,2,88,255,133,2,0,2,89,255,154,2,0,2,95,255,215,2,0,2,96,255,154,2,0,2,98,255,195,2,0,3,29,255,133,2,0,3,30,255,154,2,0,3,31,255,133,2,0,3,32,255,154,2,0,3,33,255,133,2,0,3,34,255,154,2,0,3,35,255,133,2,0,3,37,255,133,2,0,3,38,255,154,2,0,3,39,255,133,2,0,3,40,255,154,2,0,3,41,255,133,2,0,3,42,255,154,2,0,3,43,255,133,2,0,3,44,255,154,2,0,3,45,255,133,2,0,3,46,255,154,2,0,3,47,255,133,2,0,3,48,255,154,2,0,3,49,255,133,2,0,3,50,255,154,2,0,3,51,255,133,2,0,3,52,255,154,2,0,3,54,255,154,2,0,3,56,255,154,2,0,3,58,255,154,2,0,3,60,255,154,2,0,3,64,255,154,2,0,3,66,255,154,2,0,3,68,255,154,2,0,3,73,255,215,2,0,3,74,255,154,2,0,3,75,255,215,2,0,3,76,255,154,2,0,3,77,255,215,2,0,3,78,255,154,2,0,3,79,255,215,2,0,3,81,255,215,2,0,3,82,255,154,2,0,3,83,255,215,2,0,3,84,255,154,2,0,3,85,255,215,2,0,3,86,255,154,2,0,3,87,255,215,2,0,3,88,255,154,2,0,3,89,255,215,2,0,3,90,255,154,2,0,3,91,255,215,2,0,3,92,255,154,2,0,3,93,255,215,2,0,3,94,255,154,2,0,3,95,255,215,2,0,3,96,255,154,2,0,3,98,255,195,2,0,3,100,255,195,2,0,3,102,255,195,2,0,3,104,255,195,2,0,3,106,255,195,2,0,3,108,255,195,2,0,3,110,255,195,2,1,0,5,0,82,2,1,0,10,0,82,2,1,0,15,255,174,2,1,0,17,255,174,2,1,0,34,0,41,2,1,2,7,0,82,2,1,2,8,255,174,2,1,2,11,0,82,2,1,2,12,255,174,2,2,0,55,255,174,2,2,1,36,255,174,2,2,1,38,255,174,2,2,1,113,255,174,2,2,1,157,255,174,2,2,1,166,255,174,2,2,1,188,255,174,2,2,1,196,255,174,2,2,1,220,255,215,2,2,1,228,255,215,2,2,2,169,255,174,2,2,2,170,255,215,2,2,2,181,255,174,2,2,2,182,255,215,2,2,2,189,255,174,2,2,2,190,255,215,2,2,3,23,255,174,2,2,3,24,255,215,2,2,3,143,255,174,2,3,0,55,255,174,2,3,1,36,255,174,2,3,1,38,255,174,2,3,1,113,255,174,2,3,1,157,255,174,2,3,1,166,255,174,2,3,1,188,255,174,2,3,1,196,255,174,2,3,1,220,255,215,2,3,1,228,255,215,2,3,2,169,255,174,2,3,2,170,255,215,2,3,2,181,255,174,2,3,2,182,255,215,2,3,2,189,255,174,2,3,2,190,255,215,2,3,3,23,255,174,2,3,3,24,255,215,2,3,3,143,255,174,2,4,0,55,255,174,2,4,1,36,255,174,2,4,1,38,255,174,2,4,1,113,255,174,2,4,1,157,255,174,2,4,1,166,255,174,2,4,1,188,255,174,2,4,1,196,255,174,2,4,1,220,255,215,2,4,1,228,255,215,2,4,2,169,255,174,2,4,2,170,255,215,2,4,2,181,255,174,2,4,2,182,255,215,2,4,2,189,255,174,2,4,2,190,255,215,2,4,3,23,255,174,2,4,3,24,255,215,2,4,3,143,255,174,2,6,0,36,255,113,2,6,0,55,0,41,2,6,0,57,0,41,2,6,0,58,0,41,2,6,0,60,0,20,2,6,0,68,255,174,2,6,0,70,255,133,2,6,0,71,255,133,2,6,0,72,255,133,2,6,0,74,255,195,2,6,0,80,255,195,2,6,0,81,255,195,2,6,0,82,255,133,2,6,0,83,255,195,2,6,0,84,255,133,2,6,0,85,255,195,2,6,0,86,255,195,2,6,0,88,255,195,2,6,0,130,255,113,2,6,0,131,255,113,2,6,0,132,255,113,2,6,0,133,255,113,2,6,0,134,255,113,2,6,0,135,255,113,2,6,0,159,0,20,2,6,0,162,255,133,2,6,0,163,255,174,2,6,0,164,255,174,2,6,0,165,255,174,2,6,0,166,255,174,2,6,0,167,255,174,2,6,0,168,255,174,2,6,0,169,255,133,2,6,0,170,255,133,2,6,0,171,255,133,2,6,0,172,255,133,2,6,0,173,255,133,2,6,0,180,255,133,2,6,0,181,255,133,2,6,0,182,255,133,2,6,0,183,255,133,2,6,0,184,255,133,2,6,0,186,255,133,2,6,0,187,255,195,2,6,0,188,255,195,2,6,0,189,255,195,2,6,0,190,255,195,2,6,0,194,255,113,2,6,0,195,255,174,2,6,0,196,255,113,2,6,0,197,255,174,2,6,0,198,255,113,2,6,0,199,255,174,2,6,0,201,255,133,2,6,0,203,255,133,2,6,0,205,255,133,2,6,0,207,255,133,2,6,0,209,255,133,2,6,0,211,255,133,2,6,0,213,255,133,2,6,0,215,255,133,2,6,0,217,255,133,2,6,0,219,255,133,2,6,0,221,255,133,2,6,0,223,255,195,2,6,0,225,255,195,2,6,0,227,255,195,2,6,0,229,255,195,2,6,0,250,255,195,2,6,1,6,255,195,2,6,1,8,255,195,2,6,1,13,255,195,2,6,1,15,255,133,2,6,1,17,255,133,2,6,1,19,255,133,2,6,1,21,255,133,2,6,1,23,255,195,2,6,1,25,255,195,2,6,1,29,255,195,2,6,1,33,255,195,2,6,1,36,0,41,2,6,1,38,0,41,2,6,1,43,255,195,2,6,1,45,255,195,2,6,1,47,255,195,2,6,1,49,255,195,2,6,1,51,255,195,2,6,1,53,255,195,2,6,1,54,0,41,2,6,1,56,0,20,2,6,1,58,0,20,2,6,1,67,255,113,2,6,1,68,255,174,2,6,1,70,255,174,2,6,1,72,255,133,2,6,1,74,255,195,2,6,1,86,255,113,2,6,1,95,255,113,2,6,1,98,255,113,2,6,1,105,255,113,2,6,1,121,255,174,2,6,1,122,255,215,2,6,1,123,255,215,2,6,1,126,255,174,2,6,1,129,255,195,2,6,1,130,255,215,2,6,1,131,255,215,2,6,1,132,255,215,2,6,1,135,255,215,2,6,1,137,255,215,2,6,1,140,255,174,2,6,1,142,255,195,2,6,1,143,255,174,2,6,1,144,255,174,2,6,1,147,255,174,2,6,1,153,255,174,2,6,1,164,255,133,2,6,1,170,255,113,2,6,1,174,255,133,2,6,1,181,255,133,2,6,1,202,255,215,2,6,1,206,255,113,2,6,1,207,255,133,2,6,1,213,255,113,2,6,1,216,255,133,2,6,1,219,255,133,2,6,1,222,255,133,2,6,1,234,255,133,2,6,1,237,255,133,2,6,1,238,255,195,2,6,1,242,255,113,2,6,1,250,0,41,2,6,1,252,0,41,2,6,1,254,0,41,2,6,2,0,0,20,2,6,2,87,255,195,2,6,2,88,255,113,2,6,2,89,255,174,2,6,2,96,255,133,2,6,2,98,255,195,2,6,2,106,255,133,2,6,2,114,255,113,2,6,2,115,255,113,2,6,2,125,255,236,2,6,2,127,255,133,2,6,2,133,255,133,2,6,2,135,255,133,2,6,2,137,255,133,2,6,2,141,255,133,2,6,2,178,255,133,2,6,2,180,255,133,2,6,2,206,255,133,2,6,2,207,255,113,2,6,2,217,255,113,2,6,2,218,255,215,2,6,2,219,255,113,2,6,2,220,255,215,2,6,2,221,255,113,2,6,2,222,255,215,2,6,2,224,255,133,2,6,2,226,255,215,2,6,2,228,255,215,2,6,2,240,255,133,2,6,2,242,255,133,2,6,2,244,255,133,2,6,3,9,255,113,2,6,3,10,255,133,2,6,3,11,255,113,2,6,3,12,255,133,2,6,3,17,255,133,2,6,3,18,255,113,2,6,3,22,255,133,2,6,3,26,255,133,2,6,3,27,255,133,2,6,3,28,255,113,2,6,3,29,255,113,2,6,3,30,255,174,2,6,3,31,255,113,2,6,3,32,255,174,2,6,3,33,255,113,2,6,3,34,255,174,2,6,3,35,255,113,2,6,3,37,255,113,2,6,3,38,255,174,2,6,3,39,255,113,2,6,3,40,255,174,2,6,3,41,255,113,2,6,3,42,255,174,2,6,3,43,255,113,2,6,3,44,255,174,2,6,3,45,255,113,2,6,3,46,255,174,2,6,3,47,255,113,2,6,3,48,255,174,2,6,3,49,255,113,2,6,3,50,255,174,2,6,3,51,255,113,2,6,3,52,255,174,2,6,3,54,255,133,2,6,3,56,255,133,2,6,3,58,255,133,2,6,3,60,255,133,2,6,3,64,255,133,2,6,3,66,255,133,2,6,3,68,255,133,2,6,3,74,255,133,2,6,3,76,255,133,2,6,3,78,255,133,2,6,3,82,255,133,2,6,3,84,255,133,2,6,3,86,255,133,2,6,3,88,255,133,2,6,3,90,255,133,2,6,3,92,255,133,2,6,3,94,255,133,2,6,3,96,255,133,2,6,3,98,255,195,2,6,3,100,255,195,2,6,3,102,255,195,2,6,3,104,255,195,2,6,3,106,255,195,2,6,3,108,255,195,2,6,3,110,255,195,2,6,3,111,0,20,2,6,3,113,0,20,2,6,3,115,0,20,2,6,3,143,0,41,2,7,0,36,255,113,2,7,0,55,0,41,2,7,0,57,0,41,2,7,0,58,0,41,2,7,0,60,0,20,2,7,0,68,255,174,2,7,0,70,255,133,2,7,0,71,255,133,2,7,0,72,255,133,2,7,0,74,255,195,2,7,0,80,255,195,2,7,0,81,255,195,2,7,0,82,255,133,2,7,0,83,255,195,2,7,0,84,255,133,2,7,0,85,255,195,2,7,0,86,255,195,2,7,0,88,255,195,2,7,0,130,255,113,2,7,0,131,255,113,2,7,0,132,255,113,2,7,0,133,255,113,2,7,0,134,255,113,2,7,0,135,255,113,2,7,0,159,0,20,2,7,0,162,255,133,2,7,0,163,255,174,2,7,0,164,255,174,2,7,0,165,255,174,2,7,0,166,255,174,2,7,0,167,255,174,2,7,0,168,255,174,2,7,0,169,255,133,2,7,0,170,255,133,2,7,0,171,255,133,2,7,0,172,255,133,2,7,0,173,255,133,2,7,0,180,255,133,2,7,0,181,255,133,2,7,0,182,255,133,2,7,0,183,255,133,2,7,0,184,255,133,2,7,0,186,255,133,2,7,0,187,255,195,2,7,0,188,255,195,2,7,0,189,255,195,2,7,0,190,255,195,2,7,0,194,255,113,2,7,0,195,255,174,2,7,0,196,255,113,2,7,0,197,255,174,2,7,0,198,255,113,2,7,0,199,255,174,2,7,0,201,255,133,2,7,0,203,255,133,2,7,0,205,255,133,2,7,0,207,255,133,2,7,0,209,255,133,2,7,0,211,255,133,2,7,0,213,255,133,2,7,0,215,255,133,2,7,0,217,255,133,2,7,0,219,255,133,2,7,0,221,255,133,2,7,0,223,255,195,2,7,0,225,255,195,2,7,0,227,255,195,2,7,0,229,255,195,2,7,0,250,255,195,2,7,1,6,255,195,2,7,1,8,255,195,2,7,1,13,255,195,2,7,1,15,255,133,2,7,1,17,255,133,2,7,1,19,255,133,2,7,1,21,255,133,2,7,1,23,255,195,2,7,1,25,255,195,2,7,1,29,255,195,2,7,1,33,255,195,2,7,1,36,0,41,2,7,1,38,0,41,2,7,1,43,255,195,2,7,1,45,255,195,2,7,1,47,255,195,2,7,1,49,255,195,2,7,1,51,255,195,2,7,1,53,255,195,2,7,1,54,0,41,2,7,1,56,0,20,2,7,1,58,0,20,2,7,1,67,255,113,2,7,1,68,255,174,2,7,1,70,255,174,2,7,1,72,255,133,2,7,1,74,255,195,2,7,1,86,255,113,2,7,1,95,255,113,2,7,1,98,255,113,2,7,1,105,255,113,2,7,1,121,255,174,2,7,1,122,255,215,2,7,1,123,255,215,2,7,1,126,255,174,2,7,1,129,255,195,2,7,1,130,255,215,2,7,1,131,255,215,2,7,1,132,255,215,2,7,1,135,255,215,2,7,1,137,255,215,2,7,1,140,255,174,2,7,1,142,255,195,2,7,1,143,255,174,2,7,1,144,255,174,2,7,1,147,255,174,2,7,1,153,255,174,2,7,1,164,255,133,2,7,1,170,255,113,2,7,1,174,255,133,2,7,1,181,255,133,2,7,1,202,255,215,2,7,1,206,255,113,2,7,1,207,255,133,2,7,1,213,255,113,2,7,1,216,255,133,2,7,1,219,255,133,2,7,1,222,255,133,2,7,1,234,255,133,2,7,1,237,255,133,2,7,1,238,255,195,2,7,1,242,255,113,2,7,1,250,0,41,2,7,1,252,0,41,2,7,1,254,0,41,2,7,2,0,0,20,2,7,2,87,255,195,2,7,2,88,255,113,2,7,2,89,255,174,2,7,2,96,255,133,2,7,2,98,255,195,2,7,2,106,255,133,2,7,2,114,255,113,2,7,2,115,255,113,2,7,2,125,255,236,2,7,2,127,255,133,2,7,2,133,255,133,2,7,2,135,255,133,2,7,2,137,255,133,2,7,2,141,255,133,2,7,2,178,255,133,2,7,2,180,255,133,2,7,2,206,255,133,2,7,2,207,255,113,2,7,2,217,255,113,2,7,2,218,255,215,2,7,2,219,255,113,2,7,2,220,255,215,2,7,2,221,255,113,2,7,2,222,255,215,2,7,2,224,255,133,2,7,2,226,255,215,2,7,2,228,255,215,2,7,2,240,255,133,2,7,2,242,255,133,2,7,2,244,255,133,2,7,3,9,255,113,2,7,3,10,255,133,2,7,3,11,255,113,2,7,3,12,255,133,2,7,3,17,255,133,2,7,3,18,255,113,2,7,3,22,255,133,2,7,3,26,255,133,2,7,3,27,255,133,2,7,3,28,255,113,2,7,3,29,255,113,2,7,3,30,255,174,2,7,3,31,255,113,2,7,3,32,255,174,2,7,3,33,255,113,2,7,3,34,255,174,2,7,3,35,255,113,2,7,3,37,255,113,2,7,3,38,255,174,2,7,3,39,255,113,2,7,3,40,255,174,2,7,3,41,255,113,2,7,3,42,255,174,2,7,3,43,255,113,2,7,3,44,255,174,2,7,3,45,255,113,2,7,3,46,255,174,2,7,3,47,255,113,2,7,3,48,255,174,2,7,3,49,255,113,2,7,3,50,255,174,2,7,3,51,255,113,2,7,3,52,255,174,2,7,3,54,255,133,2,7,3,56,255,133,2,7,3,58,255,133,2,7,3,60,255,133,2,7,3,64,255,133,2,7,3,66,255,133,2,7,3,68,255,133,2,7,3,74,255,133,2,7,3,76,255,133,2,7,3,78,255,133,2,7,3,82,255,133,2,7,3,84,255,133,2,7,3,86,255,133,2,7,3,88,255,133,2,7,3,90,255,133,2,7,3,92,255,133,2,7,3,94,255,133,2,7,3,96,255,133,2,7,3,98,255,195,2,7,3,100,255,195,2,7,3,102,255,195,2,7,3,104,255,195,2,7,3,106,255,195,2,7,3,108,255,195,2,7,3,110,255,195,2,7,3,111,0,20,2,7,3,113,0,20,2,7,3,115,0,20,2,7,3,143,0,41,2,8,0,38,255,154,2,8,0,42,255,154,2,8,0,50,255,154,2,8,0,52,255,154,2,8,0,55,255,113,2,8,0,56,255,215,2,8,0,57,255,133,2,8,0,58,255,133,2,8,0,60,255,133,2,8,0,137,255,154,2,8,0,148,255,154,2,8,0,149,255,154,2,8,0,150,255,154,2,8,0,151,255,154,2,8,0,152,255,154,2,8,0,154,255,154,2,8,0,155,255,215,2,8,0,156,255,215,2,8,0,157,255,215,2,8,0,158,255,215,2,8,0,159,255,133,2,8,0,200,255,154,2,8,0,202,255,154,2,8,0,204,255,154,2,8,0,206,255,154,2,8,0,222,255,154,2,8,0,224,255,154,2,8,0,226,255,154,2,8,0,228,255,154,2,8,1,14,255,154,2,8,1,16,255,154,2,8,1,18,255,154,2,8,1,20,255,154,2,8,1,36,255,113,2,8,1,38,255,113,2,8,1,42,255,215,2,8,1,44,255,215,2,8,1,46,255,215,2,8,1,48,255,215,2,8,1,50,255,215,2,8,1,52,255,215,2,8,1,54,255,133,2,8,1,56,255,133,2,8,1,58,255,133,2,8,1,71,255,154,2,8,1,102,255,174,2,8,1,109,255,174,2,8,1,113,255,113,2,8,1,114,255,133,2,8,1,115,255,154,2,8,1,117,255,133,2,8,1,120,255,133,2,8,1,133,255,215,2,8,1,157,255,113,2,8,1,159,255,154,2,8,1,166,255,113,2,8,1,184,255,154,2,8,1,187,255,154,2,8,1,188,255,113,2,8,1,190,255,174,2,8,1,193,255,92,2,8,1,196,255,113,2,8,1,220,255,154,2,8,1,225,255,133,2,8,1,228,255,154,2,8,1,250,255,133,2,8,1,252,255,133,2,8,1,254,255,133,2,8,2,0,255,133,2,8,2,84,255,133,2,8,2,95,255,154,2,8,2,97,255,215,2,8,2,108,255,154,2,8,2,124,255,92,2,8,2,126,255,154,2,8,2,128,255,133,2,8,2,130,255,133,2,8,2,132,255,154,2,8,2,134,255,154,2,8,2,136,255,154,2,8,2,138,255,154,2,8,2,140,255,154,2,8,2,169,255,113,2,8,2,170,255,154,2,8,2,177,255,154,2,8,2,179,255,154,2,8,2,181,255,113,2,8,2,182,255,154,2,8,2,183,255,133,2,8,2,185,255,133,2,8,2,189,255,113,2,8,2,190,255,154,2,8,2,191,255,92,2,8,2,192,255,133,2,8,2,193,255,92,2,8,2,194,255,133,2,8,2,197,255,133,2,8,2,199,255,133,2,8,2,212,255,92,2,8,2,213,255,133,2,8,2,239,255,154,2,8,2,241,255,154,2,8,2,243,255,154,2,8,2,253,255,92,2,8,2,254,255,133,2,8,3,13,255,133,2,8,3,14,255,154,2,8,3,15,255,133,2,8,3,16,255,154,2,8,3,21,255,154,2,8,3,23,255,113,2,8,3,24,255,154,2,8,3,73,255,154,2,8,3,75,255,154,2,8,3,77,255,154,2,8,3,79,255,154,2,8,3,81,255,154,2,8,3,83,255,154,2,8,3,85,255,154,2,8,3,87,255,154,2,8,3,89,255,154,2,8,3,91,255,154,2,8,3,93,255,154,2,8,3,95,255,154,2,8,3,97,255,215,2,8,3,99,255,215,2,8,3,101,255,215,2,8,3,103,255,215,2,8,3,105,255,215,2,8,3,107,255,215,2,8,3,109,255,215,2,8,3,111,255,133,2,8,3,113,255,133,2,8,3,115,255,133,2,8,3,143,255,113,2,10,0,36,255,113,2,10,0,55,0,41,2,10,0,57,0,41,2,10,0,58,0,41,2,10,0,60,0,20,2,10,0,68,255,174,2,10,0,70,255,133,2,10,0,71,255,133,2,10,0,72,255,133,2,10,0,74,255,195,2,10,0,80,255,195,2,10,0,81,255,195,2,10,0,82,255,133,2,10,0,83,255,195,2,10,0,84,255,133,2,10,0,85,255,195,2,10,0,86,255,195,2,10,0,88,255,195,2,10,0,130,255,113,2,10,0,131,255,113,2,10,0,132,255,113,2,10,0,133,255,113,2,10,0,134,255,113,2,10,0,135,255,113,2,10,0,159,0,20,2,10,0,162,255,133,2,10,0,163,255,174,2,10,0,164,255,174,2,10,0,165,255,174,2,10,0,166,255,174,2,10,0,167,255,174,2,10,0,168,255,174,2,10,0,169,255,133,2,10,0,170,255,133,2,10,0,171,255,133,2,10,0,172,255,133,2,10,0,173,255,133,2,10,0,180,255,133,2,10,0,181,255,133,2,10,0,182,255,133,2,10,0,183,255,133,2,10,0,184,255,133,2,10,0,186,255,133,2,10,0,187,255,195,2,10,0,188,255,195,2,10,0,189,255,195,2,10,0,190,255,195,2,10,0,194,255,113,2,10,0,195,255,174,2,10,0,196,255,113,2,10,0,197,255,174,2,10,0,198,255,113,2,10,0,199,255,174,2,10,0,201,255,133,2,10,0,203,255,133,2,10,0,205,255,133,2,10,0,207,255,133,2,10,0,209,255,133,2,10,0,211,255,133,2,10,0,213,255,133,2,10,0,215,255,133,2,10,0,217,255,133,2,10,0,219,255,133,2,10,0,221,255,133,2,10,0,223,255,195,2,10,0,225,255,195,2,10,0,227,255,195,2,10,0,229,255,195,2,10,0,250,255,195,2,10,1,6,255,195,2,10,1,8,255,195,2,10,1,13,255,195,2,10,1,15,255,133,2,10,1,17,255,133,2,10,1,19,255,133,2,10,1,21,255,133,2,10,1,23,255,195,2,10,1,25,255,195,2,10,1,29,255,195,2,10,1,33,255,195,2,10,1,36,0,41,2,10,1,38,0,41,2,10,1,43,255,195,2,10,1,45,255,195,2,10,1,47,255,195,2,10,1,49,255,195,2,10,1,51,255,195,2,10,1,53,255,195,2,10,1,54,0,41,2,10,1,56,0,20,2,10,1,58,0,20,2,10,1,67,255,113,2,10,1,68,255,174,2,10,1,70,255,174,2,10,1,72,255,133,2,10,1,74,255,195,2,10,1,86,255,113,2,10,1,95,255,113,2,10,1,98,255,113,2,10,1,105,255,113,2,10,1,121,255,174,2,10,1,122,255,215,2,10,1,123,255,215,2,10,1,126,255,174,2,10,1,129,255,195,2,10,1,130,255,215,2,10,1,131,255,215,2,10,1,132,255,215,2,10,1,135,255,215,2,10,1,137,255,215,2,10,1,140,255,174,2,10,1,142,255,195,2,10,1,143,255,174,2,10,1,144,255,174,2,10,1,147,255,174,2,10,1,153,255,174,2,10,1,164,255,133,2,10,1,170,255,113,2,10,1,174,255,133,2,10,1,181,255,133,2,10,1,202,255,215,2,10,1,206,255,113,2,10,1,207,255,133,2,10,1,213,255,113,2,10,1,216,255,133,2,10,1,219,255,133,2,10,1,222,255,133,2,10,1,234,255,133,2,10,1,237,255,133,2,10,1,238,255,195,2,10,1,242,255,113,2,10,1,250,0,41,2,10,1,252,0,41,2,10,1,254,0,41,2,10,2,0,0,20,2,10,2,87,255,195,2,10,2,88,255,113,2,10,2,89,255,174,2,10,2,96,255,133,2,10,2,98,255,195,2,10,2,106,255,133,2,10,2,114,255,113,2,10,2,115,255,113,2,10,2,125,255,236,2,10,2,127,255,133,2,10,2,133,255,133,2,10,2,135,255,133,2,10,2,137,255,133,2,10,2,141,255,133,2,10,2,178,255,133,2,10,2,180,255,133,2,10,2,206,255,133,2,10,2,207,255,113,2,10,2,217,255,113,2,10,2,218,255,215,2,10,2,219,255,113,2,10,2,220,255,215,2,10,2,221,255,113,2,10,2,222,255,215,2,10,2,224,255,133,2,10,2,226,255,215,2,10,2,228,255,215,2,10,2,240,255,133,2,10,2,242,255,133,2,10,2,244,255,133,2,10,3,9,255,113,2,10,3,10,255,133,2,10,3,11,255,113,2,10,3,12,255,133,2,10,3,17,255,133,2,10,3,18,255,113,2,10,3,22,255,133,2,10,3,26,255,133,2,10,3,27,255,133,2,10,3,28,255,113,2,10,3,29,255,113,2,10,3,30,255,174,2,10,3,31,255,113,2,10,3,32,255,174,2,10,3,33,255,113,2,10,3,34,255,174,2,10,3,35,255,113,2,10,3,37,255,113,2,10,3,38,255,174,2,10,3,39,255,113,2,10,3,40,255,174,2,10,3,41,255,113,2,10,3,42,255,174,2,10,3,43,255,113,2,10,3,44,255,174,2,10,3,45,255,113,2,10,3,46,255,174,2,10,3,47,255,113,2,10,3,48,255,174,2,10,3,49,255,113,2,10,3,50,255,174,2,10,3,51,255,113,2,10,3,52,255,174,2,10,3,54,255,133,2,10,3,56,255,133,2,10,3,58,255,133,2,10,3,60,255,133,2,10,3,64,255,133,2,10,3,66,255,133,2,10,3,68,255,133,2,10,3,74,255,133,2,10,3,76,255,133,2,10,3,78,255,133,2,10,3,82,255,133,2,10,3,84,255,133,2,10,3,86,255,133,2,10,3,88,255,133,2,10,3,90,255,133,2,10,3,92,255,133,2,10,3,94,255,133,2,10,3,96,255,133,2,10,3,98,255,195,2,10,3,100,255,195,2,10,3,102,255,195,2,10,3,104,255,195,2,10,3,106,255,195,2,10,3,108,255,195,2,10,3,110,255,195,2,10,3,111,0,20,2,10,3,113,0,20,2,10,3,115,0,20,2,10,3,143,0,41,2,12,0,38,255,154,2,12,0,42,255,154,2,12,0,50,255,154,2,12,0,52,255,154,2,12,0,55,255,113,2,12,0,56,255,215,2,12,0,57,255,133,2,12,0,58,255,133,2,12,0,60,255,133,2,12,0,137,255,154,2,12,0,148,255,154,2,12,0,149,255,154,2,12,0,150,255,154,2,12,0,151,255,154,2,12,0,152,255,154,2,12,0,154,255,154,2,12,0,155,255,215,2,12,0,156,255,215,2,12,0,157,255,215,2,12,0,158,255,215,2,12,0,159,255,133,2,12,0,200,255,154,2,12,0,202,255,154,2,12,0,204,255,154,2,12,0,206,255,154,2,12,0,222,255,154,2,12,0,224,255,154,2,12,0,226,255,154,2,12,0,228,255,154,2,12,1,14,255,154,2,12,1,16,255,154,2,12,1,18,255,154,2,12,1,20,255,154,2,12,1,36,255,113,2,12,1,38,255,113,2,12,1,42,255,215,2,12,1,44,255,215,2,12,1,46,255,215,2,12,1,48,255,215,2,12,1,50,255,215,2,12,1,52,255,215,2,12,1,54,255,133,2,12,1,56,255,133,2,12,1,58,255,133,2,12,1,71,255,154,2,12,1,102,255,174,2,12,1,109,255,174,2,12,1,113,255,113,2,12,1,114,255,133,2,12,1,115,255,154,2,12,1,117,255,133,2,12,1,120,255,133,2,12,1,133,255,215,2,12,1,157,255,113,2,12,1,159,255,154,2,12,1,166,255,113,2,12,1,184,255,154,2,12,1,187,255,154,2,12,1,188,255,113,2,12,1,190,255,174,2,12,1,193,255,92,2,12,1,196,255,113,2,12,1,220,255,154,2,12,1,225,255,133,2,12,1,228,255,154,2,12,1,250,255,133,2,12,1,252,255,133,2,12,1,254,255,133,2,12,2,0,255,133,2,12,2,84,255,133,2,12,2,95,255,154,2,12,2,97,255,215,2,12,2,108,255,154,2,12,2,124,255,92,2,12,2,126,255,154,2,12,2,128,255,133,2,12,2,130,255,133,2,12,2,132,255,154,2,12,2,134,255,154,2,12,2,136,255,154,2,12,2,138,255,154,2,12,2,140,255,154,2,12,2,169,255,113,2,12,2,170,255,154,2,12,2,177,255,154,2,12,2,179,255,154,2,12,2,181,255,113,2,12,2,182,255,154,2,12,2,183,255,133,2,12,2,185,255,133,2,12,2,189,255,113,2,12,2,190,255,154,2,12,2,191,255,92,2,12,2,192,255,133,2,12,2,193,255,92,2,12,2,194,255,133,2,12,2,197,255,133,2,12,2,199,255,133,2,12,2,212,255,92,2,12,2,213,255,133,2,12,2,239,255,154,2,12,2,241,255,154,2,12,2,243,255,154,2,12,2,253,255,92,2,12,2,254,255,133,2,12,3,13,255,133,2,12,3,14,255,154,2,12,3,15,255,133,2,12,3,16,255,154,2,12,3,21,255,154,2,12,3,23,255,113,2,12,3,24,255,154,2,12,3,73,255,154,2,12,3,75,255,154,2,12,3,77,255,154,2,12,3,79,255,154,2,12,3,81,255,154,2,12,3,83,255,154,2,12,3,85,255,154,2,12,3,87,255,154,2,12,3,89,255,154,2,12,3,91,255,154,2,12,3,93,255,154,2,12,3,95,255,154,2,12,3,97,255,215,2,12,3,99,255,215,2,12,3,101,255,215,2,12,3,103,255,215,2,12,3,105,255,215,2,12,3,107,255,215,2,12,3,109,255,215,2,12,3,111,255,133,2,12,3,113,255,133,2,12,3,115,255,133,2,12,3,143,255,113,2,33,1,113,255,215,2,33,1,114,255,236,2,33,1,120,255,236,2,33,2,84,255,236,2,83,0,15,255,195,2,83,0,17,255,195,2,83,2,8,255,195,2,83,2,12,255,195,2,84,0,15,255,133,2,84,0,17,255,133,2,84,1,86,255,133,2,84,1,95,255,133,2,84,1,98,255,133,2,84,1,102,255,215,2,84,1,105,255,133,2,84,1,109,255,215,2,84,1,115,255,195,2,84,1,118,255,236,2,84,1,121,255,154,2,84,1,122,255,174,2,84,1,123,255,195,2,84,1,124,255,195,2,84,1,125,255,195,2,84,1,126,255,154,2,84,1,129,255,195,2,84,1,130,255,174,2,84,1,132,255,195,2,84,1,134,255,195,2,84,1,135,255,195,2,84,1,137,255,195,2,84,1,140,255,154,2,84,1,142,255,154,2,84,1,143,255,154,2,84,1,144,255,154,2,84,1,146,255,195,2,84,1,147,255,154,2,84,1,149,255,195,2,84,1,150,255,195,2,84,1,152,255,195,2,84,1,153,255,154,2,84,1,154,255,195,2,84,1,155,255,195,2,84,2,8,255,133,2,84,2,12,255,133,2,84,2,33,255,236,2,88,0,5,255,113,2,88,0,10,255,113,2,88,0,38,255,215,2,88,0,42,255,215,2,88,0,45,1,10,2,88,0,50,255,215,2,88,0,52,255,215,2,88,0,55,255,113,2,88,0,57,255,174,2,88,0,58,255,174,2,88,0,60,255,133,2,88,0,137,255,215,2,88,0,148,255,215,2,88,0,149,255,215,2,88,0,150,255,215,2,88,0,151,255,215,2,88,0,152,255,215,2,88,0,154,255,215,2,88,0,159,255,133,2,88,0,200,255,215,2,88,0,202,255,215,2,88,0,204,255,215,2,88,0,206,255,215,2,88,0,222,255,215,2,88,0,224,255,215,2,88,0,226,255,215,2,88,0,228,255,215,2,88,1,14,255,215,2,88,1,16,255,215,2,88,1,18,255,215,2,88,1,20,255,215,2,88,1,36,255,113,2,88,1,38,255,113,2,88,1,54,255,174,2,88,1,56,255,133,2,88,1,58,255,133,2,88,1,71,255,215,2,88,1,250,255,174,2,88,1,252,255,174,2,88,1,254,255,174,2,88,2,0,255,133,2,88,2,7,255,113,2,88,2,11,255,113,2,88,2,95,255,215,2,88,3,73,255,215,2,88,3,75,255,215,2,88,3,77,255,215,2,88,3,79,255,215,2,88,3,81,255,215,2,88,3,83,255,215,2,88,3,85,255,215,2,88,3,87,255,215,2,88,3,89,255,215,2,88,3,91,255,215,2,88,3,93,255,215,2,88,3,95,255,215,2,88,3,111,255,133,2,88,3,113,255,133,2,88,3,115,255,133,2,88,3,143,255,113,2,89,0,5,255,236,2,89,0,10,255,236,2,89,2,7,255,236,2,89,2,11,255,236,2,90,0,15,255,174,2,90,0,17,255,174,2,90,1,86,255,215,2,90,1,95,255,215,2,90,1,98,255,215,2,90,1,100,255,236,2,90,1,105,255,215,2,90,1,112,255,236,2,90,1,113,255,195,2,90,1,114,255,236,2,90,1,116,255,215,2,90,1,117,255,236,2,90,1,120,255,236,2,90,1,136,255,236,2,90,2,8,255,174,2,90,2,12,255,174,2,90,2,84,255,236,2,96,0,73,0,82,2,96,0,87,0,82,2,96,0,89,0,102,2,96,0,90,0,102,2,96,0,91,0,102,2,96,0,92,0,102,2,96,0,191,0,102,2,96,1,37,0,82,2,96,1,39,0,82,2,96,1,55,0,102,2,96,1,251,0,102,2,96,1,253,0,102,2,96,2,52,0,82,2,96,2,53,0,82,2,96,2,93,0,82,2,96,2,94,0,82,2,96,3,112,0,102,2,96,3,141,0,82,2,96,3,144,0,82,2,98,0,73,0,102,2,98,0,87,0,102,2,98,0,89,0,102,2,98,0,90,0,102,2,98,0,91,0,102,2,98,0,92,0,102,2,98,0,191,0,102,2,98,1,37,0,102,2,98,1,39,0,102,2,98,1,55,0,102,2,98,1,251,0,102,2,98,1,253,0,102,2,98,2,52,0,102,2,98,2,53,0,102,2,98,2,93,0,102,2,98,2,94,0,102,2,98,3,112,0,102,2,98,3,141,0,102,2,98,3,144,0,102,2,106,0,5,255,236,2,106,0,10,255,236,2,106,2,7,255,236,2,106,2,11,255,236,2,108,0,15,255,174,2,108,0,17,255,174,2,108,1,157,255,236,2,108,1,164,255,215,2,108,1,166,255,236,2,108,1,168,255,215,2,108,1,170,255,215,2,108,1,174,255,215,2,108,1,176,255,215,2,108,1,177,255,236,2,108,1,181,255,215,2,108,1,188,255,195,2,108,1,189,255,215,2,108,1,191,255,215,2,108,1,193,255,215,2,108,1,196,255,236,2,108,1,199,255,236,2,108,1,206,255,236,2,108,1,213,255,236,2,108,1,242,255,236,2,108,2,8,255,174,2,108,2,12,255,174,2,108,2,114,255,215,2,108,2,115,255,236,2,108,2,122,255,236,2,108,2,124,255,215,2,108,2,128,255,236,2,108,2,130,255,236,2,108,2,159,255,215,2,108,2,161,255,236,2,108,2,169,255,236,2,108,2,181,255,195,2,108,2,183,255,236,2,108,2,185,255,236,2,108,2,187,255,215,2,108,2,189,255,236,2,108,2,191,255,215,2,108,2,193,255,215,2,108,2,202,255,215,2,108,2,206,255,215,2,108,2,207,255,236,2,108,2,212,255,215,2,108,2,217,255,215,2,108,2,219,255,215,2,108,2,221,255,215,2,108,2,229,255,215,2,108,2,231,255,236,2,108,2,245,255,236,2,108,2,247,255,215,2,108,2,249,255,215,2,108,2,251,255,215,2,108,2,253,255,215,2,108,3,5,255,215,2,108,3,7,255,215,2,108,3,13,255,215,2,108,3,15,255,215,2,108,3,17,255,215,2,108,3,18,255,236,2,108,3,23,255,236,2,108,3,27,255,215,2,108,3,28,255,236,2,109,0,15,255,174,2,109,0,17,255,174,2,109,1,206,255,215,2,109,1,213,255,215,2,109,1,242,255,215,2,109,2,8,255,174,2,109,2,12,255,174,2,109,2,115,255,215,2,109,2,207,255,215,2,109,3,18,255,215,2,109,3,28,255,215,2,110,0,5,255,174,2,110,0,10,255,174,2,110,1,157,255,215,2,110,1,166,255,215,2,110,1,188,255,174,2,110,1,193,255,174,2,110,1,196,255,215,2,110,1,220,255,215,2,110,1,228,255,215,2,110,2,7,255,174,2,110,2,11,255,174,2,110,2,124,255,174,2,110,2,128,255,195,2,110,2,130,255,195,2,110,2,169,255,215,2,110,2,170,255,215,2,110,2,181,255,174,2,110,2,182,255,215,2,110,2,183,255,195,2,110,2,185,255,195,2,110,2,189,255,215,2,110,2,190,255,215,2,110,2,191,255,174,2,110,2,193,255,174,2,110,2,212,255,174,2,110,2,253,255,174,2,110,3,13,255,154,2,110,3,15,255,154,2,110,3,23,255,215,2,110,3,24,255,215,2,111,0,5,255,133,2,111,0,10,255,133,2,111,1,208,255,215,2,111,1,220,255,154,2,111,1,221,255,195,2,111,1,223,255,215,2,111,1,225,255,174,2,111,1,228,255,154,2,111,1,246,255,195,2,111,2,7,255,133,2,111,2,11,255,133,2,111,2,109,255,215,2,111,2,129,255,215,2,111,2,131,255,215,2,111,2,139,255,215,2,111,2,160,255,215,2,111,2,170,255,154,2,111,2,182,255,154,2,111,2,184,255,195,2,111,2,186,255,195,2,111,2,188,255,215,2,111,2,190,255,154,2,111,2,192,255,174,2,111,2,194,255,174,2,111,2,198,255,215,2,111,2,200,255,215,2,111,2,203,255,215,2,111,2,213,255,174,2,111,2,230,255,215,2,111,2,234,255,215,2,111,2,248,255,195,2,111,2,250,255,195,2,111,2,252,255,195,2,111,2,254,255,174,2,111,3,6,255,215,2,111,3,8,255,215,2,111,3,14,255,154,2,111,3,16,255,154,2,111,3,24,255,154,2,112,1,159,255,215,2,112,1,184,255,215,2,112,1,187,255,215,2,112,1,190,255,215,2,112,1,225,255,215,2,112,2,108,255,215,2,112,2,126,255,215,2,112,2,132,255,215,2,112,2,134,255,215,2,112,2,136,255,215,2,112,2,138,255,215,2,112,2,140,255,215,2,112,2,177,255,215,2,112,2,179,255,215,2,112,2,192,255,215,2,112,2,194,255,215,2,112,2,197,255,215,2,112,2,199,255,215,2,112,2,213,255,215,2,112,2,239,255,215,2,112,2,241,255,215,2,112,2,243,255,215,2,112,2,254,255,215,2,112,3,9,255,215,2,112,3,11,255,215,2,112,3,14,255,215,2,112,3,16,255,215,2,112,3,21,255,215,2,114,0,5,255,113,2,114,0,10,255,113,2,114,1,157,255,154,2,114,1,166,255,154,2,114,1,188,255,113,2,114,1,190,255,215,2,114,1,193,255,154,2,114,1,196,255,154,2,114,1,220,255,215,2,114,1,225,255,215,2,114,1,228,255,215,2,114,2,7,255,113,2,114,2,11,255,113,2,114,2,110,255,215,2,114,2,124,255,154,2,114,2,128,255,174,2,114,2,130,255,174,2,114,2,151,255,215,2,114,2,155,255,215,2,114,2,167,255,215,2,114,2,169,255,154,2,114,2,170,255,215,2,114,2,181,255,113,2,114,2,182,255,215,2,114,2,183,255,133,2,114,2,185,255,133,2,114,2,189,255,154,2,114,2,190,255,215,2,114,2,191,255,154,2,114,2,192,255,215,2,114,2,193,255,154,2,114,2,194,255,215,2,114,2,197,255,154,2,114,2,199,255,154,2,114,2,212,255,154,2,114,2,213,255,215,2,114,2,225,255,215,2,114,2,227,255,215,2,114,2,253,255,154,2,114,2,254,255,215,2,114,3,3,255,215,2,114,3,13,255,113,2,114,3,14,255,215,2,114,3,15,255,113,2,114,3,16,255,215,2,114,3,23,255,154,2,114,3,24,255,215,2,115,0,5,255,113,2,115,0,10,255,113,2,115,1,207,255,215,2,115,1,216,255,215,2,115,1,219,255,215,2,115,1,220,255,154,2,115,1,221,255,195,2,115,1,222,255,215,2,115,1,225,255,195,2,115,1,228,255,154,2,115,1,234,255,215,2,115,1,237,255,215,2,115,1,246,255,195,2,115,2,7,255,113,2,115,2,11,255,113,2,115,2,106,255,215,2,115,2,109,255,215,2,115,2,125,255,236,2,115,2,127,255,215,2,115,2,129,255,215,2,115,2,131,255,215,2,115,2,133,255,215,2,115,2,135,255,215,2,115,2,137,255,215,2,115,2,139,255,215,2,115,2,141,255,215,2,115,2,170,255,154,2,115,2,178,255,215,2,115,2,180,255,215,2,115,2,182,255,154,2,115,2,184,255,215,2,115,2,186,255,215,2,115,2,190,255,154,2,115,2,192,255,195,2,115,2,194,255,195,2,115,2,198,255,215,2,115,2,200,255,215,2,115,2,213,255,195,2,115,2,224,255,215,2,115,2,240,255,215,2,115,2,242,255,215,2,115,2,244,255,215,2,115,2,248,255,195,2,115,2,250,255,195,2,115,2,252,255,195,2,115,2,254,255,195,2,115,3,10,255,215,2,115,3,12,255,215,2,115,3,14,255,133,2,115,3,16,255,133,2,115,3,22,255,215,2,115,3,24,255,154,2,115,3,26,255,215,2,116,0,5,255,113,2,116,0,10,255,113,2,116,1,157,255,154,2,116,1,166,255,154,2,116,1,188,255,113,2,116,1,190,255,215,2,116,1,193,255,154,2,116,1,196,255,154,2,116,1,220,255,215,2,116,1,225,255,215,2,116,1,228,255,215,2,116,2,7,255,113,2,116,2,11,255,113,2,116,2,110,255,215,2,116,2,124,255,154,2,116,2,128,255,174,2,116,2,130,255,174,2,116,2,151,255,215,2,116,2,155,255,215,2,116,2,167,255,215,2,116,2,169,255,154,2,116,2,170,255,215,2,116,2,181,255,113,2,116,2,182,255,215,2,116,2,183,255,133,2,116,2,185,255,133,2,116,2,189,255,154,2,116,2,190,255,215,2,116,2,191,255,154,2,116,2,192,255,215,2,116,2,193,255,154,2,116,2,194,255,215,2,116,2,197,255,154,2,116,2,199,255,154,2,116,2,212,255,154,2,116,2,213,255,215,2,116,2,225,255,215,2,116,2,227,255,215,2,116,2,253,255,154,2,116,2,254,255,215,2,116,3,3,255,215,2,116,3,13,255,113,2,116,3,14,255,215,2,116,3,15,255,113,2,116,3,16,255,215,2,116,3,23,255,154,2,116,3,24,255,215,2,117,0,5,255,113,2,117,0,10,255,113,2,117,1,207,255,215,2,117,1,216,255,215,2,117,1,219,255,215,2,117,1,220,255,154,2,117,1,221,255,195,2,117,1,222,255,215,2,117,1,225,255,195,2,117,1,228,255,154,2,117,1,234,255,215,2,117,1,237,255,215,2,117,1,246,255,195,2,117,2,7,255,113,2,117,2,11,255,113,2,117,2,106,255,215,2,117,2,109,255,215,2,117,2,125,255,236,2,117,2,127,255,215,2,117,2,129,255,215,2,117,2,131,255,215,2,117,2,133,255,215,2,117,2,135,255,215,2,117,2,137,255,215,2,117,2,139,255,215,2,117,2,141,255,215,2,117,2,170,255,154,2,117,2,178,255,215,2,117,2,180,255,215,2,117,2,182,255,154,2,117,2,184,255,215,2,117,2,186,255,215,2,117,2,190,255,154,2,117,2,192,255,195,2,117,2,194,255,195,2,117,2,198,255,215,2,117,2,200,255,215,2,117,2,213,255,195,2,117,2,224,255,215,2,117,2,240,255,215,2,117,2,242,255,215,2,117,2,244,255,215,2,117,2,248,255,195,2,117,2,250,255,195,2,117,2,252,255,195,2,117,2,254,255,195,2,117,3,10,255,215,2,117,3,12,255,215,2,117,3,14,255,133,2,117,3,16,255,133,2,117,3,22,255,215,2,117,3,24,255,154,2,117,3,26,255,215,2,118,3,13,255,236,2,118,3,15,255,236,2,120,3,13,255,236,2,120,3,15,255,236,2,122,0,15,255,174,2,122,0,17,255,174,2,122,2,8,255,174,2,122,2,12,255,174,2,122,2,128,255,236,2,122,2,130,255,236,2,122,2,183,255,236,2,122,2,185,255,236,2,122,3,13,255,215,2,122,3,15,255,215,2,124,0,15,255,113,2,124,0,17,255,113,2,124,1,164,255,195,2,124,1,170,255,174,2,124,1,174,255,195,2,124,1,181,255,195,2,124,1,206,255,215,2,124,1,213,255,215,2,124,1,242,255,215,2,124,2,8,255,113,2,124,2,12,255,113,2,124,2,114,255,174,2,124,2,115,255,215,2,124,2,206,255,195,2,124,2,207,255,215,2,124,2,217,255,174,2,124,2,219,255,174,2,124,2,221,255,174,2,124,3,9,255,174,2,124,3,11,255,174,2,124,3,17,255,195,2,124,3,18,255,215,2,124,3,27,255,195,2,124,3,28,255,215,2,125,0,5,255,236,2,125,0,10,255,236,2,125,1,208,255,215,2,125,1,220,255,236,2,125,1,221,255,236,2,125,1,223,255,215,2,125,1,225,255,236,2,125,1,228,255,236,2,125,1,246,255,236,2,125,2,7,255,236,2,125,2,11,255,236,2,125,2,160,255,215,2,125,2,170,255,236,2,125,2,182,255,236,2,125,2,188,255,215,2,125,2,190,255,236,2,125,2,192,255,236,2,125,2,194,255,236,2,125,2,203,255,215,2,125,2,213,255,236,2,125,2,230,255,215,2,125,2,248,255,236,2,125,2,250,255,236,2,125,2,252,255,236,2,125,2,254,255,236,2,125,3,6,255,215,2,125,3,8,255,215,2,125,3,14,255,236,2,125,3,16,255,236,2,125,3,24,255,236,2,126,0,15,255,174,2,126,0,17,255,174,2,126,1,157,255,236,2,126,1,164,255,215,2,126,1,166,255,236,2,126,1,168,255,215,2,126,1,170,255,215,2,126,1,174,255,215,2,126,1,176,255,215,2,126,1,177,255,236,2,126,1,181,255,215,2,126,1,188,255,195,2,126,1,189,255,215,2,126,1,191,255,215,2,126,1,193,255,215,2,126,1,196,255,236,2,126,1,199,255,236,2,126,1,206,255,236,2,126,1,213,255,236,2,126,1,242,255,236,2,126,2,8,255,174,2,126,2,12,255,174,2,126,2,114,255,215,2,126,2,115,255,236,2,126,2,122,255,236,2,126,2,124,255,215,2,126,2,128,255,236,2,126,2,130,255,236,2,126,2,159,255,215,2,126,2,161,255,236,2,126,2,169,255,236,2,126,2,181,255,195,2,126,2,183,255,236,2,126,2,185,255,236,2,126,2,187,255,215,2,126,2,189,255,236,2,126,2,191,255,215,2,126,2,193,255,215,2,126,2,202,255,215,2,126,2,206,255,215,2,126,2,207,255,236,2,126,2,212,255,215,2,126,2,217,255,215,2,126,2,219,255,215,2,126,2,221,255,215,2,126,2,229,255,215,2,126,2,231,255,236,2,126,2,245,255,236,2,126,2,247,255,215,2,126,2,249,255,215,2,126,2,251,255,215,2,126,2,253,255,215,2,126,3,5,255,215,2,126,3,7,255,215,2,126,3,13,255,215,2,126,3,15,255,215,2,126,3,17,255,215,2,126,3,18,255,236,2,126,3,23,255,236,2,126,3,27,255,215,2,126,3,28,255,236,2,127,0,5,255,236,2,127,0,10,255,236,2,127,1,208,255,215,2,127,1,220,255,236,2,127,1,221,255,236,2,127,1,223,255,215,2,127,1,225,255,236,2,127,1,228,255,236,2,127,1,246,255,236,2,127,2,7,255,236,2,127,2,11,255,236,2,127,2,160,255,215,2,127,2,170,255,236,2,127,2,182,255,236,2,127,2,188,255,215,2,127,2,190,255,236,2,127,2,192,255,236,2,127,2,194,255,236,2,127,2,203,255,215,2,127,2,213,255,236,2,127,2,230,255,215,2,127,2,248,255,236,2,127,2,250,255,236,2,127,2,252,255,236,2,127,2,254,255,236,2,127,3,6,255,215,2,127,3,8,255,215,2,127,3,14,255,236,2,127,3,16,255,236,2,127,3,24,255,236,2,128,0,15,255,133,2,128,0,17,255,133,2,128,1,159,255,236,2,128,1,164,255,154,2,128,1,170,255,113,2,128,1,174,255,154,2,128,1,181,255,154,2,128,1,184,255,236,2,128,1,187,255,236,2,128,1,190,255,195,2,128,1,201,255,236,2,128,1,206,255,174,2,128,1,207,255,215,2,128,1,213,255,174,2,128,1,216,255,215,2,128,1,219,255,215,2,128,1,222,255,215,2,128,1,225,255,215,2,128,1,234,255,215,2,128,1,235,0,102,2,128,1,237,255,215,2,128,1,238,255,236,2,128,1,242,255,174,2,128,1,244,0,102,2,128,2,8,255,133,2,128,2,12,255,133,2,128,2,106,255,215,2,128,2,108,255,236,2,128,2,114,255,113,2,128,2,115,255,174,2,128,2,126,255,236,2,128,2,127,255,215,2,128,2,132,255,236,2,128,2,133,255,215,2,128,2,134,255,236,2,128,2,135,255,215,2,128,2,136,255,236,2,128,2,137,255,215,2,128,2,138,255,236,2,128,2,140,255,236,2,128,2,141,255,215,2,128,2,152,0,102,2,128,2,168,0,102,2,128,2,177,255,236,2,128,2,178,255,215,2,128,2,179,255,236,2,128,2,180,255,215,2,128,2,192,255,215,2,128,2,194,255,215,2,128,2,197,255,215,2,128,2,198,255,195,2,128,2,199,255,215,2,128,2,200,255,195,2,128,2,206,255,154,2,128,2,207,255,174,2,128,2,213,255,215,2,128,2,217,255,113,2,128,2,219,255,113,2,128,2,221,255,113,2,128,2,224,255,215,2,128,2,239,255,236,2,128,2,240,255,215,2,128,2,241,255,236,2,128,2,242,255,215,2,128,2,243,255,236,2,128,2,244,255,215,2,128,2,254,255,215,2,128,3,9,255,113,2,128,3,10,255,215,2,128,3,11,255,113,2,128,3,12,255,215,2,128,3,17,255,154,2,128,3,18,255,174,2,128,3,21,255,236,2,128,3,22,255,215,2,128,3,26,255,215,2,128,3,27,255,154,2,128,3,28,255,174,2,129,0,15,255,174,2,129,0,17,255,174,2,129,1,206,255,215,2,129,1,213,255,215,2,129,1,242,255,215,2,129,2,8,255,174,2,129,2,12,255,174,2,129,2,115,255,215,2,129,2,207,255,215,2,129,3,18,255,215,2,129,3,28,255,215,2,130,0,15,255,133,2,130,0,17,255,133,2,130,1,159,255,236,2,130,1,164,255,154,2,130,1,170,255,113,2,130,1,174,255,154,2,130,1,181,255,154,2,130,1,184,255,236,2,130,1,187,255,236,2,130,1,190,255,195,2,130,1,201,255,236,2,130,1,206,255,174,2,130,1,207,255,215,2,130,1,213,255,174,2,130,1,216,255,215,2,130,1,219,255,215,2,130,1,222,255,215,2,130,1,225,255,215,2,130,1,234,255,215,2,130,1,235,0,102,2,130,1,237,255,215,2,130,1,238,255,236,2,130,1,242,255,174,2,130,1,244,0,102,2,130,2,8,255,133,2,130,2,12,255,133,2,130,2,106,255,215,2,130,2,108,255,236,2,130,2,114,255,113,2,130,2,115,255,174,2,130,2,126,255,236,2,130,2,127,255,215,2,130,2,132,255,236,2,130,2,133,255,215,2,130,2,134,255,236,2,130,2,135,255,215,2,130,2,136,255,236,2,130,2,137,255,215,2,130,2,138,255,236,2,130,2,140,255,236,2,130,2,141,255,215,2,130,2,152,0,102,2,130,2,168,0,102,2,130,2,177,255,236,2,130,2,178,255,215,2,130,2,179,255,236,2,130,2,180,255,215,2,130,2,192,255,215,2,130,2,194,255,215,2,130,2,197,255,215,2,130,2,198,255,195,2,130,2,199,255,215,2,130,2,200,255,195,2,130,2,206,255,154,2,130,2,207,255,174,2,130,2,213,255,215,2,130,2,217,255,113,2,130,2,219,255,113,2,130,2,221,255,113,2,130,2,224,255,215,2,130,2,239,255,236,2,130,2,240,255,215,2,130,2,241,255,236,2,130,2,242,255,215,2,130,2,243,255,236,2,130,2,244,255,215,2,130,2,254,255,215,2,130,3,9,255,113,2,130,3,10,255,215,2,130,3,11,255,113,2,130,3,12,255,215,2,130,3,17,255,154,2,130,3,18,255,174,2,130,3,21,255,236,2,130,3,22,255,215,2,130,3,26,255,215,2,130,3,27,255,154,2,130,3,28,255,174,2,131,0,15,255,174,2,131,0,17,255,174,2,131,1,206,255,215,2,131,1,213,255,215,2,131,1,242,255,215,2,131,2,8,255,174,2,131,2,12,255,174,2,131,2,115,255,215,2,131,2,207,255,215,2,131,3,18,255,215,2,131,3,28,255,215,2,132,0,15,255,174,2,132,0,17,255,174,2,132,1,206,255,215,2,132,1,213,255,215,2,132,1,242,255,215,2,132,2,8,255,174,2,132,2,12,255,174,2,132,2,115,255,215,2,132,2,207,255,215,2,132,3,18,255,215,2,132,3,28,255,215,2,133,0,15,255,174,2,133,0,17,255,174,2,133,1,206,255,215,2,133,1,213,255,215,2,133,1,242,255,215,2,133,2,8,255,174,2,133,2,12,255,174,2,133,2,115,255,215,2,133,2,207,255,215,2,133,3,18,255,215,2,133,3,28,255,215,2,134,0,15,255,174,2,134,0,17,255,174,2,134,1,157,255,236,2,134,1,164,255,215,2,134,1,166,255,236,2,134,1,168,255,215,2,134,1,170,255,215,2,134,1,174,255,215,2,134,1,176,255,215,2,134,1,177,255,236,2,134,1,181,255,215,2,134,1,188,255,195,2,134,1,189,255,215,2,134,1,191,255,215,2,134,1,193,255,215,2,134,1,196,255,236,2,134,1,199,255,236,2,134,1,206,255,236,2,134,1,213,255,236,2,134,1,242,255,236,2,134,2,8,255,174,2,134,2,12,255,174,2,134,2,114,255,215,2,134,2,115,255,236,2,134,2,122,255,236,2,134,2,124,255,215,2,134,2,128,255,236,2,134,2,130,255,236,2,134,2,159,255,215,2,134,2,161,255,236,2,134,2,169,255,236,2,134,2,181,255,195,2,134,2,183,255,236,2,134,2,185,255,236,2,134,2,187,255,215,2,134,2,189,255,236,2,134,2,191,255,215,2,134,2,193,255,215,2,134,2,202,255,215,2,134,2,206,255,215,2,134,2,207,255,236,2,134,2,212,255,215,2,134,2,217,255,215,2,134,2,219,255,215,2,134,2,221,255,215,2,134,2,229,255,215,2,134,2,231,255,236,2,134,2,245,255,236,2,134,2,247,255,215,2,134,2,249,255,215,2,134,2,251,255,215,2,134,2,253,255,215,2,134,3,5,255,215,2,134,3,7,255,215,2,134,3,13,255,215,2,134,3,15,255,215,2,134,3,17,255,215,2,134,3,18,255,236,2,134,3,23,255,236,2,134,3,27,255,215,2,134,3,28,255,236,2,135,0,5,255,236,2,135,0,10,255,236,2,135,1,208,255,215,2,135,1,220,255,236,2,135,1,221,255,236,2,135,1,223,255,215,2,135,1,225,255,236,2,135,1,228,255,236,2,135,1,246,255,236,2,135,2,7,255,236,2,135,2,11,255,236,2,135,2,160,255,215,2,135,2,170,255,236,2,135,2,182,255,236,2,135,2,188,255,215,2,135,2,190,255,236,2,135,2,192,255,236,2,135,2,194,255,236,2,135,2,203,255,215,2,135,2,213,255,236,2,135,2,230,255,215,2,135,2,248,255,236,2,135,2,250,255,236,2,135,2,252,255,236,2,135,2,254,255,236,2,135,3,6,255,215,2,135,3,8,255,215,2,135,3,14,255,236,2,135,3,16,255,236,2,135,3,24,255,236,2,136,0,15,255,174,2,136,0,17,255,174,2,136,1,157,255,236,2,136,1,164,255,215,2,136,1,166,255,236,2,136,1,168,255,215,2,136,1,170,255,215,2,136,1,174,255,215,2,136,1,176,255,215,2,136,1,177,255,236,2,136,1,181,255,215,2,136,1,188,255,195,2,136,1,189,255,215,2,136,1,191,255,215,2,136,1,193,255,215,2,136,1,196,255,236,2,136,1,199,255,236,2,136,1,206,255,236,2,136,1,213,255,236,2,136,1,242,255,236,2,136,2,8,255,174,2,136,2,12,255,174,2,136,2,114,255,215,2,136,2,115,255,236,2,136,2,122,255,236,2,136,2,124,255,215,2,136,2,128,255,236,2,136,2,130,255,236,2,136,2,159,255,215,2,136,2,161,255,236,2,136,2,169,255,236,2,136,2,181,255,195,2,136,2,183,255,236,2,136,2,185,255,236,2,136,2,187,255,215,2,136,2,189,255,236,2,136,2,191,255,215,2,136,2,193,255,215,2,136,2,202,255,215,2,136,2,206,255,215,2,136,2,207,255,236,2,136,2,212,255,215,2,136,2,217,255,215,2,136,2,219,255,215,2,136,2,221,255,215,2,136,2,229,255,215,2,136,2,231,255,236,2,136,2,245,255,236,2,136,2,247,255,215,2,136,2,249,255,215,2,136,2,251,255,215,2,136,2,253,255,215,2,136,3,5,255,215,2,136,3,7,255,215,2,136,3,13,255,215,2,136,3,15,255,215,2,136,3,17,255,215,2,136,3,18,255,236,2,136,3,23,255,236,2,136,3,27,255,215,2,136,3,28,255,236,2,137,0,5,255,236,2,137,0,10,255,236,2,137,1,208,255,215,2,137,1,220,255,236,2,137,1,221,255,236,2,137,1,223,255,215,2,137,1,225,255,236,2,137,1,228,255,236,2,137,1,246,255,236,2,137,2,7,255,236,2,137,2,11,255,236,2,137,2,160,255,215,2,137,2,170,255,236,2,137,2,182,255,236,2,137,2,188,255,215,2,137,2,190,255,236,2,137,2,192,255,236,2,137,2,194,255,236,2,137,2,203,255,215,2,137,2,213,255,236,2,137,2,230,255,215,2,137,2,248,255,236,2,137,2,250,255,236,2,137,2,252,255,236,2,137,2,254,255,236,2,137,3,6,255,215,2,137,3,8,255,215,2,137,3,14,255,236,2,137,3,16,255,236,2,137,3,24,255,236,2,138,0,15,255,174,2,138,0,17,255,174,2,138,1,157,255,236,2,138,1,164,255,215,2,138,1,166,255,236,2,138,1,168,255,215,2,138,1,170,255,215,2,138,1,174,255,215,2,138,1,176,255,215,2,138,1,177,255,236,2,138,1,181,255,215,2,138,1,188,255,195,2,138,1,189,255,215,2,138,1,191,255,215,2,138,1,193,255,215,2,138,1,196,255,236,2,138,1,199,255,236,2,138,1,206,255,236,2,138,1,213,255,236,2,138,1,242,255,236,2,138,2,8,255,174,2,138,2,12,255,174,2,138,2,114,255,215,2,138,2,115,255,236,2,138,2,122,255,236,2,138,2,124,255,215,2,138,2,128,255,236,2,138,2,130,255,236,2,138,2,159,255,215,2,138,2,161,255,236,2,138,2,169,255,236,2,138,2,181,255,195,2,138,2,183,255,236,2,138,2,185,255,236,2,138,2,187,255,215,2,138,2,189,255,236,2,138,2,191,255,215,2,138,2,193,255,215,2,138,2,202,255,215,2,138,2,206,255,215,2,138,2,207,255,236,2,138,2,212,255,215,2,138,2,217,255,215,2,138,2,219,255,215,2,138,2,221,255,215,2,138,2,229,255,215,2,138,2,231,255,236,2,138,2,245,255,236,2,138,2,247,255,215,2,138,2,249,255,215,2,138,2,251,255,215,2,138,2,253,255,215,2,138,3,5,255,215,2,138,3,7,255,215,2,138,3,13,255,215,2,138,3,15,255,215,2,138,3,17,255,215,2,138,3,18,255,236,2,138,3,23,255,236,2,138,3,27,255,215,2,138,3,28,255,236,2,139,0,15,255,174,2,139,0,17,255,174,2,139,1,206,255,215,2,139,1,213,255,215,2,139,1,242,255,215,2,139,2,8,255,174,2,139,2,12,255,174,2,139,2,115,255,215,2,139,2,207,255,215,2,139,3,18,255,215,2,139,3,28,255,215,2,140,1,159,255,215,2,140,1,184,255,215,2,140,1,187,255,215,2,140,1,190,255,215,2,140,1,225,255,215,2,140,2,108,255,215,2,140,2,126,255,215,2,140,2,132,255,215,2,140,2,134,255,215,2,140,2,136,255,215,2,140,2,138,255,215,2,140,2,140,255,215,2,140,2,177,255,215,2,140,2,179,255,215,2,140,2,192,255,215,2,140,2,194,255,215,2,140,2,197,255,215,2,140,2,199,255,215,2,140,2,213,255,215,2,140,2,239,255,215,2,140,2,241,255,215,2,140,2,243,255,215,2,140,2,254,255,215,2,140,3,9,255,215,2,140,3,11,255,215,2,140,3,14,255,215,2,140,3,16,255,215,2,140,3,21,255,215,2,149,1,163,0,225,2,149,2,234,0,41,2,149,3,14,255,215,2,149,3,16,255,215,2,150,0,5,255,236,2,150,0,10,255,236,2,150,2,7,255,236,2,150,2,11,255,236,2,151,0,5,255,174,2,151,0,10,255,174,2,151,1,157,255,215,2,151,1,166,255,215,2,151,1,188,255,174,2,151,1,193,255,174,2,151,1,196,255,215,2,151,1,220,255,215,2,151,1,228,255,215,2,151,2,7,255,174,2,151,2,11,255,174,2,151,2,124,255,174,2,151,2,128,255,195,2,151,2,130,255,195,2,151,2,169,255,215,2,151,2,170,255,215,2,151,2,181,255,174,2,151,2,182,255,215,2,151,2,183,255,195,2,151,2,185,255,195,2,151,2,189,255,215,2,151,2,190,255,215,2,151,2,191,255,174,2,151,2,193,255,174,2,151,2,212,255,174,2,151,2,253,255,174,2,151,3,13,255,154,2,151,3,15,255,154,2,151,3,23,255,215,2,151,3,24,255,215,2,152,0,5,255,133,2,152,0,10,255,133,2,152,1,208,255,215,2,152,1,220,255,154,2,152,1,221,255,195,2,152,1,223,255,215,2,152,1,225,255,174,2,152,1,228,255,154,2,152,1,246,255,195,2,152,2,7,255,133,2,152,2,11,255,133,2,152,2,109,255,215,2,152,2,129,255,215,2,152,2,131,255,215,2,152,2,139,255,215,2,152,2,160,255,215,2,152,2,170,255,154,2,152,2,182,255,154,2,152,2,184,255,195,2,152,2,186,255,195,2,152,2,188,255,215,2,152,2,190,255,154,2,152,2,192,255,174,2,152,2,194,255,174,2,152,2,198,255,215,2,152,2,200,255,215,2,152,2,203,255,215,2,152,2,213,255,174,2,152,2,230,255,215,2,152,2,234,255,215,2,152,2,248,255,195,2,152,2,250,255,195,2,152,2,252,255,195,2,152,2,254,255,174,2,152,3,6,255,215,2,152,3,8,255,215,2,152,3,14,255,154,2,152,3,16,255,154,2,152,3,24,255,154,2,153,0,15,254,246,2,153,0,17,254,246,2,153,1,164,255,133,2,153,1,170,255,154,2,153,1,174,255,133,2,153,1,176,255,215,2,153,1,181,255,133,2,153,1,191,255,215,2,153,1,206,255,154,2,153,1,213,255,154,2,153,1,242,255,154,2,153,2,8,254,246,2,153,2,12,254,246,2,153,2,114,255,154,2,153,2,115,255,154,2,153,2,118,255,236,2,153,2,159,255,215,2,153,2,187,255,215,2,153,2,202,255,215,2,153,2,206,255,133,2,153,2,207,255,154,2,153,2,217,255,154,2,153,2,219,255,154,2,153,2,221,255,154,2,153,2,229,255,215,2,153,3,5,255,215,2,153,3,7,255,215,2,153,3,9,255,174,2,153,3,11,255,174,2,153,3,17,255,133,2,153,3,18,255,154,2,153,3,27,255,133,2,153,3,28,255,154,2,154,0,5,255,236,2,154,0,10,255,236,2,154,1,208,255,215,2,154,1,220,255,236,2,154,1,221,255,236,2,154,1,223,255,215,2,154,1,225,255,236,2,154,1,228,255,236,2,154,1,246,255,236,2,154,2,7,255,236,2,154,2,11,255,236,2,154,2,160,255,215,2,154,2,170,255,236,2,154,2,182,255,236,2,154,2,188,255,215,2,154,2,190,255,236,2,154,2,192,255,236,2,154,2,194,255,236,2,154,2,203,255,215,2,154,2,213,255,236,2,154,2,230,255,215,2,154,2,248,255,236,2,154,2,250,255,236,2,154,2,252,255,236,2,154,2,254,255,236,2,154,3,6,255,215,2,154,3,8,255,215,2,154,3,14,255,236,2,154,3,16,255,236,2,154,3,24,255,236,2,155,0,15,255,154,2,155,0,16,255,215,2,155,0,17,255,154,2,155,1,157,0,41,2,155,1,159,255,215,2,155,1,164,255,174,2,155,1,166,0,41,2,155,1,170,255,133,2,155,1,174,255,174,2,155,1,181,255,174,2,155,1,184,255,215,2,155,1,187,255,215,2,155,1,188,0,41,2,155,1,190,255,195,2,155,1,196,0,41,2,155,1,204,255,195,2,155,1,205,255,195,2,155,1,206,255,154,2,155,1,207,255,174,2,155,1,208,255,215,2,155,1,209,255,215,2,155,1,210,255,195,2,155,1,211,255,195,2,155,1,212,255,195,2,155,1,213,255,154,2,155,1,214,255,195,2,155,1,215,255,195,2,155,1,216,255,174,2,155,1,217,255,195,2,155,1,218,255,195,2,155,1,219,255,174,2,155,1,222,255,174,2,155,1,223,255,215,2,155,1,224,255,195,2,155,1,225,255,154,2,155,1,226,255,195,2,155,1,227,255,195,2,155,1,229,255,195,2,155,1,230,255,195,2,155,1,231,255,215,2,155,1,232,255,195,2,155,1,234,255,174,2,155,1,235,0,41,2,155,1,236,255,195,2,155,1,237,255,174,2,155,1,238,255,195,2,155,1,242,255,154,2,155,1,243,255,195,2,155,1,244,0,41,2,155,1,245,255,195,2,155,1,247,255,195,2,155,1,249,255,195,2,155,2,2,255,215,2,155,2,3,255,215,2,155,2,4,255,215,2,155,2,8,255,154,2,155,2,12,255,154,2,155,2,106,255,174,2,155,2,107,255,195,2,155,2,108,255,215,2,155,2,113,255,195,2,155,2,114,255,133,2,155,2,115,255,154,2,155,2,117,255,195,2,155,2,119,255,215,2,155,2,121,255,195,2,155,2,125,255,195,2,155,2,126,255,215,2,155,2,127,255,174,2,155,2,132,255,215,2,155,2,133,255,174,2,155,2,134,255,215,2,155,2,135,255,174,2,155,2,136,255,215,2,155,2,137,255,174,2,155,2,138,255,215,2,155,2,140,255,215,2,155,2,141,255,174,2,155,2,150,255,195,2,155,2,152,0,41,2,155,2,154,255,195,2,155,2,158,255,195,2,155,2,160,255,215,2,155,2,162,255,215,2,155,2,164,255,195,2,155,2,166,255,195,2,155,2,168,0,41,2,155,2,169,0,41,2,155,2,172,255,195,2,155,2,174,255,195,2,155,2,176,255,195,2,155,2,177,255,215,2,155,2,178,255,174,2,155,2,179,255,215,2,155,2,180,255,174,2,155,2,181,0,41,2,155,2,188,255,215,2,155,2,189,0,41,2,155,2,192,255,154,2,155,2,194,255,154,2,155,2,196,255,195,2,155,2,197,255,215,2,155,2,198,255,195,2,155,2,199,255,215,2,155,2,200,255,195,2,155,2,203,255,215,2,155,2,205,255,195,2,155,2,206,255,174,2,155,2,207,255,154,2,155,2,209,255,195,2,155,2,211,255,195,2,155,2,213,255,154,2,155,2,215,255,195,2,155,2,217,255,133,2,155,2,219,255,133,2,155,2,221,255,133,2,155,2,224,255,174,2,155,2,230,255,215,2,155,2,232,255,215,2,155,2,236,255,195,2,155,2,238,255,195,2,155,2,239,255,215,2,155,2,240,255,174,2,155,2,241,255,215,2,155,2,242,255,174,2,155,2,243,255,215,2,155,2,244,255,174,2,155,2,246,255,215,2,155,2,254,255,154,2,155,3,0,255,195,2,155,3,2,255,195,2,155,3,6,255,215,2,155,3,8,255,215,2,155,3,9,255,154,2,155,3,10,255,174,2,155,3,11,255,154,2,155,3,12,255,174,2,155,3,14,255,215,2,155,3,16,255,215,2,155,3,17,255,174,2,155,3,18,255,154,2,155,3,20,255,195,2,155,3,21,255,215,2,155,3,22,255,174,2,155,3,23,0,41,2,155,3,26,255,174,2,155,3,27,255,174,2,155,3,28,255,154,2,156,0,15,255,195,2,156,0,17,255,195,2,156,1,206,255,195,2,156,1,207,255,215,2,156,1,213,255,195,2,156,1,216,255,215,2,156,1,219,255,215,2,156,1,222,255,215,2,156,1,234,255,215,2,156,1,237,255,215,2,156,1,242,255,195,2,156,2,8,255,195,2,156,2,12,255,195,2,156,2,106,255,215,2,156,2,115,255,195,2,156,2,127,255,215,2,156,2,133,255,215,2,156,2,135,255,215,2,156,2,137,255,215,2,156,2,141,255,215,2,156,2,178,255,215,2,156,2,180,255,215,2,156,2,207,255,195,2,156,2,224,255,215,2,156,2,240,255,215,2,156,2,242,255,215,2,156,2,244,255,215,2,156,3,10,255,215,2,156,3,12,255,215,2,156,3,18,255,195,2,156,3,22,255,215,2,156,3,26,255,215,2,156,3,28,255,195,2,157,0,5,255,195,2,157,0,10,255,195,2,157,1,157,255,195,2,157,1,163,0,102,2,157,1,166,255,195,2,157,1,188,255,195,2,157,1,193,255,174,2,157,1,196,255,195,2,157,1,220,255,215,2,157,1,225,255,215,2,157,1,228,255,215,2,157,2,7,255,195,2,157,2,11,255,195,2,157,2,124,255,174,2,157,2,128,255,195,2,157,2,130,255,195,2,157,2,169,255,195,2,157,2,170,255,215,2,157,2,181,255,195,2,157,2,182,255,215,2,157,2,183,255,215,2,157,2,185,255,215,2,157,2,189,255,195,2,157,2,190,255,215,2,157,2,191,255,174,2,157,2,192,255,215,2,157,2,193,255,174,2,157,2,194,255,215,2,157,2,212,255,174,2,157,2,213,255,215,2,157,2,253,255,174,2,157,2,254,255,215,2,157,3,13,255,215,2,157,3,14,255,195,2,157,3,15,255,215,2,157,3,16,255,195,2,157,3,23,255,195,2,157,3,24,255,215,2,158,0,5,255,195,2,158,0,10,255,195,2,158,2,7,255,195,2,158,2,11,255,195,2,158,3,14,255,215,2,158,3,16,255,215,2,159,1,159,255,215,2,159,1,163,0,225,2,159,1,184,255,215,2,159,1,187,255,215,2,159,1,190,255,195,2,159,1,220,255,215,2,159,1,225,255,174,2,159,1,228,255,215,2,159,2,108,255,215,2,159,2,123,0,61,2,159,2,125,255,236,2,159,2,126,255,215,2,159,2,132,255,215,2,159,2,134,255,215,2,159,2,136,255,215,2,159,2,138,255,215,2,159,2,140,255,215,2,159,2,170,255,215,2,159,2,177,255,215,2,159,2,179,255,215,2,159,2,182,255,215,2,159,2,190,255,215,2,159,2,192,255,174,2,159,2,194,255,174,2,159,2,197,255,195,2,159,2,198,255,215,2,159,2,199,255,195,2,159,2,200,255,215,2,159,2,213,255,174,2,159,2,239,255,215,2,159,2,241,255,215,2,159,2,243,255,215,2,159,2,254,255,174,2,159,3,14,255,215,2,159,3,16,255,215,2,159,3,21,255,215,2,159,3,24,255,215,2,160,1,207,255,236,2,160,1,216,255,236,2,160,1,219,255,236,2,160,1,222,255,236,2,160,1,225,255,236,2,160,1,234,255,236,2,160,1,237,255,236,2,160,2,106,255,236,2,160,2,127,255,236,2,160,2,133,255,236,2,160,2,135,255,236,2,160,2,137,255,236,2,160,2,141,255,236,2,160,2,178,255,236,2,160,2,180,255,236,2,160,2,192,255,236,2,160,2,194,255,236,2,160,2,213,255,236,2,160,2,224,255,236,2,160,2,240,255,236,2,160,2,242,255,236,2,160,2,244,255,236,2,160,2,254,255,236,2,160,3,10,255,236,2,160,3,12,255,236,2,160,3,14,255,215,2,160,3,16,255,215,2,160,3,22,255,236,2,160,3,26,255,236,2,161,0,15,255,174,2,161,0,17,255,174,2,161,2,8,255,174,2,161,2,12,255,174,2,161,2,128,255,236,2,161,2,130,255,236,2,161,2,183,255,236,2,161,2,185,255,236,2,161,3,13,255,215,2,161,3,15,255,215,2,162,1,233,0,41,2,163,1,159,255,215,2,163,1,163,0,225,2,163,1,184,255,215,2,163,1,187,255,215,2,163,1,190,255,195,2,163,1,220,255,215,2,163,1,225,255,174,2,163,1,228,255,215,2,163,2,108,255,215,2,163,2,123,0,61,2,163,2,125,255,236,2,163,2,126,255,215,2,163,2,132,255,215,2,163,2,134,255,215,2,163,2,136,255,215,2,163,2,138,255,215,2,163,2,140,255,215,2,163,2,170,255,215,2,163,2,177,255,215,2,163,2,179,255,215,2,163,2,182,255,215,2,163,2,190,255,215,2,163,2,192,255,174,2,163,2,194,255,174,2,163,2,197,255,195,2,163,2,198,255,215,2,163,2,199,255,195,2,163,2,200,255,215,2,163,2,213,255,174,2,163,2,239,255,215,2,163,2,241,255,215,2,163,2,243,255,215,2,163,2,254,255,174,2,163,3,14,255,215,2,163,3,16,255,215,2,163,3,21,255,215,2,163,3,24,255,215,2,164,1,207,255,236,2,164,1,216,255,236,2,164,1,219,255,236,2,164,1,222,255,236,2,164,1,225,255,236,2,164,1,234,255,236,2,164,1,237,255,236,2,164,2,106,255,236,2,164,2,127,255,236,2,164,2,133,255,236,2,164,2,135,255,236,2,164,2,137,255,236,2,164,2,141,255,236,2,164,2,178,255,236,2,164,2,180,255,236,2,164,2,192,255,236,2,164,2,194,255,236,2,164,2,213,255,236,2,164,2,224,255,236,2,164,2,240,255,236,2,164,2,242,255,236,2,164,2,244,255,236,2,164,2,254,255,236,2,164,3,10,255,236,2,164,3,12,255,236,2,164,3,14,255,215,2,164,3,16,255,215,2,164,3,22,255,236,2,164,3,26,255,236,2,165,1,159,255,215,2,165,1,184,255,215,2,165,1,187,255,215,2,165,1,190,255,215,2,165,1,193,255,215,2,165,1,225,255,215,2,165,2,108,255,215,2,165,2,124,255,215,2,165,2,126,255,215,2,165,2,132,255,215,2,165,2,134,255,215,2,165,2,136,255,215,2,165,2,138,255,215,2,165,2,140,255,215,2,165,2,177,255,215,2,165,2,179,255,215,2,165,2,191,255,215,2,165,2,192,255,215,2,165,2,193,255,215,2,165,2,194,255,215,2,165,2,197,255,154,2,165,2,199,255,154,2,165,2,212,255,215,2,165,2,213,255,215,2,165,2,239,255,215,2,165,2,241,255,215,2,165,2,243,255,215,2,165,2,253,255,215,2,165,2,254,255,215,2,165,3,9,255,215,2,165,3,11,255,215,2,165,3,14,255,215,2,165,3,16,255,215,2,165,3,21,255,215,2,165,3,25,255,236,2,166,1,207,255,215,2,166,1,216,255,215,2,166,1,219,255,215,2,166,1,222,255,215,2,166,1,225,255,215,2,166,1,234,255,215,2,166,1,237,255,215,2,166,2,106,255,215,2,166,2,127,255,215,2,166,2,133,255,215,2,166,2,135,255,215,2,166,2,137,255,215,2,166,2,141,255,215,2,166,2,178,255,215,2,166,2,180,255,215,2,166,2,192,255,215,2,166,2,194,255,215,2,166,2,198,255,215,2,166,2,200,255,215,2,166,2,213,255,215,2,166,2,224,255,215,2,166,2,240,255,215,2,166,2,242,255,215,2,166,2,244,255,215,2,166,2,254,255,215,2,166,3,10,255,215,2,166,3,12,255,215,2,166,3,22,255,215,2,166,3,26,255,215,2,167,1,159,255,215,2,167,1,184,255,215,2,167,1,187,255,215,2,167,1,190,255,215,2,167,1,193,255,215,2,167,1,225,255,215,2,167,2,108,255,215,2,167,2,124,255,215,2,167,2,126,255,215,2,167,2,132,255,215,2,167,2,134,255,215,2,167,2,136,255,215,2,167,2,138,255,215,2,167,2,140,255,215,2,167,2,177,255,215,2,167,2,179,255,215,2,167,2,191,255,215,2,167,2,192,255,215,2,167,2,193,255,215,2,167,2,194,255,215,2,167,2,197,255,154,2,167,2,199,255,154,2,167,2,212,255,215,2,167,2,213,255,215,2,167,2,239,255,215,2,167,2,241,255,215,2,167,2,243,255,215,2,167,2,253,255,215,2,167,2,254,255,215,2,167,3,9,255,215,2,167,3,11,255,215,2,167,3,14,255,215,2,167,3,16,255,215,2,167,3,21,255,215,2,167,3,25,255,236,2,168,1,207,255,215,2,168,1,216,255,215,2,168,1,219,255,215,2,168,1,222,255,215,2,168,1,225,255,215,2,168,1,234,255,215,2,168,1,237,255,215,2,168,2,106,255,215,2,168,2,127,255,215,2,168,2,133,255,215,2,168,2,135,255,215,2,168,2,137,255,215,2,168,2,141,255,215,2,168,2,178,255,215,2,168,2,180,255,215,2,168,2,192,255,215,2,168,2,194,255,215,2,168,2,198,255,215,2,168,2,200,255,215,2,168,2,213,255,215,2,168,2,224,255,215,2,168,2,240,255,215,2,168,2,242,255,215,2,168,2,244,255,215,2,168,2,254,255,215,2,168,3,10,255,215,2,168,3,12,255,215,2,168,3,22,255,215,2,168,3,26,255,215,2,169,1,159,255,215,2,169,1,184,255,215,2,169,1,187,255,215,2,169,1,190,255,215,2,169,1,193,255,215,2,169,1,225,255,215,2,169,2,108,255,215,2,169,2,124,255,215,2,169,2,126,255,215,2,169,2,132,255,215,2,169,2,134,255,215,2,169,2,136,255,215,2,169,2,138,255,215,2,169,2,140,255,215,2,169,2,177,255,215,2,169,2,179,255,215,2,169,2,191,255,215,2,169,2,192,255,215,2,169,2,193,255,215,2,169,2,194,255,215,2,169,2,197,255,154,2,169,2,199,255,154,2,169,2,212,255,215,2,169,2,213,255,215,2,169,2,239,255,215,2,169,2,241,255,215,2,169,2,243,255,215,2,169,2,253,255,215,2,169,2,254,255,215,2,169,3,9,255,215,2,169,3,11,255,215,2,169,3,14,255,215,2,169,3,16,255,215,2,169,3,21,255,215,2,169,3,25,255,236,2,170,1,207,255,215,2,170,1,216,255,215,2,170,1,219,255,215,2,170,1,222,255,215,2,170,1,225,255,215,2,170,1,234,255,215,2,170,1,237,255,215,2,170,2,106,255,215,2,170,2,127,255,215,2,170,2,133,255,215,2,170,2,135,255,215,2,170,2,137,255,215,2,170,2,141,255,215,2,170,2,178,255,215,2,170,2,180,255,215,2,170,2,192,255,215,2,170,2,194,255,215,2,170,2,198,255,215,2,170,2,200,255,215,2,170,2,213,255,215,2,170,2,224,255,215,2,170,2,240,255,215,2,170,2,242,255,215,2,170,2,244,255,215,2,170,2,254,255,215,2,170,3,10,255,215,2,170,3,12,255,215,2,170,3,22,255,215,2,170,3,26,255,215,2,171,1,163,0,225,2,171,2,234,0,41,2,171,3,14,255,215,2,171,3,16,255,215,2,172,0,5,255,236,2,172,0,10,255,236,2,172,2,7,255,236,2,172,2,11,255,236,2,173,0,15,255,154,2,173,0,16,255,215,2,173,0,17,255,154,2,173,1,157,0,41,2,173,1,159,255,215,2,173,1,164,255,174,2,173,1,166,0,41,2,173,1,170,255,133,2,173,1,174,255,174,2,173,1,181,255,174,2,173,1,184,255,215,2,173,1,187,255,215,2,173,1,188,0,41,2,173,1,190,255,195,2,173,1,196,0,41,2,173,1,204,255,195,2,173,1,205,255,195,2,173,1,206,255,154,2,173,1,207,255,174,2,173,1,208,255,215,2,173,1,209,255,215,2,173,1,210,255,195,2,173,1,211,255,195,2,173,1,212,255,195,2,173,1,213,255,154,2,173,1,214,255,195,2,173,1,215,255,195,2,173,1,216,255,174,2,173,1,217,255,195,2,173,1,218,255,195,2,173,1,219,255,174,2,173,1,222,255,174,2,173,1,223,255,215,2,173,1,224,255,195,2,173,1,225,255,154,2,173,1,226,255,195,2,173,1,227,255,195,2,173,1,229,255,195,2,173,1,230,255,195,2,173,1,231,255,215,2,173,1,232,255,195,2,173,1,234,255,174,2,173,1,235,0,41,2,173,1,236,255,195,2,173,1,237,255,174,2,173,1,238,255,195,2,173,1,242,255,154,2,173,1,243,255,195,2,173,1,244,0,41,2,173,1,245,255,195,2,173,1,247,255,195,2,173,1,249,255,195,2,173,2,2,255,215,2,173,2,3,255,215,2,173,2,4,255,215,2,173,2,8,255,154,2,173,2,12,255,154,2,173,2,106,255,174,2,173,2,107,255,195,2,173,2,108,255,215,2,173,2,113,255,195,2,173,2,114,255,133,2,173,2,115,255,154,2,173,2,117,255,195,2,173,2,119,255,215,2,173,2,121,255,195,2,173,2,125,255,195,2,173,2,126,255,215,2,173,2,127,255,174,2,173,2,132,255,215,2,173,2,133,255,174,2,173,2,134,255,215,2,173,2,135,255,174,2,173,2,136,255,215,2,173,2,137,255,174,2,173,2,138,255,215,2,173,2,140,255,215,2,173,2,141,255,174,2,173,2,150,255,195,2,173,2,152,0,41,2,173,2,154,255,195,2,173,2,158,255,195,2,173,2,160,255,215,2,173,2,162,255,215,2,173,2,164,255,195,2,173,2,166,255,195,2,173,2,168,0,41,2,173,2,169,0,41,2,173,2,172,255,195,2,173,2,174,255,195,2,173,2,176,255,195,2,173,2,177,255,215,2,173,2,178,255,174,2,173,2,179,255,215,2,173,2,180,255,174,2,173,2,181,0,41,2,173,2,188,255,215,2,173,2,189,0,41,2,173,2,192,255,154,2,173,2,194,255,154,2,173,2,196,255,195,2,173,2,197,255,215,2,173,2,198,255,195,2,173,2,199,255,215,2,173,2,200,255,195,2,173,2,203,255,215,2,173,2,205,255,195,2,173,2,206,255,174,2,173,2,207,255,154,2,173,2,209,255,195,2,173,2,211,255,195,2,173,2,213,255,154,2,173,2,215,255,195,2,173,2,217,255,133,2,173,2,219,255,133,2,173,2,221,255,133,2,173,2,224,255,174,2,173,2,230,255,215,2,173,2,232,255,215,2,173,2,236,255,195,2,173,2,238,255,195,2,173,2,239,255,215,2,173,2,240,255,174,2,173,2,241,255,215,2,173,2,242,255,174,2,173,2,243,255,215,2,173,2,244,255,174,2,173,2,246,255,215,2,173,2,254,255,154,2,173,3,0,255,195,2,173,3,2,255,195,2,173,3,6,255,215,2,173,3,8,255,215,2,173,3,9,255,154,2,173,3,10,255,174,2,173,3,11,255,154,2,173,3,12,255,174,2,173,3,14,255,215,2,173,3,16,255,215,2,173,3,17,255,174,2,173,3,18,255,154,2,173,3,20,255,195,2,173,3,21,255,215,2,173,3,22,255,174,2,173,3,23,0,41,2,173,3,26,255,174,2,173,3,27,255,174,2,173,3,28,255,154,2,174,0,15,255,154,2,174,0,16,255,215,2,174,0,17,255,154,2,174,1,206,255,195,2,174,1,207,255,236,2,174,1,213,255,195,2,174,1,216,255,236,2,174,1,219,255,236,2,174,1,222,255,236,2,174,1,234,255,236,2,174,1,237,255,236,2,174,1,242,255,195,2,174,2,2,255,215,2,174,2,3,255,215,2,174,2,4,255,215,2,174,2,8,255,154,2,174,2,12,255,154,2,174,2,106,255,236,2,174,2,115,255,195,2,174,2,127,255,236,2,174,2,133,255,236,2,174,2,135,255,236,2,174,2,137,255,236,2,174,2,141,255,236,2,174,2,178,255,236,2,174,2,180,255,236,2,174,2,207,255,195,2,174,2,224,255,236,2,174,2,240,255,236,2,174,2,242,255,236,2,174,2,244,255,236,2,174,3,10,255,236,2,174,3,12,255,236,2,174,3,18,255,195,2,174,3,22,255,236,2,174,3,26,255,236,2,174,3,28,255,195,2,175,0,5,255,92,2,175,0,10,255,92,2,175,1,157,255,154,2,175,1,163,0,102,2,175,1,166,255,154,2,175,1,188,255,72,2,175,1,193,255,133,2,175,1,196,255,154,2,175,1,220,255,174,2,175,1,225,255,215,2,175,1,228,255,174,2,175,2,7,255,92,2,175,2,11,255,92,2,175,2,124,255,133,2,175,2,128,255,113,2,175,2,130,255,113,2,175,2,169,255,154,2,175,2,170,255,174,2,175,2,181,255,72,2,175,2,182,255,174,2,175,2,183,255,154,2,175,2,185,255,154,2,175,2,189,255,154,2,175,2,190,255,174,2,175,2,191,255,133,2,175,2,192,255,215,2,175,2,193,255,133,2,175,2,194,255,215,2,175,2,197,255,195,2,175,2,198,255,215,2,175,2,199,255,195,2,175,2,200,255,215,2,175,2,212,255,133,2,175,2,213,255,215,2,175,2,253,255,133,2,175,2,254,255,215,2,175,3,13,255,72,2,175,3,14,255,174,2,175,3,15,255,72,2,175,3,16,255,174,2,175,3,23,255,154,2,175,3,24,255,174,2,176,0,5,255,113,2,176,0,10,255,113,2,176,1,220,255,154,2,176,1,225,255,215,2,176,1,228,255,154,2,176,2,7,255,113,2,176,2,11,255,113,2,176,2,109,255,215,2,176,2,129,255,215,2,176,2,131,255,215,2,176,2,139,255,215,2,176,2,170,255,154,2,176,2,182,255,154,2,176,2,184,255,215,2,176,2,186,255,215,2,176,2,190,255,154,2,176,2,192,255,215,2,176,2,194,255,215,2,176,2,198,255,215,2,176,2,200,255,215,2,176,2,213,255,215,2,176,2,254,255,215,2,176,3,14,255,113,2,176,3,16,255,113,2,176,3,24,255,154,2,177,1,157,255,215,2,177,1,166,255,215,2,177,1,188,255,195,2,177,1,196,255,215,2,177,2,128,255,236,2,177,2,130,255,236,2,177,2,169,255,215,2,177,2,181,255,195,2,177,2,183,255,236,2,177,2,185,255,236,2,177,2,189,255,215,2,177,3,13,255,215,2,177,3,15,255,215,2,177,3,23,255,215,2,178,0,5,255,236,2,178,0,10,255,236,2,178,1,208,255,215,2,178,1,220,255,236,2,178,1,221,255,236,2,178,1,223,255,215,2,178,1,225,255,236,2,178,1,228,255,236,2,178,1,246,255,236,2,178,2,7,255,236,2,178,2,11,255,236,2,178,2,160,255,215,2,178,2,170,255,236,2,178,2,182,255,236,2,178,2,188,255,215,2,178,2,190,255,236,2,178,2,192,255,236,2,178,2,194,255,236,2,178,2,203,255,215,2,178,2,213,255,236,2,178,2,230,255,215,2,178,2,248,255,236,2,178,2,250,255,236,2,178,2,252,255,236,2,178,2,254,255,236,2,178,3,6,255,215,2,178,3,8,255,215,2,178,3,14,255,236,2,178,3,16,255,236,2,178,3,24,255,236,2,179,1,159,255,215,2,179,1,184,255,215,2,179,1,187,255,215,2,179,1,190,255,215,2,179,1,225,255,215,2,179,2,108,255,215,2,179,2,126,255,215,2,179,2,132,255,215,2,179,2,134,255,215,2,179,2,136,255,215,2,179,2,138,255,215,2,179,2,140,255,215,2,179,2,177,255,215,2,179,2,179,255,215,2,179,2,192,255,215,2,179,2,194,255,215,2,179,2,197,255,215,2,179,2,199,255,215,2,179,2,213,255,215,2,179,2,239,255,215,2,179,2,241,255,215,2,179,2,243,255,215,2,179,2,254,255,215,2,179,3,9,255,215,2,179,3,11,255,215,2,179,3,14,255,215,2,179,3,16,255,215,2,179,3,21,255,215,2,181,0,15,255,133,2,181,0,16,255,174,2,181,0,17,255,133,2,181,1,159,255,215,2,181,1,164,255,154,2,181,1,170,255,113,2,181,1,174,255,154,2,181,1,181,255,154,2,181,1,184,255,215,2,181,1,187,255,215,2,181,1,188,0,41,2,181,1,190,255,174,2,181,1,204,255,154,2,181,1,205,255,154,2,181,1,206,255,133,2,181,1,207,255,113,2,181,1,208,255,215,2,181,1,209,255,215,2,181,1,210,255,154,2,181,1,211,255,154,2,181,1,212,255,154,2,181,1,213,255,133,2,181,1,214,255,154,2,181,1,215,255,154,2,181,1,216,255,113,2,181,1,217,255,154,2,181,1,218,255,154,2,181,1,219,255,113,2,181,1,220,255,174,2,181,1,221,255,174,2,181,1,222,255,113,2,181,1,223,255,215,2,181,1,224,255,154,2,181,1,225,255,154,2,181,1,226,255,154,2,181,1,227,255,154,2,181,1,228,255,174,2,181,1,229,255,154,2,181,1,230,255,154,2,181,1,231,255,215,2,181,1,232,255,154,2,181,1,233,255,195,2,181,1,234,255,113,2,181,1,236,255,154,2,181,1,237,255,113,2,181,1,238,255,133,2,181,1,242,255,133,2,181,1,243,255,154,2,181,1,245,255,154,2,181,1,246,255,174,2,181,1,247,255,154,2,181,1,249,255,154,2,181,2,2,255,174,2,181,2,3,255,174,2,181,2,4,255,174,2,181,2,8,255,133,2,181,2,12,255,133,2,181,2,106,255,113,2,181,2,107,255,154,2,181,2,108,255,215,2,181,2,109,255,215,2,181,2,113,255,154,2,181,2,114,255,113,2,181,2,115,255,133,2,181,2,117,255,154,2,181,2,119,255,154,2,181,2,121,255,154,2,181,2,125,255,154,2,181,2,126,255,215,2,181,2,127,255,113,2,181,2,129,255,215,2,181,2,131,255,215,2,181,2,132,255,215,2,181,2,133,255,113,2,181,2,134,255,215,2,181,2,135,255,113,2,181,2,136,255,215,2,181,2,137,255,113,2,181,2,138,255,215,2,181,2,139,255,215,2,181,2,140,255,215,2,181,2,141,255,113,2,181,2,150,255,154,2,181,2,154,255,154,2,181,2,158,255,154,2,181,2,160,255,215,2,181,2,162,255,215,2,181,2,164,255,154,2,181,2,166,255,154,2,181,2,170,255,174,2,181,2,172,255,154,2,181,2,174,255,154,2,181,2,176,255,154,2,181,2,177,255,215,2,181,2,178,255,113,2,181,2,179,255,215,2,181,2,180,255,113,2,181,2,181,0,41,2,181,2,182,255,174,2,181,2,184,255,174,2,181,2,186,255,174,2,181,2,188,255,215,2,181,2,190,255,174,2,181,2,192,255,154,2,181,2,194,255,154,2,181,2,196,255,154,2,181,2,197,255,154,2,181,2,198,255,113,2,181,2,199,255,154,2,181,2,200,255,113,2,181,2,203,255,215,2,181,2,205,255,154,2,181,2,206,255,154,2,181,2,207,255,133,2,181,2,209,255,154,2,181,2,211,255,154,2,181,2,213,255,154,2,181,2,215,255,154,2,181,2,217,255,113,2,181,2,219,255,113,2,181,2,221,255,113,2,181,2,224,255,113,2,181,2,230,255,215,2,181,2,232,255,215,2,181,2,234,255,195,2,181,2,236,255,154,2,181,2,238,255,154,2,181,2,239,255,215,2,181,2,240,255,113,2,181,2,241,255,215,2,181,2,242,255,113,2,181,2,243,255,215,2,181,2,244,255,113,2,181,2,246,255,215,2,181,2,248,255,174,2,181,2,250,255,174,2,181,2,252,255,174,2,181,2,254,255,154,2,181,3,0,255,154,2,181,3,2,255,154,2,181,3,6,255,215,2,181,3,8,255,215,2,181,3,9,255,113,2,181,3,10,255,113,2,181,3,11,255,113,2,181,3,12,255,113,2,181,3,14,255,154,2,181,3,16,255,154,2,181,3,17,255,154,2,181,3,18,255,133,2,181,3,20,255,154,2,181,3,21,255,215,2,181,3,22,255,113,2,181,3,24,255,174,2,181,3,26,255,113,2,181,3,27,255,154,2,181,3,28,255,133,2,182,0,15,255,154,2,182,0,16,255,215,2,182,0,17,255,154,2,182,1,206,255,195,2,182,1,207,255,236,2,182,1,213,255,195,2,182,1,216,255,236,2,182,1,219,255,236,2,182,1,222,255,236,2,182,1,234,255,236,2,182,1,237,255,236,2,182,1,242,255,195,2,182,2,2,255,215,2,182,2,3,255,215,2,182,2,4,255,215,2,182,2,8,255,154,2,182,2,12,255,154,2,182,2,106,255,236,2,182,2,115,255,195,2,182,2,127,255,236,2,182,2,133,255,236,2,182,2,135,255,236,2,182,2,137,255,236,2,182,2,141,255,236,2,182,2,178,255,236,2,182,2,180,255,236,2,182,2,207,255,195,2,182,2,224,255,236,2,182,2,240,255,236,2,182,2,242,255,236,2,182,2,244,255,236,2,182,3,10,255,236,2,182,3,12,255,236,2,182,3,18,255,195,2,182,3,22,255,236,2,182,3,26,255,236,2,182,3,28,255,195,2,183,0,15,255,133,2,183,0,17,255,133,2,183,1,159,255,215,2,183,1,164,255,174,2,183,1,170,255,133,2,183,1,174,255,174,2,183,1,181,255,174,2,183,1,184,255,215,2,183,1,187,255,215,2,183,1,190,255,195,2,183,1,202,255,174,2,183,1,204,255,195,2,183,1,205,255,195,2,183,1,206,255,154,2,183,1,207,255,154,2,183,1,210,255,195,2,183,1,211,255,195,2,183,1,212,255,195,2,183,1,213,255,154,2,183,1,214,255,195,2,183,1,215,255,195,2,183,1,216,255,154,2,183,1,217,255,195,2,183,1,218,255,195,2,183,1,219,255,154,2,183,1,222,255,154,2,183,1,224,255,195,2,183,1,225,255,174,2,183,1,226,255,195,2,183,1,227,255,195,2,183,1,229,255,195,2,183,1,230,255,195,2,183,1,232,255,195,2,183,1,233,255,215,2,183,1,234,255,154,2,183,1,235,0,41,2,183,1,236,255,195,2,183,1,237,255,154,2,183,1,238,255,174,2,183,1,242,255,154,2,183,1,243,255,195,2,183,1,244,0,41,2,183,1,245,255,195,2,183,1,247,255,195,2,183,1,249,255,195,2,183,2,8,255,133,2,183,2,12,255,133,2,183,2,106,255,154,2,183,2,107,255,195,2,183,2,108,255,215,2,183,2,113,255,195,2,183,2,114,255,133,2,183,2,115,255,154,2,183,2,117,255,195,2,183,2,119,255,215,2,183,2,121,255,195,2,183,2,125,255,215,2,183,2,126,255,215,2,183,2,127,255,154,2,183,2,132,255,215,2,183,2,133,255,154,2,183,2,134,255,215,2,183,2,135,255,154,2,183,2,136,255,215,2,183,2,137,255,154,2,183,2,138,255,215,2,183,2,140,255,215,2,183,2,141,255,154,2,183,2,150,255,195,2,183,2,152,0,41,2,183,2,154,255,195,2,183,2,158,255,195,2,183,2,164,255,195,2,183,2,166,255,195,2,183,2,168,0,41,2,183,2,172,255,195,2,183,2,174,255,195,2,183,2,176,255,195,2,183,2,177,255,215,2,183,2,178,255,154,2,183,2,179,255,215,2,183,2,180,255,154,2,183,2,192,255,174,2,183,2,194,255,174,2,183,2,196,255,195,2,183,2,198,255,174,2,183,2,200,255,174,2,183,2,205,255,195,2,183,2,206,255,174,2,183,2,207,255,154,2,183,2,209,255,195,2,183,2,211,255,195,2,183,2,213,255,174,2,183,2,215,255,195,2,183,2,217,255,133,2,183,2,218,255,174,2,183,2,219,255,133,2,183,2,220,255,174,2,183,2,221,255,133,2,183,2,222,255,174,2,183,2,224,255,154,2,183,2,225,255,236,2,183,2,226,255,174,2,183,2,227,255,236,2,183,2,228,255,174,2,183,2,236,255,195,2,183,2,238,255,195,2,183,2,239,255,215,2,183,2,240,255,154,2,183,2,241,255,215,2,183,2,242,255,154,2,183,2,243,255,215,2,183,2,244,255,154,2,183,2,254,255,174,2,183,3,0,255,195,2,183,3,2,255,195,2,183,3,9,255,174,2,183,3,10,255,154,2,183,3,11,255,174,2,183,3,12,255,154,2,183,3,14,255,215,2,183,3,16,255,215,2,183,3,17,255,174,2,183,3,18,255,154,2,183,3,20,255,195,2,183,3,21,255,215,2,183,3,22,255,154,2,183,3,25,255,236,2,183,3,26,255,154,2,183,3,27,255,174,2,183,3,28,255,154,2,184,0,15,255,174,2,184,0,17,255,174,2,184,1,206,255,236,2,184,1,213,255,236,2,184,1,242,255,236,2,184,2,8,255,174,2,184,2,12,255,174,2,184,2,115,255,236,2,184,2,207,255,236,2,184,3,18,255,236,2,184,3,28,255,236,2,185,0,15,255,133,2,185,0,17,255,133,2,185,1,159,255,215,2,185,1,164,255,174,2,185,1,170,255,133,2,185,1,174,255,174,2,185,1,181,255,174,2,185,1,184,255,215,2,185,1,187,255,215,2,185,1,190,255,195,2,185,1,202,255,174,2,185,1,204,255,195,2,185,1,205,255,195,2,185,1,206,255,154,2,185,1,207,255,154,2,185,1,210,255,195,2,185,1,211,255,195,2,185,1,212,255,195,2,185,1,213,255,154,2,185,1,214,255,195,2,185,1,215,255,195,2,185,1,216,255,154,2,185,1,217,255,195,2,185,1,218,255,195,2,185,1,219,255,154,2,185,1,222,255,154,2,185,1,224,255,195,2,185,1,225,255,174,2,185,1,226,255,195,2,185,1,227,255,195,2,185,1,229,255,195,2,185,1,230,255,195,2,185,1,232,255,195,2,185,1,233,255,215,2,185,1,234,255,154,2,185,1,235,0,41,2,185,1,236,255,195,2,185,1,237,255,154,2,185,1,238,255,174,2,185,1,242,255,154,2,185,1,243,255,195,2,185,1,244,0,41,2,185,1,245,255,195,2,185,1,247,255,195,2,185,1,249,255,195,2,185,2,8,255,133,2,185,2,12,255,133,2,185,2,106,255,154,2,185,2,107,255,195,2,185,2,108,255,215,2,185,2,113,255,195,2,185,2,114,255,133,2,185,2,115,255,154,2,185,2,117,255,195,2,185,2,119,255,215,2,185,2,121,255,195,2,185,2,125,255,215,2,185,2,126,255,215,2,185,2,127,255,154,2,185,2,132,255,215,2,185,2,133,255,154,2,185,2,134,255,215,2,185,2,135,255,154,2,185,2,136,255,215,2,185,2,137,255,154,2,185,2,138,255,215,2,185,2,140,255,215,2,185,2,141,255,154,2,185,2,150,255,195,2,185,2,152,0,41,2,185,2,154,255,195,2,185,2,158,255,195,2,185,2,164,255,195,2,185,2,166,255,195,2,185,2,168,0,41,2,185,2,172,255,195,2,185,2,174,255,195,2,185,2,176,255,195,2,185,2,177,255,215,2,185,2,178,255,154,2,185,2,179,255,215,2,185,2,180,255,154,2,185,2,192,255,174,2,185,2,194,255,174,2,185,2,196,255,195,2,185,2,198,255,174,2,185,2,200,255,174,2,185,2,205,255,195,2,185,2,206,255,174,2,185,2,207,255,154,2,185,2,209,255,195,2,185,2,211,255,195,2,185,2,213,255,174,2,185,2,215,255,195,2,185,2,217,255,133,2,185,2,218,255,174,2,185,2,219,255,133,2,185,2,220,255,174,2,185,2,221,255,133,2,185,2,222,255,174,2,185,2,224,255,154,2,185,2,225,255,236,2,185,2,226,255,174,2,185,2,227,255,236,2,185,2,228,255,174,2,185,2,236,255,195,2,185,2,238,255,195,2,185,2,239,255,215,2,185,2,240,255,154,2,185,2,241,255,215,2,185,2,242,255,154,2,185,2,243,255,215,2,185,2,244,255,154,2,185,2,254,255,174,2,185,3,0,255,195,2,185,3,2,255,195,2,185,3,9,255,174,2,185,3,10,255,154,2,185,3,11,255,174,2,185,3,12,255,154,2,185,3,14,255,215,2,185,3,16,255,215,2,185,3,17,255,174,2,185,3,18,255,154,2,185,3,20,255,195,2,185,3,21,255,215,2,185,3,22,255,154,2,185,3,25,255,236,2,185,3,26,255,154,2,185,3,27,255,174,2,185,3,28,255,154,2,186,0,15,255,174,2,186,0,17,255,174,2,186,1,206,255,236,2,186,1,213,255,236,2,186,1,242,255,236,2,186,2,8,255,174,2,186,2,12,255,174,2,186,2,115,255,236,2,186,2,207,255,236,2,186,3,18,255,236,2,186,3,28,255,236,2,187,1,159,255,215,2,187,1,163,0,225,2,187,1,184,255,215,2,187,1,187,255,215,2,187,1,190,255,195,2,187,1,220,255,215,2,187,1,225,255,174,2,187,1,228,255,215,2,187,2,108,255,215,2,187,2,123,0,61,2,187,2,125,255,236,2,187,2,126,255,215,2,187,2,132,255,215,2,187,2,134,255,215,2,187,2,136,255,215,2,187,2,138,255,215,2,187,2,140,255,215,2,187,2,170,255,215,2,187,2,177,255,215,2,187,2,179,255,215,2,187,2,182,255,215,2,187,2,190,255,215,2,187,2,192,255,174,2,187,2,194,255,174,2,187,2,197,255,195,2,187,2,198,255,215,2,187,2,199,255,195,2,187,2,200,255,215,2,187,2,213,255,174,2,187,2,239,255,215,2,187,2,241,255,215,2,187,2,243,255,215,2,187,2,254,255,174,2,187,3,14,255,215,2,187,3,16,255,215,2,187,3,21,255,215,2,187,3,24,255,215,2,188,1,207,255,236,2,188,1,216,255,236,2,188,1,219,255,236,2,188,1,222,255,236,2,188,1,225,255,236,2,188,1,234,255,236,2,188,1,237,255,236,2,188,2,106,255,236,2,188,2,127,255,236,2,188,2,133,255,236,2,188,2,135,255,236,2,188,2,137,255,236,2,188,2,141,255,236,2,188,2,178,255,236,2,188,2,180,255,236,2,188,2,192,255,236,2,188,2,194,255,236,2,188,2,213,255,236,2,188,2,224,255,236,2,188,2,240,255,236,2,188,2,242,255,236,2,188,2,244,255,236,2,188,2,254,255,236,2,188,3,10,255,236,2,188,3,12,255,236,2,188,3,14,255,215,2,188,3,16,255,215,2,188,3,22,255,236,2,188,3,26,255,236,2,189,1,163,0,225,2,189,2,234,0,41,2,189,3,14,255,215,2,189,3,16,255,215,2,190,0,5,255,236,2,190,0,10,255,236,2,190,2,7,255,236,2,190,2,11,255,236,2,191,1,163,0,225,2,191,2,234,0,41,2,191,3,14,255,215,2,191,3,16,255,215,2,192,0,5,255,236,2,192,0,10,255,236,2,192,2,7,255,236,2,192,2,11,255,236,2,195,0,5,255,195,2,195,0,10,255,195,2,195,1,157,255,215,2,195,1,166,255,215,2,195,1,188,255,133,2,195,1,193,255,174,2,195,1,196,255,215,2,195,1,220,255,215,2,195,1,221,255,236,2,195,1,225,255,236,2,195,1,228,255,215,2,195,1,246,255,236,2,195,2,7,255,195,2,195,2,11,255,195,2,195,2,124,255,174,2,195,2,128,255,195,2,195,2,130,255,195,2,195,2,169,255,215,2,195,2,170,255,215,2,195,2,181,255,133,2,195,2,182,255,215,2,195,2,183,255,154,2,195,2,185,255,154,2,195,2,189,255,215,2,195,2,190,255,215,2,195,2,191,255,174,2,195,2,192,255,236,2,195,2,193,255,174,2,195,2,194,255,236,2,195,2,212,255,174,2,195,2,213,255,236,2,195,2,248,255,236,2,195,2,250,255,236,2,195,2,252,255,236,2,195,2,253,255,174,2,195,2,254,255,236,2,195,3,13,255,174,2,195,3,14,255,215,2,195,3,15,255,174,2,195,3,16,255,215,2,195,3,23,255,215,2,195,3,24,255,215,2,196,0,5,255,154,2,196,0,10,255,154,2,196,1,220,255,215,2,196,1,221,255,215,2,196,1,228,255,215,2,196,1,246,255,215,2,196,2,7,255,154,2,196,2,11,255,154,2,196,2,170,255,215,2,196,2,182,255,215,2,196,2,184,255,215,2,196,2,186,255,215,2,196,2,190,255,215,2,196,2,248,255,215,2,196,2,250,255,215,2,196,2,252,255,215,2,196,3,14,255,174,2,196,3,16,255,174,2,196,3,24,255,215,2,197,1,188,255,215,2,197,2,128,255,236,2,197,2,130,255,236,2,197,2,181,255,215,2,197,2,183,255,236,2,197,2,185,255,236,2,197,3,13,255,236,2,197,3,15,255,236,2,198,0,5,255,236,2,198,0,10,255,236,2,198,2,7,255,236,2,198,2,11,255,236,2,199,1,188,255,215,2,199,2,128,255,236,2,199,2,130,255,236,2,199,2,181,255,215,2,199,2,183,255,236,2,199,2,185,255,236,2,199,3,13,255,236,2,199,3,15,255,236,2,200,0,5,255,236,2,200,0,10,255,236,2,200,2,7,255,236,2,200,2,11,255,236,2,202,1,159,255,215,2,202,1,184,255,215,2,202,1,187,255,215,2,202,1,190,255,215,2,202,1,193,255,215,2,202,1,225,255,215,2,202,2,108,255,215,2,202,2,124,255,215,2,202,2,126,255,215,2,202,2,132,255,215,2,202,2,134,255,215,2,202,2,136,255,215,2,202,2,138,255,215,2,202,2,140,255,215,2,202,2,177,255,215,2,202,2,179,255,215,2,202,2,191,255,215,2,202,2,192,255,215,2,202,2,193,255,215,2,202,2,194,255,215,2,202,2,197,255,154,2,202,2,199,255,154,2,202,2,212,255,215,2,202,2,213,255,215,2,202,2,239,255,215,2,202,2,241,255,215,2,202,2,243,255,215,2,202,2,253,255,215,2,202,2,254,255,215,2,202,3,9,255,215,2,202,3,11,255,215,2,202,3,14,255,215,2,202,3,16,255,215,2,202,3,21,255,215,2,202,3,25,255,236,2,203,1,207,255,215,2,203,1,216,255,215,2,203,1,219,255,215,2,203,1,222,255,215,2,203,1,225,255,215,2,203,1,234,255,215,2,203,1,237,255,215,2,203,2,106,255,215,2,203,2,127,255,215,2,203,2,133,255,215,2,203,2,135,255,215,2,203,2,137,255,215,2,203,2,141,255,215,2,203,2,178,255,215,2,203,2,180,255,215,2,203,2,192,255,215,2,203,2,194,255,215,2,203,2,198,255,215,2,203,2,200,255,215,2,203,2,213,255,215,2,203,2,224,255,215,2,203,2,240,255,215,2,203,2,242,255,215,2,203,2,244,255,215,2,203,2,254,255,215,2,203,3,10,255,215,2,203,3,12,255,215,2,203,3,22,255,215,2,203,3,26,255,215,2,204,0,5,255,195,2,204,0,10,255,195,2,204,1,163,0,102,2,204,1,188,255,215,2,204,1,190,255,215,2,204,1,193,255,174,2,204,1,220,255,195,2,204,1,225,255,215,2,204,1,228,255,195,2,204,2,7,255,195,2,204,2,11,255,195,2,204,2,109,255,236,2,204,2,124,255,174,2,204,2,128,255,215,2,204,2,129,255,236,2,204,2,130,255,215,2,204,2,131,255,236,2,204,2,139,255,236,2,204,2,170,255,195,2,204,2,181,255,215,2,204,2,182,255,195,2,204,2,183,255,215,2,204,2,184,255,236,2,204,2,185,255,215,2,204,2,186,255,236,2,204,2,190,255,195,2,204,2,191,255,174,2,204,2,192,255,215,2,204,2,193,255,174,2,204,2,194,255,215,2,204,2,197,255,195,2,204,2,198,255,215,2,204,2,199,255,195,2,204,2,200,255,215,2,204,2,212,255,174,2,204,2,213,255,215,2,204,2,253,255,174,2,204,2,254,255,215,2,204,3,13,255,215,2,204,3,14,255,195,2,204,3,15,255,215,2,204,3,16,255,195,2,204,3,24,255,195,2,205,1,225,255,215,2,205,2,192,255,215,2,205,2,194,255,215,2,205,2,213,255,215,2,205,2,254,255,215,2,206,1,163,0,225,2,206,2,234,0,41,2,206,3,14,255,215,2,206,3,16,255,215,2,207,0,5,255,236,2,207,0,10,255,236,2,207,2,7,255,236,2,207,2,11,255,236,2,210,1,163,0,225,2,210,2,234,0,41,2,210,3,14,255,215,2,210,3,16,255,215,2,211,0,5,255,236,2,211,0,10,255,236,2,211,2,7,255,236,2,211,2,11,255,236,2,214,1,163,0,225,2,214,2,234,0,41,2,214,3,14,255,215,2,214,3,16,255,215,2,215,0,5,255,236,2,215,0,10,255,236,2,215,2,7,255,236,2,215,2,11,255,236,2,217,0,5,255,113,2,217,0,10,255,113,2,217,1,157,255,154,2,217,1,166,255,154,2,217,1,188,255,113,2,217,1,190,255,215,2,217,1,193,255,154,2,217,1,196,255,154,2,217,1,220,255,215,2,217,1,225,255,215,2,217,1,228,255,215,2,217,2,7,255,113,2,217,2,11,255,113,2,217,2,110,255,215,2,217,2,124,255,154,2,217,2,128,255,174,2,217,2,130,255,174,2,217,2,151,255,215,2,217,2,155,255,215,2,217,2,167,255,215,2,217,2,169,255,154,2,217,2,170,255,215,2,217,2,181,255,113,2,217,2,182,255,215,2,217,2,183,255,133,2,217,2,185,255,133,2,217,2,189,255,154,2,217,2,190,255,215,2,217,2,191,255,154,2,217,2,192,255,215,2,217,2,193,255,154,2,217,2,194,255,215,2,217,2,197,255,154,2,217,2,199,255,154,2,217,2,212,255,154,2,217,2,213,255,215,2,217,2,225,255,215,2,217,2,227,255,215,2,217,2,253,255,154,2,217,2,254,255,215,2,217,3,3,255,215,2,217,3,13,255,113,2,217,3,14,255,215,2,217,3,15,255,113,2,217,3,16,255,215,2,217,3,23,255,154,2,217,3,24,255,215,2,218,0,5,255,236,2,218,0,10,255,236,2,218,2,7,255,236,2,218,2,11,255,236,2,219,0,5,255,113,2,219,0,10,255,113,2,219,1,157,255,154,2,219,1,166,255,154,2,219,1,188,255,113,2,219,1,190,255,215,2,219,1,193,255,154,2,219,1,196,255,154,2,219,1,220,255,215,2,219,1,225,255,215,2,219,1,228,255,215,2,219,2,7,255,113,2,219,2,11,255,113,2,219,2,110,255,215,2,219,2,124,255,154,2,219,2,128,255,174,2,219,2,130,255,174,2,219,2,151,255,215,2,219,2,155,255,215,2,219,2,167,255,215,2,219,2,169,255,154,2,219,2,170,255,215,2,219,2,181,255,113,2,219,2,182,255,215,2,219,2,183,255,133,2,219,2,185,255,133,2,219,2,189,255,154,2,219,2,190,255,215,2,219,2,191,255,154,2,219,2,192,255,215,2,219,2,193,255,154,2,219,2,194,255,215,2,219,2,197,255,154,2,219,2,199,255,154,2,219,2,212,255,154,2,219,2,213,255,215,2,219,2,225,255,215,2,219,2,227,255,215,2,219,2,253,255,154,2,219,2,254,255,215,2,219,3,3,255,215,2,219,3,13,255,113,2,219,3,14,255,215,2,219,3,15,255,113,2,219,3,16,255,215,2,219,3,23,255,154,2,219,3,24,255,215,2,220,0,5,255,236,2,220,0,10,255,236,2,220,2,7,255,236,2,220,2,11,255,236,2,222,0,5,255,236,2,222,0,10,255,236,2,222,2,7,255,236,2,222,2,11,255,236,2,224,0,5,255,236,2,224,0,10,255,236,2,224,2,7,255,236,2,224,2,11,255,236,2,225,0,15,255,174,2,225,0,17,255,174,2,225,1,157,255,236,2,225,1,164,255,215,2,225,1,166,255,236,2,225,1,168,255,215,2,225,1,170,255,215,2,225,1,174,255,215,2,225,1,176,255,215,2,225,1,177,255,236,2,225,1,181,255,215,2,225,1,188,255,195,2,225,1,189,255,215,2,225,1,191,255,215,2,225,1,193,255,215,2,225,1,196,255,236,2,225,1,199,255,236,2,225,1,206,255,236,2,225,1,213,255,236,2,225,1,242,255,236,2,225,2,8,255,174,2,225,2,12,255,174,2,225,2,114,255,215,2,225,2,115,255,236,2,225,2,122,255,236,2,225,2,124,255,215,2,225,2,128,255,236,2,225,2,130,255,236,2,225,2,159,255,215,2,225,2,161,255,236,2,225,2,169,255,236,2,225,2,181,255,195,2,225,2,183,255,236,2,225,2,185,255,236,2,225,2,187,255,215,2,225,2,189,255,236,2,225,2,191,255,215,2,225,2,193,255,215,2,225,2,202,255,215,2,225,2,206,255,215,2,225,2,207,255,236,2,225,2,212,255,215,2,225,2,217,255,215,2,225,2,219,255,215,2,225,2,221,255,215,2,225,2,229,255,215,2,225,2,231,255,236,2,225,2,245,255,236,2,225,2,247,255,215,2,225,2,249,255,215,2,225,2,251,255,215,2,225,2,253,255,215,2,225,3,5,255,215,2,225,3,7,255,215,2,225,3,13,255,215,2,225,3,15,255,215,2,225,3,17,255,215,2,225,3,18,255,236,2,225,3,23,255,236,2,225,3,27,255,215,2,225,3,28,255,236,2,226,0,5,255,236,2,226,0,10,255,236,2,226,1,208,255,215,2,226,1,220,255,236,2,226,1,221,255,236,2,226,1,223,255,215,2,226,1,225,255,236,2,226,1,228,255,236,2,226,1,246,255,236,2,226,2,7,255,236,2,226,2,11,255,236,2,226,2,160,255,215,2,226,2,170,255,236,2,226,2,182,255,236,2,226,2,188,255,215,2,226,2,190,255,236,2,226,2,192,255,236,2,226,2,194,255,236,2,226,2,203,255,215,2,226,2,213,255,236,2,226,2,230,255,215,2,226,2,248,255,236,2,226,2,250,255,236,2,226,2,252,255,236,2,226,2,254,255,236,2,226,3,6,255,215,2,226,3,8,255,215,2,226,3,14,255,236,2,226,3,16,255,236,2,226,3,24,255,236,2,227,0,15,255,174,2,227,0,17,255,174,2,227,1,157,255,236,2,227,1,164,255,215,2,227,1,166,255,236,2,227,1,168,255,215,2,227,1,170,255,215,2,227,1,174,255,215,2,227,1,176,255,215,2,227,1,177,255,236,2,227,1,181,255,215,2,227,1,188,255,195,2,227,1,189,255,215,2,227,1,191,255,215,2,227,1,193,255,215,2,227,1,196,255,236,2,227,1,199,255,236,2,227,1,206,255,236,2,227,1,213,255,236,2,227,1,242,255,236,2,227,2,8,255,174,2,227,2,12,255,174,2,227,2,114,255,215,2,227,2,115,255,236,2,227,2,122,255,236,2,227,2,124,255,215,2,227,2,128,255,236,2,227,2,130,255,236,2,227,2,159,255,215,2,227,2,161,255,236,2,227,2,169,255,236,2,227,2,181,255,195,2,227,2,183,255,236,2,227,2,185,255,236,2,227,2,187,255,215,2,227,2,189,255,236,2,227,2,191,255,215,2,227,2,193,255,215,2,227,2,202,255,215,2,227,2,206,255,215,2,227,2,207,255,236,2,227,2,212,255,215,2,227,2,217,255,215,2,227,2,219,255,215,2,227,2,221,255,215,2,227,2,229,255,215,2,227,2,231,255,236,2,227,2,245,255,236,2,227,2,247,255,215,2,227,2,249,255,215,2,227,2,251,255,215,2,227,2,253,255,215,2,227,3,5,255,215,2,227,3,7,255,215,2,227,3,13,255,215,2,227,3,15,255,215,2,227,3,17,255,215,2,227,3,18,255,236,2,227,3,23,255,236,2,227,3,27,255,215,2,227,3,28,255,236,2,228,0,5,255,236,2,228,0,10,255,236,2,228,1,208,255,215,2,228,1,220,255,236,2,228,1,221,255,236,2,228,1,223,255,215,2,228,1,225,255,236,2,228,1,228,255,236,2,228,1,246,255,236,2,228,2,7,255,236,2,228,2,11,255,236,2,228,2,160,255,215,2,228,2,170,255,236,2,228,2,182,255,236,2,228,2,188,255,215,2,228,2,190,255,236,2,228,2,192,255,236,2,228,2,194,255,236,2,228,2,203,255,215,2,228,2,213,255,236,2,228,2,230,255,215,2,228,2,248,255,236,2,228,2,250,255,236,2,228,2,252,255,236,2,228,2,254,255,236,2,228,3,6,255,215,2,228,3,8,255,215,2,228,3,14,255,236,2,228,3,16,255,236,2,228,3,24,255,236,2,229,1,159,255,215,2,229,1,184,255,215,2,229,1,187,255,215,2,229,1,190,255,215,2,229,1,193,255,215,2,229,1,225,255,215,2,229,2,108,255,215,2,229,2,124,255,215,2,229,2,126,255,215,2,229,2,132,255,215,2,229,2,134,255,215,2,229,2,136,255,215,2,229,2,138,255,215,2,229,2,140,255,215,2,229,2,177,255,215,2,229,2,179,255,215,2,229,2,191,255,215,2,229,2,192,255,215,2,229,2,193,255,215,2,229,2,194,255,215,2,229,2,197,255,154,2,229,2,199,255,154,2,229,2,212,255,215,2,229,2,213,255,215,2,229,2,239,255,215,2,229,2,241,255,215,2,229,2,243,255,215,2,229,2,253,255,215,2,229,2,254,255,215,2,229,3,9,255,215,2,229,3,11,255,215,2,229,3,14,255,215,2,229,3,16,255,215,2,229,3,21,255,215,2,229,3,25,255,236,2,230,1,207,255,215,2,230,1,216,255,215,2,230,1,219,255,215,2,230,1,222,255,215,2,230,1,225,255,215,2,230,1,234,255,215,2,230,1,237,255,215,2,230,2,106,255,215,2,230,2,127,255,215,2,230,2,133,255,215,2,230,2,135,255,215,2,230,2,137,255,215,2,230,2,141,255,215,2,230,2,178,255,215,2,230,2,180,255,215,2,230,2,192,255,215,2,230,2,194,255,215,2,230,2,198,255,215,2,230,2,200,255,215,2,230,2,213,255,215,2,230,2,224,255,215,2,230,2,240,255,215,2,230,2,242,255,215,2,230,2,244,255,215,2,230,2,254,255,215,2,230,3,10,255,215,2,230,3,12,255,215,2,230,3,22,255,215,2,230,3,26,255,215,2,231,0,15,255,174,2,231,0,17,255,174,2,231,2,8,255,174,2,231,2,12,255,174,2,231,2,128,255,236,2,231,2,130,255,236,2,231,2,183,255,236,2,231,2,185,255,236,2,231,3,13,255,215,2,231,3,15,255,215,2,232,1,233,0,41,2,233,0,5,255,236,2,233,0,10,255,236,2,233,2,7,255,236,2,233,2,11,255,236,2,233,3,14,255,215,2,233,3,16,255,215,2,239,0,15,255,174,2,239,0,17,255,174,2,239,1,157,255,236,2,239,1,164,255,215,2,239,1,166,255,236,2,239,1,168,255,215,2,239,1,170,255,215,2,239,1,174,255,215,2,239,1,176,255,215,2,239,1,177,255,236,2,239,1,181,255,215,2,239,1,188,255,195,2,239,1,189,255,215,2,239,1,191,255,215,2,239,1,193,255,215,2,239,1,196,255,236,2,239,1,199,255,236,2,239,1,206,255,236,2,239,1,213,255,236,2,239,1,242,255,236,2,239,2,8,255,174,2,239,2,12,255,174,2,239,2,114,255,215,2,239,2,115,255,236,2,239,2,122,255,236,2,239,2,124,255,215,2,239,2,128,255,236,2,239,2,130,255,236,2,239,2,159,255,215,2,239,2,161,255,236,2,239,2,169,255,236,2,239,2,181,255,195,2,239,2,183,255,236,2,239,2,185,255,236,2,239,2,187,255,215,2,239,2,189,255,236,2,239,2,191,255,215,2,239,2,193,255,215,2,239,2,202,255,215,2,239,2,206,255,215,2,239,2,207,255,236,2,239,2,212,255,215,2,239,2,217,255,215,2,239,2,219,255,215,2,239,2,221,255,215,2,239,2,229,255,215,2,239,2,231,255,236,2,239,2,245,255,236,2,239,2,247,255,215,2,239,2,249,255,215,2,239,2,251,255,215,2,239,2,253,255,215,2,239,3,5,255,215,2,239,3,7,255,215,2,239,3,13,255,215,2,239,3,15,255,215,2,239,3,17,255,215,2,239,3,18,255,236,2,239,3,23,255,236,2,239,3,27,255,215,2,239,3,28,255,236,2,240,0,5,255,236,2,240,0,10,255,236,2,240,1,208,255,215,2,240,1,220,255,236,2,240,1,221,255,236,2,240,1,223,255,215,2,240,1,225,255,236,2,240,1,228,255,236,2,240,1,246,255,236,2,240,2,7,255,236,2,240,2,11,255,236,2,240,2,160,255,215,2,240,2,170,255,236,2,240,2,182,255,236,2,240,2,188,255,215,2,240,2,190,255,236,2,240,2,192,255,236,2,240,2,194,255,236,2,240,2,203,255,215,2,240,2,213,255,236,2,240,2,230,255,215,2,240,2,248,255,236,2,240,2,250,255,236,2,240,2,252,255,236,2,240,2,254,255,236,2,240,3,6,255,215,2,240,3,8,255,215,2,240,3,14,255,236,2,240,3,16,255,236,2,240,3,24,255,236,2,241,0,15,255,174,2,241,0,17,255,174,2,241,1,157,255,236,2,241,1,164,255,215,2,241,1,166,255,236,2,241,1,168,255,215,2,241,1,170,255,215,2,241,1,174,255,215,2,241,1,176,255,215,2,241,1,177,255,236,2,241,1,181,255,215,2,241,1,188,255,195,2,241,1,189,255,215,2,241,1,191,255,215,2,241,1,193,255,215,2,241,1,196,255,236,2,241,1,199,255,236,2,241,1,206,255,236,2,241,1,213,255,236,2,241,1,242,255,236,2,241,2,8,255,174,2,241,2,12,255,174,2,241,2,114,255,215,2,241,2,115,255,236,2,241,2,122,255,236,2,241,2,124,255,215,2,241,2,128,255,236,2,241,2,130,255,236,2,241,2,159,255,215,2,241,2,161,255,236,2,241,2,169,255,236,2,241,2,181,255,195,2,241,2,183,255,236,2,241,2,185,255,236,2,241,2,187,255,215,2,241,2,189,255,236,2,241,2,191,255,215,2,241,2,193,255,215,2,241,2,202,255,215,2,241,2,206,255,215,2,241,2,207,255,236,2,241,2,212,255,215,2,241,2,217,255,215,2,241,2,219,255,215,2,241,2,221,255,215,2,241,2,229,255,215,2,241,2,231,255,236,2,241,2,245,255,236,2,241,2,247,255,215,2,241,2,249,255,215,2,241,2,251,255,215,2,241,2,253,255,215,2,241,3,5,255,215,2,241,3,7,255,215,2,241,3,13,255,215,2,241,3,15,255,215,2,241,3,17,255,215,2,241,3,18,255,236,2,241,3,23,255,236,2,241,3,27,255,215,2,241,3,28,255,236,2,242,0,5,255,236,2,242,0,10,255,236,2,242,1,208,255,215,2,242,1,220,255,236,2,242,1,221,255,236,2,242,1,223,255,215,2,242,1,225,255,236,2,242,1,228,255,236,2,242,1,246,255,236,2,242,2,7,255,236,2,242,2,11,255,236,2,242,2,160,255,215,2,242,2,170,255,236,2,242,2,182,255,236,2,242,2,188,255,215,2,242,2,190,255,236,2,242,2,192,255,236,2,242,2,194,255,236,2,242,2,203,255,215,2,242,2,213,255,236,2,242,2,230,255,215,2,242,2,248,255,236,2,242,2,250,255,236,2,242,2,252,255,236,2,242,2,254,255,236,2,242,3,6,255,215,2,242,3,8,255,215,2,242,3,14,255,236,2,242,3,16,255,236,2,242,3,24,255,236,2,243,0,15,255,174,2,243,0,17,255,174,2,243,1,157,255,236,2,243,1,164,255,215,2,243,1,166,255,236,2,243,1,168,255,215,2,243,1,170,255,215,2,243,1,174,255,215,2,243,1,176,255,215,2,243,1,177,255,236,2,243,1,181,255,215,2,243,1,188,255,195,2,243,1,189,255,215,2,243,1,191,255,215,2,243,1,193,255,215,2,243,1,196,255,236,2,243,1,199,255,236,2,243,1,206,255,236,2,243,1,213,255,236,2,243,1,242,255,236,2,243,2,8,255,174,2,243,2,12,255,174,2,243,2,114,255,215,2,243,2,115,255,236,2,243,2,122,255,236,2,243,2,124,255,215,2,243,2,128,255,236,2,243,2,130,255,236,2,243,2,159,255,215,2,243,2,161,255,236,2,243,2,169,255,236,2,243,2,181,255,195,2,243,2,183,255,236,2,243,2,185,255,236,2,243,2,187,255,215,2,243,2,189,255,236,2,243,2,191,255,215,2,243,2,193,255,215,2,243,2,202,255,215,2,243,2,206,255,215,2,243,2,207,255,236,2,243,2,212,255,215,2,243,2,217,255,215,2,243,2,219,255,215,2,243,2,221,255,215,2,243,2,229,255,215,2,243,2,231,255,236,2,243,2,245,255,236,2,243,2,247,255,215,2,243,2,249,255,215,2,243,2,251,255,215,2,243,2,253,255,215,2,243,3,5,255,215,2,243,3,7,255,215,2,243,3,13,255,215,2,243,3,15,255,215,2,243,3,17,255,215,2,243,3,18,255,236,2,243,3,23,255,236,2,243,3,27,255,215,2,243,3,28,255,236,2,244,0,5,255,236,2,244,0,10,255,236,2,244,1,208,255,215,2,244,1,220,255,236,2,244,1,221,255,236,2,244,1,223,255,215,2,244,1,225,255,236,2,244,1,228,255,236,2,244,1,246,255,236,2,244,2,7,255,236,2,244,2,11,255,236,2,244,2,160,255,215,2,244,2,170,255,236,2,244,2,182,255,236,2,244,2,188,255,215,2,244,2,190,255,236,2,244,2,192,255,236,2,244,2,194,255,236,2,244,2,203,255,215,2,244,2,213,255,236,2,244,2,230,255,215,2,244,2,248,255,236,2,244,2,250,255,236,2,244,2,252,255,236,2,244,2,254,255,236,2,244,3,6,255,215,2,244,3,8,255,215,2,244,3,14,255,236,2,244,3,16,255,236,2,244,3,24,255,236,2,245,0,15,255,174,2,245,0,17,255,174,2,245,1,157,255,236,2,245,1,164,255,215,2,245,1,166,255,236,2,245,1,168,255,215,2,245,1,170,255,215,2,245,1,174,255,215,2,245,1,176,255,215,2,245,1,177,255,236,2,245,1,181,255,215,2,245,1,188,255,195,2,245,1,189,255,215,2,245,1,191,255,215,2,245,1,193,255,215,2,245,1,196,255,236,2,245,1,199,255,236,2,245,1,206,255,236,2,245,1,213,255,236,2,245,1,242,255,236,2,245,2,8,255,174,2,245,2,12,255,174,2,245,2,114,255,215,2,245,2,115,255,236,2,245,2,122,255,236,2,245,2,124,255,215,2,245,2,128,255,236,2,245,2,130,255,236,2,245,2,159,255,215,2,245,2,161,255,236,2,245,2,169,255,236,2,245,2,181,255,195,2,245,2,183,255,236,2,245,2,185,255,236,2,245,2,187,255,215,2,245,2,189,255,236,2,245,2,191,255,215,2,245,2,193,255,215,2,245,2,202,255,215,2,245,2,206,255,215,2,245,2,207,255,236,2,245,2,212,255,215,2,245,2,217,255,215,2,245,2,219,255,215,2,245,2,221,255,215,2,245,2,229,255,215,2,245,2,231,255,236,2,245,2,245,255,236,2,245,2,247,255,215,2,245,2,249,255,215,2,245,2,251,255,215,2,245,2,253,255,215,2,245,3,5,255,215,2,245,3,7,255,215,2,245,3,13,255,215,2,245,3,15,255,215,2,245,3,17,255,215,2,245,3,18,255,236,2,245,3,23,255,236,2,245,3,27,255,215,2,245,3,28,255,236,2,246,0,5,255,236,2,246,0,10,255,236,2,246,1,208,255,215,2,246,1,220,255,236,2,246,1,221,255,236,2,246,1,223,255,215,2,246,1,225,255,236,2,246,1,228,255,236,2,246,1,246,255,236,2,246,2,7,255,236,2,246,2,11,255,236,2,246,2,160,255,215,2,246,2,170,255,236,2,246,2,182,255,236,2,246,2,188,255,215,2,246,2,190,255,236,2,246,2,192,255,236,2,246,2,194,255,236,2,246,2,203,255,215,2,246,2,213,255,236,2,246,2,230,255,215,2,246,2,248,255,236,2,246,2,250,255,236,2,246,2,252,255,236,2,246,2,254,255,236,2,246,3,6,255,215,2,246,3,8,255,215,2,246,3,14,255,236,2,246,3,16,255,236,2,246,3,24,255,236,2,247,0,15,255,133,2,247,0,17,255,133,2,247,1,159,255,236,2,247,1,164,255,154,2,247,1,170,255,113,2,247,1,174,255,154,2,247,1,181,255,154,2,247,1,184,255,236,2,247,1,187,255,236,2,247,1,190,255,195,2,247,1,201,255,236,2,247,1,206,255,174,2,247,1,207,255,215,2,247,1,213,255,174,2,247,1,216,255,215,2,247,1,219,255,215,2,247,1,222,255,215,2,247,1,225,255,215,2,247,1,234,255,215,2,247,1,235,0,102,2,247,1,237,255,215,2,247,1,238,255,236,2,247,1,242,255,174,2,247,1,244,0,102,2,247,2,8,255,133,2,247,2,12,255,133,2,247,2,106,255,215,2,247,2,108,255,236,2,247,2,114,255,113,2,247,2,115,255,174,2,247,2,126,255,236,2,247,2,127,255,215,2,247,2,132,255,236,2,247,2,133,255,215,2,247,2,134,255,236,2,247,2,135,255,215,2,247,2,136,255,236,2,247,2,137,255,215,2,247,2,138,255,236,2,247,2,140,255,236,2,247,2,141,255,215,2,247,2,152,0,102,2,247,2,168,0,102,2,247,2,177,255,236,2,247,2,178,255,215,2,247,2,179,255,236,2,247,2,180,255,215,2,247,2,192,255,215,2,247,2,194,255,215,2,247,2,197,255,215,2,247,2,198,255,195,2,247,2,199,255,215,2,247,2,200,255,195,2,247,2,206,255,154,2,247,2,207,255,174,2,247,2,213,255,215,2,247,2,217,255,113,2,247,2,219,255,113,2,247,2,221,255,113,2,247,2,224,255,215,2,247,2,239,255,236,2,247,2,240,255,215,2,247,2,241,255,236,2,247,2,242,255,215,2,247,2,243,255,236,2,247,2,244,255,215,2,247,2,254,255,215,2,247,3,9,255,113,2,247,3,10,255,215,2,247,3,11,255,113,2,247,3,12,255,215,2,247,3,17,255,154,2,247,3,18,255,174,2,247,3,21,255,236,2,247,3,22,255,215,2,247,3,26,255,215,2,247,3,27,255,154,2,247,3,28,255,174,2,248,0,15,255,174,2,248,0,17,255,174,2,248,1,206,255,215,2,248,1,213,255,215,2,248,1,242,255,215,2,248,2,8,255,174,2,248,2,12,255,174,2,248,2,115,255,215,2,248,2,207,255,215,2,248,3,18,255,215,2,248,3,28,255,215,2,249,0,15,255,133,2,249,0,17,255,133,2,249,1,159,255,236,2,249,1,164,255,154,2,249,1,170,255,113,2,249,1,174,255,154,2,249,1,181,255,154,2,249,1,184,255,236,2,249,1,187,255,236,2,249,1,190,255,195,2,249,1,201,255,236,2,249,1,206,255,174,2,249,1,207,255,215,2,249,1,213,255,174,2,249,1,216,255,215,2,249,1,219,255,215,2,249,1,222,255,215,2,249,1,225,255,215,2,249,1,234,255,215,2,249,1,235,0,102,2,249,1,237,255,215,2,249,1,238,255,236,2,249,1,242,255,174,2,249,1,244,0,102,2,249,2,8,255,133,2,249,2,12,255,133,2,249,2,106,255,215,2,249,2,108,255,236,2,249,2,114,255,113,2,249,2,115,255,174,2,249,2,126,255,236,2,249,2,127,255,215,2,249,2,132,255,236,2,249,2,133,255,215,2,249,2,134,255,236,2,249,2,135,255,215,2,249,2,136,255,236,2,249,2,137,255,215,2,249,2,138,255,236,2,249,2,140,255,236,2,249,2,141,255,215,2,249,2,152,0,102,2,249,2,168,0,102,2,249,2,177,255,236,2,249,2,178,255,215,2,249,2,179,255,236,2,249,2,180,255,215,2,249,2,192,255,215,2,249,2,194,255,215,2,249,2,197,255,215,2,249,2,198,255,195,2,249,2,199,255,215,2,249,2,200,255,195,2,249,2,206,255,154,2,249,2,207,255,174,2,249,2,213,255,215,2,249,2,217,255,113,2,249,2,219,255,113,2,249,2,221,255,113,2,249,2,224,255,215,2,249,2,239,255,236,2,249,2,240,255,215,2,249,2,241,255,236,2,249,2,242,255,215,2,249,2,243,255,236,2,249,2,244,255,215,2,249,2,254,255,215,2,249,3,9,255,113,2,249,3,10,255,215,2,249,3,11,255,113,2,249,3,12,255,215,2,249,3,17,255,154,2,249,3,18,255,174,2,249,3,21,255,236,2,249,3,22,255,215,2,249,3,26,255,215,2,249,3,27,255,154,2,249,3,28,255,174,2,250,0,15,255,174,2,250,0,17,255,174,2,250,1,206,255,215,2,250,1,213,255,215,2,250,1,242,255,215,2,250,2,8,255,174,2,250,2,12,255,174,2,250,2,115,255,215,2,250,2,207,255,215,2,250,3,18,255,215,2,250,3,28,255,215,2,251,0,15,255,133,2,251,0,17,255,133,2,251,1,159,255,236,2,251,1,164,255,154,2,251,1,170,255,113,2,251,1,174,255,154,2,251,1,181,255,154,2,251,1,184,255,236,2,251,1,187,255,236,2,251,1,190,255,195,2,251,1,201,255,236,2,251,1,206,255,174,2,251,1,207,255,215,2,251,1,213,255,174,2,251,1,216,255,215,2,251,1,219,255,215,2,251,1,222,255,215,2,251,1,225,255,215,2,251,1,234,255,215,2,251,1,235,0,102,2,251,1,237,255,215,2,251,1,238,255,236,2,251,1,242,255,174,2,251,1,244,0,102,2,251,2,8,255,133,2,251,2,12,255,133,2,251,2,106,255,215,2,251,2,108,255,236,2,251,2,114,255,113,2,251,2,115,255,174,2,251,2,126,255,236,2,251,2,127,255,215,2,251,2,132,255,236,2,251,2,133,255,215,2,251,2,134,255,236,2,251,2,135,255,215,2,251,2,136,255,236,2,251,2,137,255,215,2,251,2,138,255,236,2,251,2,140,255,236,2,251,2,141,255,215,2,251,2,152,0,102,2,251,2,168,0,102,2,251,2,177,255,236,2,251,2,178,255,215,2,251,2,179,255,236,2,251,2,180,255,215,2,251,2,192,255,215,2,251,2,194,255,215,2,251,2,197,255,215,2,251,2,198,255,195,2,251,2,199,255,215,2,251,2,200,255,195,2,251,2,206,255,154,2,251,2,207,255,174,2,251,2,213,255,215,2,251,2,217,255,113,2,251,2,219,255,113,2,251,2,221,255,113,2,251,2,224,255,215,2,251,2,239,255,236,2,251,2,240,255,215,2,251,2,241,255,236,2,251,2,242,255,215,2,251,2,243,255,236,2,251,2,244,255,215,2,251,2,254,255,215,2,251,3,9,255,113,2,251,3,10,255,215,2,251,3,11,255,113,2,251,3,12,255,215,2,251,3,17,255,154,2,251,3,18,255,174,2,251,3,21,255,236,2,251,3,22,255,215,2,251,3,26,255,215,2,251,3,27,255,154,2,251,3,28,255,174,2,252,0,15,255,174,2,252,0,17,255,174,2,252,1,206,255,215,2,252,1,213,255,215,2,252,1,242,255,215,2,252,2,8,255,174,2,252,2,12,255,174,2,252,2,115,255,215,2,252,2,207,255,215,2,252,3,18,255,215,2,252,3,28,255,215,2,255,0,15,255,133,2,255,0,16,255,174,2,255,0,17,255,133,2,255,1,159,255,215,2,255,1,164,255,154,2,255,1,170,255,113,2,255,1,174,255,154,2,255,1,181,255,154,2,255,1,184,255,215,2,255,1,187,255,215,2,255,1,188,0,41,2,255,1,190,255,174,2,255,1,204,255,154,2,255,1,205,255,154,2,255,1,206,255,133,2,255,1,207,255,113,2,255,1,208,255,215,2,255,1,209,255,215,2,255,1,210,255,154,2,255,1,211,255,154,2,255,1,212,255,154,2,255,1,213,255,133,2,255,1,214,255,154,2,255,1,215,255,154,2,255,1,216,255,113,2,255,1,217,255,154,2,255,1,218,255,154,2,255,1,219,255,113,2,255,1,220,255,174,2,255,1,221,255,174,2,255,1,222,255,113,2,255,1,223,255,215,2,255,1,224,255,154,2,255,1,225,255,154,2,255,1,226,255,154,2,255,1,227,255,154,2,255,1,228,255,174,2,255,1,229,255,154,2,255,1,230,255,154,2,255,1,231,255,215,2,255,1,232,255,154,2,255,1,233,255,195,2,255,1,234,255,113,2,255,1,236,255,154,2,255,1,237,255,113,2,255,1,238,255,133,2,255,1,242,255,133,2,255,1,243,255,154,2,255,1,245,255,154,2,255,1,246,255,174,2,255,1,247,255,154,2,255,1,249,255,154,2,255,2,2,255,174,2,255,2,3,255,174,2,255,2,4,255,174,2,255,2,8,255,133,2,255,2,12,255,133,2,255,2,106,255,113,2,255,2,107,255,154,2,255,2,108,255,215,2,255,2,109,255,215,2,255,2,113,255,154,2,255,2,114,255,113,2,255,2,115,255,133,2,255,2,117,255,154,2,255,2,119,255,154,2,255,2,121,255,154,2,255,2,125,255,154,2,255,2,126,255,215,2,255,2,127,255,113,2,255,2,129,255,215,2,255,2,131,255,215,2,255,2,132,255,215,2,255,2,133,255,113,2,255,2,134,255,215,2,255,2,135,255,113,2,255,2,136,255,215,2,255,2,137,255,113,2,255,2,138,255,215,2,255,2,139,255,215,2,255,2,140,255,215,2,255,2,141,255,113,2,255,2,150,255,154,2,255,2,154,255,154,2,255,2,158,255,154,2,255,2,160,255,215,2,255,2,162,255,215,2,255,2,164,255,154,2,255,2,166,255,154,2,255,2,170,255,174,2,255,2,172,255,154,2,255,2,174,255,154,2,255,2,176,255,154,2,255,2,177,255,215,2,255,2,178,255,113,2,255,2,179,255,215,2,255,2,180,255,113,2,255,2,181,0,41,2,255,2,182,255,174,2,255,2,184,255,174,2,255,2,186,255,174,2,255,2,188,255,215,2,255,2,190,255,174,2,255,2,192,255,154,2,255,2,194,255,154,2,255,2,196,255,154,2,255,2,197,255,154,2,255,2,198,255,113,2,255,2,199,255,154,2,255,2,200,255,113,2,255,2,203,255,215,2,255,2,205,255,154,2,255,2,206,255,154,2,255,2,207,255,133,2,255,2,209,255,154,2,255,2,211,255,154,2,255,2,213,255,154,2,255,2,215,255,154,2,255,2,217,255,113,2,255,2,219,255,113,2,255,2,221,255,113,2,255,2,224,255,113,2,255,2,230,255,215,2,255,2,232,255,215,2,255,2,234,255,195,2,255,2,236,255,154,2,255,2,238,255,154,2,255,2,239,255,215,2,255,2,240,255,113,2,255,2,241,255,215,2,255,2,242,255,113,2,255,2,243,255,215,2,255,2,244,255,113,2,255,2,246,255,215,2,255,2,248,255,174,2,255,2,250,255,174,2,255,2,252,255,174,2,255,2,254,255,154,2,255,3,0,255,154,2,255,3,2,255,154,2,255,3,6,255,215,2,255,3,8,255,215,2,255,3,9,255,113,2,255,3,10,255,113,2,255,3,11,255,113,2,255,3,12,255,113,2,255,3,14,255,154,2,255,3,16,255,154,2,255,3,17,255,154,2,255,3,18,255,133,2,255,3,20,255,154,2,255,3,21,255,215,2,255,3,22,255,113,2,255,3,24,255,174,2,255,3,26,255,113,2,255,3,27,255,154,2,255,3,28,255,133,3,0,0,15,255,154,3,0,0,16,255,215,3,0,0,17,255,154,3,0,1,206,255,195,3,0,1,207,255,236,3,0,1,213,255,195,3,0,1,216,255,236,3,0,1,219,255,236,3,0,1,222,255,236,3,0,1,234,255,236,3,0,1,237,255,236,3,0,1,242,255,195,3,0,2,2,255,215,3,0,2,3,255,215,3,0,2,4,255,215,3,0,2,8,255,154,3,0,2,12,255,154,3,0,2,106,255,236,3,0,2,115,255,195,3,0,2,127,255,236,3,0,2,133,255,236,3,0,2,135,255,236,3,0,2,137,255,236,3,0,2,141,255,236,3,0,2,178,255,236,3,0,2,180,255,236,3,0,2,207,255,195,3,0,2,224,255,236,3,0,2,240,255,236,3,0,2,242,255,236,3,0,2,244,255,236,3,0,3,10,255,236,3,0,3,12,255,236,3,0,3,18,255,195,3,0,3,22,255,236,3,0,3,26,255,236,3,0,3,28,255,195,3,3,0,15,255,154,3,3,0,16,255,215,3,3,0,17,255,154,3,3,1,157,0,41,3,3,1,159,255,215,3,3,1,164,255,174,3,3,1,166,0,41,3,3,1,170,255,133,3,3,1,174,255,174,3,3,1,181,255,174,3,3,1,184,255,215,3,3,1,187,255,215,3,3,1,188,0,41,3,3,1,190,255,195,3,3,1,196,0,41,3,3,1,204,255,195,3,3,1,205,255,195,3,3,1,206,255,154,3,3,1,207,255,174,3,3,1,208,255,215,3,3,1,209,255,215,3,3,1,210,255,195,3,3,1,211,255,195,3,3,1,212,255,195,3,3,1,213,255,154,3,3,1,214,255,195,3,3,1,215,255,195,3,3,1,216,255,174,3,3,1,217,255,195,3,3,1,218,255,195,3,3,1,219,255,174,3,3,1,222,255,174,3,3,1,223,255,215,3,3,1,224,255,195,3,3,1,225,255,154,3,3,1,226,255,195,3,3,1,227,255,195,3,3,1,229,255,195,3,3,1,230,255,195,3,3,1,231,255,215,3,3,1,232,255,195,3,3,1,234,255,174,3,3,1,235,0,41,3,3,1,236,255,195,3,3,1,237,255,174,3,3,1,238,255,195,3,3,1,242,255,154,3,3,1,243,255,195,3,3,1,244,0,41,3,3,1,245,255,195,3,3,1,247,255,195,3,3,1,249,255,195,3,3,2,2,255,215,3,3,2,3,255,215,3,3,2,4,255,215,3,3,2,8,255,154,3,3,2,12,255,154,3,3,2,106,255,174,3,3,2,107,255,195,3,3,2,108,255,215,3,3,2,113,255,195,3,3,2,114,255,133,3,3,2,115,255,154,3,3,2,117,255,195,3,3,2,119,255,215,3,3,2,121,255,195,3,3,2,125,255,195,3,3,2,126,255,215,3,3,2,127,255,174,3,3,2,132,255,215,3,3,2,133,255,174,3,3,2,134,255,215,3,3,2,135,255,174,3,3,2,136,255,215,3,3,2,137,255,174,3,3,2,138,255,215,3,3,2,140,255,215,3,3,2,141,255,174,3,3,2,150,255,195,3,3,2,152,0,41,3,3,2,154,255,195,3,3,2,158,255,195,3,3,2,160,255,215,3,3,2,162,255,215,3,3,2,164,255,195,3,3,2,166,255,195,3,3,2,168,0,41,3,3,2,169,0,41,3,3,2,172,255,195,3,3,2,174,255,195,3,3,2,176,255,195,3,3,2,177,255,215,3,3,2,178,255,174,3,3,2,179,255,215,3,3,2,180,255,174,3,3,2,181,0,41,3,3,2,188,255,215,3,3,2,189,0,41,3,3,2,192,255,154,3,3,2,194,255,154,3,3,2,196,255,195,3,3,2,197,255,215,3,3,2,198,255,195,3,3,2,199,255,215,3,3,2,200,255,195,3,3,2,203,255,215,3,3,2,205,255,195,3,3,2,206,255,174,3,3,2,207,255,154,3,3,2,209,255,195,3,3,2,211,255,195,3,3,2,213,255,154,3,3,2,215,255,195,3,3,2,217,255,133,3,3,2,219,255,133,3,3,2,221,255,133,3,3,2,224,255,174,3,3,2,230,255,215,3,3,2,232,255,215,3,3,2,236,255,195,3,3,2,238,255,195,3,3,2,239,255,215,3,3,2,240,255,174,3,3,2,241,255,215,3,3,2,242,255,174,3,3,2,243,255,215,3,3,2,244,255,174,3,3,2,246,255,215,3,3,2,254,255,154,3,3,3,0,255,195,3,3,3,2,255,195,3,3,3,6,255,215,3,3,3,8,255,215,3,3,3,9,255,154,3,3,3,10,255,174,3,3,3,11,255,154,3,3,3,12,255,174,3,3,3,14,255,215,3,3,3,16,255,215,3,3,3,17,255,174,3,3,3,18,255,154,3,3,3,20,255,195,3,3,3,21,255,215,3,3,3,22,255,174,3,3,3,23,0,41,3,3,3,26,255,174,3,3,3,27,255,174,3,3,3,28,255,154,3,4,0,15,255,195,3,4,0,17,255,195,3,4,1,206,255,195,3,4,1,207,255,215,3,4,1,213,255,195,3,4,1,216,255,215,3,4,1,219,255,215,3,4,1,222,255,215,3,4,1,234,255,215,3,4,1,237,255,215,3,4,1,242,255,195,3,4,2,8,255,195,3,4,2,12,255,195,3,4,2,106,255,215,3,4,2,115,255,195,3,4,2,127,255,215,3,4,2,133,255,215,3,4,2,135,255,215,3,4,2,137,255,215,3,4,2,141,255,215,3,4,2,178,255,215,3,4,2,180,255,215,3,4,2,207,255,195,3,4,2,224,255,215,3,4,2,240,255,215,3,4,2,242,255,215,3,4,2,244,255,215,3,4,3,10,255,215,3,4,3,12,255,215,3,4,3,18,255,195,3,4,3,22,255,215,3,4,3,26,255,215,3,4,3,28,255,195,3,5,1,159,255,215,3,5,1,163,0,225,3,5,1,184,255,215,3,5,1,187,255,215,3,5,1,190,255,195,3,5,1,220,255,215,3,5,1,225,255,174,3,5,1,228,255,215,3,5,2,108,255,215,3,5,2,123,0,61,3,5,2,125,255,236,3,5,2,126,255,215,3,5,2,132,255,215,3,5,2,134,255,215,3,5,2,136,255,215,3,5,2,138,255,215,3,5,2,140,255,215,3,5,2,170,255,215,3,5,2,177,255,215,3,5,2,179,255,215,3,5,2,182,255,215,3,5,2,190,255,215,3,5,2,192,255,174,3,5,2,194,255,174,3,5,2,197,255,195,3,5,2,198,255,215,3,5,2,199,255,195,3,5,2,200,255,215,3,5,2,213,255,174,3,5,2,239,255,215,3,5,2,241,255,215,3,5,2,243,255,215,3,5,2,254,255,174,3,5,3,14,255,215,3,5,3,16,255,215,3,5,3,21,255,215,3,5,3,24,255,215,3,6,1,207,255,236,3,6,1,216,255,236,3,6,1,219,255,236,3,6,1,222,255,236,3,6,1,225,255,236,3,6,1,234,255,236,3,6,1,237,255,236,3,6,2,106,255,236,3,6,2,127,255,236,3,6,2,133,255,236,3,6,2,135,255,236,3,6,2,137,255,236,3,6,2,141,255,236,3,6,2,178,255,236,3,6,2,180,255,236,3,6,2,192,255,236,3,6,2,194,255,236,3,6,2,213,255,236,3,6,2,224,255,236,3,6,2,240,255,236,3,6,2,242,255,236,3,6,2,244,255,236,3,6,2,254,255,236,3,6,3,10,255,236,3,6,3,12,255,236,3,6,3,14,255,215,3,6,3,16,255,215,3,6,3,22,255,236,3,6,3,26,255,236,3,7,1,159,255,215,3,7,1,184,255,215,3,7,1,187,255,215,3,7,1,190,255,215,3,7,1,193,255,215,3,7,1,225,255,215,3,7,2,108,255,215,3,7,2,124,255,215,3,7,2,126,255,215,3,7,2,132,255,215,3,7,2,134,255,215,3,7,2,136,255,215,3,7,2,138,255,215,3,7,2,140,255,215,3,7,2,177,255,215,3,7,2,179,255,215,3,7,2,191,255,215,3,7,2,192,255,215,3,7,2,193,255,215,3,7,2,194,255,215,3,7,2,197,255,154,3,7,2,199,255,154,3,7,2,212,255,215,3,7,2,213,255,215,3,7,2,239,255,215,3,7,2,241,255,215,3,7,2,243,255,215,3,7,2,253,255,215,3,7,2,254,255,215,3,7,3,9,255,215,3,7,3,11,255,215,3,7,3,14,255,215,3,7,3,16,255,215,3,7,3,21,255,215,3,7,3,25,255,236,3,8,1,207,255,236,3,8,1,216,255,236,3,8,1,219,255,236,3,8,1,222,255,236,3,8,1,225,255,236,3,8,1,234,255,236,3,8,1,237,255,236,3,8,2,106,255,236,3,8,2,127,255,236,3,8,2,133,255,236,3,8,2,135,255,236,3,8,2,137,255,236,3,8,2,141,255,236,3,8,2,178,255,236,3,8,2,180,255,236,3,8,2,192,255,236,3,8,2,194,255,236,3,8,2,213,255,236,3,8,2,224,255,236,3,8,2,240,255,236,3,8,2,242,255,236,3,8,2,244,255,236,3,8,2,254,255,236,3,8,3,10,255,236,3,8,3,12,255,236,3,8,3,14,255,215,3,8,3,16,255,215,3,8,3,22,255,236,3,8,3,26,255,236,3,11,0,5,255,154,3,11,0,10,255,154,3,11,1,157,255,174,3,11,1,166,255,174,3,11,1,168,255,195,3,11,1,170,255,195,3,11,1,176,255,195,3,11,1,188,255,113,3,11,1,189,255,195,3,11,1,191,255,195,3,11,1,193,255,195,3,11,1,196,255,174,3,11,1,208,255,215,3,11,1,220,255,195,3,11,1,223,255,215,3,11,1,225,255,215,3,11,1,228,255,195,3,11,2,7,255,154,3,11,2,11,255,154,3,11,2,114,255,195,3,11,2,118,255,215,3,11,2,124,255,195,3,11,2,128,255,195,3,11,2,130,255,195,3,11,2,159,255,195,3,11,2,160,255,215,3,11,2,169,255,174,3,11,2,170,255,195,3,11,2,181,255,113,3,11,2,182,255,195,3,11,2,183,255,195,3,11,2,185,255,195,3,11,2,187,255,195,3,11,2,188,255,215,3,11,2,189,255,174,3,11,2,190,255,195,3,11,2,191,255,195,3,11,2,192,255,215,3,11,2,193,255,195,3,11,2,194,255,215,3,11,2,202,255,195,3,11,2,203,255,215,3,11,2,212,255,195,3,11,2,213,255,215,3,11,2,217,255,195,3,11,2,219,255,195,3,11,2,221,255,195,3,11,2,229,255,195,3,11,2,230,255,215,3,11,2,247,255,195,3,11,2,249,255,195,3,11,2,251,255,195,3,11,2,253,255,195,3,11,2,254,255,215,3,11,3,5,255,195,3,11,3,6,255,215,3,11,3,7,255,195,3,11,3,8,255,215,3,11,3,13,255,215,3,11,3,14,255,215,3,11,3,15,255,215,3,11,3,16,255,215,3,11,3,23,255,174,3,11,3,24,255,195,3,12,0,5,255,154,3,12,0,10,255,154,3,12,1,208,255,215,3,12,1,220,255,195,3,12,1,221,255,215,3,12,1,223,255,215,3,12,1,225,255,215,3,12,1,228,255,195,3,12,1,246,255,215,3,12,2,7,255,154,3,12,2,11,255,154,3,12,2,160,255,215,3,12,2,170,255,195,3,12,2,182,255,195,3,12,2,188,255,215,3,12,2,190,255,195,3,12,2,192,255,215,3,12,2,194,255,215,3,12,2,203,255,215,3,12,2,213,255,215,3,12,2,230,255,215,3,12,2,248,255,215,3,12,2,250,255,215,3,12,2,252,255,215,3,12,2,254,255,215,3,12,3,6,255,215,3,12,3,8,255,215,3,12,3,14,255,154,3,12,3,16,255,154,3,12,3,24,255,195,3,13,0,5,255,154,3,13,0,10,255,154,3,13,1,157,255,174,3,13,1,166,255,174,3,13,1,168,255,195,3,13,1,170,255,195,3,13,1,176,255,195,3,13,1,188,255,113,3,13,1,189,255,195,3,13,1,191,255,195,3,13,1,193,255,195,3,13,1,196,255,174,3,13,1,208,255,215,3,13,1,220,255,195,3,13,1,223,255,215,3,13,1,225,255,215,3,13,1,228,255,195,3,13,2,7,255,154,3,13,2,11,255,154,3,13,2,114,255,195,3,13,2,118,255,215,3,13,2,124,255,195,3,13,2,128,255,195,3,13,2,130,255,195,3,13,2,159,255,195,3,13,2,160,255,215,3,13,2,169,255,174,3,13,2,170,255,195,3,13,2,181,255,113,3,13,2,182,255,195,3,13,2,183,255,195,3,13,2,185,255,195,3,13,2,187,255,195,3,13,2,188,255,215,3,13,2,189,255,174,3,13,2,190,255,195,3,13,2,191,255,195,3,13,2,192,255,215,3,13,2,193,255,195,3,13,2,194,255,215,3,13,2,202,255,195,3,13,2,203,255,215,3,13,2,212,255,195,3,13,2,213,255,215,3,13,2,217,255,195,3,13,2,219,255,195,3,13,2,221,255,195,3,13,2,229,255,195,3,13,2,230,255,215,3,13,2,247,255,195,3,13,2,249,255,195,3,13,2,251,255,195,3,13,2,253,255,195,3,13,2,254,255,215,3,13,3,5,255,195,3,13,3,6,255,215,3,13,3,7,255,195,3,13,3,8,255,215,3,13,3,13,255,215,3,13,3,14,255,215,3,13,3,15,255,215,3,13,3,16,255,215,3,13,3,23,255,174,3,13,3,24,255,195,3,14,0,5,255,154,3,14,0,10,255,154,3,14,1,208,255,215,3,14,1,220,255,195,3,14,1,221,255,215,3,14,1,223,255,215,3,14,1,225,255,215,3,14,1,228,255,195,3,14,1,246,255,215,3,14,2,7,255,154,3,14,2,11,255,154,3,14,2,160,255,215,3,14,2,170,255,195,3,14,2,182,255,195,3,14,2,188,255,215,3,14,2,190,255,195,3,14,2,192,255,215,3,14,2,194,255,215,3,14,2,203,255,215,3,14,2,213,255,215,3,14,2,230,255,215,3,14,2,248,255,215,3,14,2,250,255,215,3,14,2,252,255,215,3,14,2,254,255,215,3,14,3,6,255,215,3,14,3,8,255,215,3,14,3,14,255,154,3,14,3,16,255,154,3,14,3,24,255,195,3,15,1,163,0,225,3,15,2,234,0,41,3,15,3,14,255,215,3,15,3,16,255,215,3,16,0,5,255,236,3,16,0,10,255,236,3,16,2,7,255,236,3,16,2,11,255,236,3,17,0,5,255,154,3,17,0,10,255,154,3,17,1,157,255,174,3,17,1,166,255,174,3,17,1,168,255,195,3,17,1,170,255,195,3,17,1,176,255,195,3,17,1,188,255,113,3,17,1,189,255,195,3,17,1,191,255,195,3,17,1,193,255,195,3,17,1,196,255,174,3,17,1,208,255,215,3,17,1,220,255,195,3,17,1,223,255,215,3,17,1,225,255,215,3,17,1,228,255,195,3,17,2,7,255,154,3,17,2,11,255,154,3,17,2,114,255,195,3,17,2,118,255,215,3,17,2,124,255,195,3,17,2,128,255,195,3,17,2,130,255,195,3,17,2,159,255,195,3,17,2,160,255,215,3,17,2,169,255,174,3,17,2,170,255,195,3,17,2,181,255,113,3,17,2,182,255,195,3,17,2,183,255,195,3,17,2,185,255,195,3,17,2,187,255,195,3,17,2,188,255,215,3,17,2,189,255,174,3,17,2,190,255,195,3,17,2,191,255,195,3,17,2,192,255,215,3,17,2,193,255,195,3,17,2,194,255,215,3,17,2,202,255,195,3,17,2,203,255,215,3,17,2,212,255,195,3,17,2,213,255,215,3,17,2,217,255,195,3,17,2,219,255,195,3,17,2,221,255,195,3,17,2,229,255,195,3,17,2,230,255,215,3,17,2,247,255,195,3,17,2,249,255,195,3,17,2,251,255,195,3,17,2,253,255,195,3,17,2,254,255,215,3,17,3,5,255,195,3,17,3,6,255,215,3,17,3,7,255,195,3,17,3,8,255,215,3,17,3,13,255,215,3,17,3,14,255,215,3,17,3,15,255,215,3,17,3,16,255,215,3,17,3,23,255,174,3,17,3,24,255,195,3,18,0,5,255,154,3,18,0,10,255,154,3,18,1,208,255,215,3,18,1,220,255,195,3,18,1,221,255,215,3,18,1,223,255,215,3,18,1,225,255,215,3,18,1,228,255,195,3,18,1,246,255,215,3,18,2,7,255,154,3,18,2,11,255,154,3,18,2,160,255,215,3,18,2,170,255,195,3,18,2,182,255,195,3,18,2,188,255,215,3,18,2,190,255,195,3,18,2,192,255,215,3,18,2,194,255,215,3,18,2,203,255,215,3,18,2,213,255,215,3,18,2,230,255,215,3,18,2,248,255,215,3,18,2,250,255,215,3,18,2,252,255,215,3,18,2,254,255,215,3,18,3,6,255,215,3,18,3,8,255,215,3,18,3,14,255,154,3,18,3,16,255,154,3,18,3,24,255,195,3,19,0,5,255,154,3,19,0,10,255,154,3,19,1,157,255,174,3,19,1,166,255,174,3,19,1,168,255,195,3,19,1,170,255,195,3,19,1,176,255,195,3,19,1,188,255,113,3,19,1,189,255,195,3,19,1,191,255,195,3,19,1,193,255,195,3,19,1,196,255,174,3,19,1,208,255,215,3,19,1,220,255,195,3,19,1,223,255,215,3,19,1,225,255,215,3,19,1,228,255,195,3,19,2,7,255,154,3,19,2,11,255,154,3,19,2,114,255,195,3,19,2,118,255,215,3,19,2,124,255,195,3,19,2,128,255,195,3,19,2,130,255,195,3,19,2,159,255,195,3,19,2,160,255,215,3,19,2,169,255,174,3,19,2,170,255,195,3,19,2,181,255,113,3,19,2,182,255,195,3,19,2,183,255,195,3,19,2,185,255,195,3,19,2,187,255,195,3,19,2,188,255,215,3,19,2,189,255,174,3,19,2,190,255,195,3,19,2,191,255,195,3,19,2,192,255,215,3,19,2,193,255,195,3,19,2,194,255,215,3,19,2,202,255,195,3,19,2,203,255,215,3,19,2,212,255,195,3,19,2,213,255,215,3,19,2,217,255,195,3,19,2,219,255,195,3,19,2,221,255,195,3,19,2,229,255,195,3,19,2,230,255,215,3,19,2,247,255,195,3,19,2,249,255,195,3,19,2,251,255,195,3,19,2,253,255,195,3,19,2,254,255,215,3,19,3,5,255,195,3,19,3,6,255,215,3,19,3,7,255,195,3,19,3,8,255,215,3,19,3,13,255,215,3,19,3,14,255,215,3,19,3,15,255,215,3,19,3,16,255,215,3,19,3,23,255,174,3,19,3,24,255,195,3,20,0,5,255,154,3,20,0,10,255,154,3,20,1,208,255,215,3,20,1,220,255,195,3,20,1,221,255,215,3,20,1,223,255,215,3,20,1,225,255,215,3,20,1,228,255,195,3,20,1,246,255,215,3,20,2,7,255,154,3,20,2,11,255,154,3,20,2,160,255,215,3,20,2,170,255,195,3,20,2,182,255,195,3,20,2,188,255,215,3,20,2,190,255,195,3,20,2,192,255,215,3,20,2,194,255,215,3,20,2,203,255,215,3,20,2,213,255,215,3,20,2,230,255,215,3,20,2,248,255,215,3,20,2,250,255,215,3,20,2,252,255,215,3,20,2,254,255,215,3,20,3,6,255,215,3,20,3,8,255,215,3,20,3,14,255,154,3,20,3,16,255,154,3,20,3,24,255,195,3,21,0,15,255,174,3,21,0,17,255,174,3,21,1,170,255,236,3,21,1,176,255,215,3,21,1,188,255,215,3,21,1,191,255,215,3,21,2,8,255,174,3,21,2,12,255,174,3,21,2,114,255,236,3,21,2,128,255,236,3,21,2,130,255,236,3,21,2,159,255,215,3,21,2,181,255,215,3,21,2,183,255,236,3,21,2,185,255,236,3,21,2,187,255,215,3,21,2,202,255,215,3,21,2,217,255,236,3,21,2,219,255,236,3,21,2,221,255,236,3,21,2,229,255,215,3,21,3,5,255,215,3,21,3,7,255,215,3,22,0,5,255,215,3,22,0,10,255,215,3,22,1,208,255,236,3,22,1,221,255,236,3,22,1,223,255,236,3,22,1,246,255,236,3,22,2,7,255,215,3,22,2,11,255,215,3,22,2,160,255,236,3,22,2,188,255,236,3,22,2,203,255,236,3,22,2,230,255,236,3,22,2,248,255,236,3,22,2,250,255,236,3,22,2,252,255,236,3,22,3,6,255,236,3,22,3,8,255,236,3,22,3,14,255,215,3,22,3,16,255,215,3,23,0,5,255,174,3,23,0,10,255,174,3,23,1,157,255,195,3,23,1,166,255,195,3,23,1,170,255,215,3,23,1,176,255,215,3,23,1,188,255,195,3,23,1,191,255,215,3,23,1,193,255,215,3,23,1,196,255,195,3,23,1,220,255,215,3,23,1,228,255,215,3,23,2,7,255,174,3,23,2,11,255,174,3,23,2,114,255,215,3,23,2,124,255,215,3,23,2,128,255,215,3,23,2,130,255,215,3,23,2,159,255,215,3,23,2,169,255,195,3,23,2,170,255,215,3,23,2,181,255,195,3,23,2,182,255,215,3,23,2,183,255,215,3,23,2,185,255,215,3,23,2,187,255,215,3,23,2,189,255,195,3,23,2,190,255,215,3,23,2,191,255,215,3,23,2,193,255,215,3,23,2,202,255,215,3,23,2,212,255,215,3,23,2,217,255,215,3,23,2,219,255,215,3,23,2,221,255,215,3,23,2,229,255,215,3,23,2,253,255,215,3,23,3,5,255,215,3,23,3,7,255,215,3,23,3,13,255,215,3,23,3,15,255,215,3,23,3,23,255,195,3,23,3,24,255,215,3,24,0,5,255,154,3,24,0,10,255,154,3,24,1,208,255,215,3,24,1,220,255,195,3,24,1,221,255,215,3,24,1,223,255,215,3,24,1,225,255,215,3,24,1,228,255,195,3,24,1,246,255,215,3,24,2,7,255,154,3,24,2,11,255,154,3,24,2,160,255,215,3,24,2,170,255,195,3,24,2,182,255,195,3,24,2,188,255,215,3,24,2,190,255,195,3,24,2,192,255,215,3,24,2,194,255,215,3,24,2,203,255,215,3,24,2,213,255,215,3,24,2,230,255,215,3,24,2,248,255,215,3,24,2,250,255,215,3,24,2,252,255,215,3,24,2,254,255,215,3,24,3,6,255,215,3,24,3,8,255,215,3,24,3,14,255,154,3,24,3,16,255,154,3,24,3,24,255,195,3,25,1,225,255,215,3,25,2,192,255,215,3,25,2,194,255,215,3,25,2,213,255,215,3,25,2,254,255,215,3,27,1,163,0,225,3,27,2,234,0,41,3,27,3,14,255,215,3,27,3,16,255,215,3,28,0,5,255,236,3,28,0,10,255,236,3,28,2,7,255,236,3,28,2,11,255,236,3,29,0,5,255,113,3,29,0,10,255,113,3,29,0,38,255,215,3,29,0,42,255,215,3,29,0,45,1,10,3,29,0,50,255,215,3,29,0,52,255,215,3,29,0,55,255,113,3,29,0,57,255,174,3,29,0,58,255,174,3,29,0,60,255,133,3,29,0,137,255,215,3,29,0,148,255,215,3,29,0,149,255,215,3,29,0,150,255,215,3,29,0,151,255,215,3,29,0,152,255,215,3,29,0,154,255,215,3,29,0,159,255,133,3,29,0,200,255,215,3,29,0,202,255,215,3,29,0,204,255,215,3,29,0,206,255,215,3,29,0,222,255,215,3,29,0,224,255,215,3,29,0,226,255,215,3,29,0,228,255,215,3,29,1,14,255,215,3,29,1,16,255,215,3,29,1,18,255,215,3,29,1,20,255,215,3,29,1,36,255,113,3,29,1,38,255,113,3,29,1,54,255,174,3,29,1,56,255,133,3,29,1,58,255,133,3,29,1,71,255,215,3,29,1,250,255,174,3,29,1,252,255,174,3,29,1,254,255,174,3,29,2,0,255,133,3,29,2,7,255,113,3,29,2,11,255,113,3,29,2,95,255,215,3,29,3,73,255,215,3,29,3,75,255,215,3,29,3,77,255,215,3,29,3,79,255,215,3,29,3,81,255,215,3,29,3,83,255,215,3,29,3,85,255,215,3,29,3,87,255,215,3,29,3,89,255,215,3,29,3,91,255,215,3,29,3,93,255,215,3,29,3,95,255,215,3,29,3,111,255,133,3,29,3,113,255,133,3,29,3,115,255,133,3,29,3,143,255,113,3,30,0,5,255,236,3,30,0,10,255,236,3,30,2,7,255,236,3,30,2,11,255,236,3,31,0,5,255,113,3,31,0,10,255,113,3,31,0,38,255,215,3,31,0,42,255,215,3,31,0,45,1,10,3,31,0,50,255,215,3,31,0,52,255,215,3,31,0,55,255,113,3,31,0,57,255,174,3,31,0,58,255,174,3,31,0,60,255,133,3,31,0,137,255,215,3,31,0,148,255,215,3,31,0,149,255,215,3,31,0,150,255,215,3,31,0,151,255,215,3,31,0,152,255,215,3,31,0,154,255,215,3,31,0,159,255,133,3,31,0,200,255,215,3,31,0,202,255,215,3,31,0,204,255,215,3,31,0,206,255,215,3,31,0,222,255,215,3,31,0,224,255,215,3,31,0,226,255,215,3,31,0,228,255,215,3,31,1,14,255,215,3,31,1,16,255,215,3,31,1,18,255,215,3,31,1,20,255,215,3,31,1,36,255,113,3,31,1,38,255,113,3,31,1,54,255,174,3,31,1,56,255,133,3,31,1,58,255,133,3,31,1,71,255,215,3,31,1,250,255,174,3,31,1,252,255,174,3,31,1,254,255,174,3,31,2,0,255,133,3,31,2,7,255,113,3,31,2,11,255,113,3,31,2,95,255,215,3,31,3,73,255,215,3,31,3,75,255,215,3,31,3,77,255,215,3,31,3,79,255,215,3,31,3,81,255,215,3,31,3,83,255,215,3,31,3,85,255,215,3,31,3,87,255,215,3,31,3,89,255,215,3,31,3,91,255,215,3,31,3,93,255,215,3,31,3,95,255,215,3,31,3,111,255,133,3,31,3,113,255,133,3,31,3,115,255,133,3,31,3,143,255,113,3,32,0,5,255,236,3,32,0,10,255,236,3,32,2,7,255,236,3,32,2,11,255,236,3,33,0,5,255,113,3,33,0,10,255,113,3,33,0,38,255,215,3,33,0,42,255,215,3,33,0,45,1,10,3,33,0,50,255,215,3,33,0,52,255,215,3,33,0,55,255,113,3,33,0,57,255,174,3,33,0,58,255,174,3,33,0,60,255,133,3,33,0,137,255,215,3,33,0,148,255,215,3,33,0,149,255,215,3,33,0,150,255,215,3,33,0,151,255,215,3,33,0,152,255,215,3,33,0,154,255,215,3,33,0,159,255,133,3,33,0,200,255,215,3,33,0,202,255,215,3,33,0,204,255,215,3,33,0,206,255,215,3,33,0,222,255,215,3,33,0,224,255,215,3,33,0,226,255,215,3,33,0,228,255,215,3,33,1,14,255,215,3,33,1,16,255,215,3,33,1,18,255,215,3,33,1,20,255,215,3,33,1,36,255,113,3,33,1,38,255,113,3,33,1,54,255,174,3,33,1,56,255,133,3,33,1,58,255,133,3,33,1,71,255,215,3,33,1,250,255,174,3,33,1,252,255,174,3,33,1,254,255,174,3,33,2,0,255,133,3,33,2,7,255,113,3,33,2,11,255,113,3,33,2,95,255,215,3,33,3,73,255,215,3,33,3,75,255,215,3,33,3,77,255,215,3,33,3,79,255,215,3,33,3,81,255,215,3,33,3,83,255,215,3,33,3,85,255,215,3,33,3,87,255,215,3,33,3,89,255,215,3,33,3,91,255,215,3,33,3,93,255,215,3,33,3,95,255,215,3,33,3,111,255,133,3,33,3,113,255,133,3,33,3,115,255,133,3,33,3,143,255,113,3,34,0,5,255,236,3,34,0,10,255,236,3,34,2,7,255,236,3,34,2,11,255,236,3,35,0,5,255,113,3,35,0,10,255,113,3,35,0,38,255,215,3,35,0,42,255,215,3,35,0,45,1,10,3,35,0,50,255,215,3,35,0,52,255,215,3,35,0,55,255,113,3,35,0,57,255,174,3,35,0,58,255,174,3,35,0,60,255,133,3,35,0,137,255,215,3,35,0,148,255,215,3,35,0,149,255,215,3,35,0,150,255,215,3,35,0,151,255,215,3,35,0,152,255,215,3,35,0,154,255,215,3,35,0,159,255,133,3,35,0,200,255,215,3,35,0,202,255,215,3,35,0,204,255,215,3,35,0,206,255,215,3,35,0,222,255,215,3,35,0,224,255,215,3,35,0,226,255,215,3,35,0,228,255,215,3,35,1,14,255,215,3,35,1,16,255,215,3,35,1,18,255,215,3,35,1,20,255,215,3,35,1,36,255,113,3,35,1,38,255,113,3,35,1,54,255,174,3,35,1,56,255,133,3,35,1,58,255,133,3,35,1,71,255,215,3,35,1,250,255,174,3,35,1,252,255,174,3,35,1,254,255,174,3,35,2,0,255,133,3,35,2,7,255,113,3,35,2,11,255,113,3,35,2,95,255,215,3,35,3,73,255,215,3,35,3,75,255,215,3,35,3,77,255,215,3,35,3,79,255,215,3,35,3,81,255,215,3,35,3,83,255,215,3,35,3,85,255,215,3,35,3,87,255,215,3,35,3,89,255,215,3,35,3,91,255,215,3,35,3,93,255,215,3,35,3,95,255,215,3,35,3,111,255,133,3,35,3,113,255,133,3,35,3,115,255,133,3,35,3,143,255,113,3,36,0,5,255,236,3,36,0,10,255,236,3,36,2,7,255,236,3,36,2,11,255,236,3,37,0,5,255,113,3,37,0,10,255,113,3,37,0,38,255,215,3,37,0,42,255,215,3,37,0,45,1,10,3,37,0,50,255,215,3,37,0,52,255,215,3,37,0,55,255,113,3,37,0,57,255,174,3,37,0,58,255,174,3,37,0,60,255,133,3,37,0,137,255,215,3,37,0,148,255,215,3,37,0,149,255,215,3,37,0,150,255,215,3,37,0,151,255,215,3,37,0,152,255,215,3,37,0,154,255,215,3,37,0,159,255,133,3,37,0,200,255,215,3,37,0,202,255,215,3,37,0,204,255,215,3,37,0,206,255,215,3,37,0,222,255,215,3,37,0,224,255,215,3,37,0,226,255,215,3,37,0,228,255,215,3,37,1,14,255,215,3,37,1,16,255,215,3,37,1,18,255,215,3,37,1,20,255,215,3,37,1,36,255,113,3,37,1,38,255,113,3,37,1,54,255,174,3,37,1,56,255,133,3,37,1,58,255,133,3,37,1,71,255,215,3,37,1,250,255,174,3,37,1,252,255,174,3,37,1,254,255,174,3,37,2,0,255,133,3,37,2,7,255,113,3,37,2,11,255,113,3,37,2,95,255,215,3,37,3,73,255,215,3,37,3,75,255,215,3,37,3,77,255,215,3,37,3,79,255,215,3,37,3,81,255,215,3,37,3,83,255,215,3,37,3,85,255,215,3,37,3,87,255,215,3,37,3,89,255,215,3,37,3,91,255,215,3,37,3,93,255,215,3,37,3,95,255,215,3,37,3,111,255,133,3,37,3,113,255,133,3,37,3,115,255,133,3,37,3,143,255,113,3,38,0,5,255,236,3,38,0,10,255,236,3,38,2,7,255,236,3,38,2,11,255,236,3,39,0,5,255,113,3,39,0,10,255,113,3,39,0,38,255,215,3,39,0,42,255,215,3,39,0,45,1,10,3,39,0,50,255,215,3,39,0,52,255,215,3,39,0,55,255,113,3,39,0,57,255,174,3,39,0,58,255,174,3,39,0,60,255,133,3,39,0,137,255,215,3,39,0,148,255,215,3,39,0,149,255,215,3,39,0,150,255,215,3,39,0,151,255,215,3,39,0,152,255,215,3,39,0,154,255,215,3,39,0,159,255,133,3,39,0,200,255,215,3,39,0,202,255,215,3,39,0,204,255,215,3,39,0,206,255,215,3,39,0,222,255,215,3,39,0,224,255,215,3,39,0,226,255,215,3,39,0,228,255,215,3,39,1,14,255,215,3,39,1,16,255,215,3,39,1,18,255,215,3,39,1,20,255,215,3,39,1,36,255,113,3,39,1,38,255,113,3,39,1,54,255,174,3,39,1,56,255,133,3,39,1,58,255,133,3,39,1,71,255,215,3,39,1,250,255,174,3,39,1,252,255,174,3,39,1,254,255,174,3,39,2,0,255,133,3,39,2,7,255,113,3,39,2,11,255,113,3,39,2,95,255,215,3,39,3,73,255,215,3,39,3,75,255,215,3,39,3,77,255,215,3,39,3,79,255,215,3,39,3,81,255,215,3,39,3,83,255,215,3,39,3,85,255,215,3,39,3,87,255,215,3,39,3,89,255,215,3,39,3,91,255,215,3,39,3,93,255,215,3,39,3,95,255,215,3,39,3,111,255,133,3,39,3,113,255,133,3,39,3,115,255,133,3,39,3,143,255,113,3,40,0,5,255,236,3,40,0,10,255,236,3,40,2,7,255,236,3,40,2,11,255,236,3,41,0,5,255,113,3,41,0,10,255,113,3,41,0,38,255,215,3,41,0,42,255,215,3,41,0,45,1,10,3,41,0,50,255,215,3,41,0,52,255,215,3,41,0,55,255,113,3,41,0,57,255,174,3,41,0,58,255,174,3,41,0,60,255,133,3,41,0,137,255,215,3,41,0,148,255,215,3,41,0,149,255,215,3,41,0,150,255,215,3,41,0,151,255,215,3,41,0,152,255,215,3,41,0,154,255,215,3,41,0,159,255,133,3,41,0,200,255,215,3,41,0,202,255,215,3,41,0,204,255,215,3,41,0,206,255,215,3,41,0,222,255,215,3,41,0,224,255,215,3,41,0,226,255,215,3,41,0,228,255,215,3,41,1,14,255,215,3,41,1,16,255,215,3,41,1,18,255,215,3,41,1,20,255,215,3,41,1,36,255,113,3,41,1,38,255,113,3,41,1,54,255,174,3,41,1,56,255,133,3,41,1,58,255,133,3,41,1,71,255,215,3,41,1,250,255,174,3,41,1,252,255,174,3,41,1,254,255,174,3,41,2,0,255,133,3,41,2,7,255,113,3,41,2,11,255,113,3,41,2,95,255,215,3,41,3,73,255,215,3,41,3,75,255,215,3,41,3,77,255,215,3,41,3,79,255,215,3,41,3,81,255,215,3,41,3,83,255,215,3,41,3,85,255,215,3,41,3,87,255,215,3,41,3,89,255,215,3,41,3,91,255,215,3,41,3,93,255,215,3,41,3,95,255,215,3,41,3,111,255,133,3,41,3,113,255,133,3,41,3,115,255,133,3,41,3,143,255,113,3,42,0,5,255,236,3,42,0,10,255,236,3,42,2,7,255,236,3,42,2,11,255,236,3,43,0,5,255,113,3,43,0,10,255,113,3,43,0,38,255,215,3,43,0,42,255,215,3,43,0,45,1,10,3,43,0,50,255,215,3,43,0,52,255,215,3,43,0,55,255,113,3,43,0,57,255,174,3,43,0,58,255,174,3,43,0,60,255,133,3,43,0,137,255,215,3,43,0,148,255,215,3,43,0,149,255,215,3,43,0,150,255,215,3,43,0,151,255,215,3,43,0,152,255,215,3,43,0,154,255,215,3,43,0,159,255,133,3,43,0,200,255,215,3,43,0,202,255,215,3,43,0,204,255,215,3,43,0,206,255,215,3,43,0,222,255,215,3,43,0,224,255,215,3,43,0,226,255,215,3,43,0,228,255,215,3,43,1,14,255,215,3,43,1,16,255,215,3,43,1,18,255,215,3,43,1,20,255,215,3,43,1,36,255,113,3,43,1,38,255,113,3,43,1,54,255,174,3,43,1,56,255,133,3,43,1,58,255,133,3,43,1,71,255,215,3,43,1,250,255,174,3,43,1,252,255,174,3,43,1,254,255,174,3,43,2,0,255,133,3,43,2,7,255,113,3,43,2,11,255,113,3,43,2,95,255,215,3,43,3,73,255,215,3,43,3,75,255,215,3,43,3,77,255,215,3,43,3,79,255,215,3,43,3,81,255,215,3,43,3,83,255,215,3,43,3,85,255,215,3,43,3,87,255,215,3,43,3,89,255,215,3,43,3,91,255,215,3,43,3,93,255,215,3,43,3,95,255,215,3,43,3,111,255,133,3,43,3,113,255,133,3,43,3,115,255,133,3,43,3,143,255,113,3,44,0,5,255,236,3,44,0,10,255,236,3,44,2,7,255,236,3,44,2,11,255,236,3,45,0,5,255,113,3,45,0,10,255,113,3,45,0,38,255,215,3,45,0,42,255,215,3,45,0,45,1,10,3,45,0,50,255,215,3,45,0,52,255,215,3,45,0,55,255,113,3,45,0,57,255,174,3,45,0,58,255,174,3,45,0,60,255,133,3,45,0,137,255,215,3,45,0,148,255,215,3,45,0,149,255,215,3,45,0,150,255,215,3,45,0,151,255,215,3,45,0,152,255,215,3,45,0,154,255,215,3,45,0,159,255,133,3,45,0,200,255,215,3,45,0,202,255,215,3,45,0,204,255,215,3,45,0,206,255,215,3,45,0,222,255,215,3,45,0,224,255,215,3,45,0,226,255,215,3,45,0,228,255,215,3,45,1,14,255,215,3,45,1,16,255,215,3,45,1,18,255,215,3,45,1,20,255,215,3,45,1,36,255,113,3,45,1,38,255,113,3,45,1,54,255,174,3,45,1,56,255,133,3,45,1,58,255,133,3,45,1,71,255,215,3,45,1,250,255,174,3,45,1,252,255,174,3,45,1,254,255,174,3,45,2,0,255,133,3,45,2,7,255,113,3,45,2,11,255,113,3,45,2,95,255,215,3,45,3,73,255,215,3,45,3,75,255,215,3,45,3,77,255,215,3,45,3,79,255,215,3,45,3,81,255,215,3,45,3,83,255,215,3,45,3,85,255,215,3,45,3,87,255,215,3,45,3,89,255,215,3,45,3,91,255,215,3,45,3,93,255,215,3,45,3,95,255,215,3,45,3,111,255,133,3,45,3,113,255,133,3,45,3,115,255,133,3,45,3,143,255,113,3,46,0,5,255,236,3,46,0,10,255,236,3,46,2,7,255,236,3,46,2,11,255,236,3,47,0,5,255,113,3,47,0,10,255,113,3,47,0,38,255,215,3,47,0,42,255,215,3,47,0,45,1,10,3,47,0,50,255,215,3,47,0,52,255,215,3,47,0,55,255,113,3,47,0,57,255,174,3,47,0,58,255,174,3,47,0,60,255,133,3,47,0,137,255,215,3,47,0,148,255,215,3,47,0,149,255,215,3,47,0,150,255,215,3,47,0,151,255,215,3,47,0,152,255,215,3,47,0,154,255,215,3,47,0,159,255,133,3,47,0,200,255,215,3,47,0,202,255,215,3,47,0,204,255,215,3,47,0,206,255,215,3,47,0,222,255,215,3,47,0,224,255,215,3,47,0,226,255,215,3,47,0,228,255,215,3,47,1,14,255,215,3,47,1,16,255,215,3,47,1,18,255,215,3,47,1,20,255,215,3,47,1,36,255,113,3,47,1,38,255,113,3,47,1,54,255,174,3,47,1,56,255,133,3,47,1,58,255,133,3,47,1,71,255,215,3,47,1,250,255,174,3,47,1,252,255,174,3,47,1,254,255,174,3,47,2,0,255,133,3,47,2,7,255,113,3,47,2,11,255,113,3,47,2,95,255,215,3,47,3,73,255,215,3,47,3,75,255,215,3,47,3,77,255,215,3,47,3,79,255,215,3,47,3,81,255,215,3,47,3,83,255,215,3,47,3,85,255,215,3,47,3,87,255,215,3,47,3,89,255,215,3,47,3,91,255,215,3,47,3,93,255,215,3,47,3,95,255,215,3,47,3,111,255,133,3,47,3,113,255,133,3,47,3,115,255,133,3,47,3,143,255,113,3,48,0,5,255,236,3,48,0,10,255,236,3,48,2,7,255,236,3,48,2,11,255,236,3,49,0,5,255,113,3,49,0,10,255,113,3,49,0,38,255,215,3,49,0,42,255,215,3,49,0,45,1,10,3,49,0,50,255,215,3,49,0,52,255,215,3,49,0,55,255,113,3,49,0,57,255,174,3,49,0,58,255,174,3,49,0,60,255,133,3,49,0,137,255,215,3,49,0,148,255,215,3,49,0,149,255,215,3,49,0,150,255,215,3,49,0,151,255,215,3,49,0,152,255,215,3,49,0,154,255,215,3,49,0,159,255,133,3,49,0,200,255,215,3,49,0,202,255,215,3,49,0,204,255,215,3,49,0,206,255,215,3,49,0,222,255,215,3,49,0,224,255,215,3,49,0,226,255,215,3,49,0,228,255,215,3,49,1,14,255,215,3,49,1,16,255,215,3,49,1,18,255,215,3,49,1,20,255,215,3,49,1,36,255,113,3,49,1,38,255,113,3,49,1,54,255,174,3,49,1,56,255,133,3,49,1,58,255,133,3,49,1,71,255,215,3,49,1,250,255,174,3,49,1,252,255,174,3,49,1,254,255,174,3,49,2,0,255,133,3,49,2,7,255,113,3,49,2,11,255,113,3,49,2,95,255,215,3,49,3,73,255,215,3,49,3,75,255,215,3,49,3,77,255,215,3,49,3,79,255,215,3,49,3,81,255,215,3,49,3,83,255,215,3,49,3,85,255,215,3,49,3,87,255,215,3,49,3,89,255,215,3,49,3,91,255,215,3,49,3,93,255,215,3,49,3,95,255,215,3,49,3,111,255,133,3,49,3,113,255,133,3,49,3,115,255,133,3,49,3,143,255,113,3,50,0,5,255,236,3,50,0,10,255,236,3,50,2,7,255,236,3,50,2,11,255,236,3,51,0,5,255,113,3,51,0,10,255,113,3,51,0,38,255,215,3,51,0,42,255,215,3,51,0,45,1,10,3,51,0,50,255,215,3,51,0,52,255,215,3,51,0,55,255,113,3,51,0,57,255,174,3,51,0,58,255,174,3,51,0,60,255,133,3,51,0,137,255,215,3,51,0,148,255,215,3,51,0,149,255,215,3,51,0,150,255,215,3,51,0,151,255,215,3,51,0,152,255,215,3,51,0,154,255,215,3,51,0,159,255,133,3,51,0,200,255,215,3,51,0,202,255,215,3,51,0,204,255,215,3,51,0,206,255,215,3,51,0,222,255,215,3,51,0,224,255,215,3,51,0,226,255,215,3,51,0,228,255,215,3,51,1,14,255,215,3,51,1,16,255,215,3,51,1,18,255,215,3,51,1,20,255,215,3,51,1,36,255,113,3,51,1,38,255,113,3,51,1,54,255,174,3,51,1,56,255,133,3,51,1,58,255,133,3,51,1,71,255,215,3,51,1,250,255,174,3,51,1,252,255,174,3,51,1,254,255,174,3,51,2,0,255,133,3,51,2,7,255,113,3,51,2,11,255,113,3,51,2,95,255,215,3,51,3,73,255,215,3,51,3,75,255,215,3,51,3,77,255,215,3,51,3,79,255,215,3,51,3,81,255,215,3,51,3,83,255,215,3,51,3,85,255,215,3,51,3,87,255,215,3,51,3,89,255,215,3,51,3,91,255,215,3,51,3,93,255,215,3,51,3,95,255,215,3,51,3,111,255,133,3,51,3,113,255,133,3,51,3,115,255,133,3,51,3,143,255,113,3,52,0,5,255,236,3,52,0,10,255,236,3,52,2,7,255,236,3,52,2,11,255,236,3,53,0,45,0,123,3,54,0,5,255,236,3,54,0,10,255,236,3,54,0,89,255,215,3,54,0,90,255,215,3,54,0,91,255,215,3,54,0,92,255,215,3,54,0,93,255,236,3,54,0,191,255,215,3,54,1,55,255,215,3,54,1,60,255,236,3,54,1,62,255,236,3,54,1,64,255,236,3,54,1,251,255,215,3,54,1,253,255,215,3,54,2,7,255,236,3,54,2,11,255,236,3,54,3,112,255,215,3,55,0,45,0,123,3,56,0,5,255,236,3,56,0,10,255,236,3,56,0,89,255,215,3,56,0,90,255,215,3,56,0,91,255,215,3,56,0,92,255,215,3,56,0,93,255,236,3,56,0,191,255,215,3,56,1,55,255,215,3,56,1,60,255,236,3,56,1,62,255,236,3,56,1,64,255,236,3,56,1,251,255,215,3,56,1,253,255,215,3,56,2,7,255,236,3,56,2,11,255,236,3,56,3,112,255,215,3,57,0,45,0,123,3,58,0,5,255,236,3,58,0,10,255,236,3,58,0,89,255,215,3,58,0,90,255,215,3,58,0,91,255,215,3,58,0,92,255,215,3,58,0,93,255,236,3,58,0,191,255,215,3,58,1,55,255,215,3,58,1,60,255,236,3,58,1,62,255,236,3,58,1,64,255,236,3,58,1,251,255,215,3,58,1,253,255,215,3,58,2,7,255,236,3,58,2,11,255,236,3,58,3,112,255,215,3,59,0,45,0,123,3,60,0,5,255,236,3,60,0,10,255,236,3,60,0,89,255,215,3,60,0,90,255,215,3,60,0,91,255,215,3,60,0,92,255,215,3,60,0,93,255,236,3,60,0,191,255,215,3,60,1,55,255,215,3,60,1,60,255,236,3,60,1,62,255,236,3,60,1,64,255,236,3,60,1,251,255,215,3,60,1,253,255,215,3,60,2,7,255,236,3,60,2,11,255,236,3,60,3,112,255,215,3,61,0,45,0,123,3,62,0,5,255,236,3,62,0,10,255,236,3,62,0,89,255,215,3,62,0,90,255,215,3,62,0,91,255,215,3,62,0,92,255,215,3,62,0,93,255,236,3,62,0,191,255,215,3,62,1,55,255,215,3,62,1,60,255,236,3,62,1,62,255,236,3,62,1,64,255,236,3,62,1,251,255,215,3,62,1,253,255,215,3,62,2,7,255,236,3,62,2,11,255,236,3,62,3,112,255,215,3,63,0,45,0,123,3,64,0,5,255,236,3,64,0,10,255,236,3,64,0,89,255,215,3,64,0,90,255,215,3,64,0,91,255,215,3,64,0,92,255,215,3,64,0,93,255,236,3,64,0,191,255,215,3,64,1,55,255,215,3,64,1,60,255,236,3,64,1,62,255,236,3,64,1,64,255,236,3,64,1,251,255,215,3,64,1,253,255,215,3,64,2,7,255,236,3,64,2,11,255,236,3,64,3,112,255,215,3,65,0,45,0,123,3,66,0,5,255,236,3,66,0,10,255,236,3,66,0,89,255,215,3,66,0,90,255,215,3,66,0,91,255,215,3,66,0,92,255,215,3,66,0,93,255,236,3,66,0,191,255,215,3,66,1,55,255,215,3,66,1,60,255,236,3,66,1,62,255,236,3,66,1,64,255,236,3,66,1,251,255,215,3,66,1,253,255,215,3,66,2,7,255,236,3,66,2,11,255,236,3,66,3,112,255,215,3,67,0,45,0,123,3,68,0,5,255,236,3,68,0,10,255,236,3,68,0,89,255,215,3,68,0,90,255,215,3,68,0,91,255,215,3,68,0,92,255,215,3,68,0,93,255,236,3,68,0,191,255,215,3,68,1,55,255,215,3,68,1,60,255,236,3,68,1,62,255,236,3,68,1,64,255,236,3,68,1,251,255,215,3,68,1,253,255,215,3,68,2,7,255,236,3,68,2,11,255,236,3,68,3,112,255,215,3,73,0,15,255,174,3,73,0,17,255,174,3,73,0,36,255,215,3,73,0,55,255,195,3,73,0,57,255,236,3,73,0,58,255,236,3,73,0,59,255,215,3,73,0,60,255,236,3,73,0,61,255,236,3,73,0,130,255,215,3,73,0,131,255,215,3,73,0,132,255,215,3,73,0,133,255,215,3,73,0,134,255,215,3,73,0,135,255,215,3,73,0,159,255,236,3,73,0,194,255,215,3,73,0,196,255,215,3,73,0,198,255,215,3,73,1,36,255,195,3,73,1,38,255,195,3,73,1,54,255,236,3,73,1,56,255,236,3,73,1,58,255,236,3,73,1,59,255,236,3,73,1,61,255,236,3,73,1,63,255,236,3,73,1,67,255,215,3,73,1,160,255,236,3,73,1,250,255,236,3,73,1,252,255,236,3,73,1,254,255,236,3,73,2,0,255,236,3,73,2,8,255,174,3,73,2,12,255,174,3,73,2,88,255,215,3,73,3,29,255,215,3,73,3,31,255,215,3,73,3,33,255,215,3,73,3,35,255,215,3,73,3,37,255,215,3,73,3,39,255,215,3,73,3,41,255,215,3,73,3,43,255,215,3,73,3,45,255,215,3,73,3,47,255,215,3,73,3,49,255,215,3,73,3,51,255,215,3,73,3,111,255,236,3,73,3,113,255,236,3,73,3,115,255,236,3,73,3,143,255,195,3,74,0,5,255,236,3,74,0,10,255,236,3,74,0,89,255,215,3,74,0,90,255,215,3,74,0,91,255,215,3,74,0,92,255,215,3,74,0,93,255,236,3,74,0,191,255,215,3,74,1,55,255,215,3,74,1,60,255,236,3,74,1,62,255,236,3,74,1,64,255,236,3,74,1,251,255,215,3,74,1,253,255,215,3,74,2,7,255,236,3,74,2,11,255,236,3,74,3,112,255,215,3,75,0,15,255,174,3,75,0,17,255,174,3,75,0,36,255,215,3,75,0,55,255,195,3,75,0,57,255,236,3,75,0,58,255,236,3,75,0,59,255,215,3,75,0,60,255,236,3,75,0,61,255,236,3,75,0,130,255,215,3,75,0,131,255,215,3,75,0,132,255,215,3,75,0,133,255,215,3,75,0,134,255,215,3,75,0,135,255,215,3,75,0,159,255,236,3,75,0,194,255,215,3,75,0,196,255,215,3,75,0,198,255,215,3,75,1,36,255,195,3,75,1,38,255,195,3,75,1,54,255,236,3,75,1,56,255,236,3,75,1,58,255,236,3,75,1,59,255,236,3,75,1,61,255,236,3,75,1,63,255,236,3,75,1,67,255,215,3,75,1,160,255,236,3,75,1,250,255,236,3,75,1,252,255,236,3,75,1,254,255,236,3,75,2,0,255,236,3,75,2,8,255,174,3,75,2,12,255,174,3,75,2,88,255,215,3,75,3,29,255,215,3,75,3,31,255,215,3,75,3,33,255,215,3,75,3,35,255,215,3,75,3,37,255,215,3,75,3,39,255,215,3,75,3,41,255,215,3,75,3,43,255,215,3,75,3,45,255,215,3,75,3,47,255,215,3,75,3,49,255,215,3,75,3,51,255,215,3,75,3,111,255,236,3,75,3,113,255,236,3,75,3,115,255,236,3,75,3,143,255,195,3,76,0,5,255,236,3,76,0,10,255,236,3,76,0,89,255,215,3,76,0,90,255,215,3,76,0,91,255,215,3,76,0,92,255,215,3,76,0,93,255,236,3,76,0,191,255,215,3,76,1,55,255,215,3,76,1,60,255,236,3,76,1,62,255,236,3,76,1,64,255,236,3,76,1,251,255,215,3,76,1,253,255,215,3,76,2,7,255,236,3,76,2,11,255,236,3,76,3,112,255,215,3,77,0,15,255,174,3,77,0,17,255,174,3,77,0,36,255,215,3,77,0,55,255,195,3,77,0,57,255,236,3,77,0,58,255,236,3,77,0,59,255,215,3,77,0,60,255,236,3,77,0,61,255,236,3,77,0,130,255,215,3,77,0,131,255,215,3,77,0,132,255,215,3,77,0,133,255,215,3,77,0,134,255,215,3,77,0,135,255,215,3,77,0,159,255,236,3,77,0,194,255,215,3,77,0,196,255,215,3,77,0,198,255,215,3,77,1,36,255,195,3,77,1,38,255,195,3,77,1,54,255,236,3,77,1,56,255,236,3,77,1,58,255,236,3,77,1,59,255,236,3,77,1,61,255,236,3,77,1,63,255,236,3,77,1,67,255,215,3,77,1,160,255,236,3,77,1,250,255,236,3,77,1,252,255,236,3,77,1,254,255,236,3,77,2,0,255,236,3,77,2,8,255,174,3,77,2,12,255,174,3,77,2,88,255,215,3,77,3,29,255,215,3,77,3,31,255,215,3,77,3,33,255,215,3,77,3,35,255,215,3,77,3,37,255,215,3,77,3,39,255,215,3,77,3,41,255,215,3,77,3,43,255,215,3,77,3,45,255,215,3,77,3,47,255,215,3,77,3,49,255,215,3,77,3,51,255,215,3,77,3,111,255,236,3,77,3,113,255,236,3,77,3,115,255,236,3,77,3,143,255,195,3,79,0,15,255,174,3,79,0,17,255,174,3,79,0,36,255,215,3,79,0,55,255,195,3,79,0,57,255,236,3,79,0,58,255,236,3,79,0,59,255,215,3,79,0,60,255,236,3,79,0,61,255,236,3,79,0,130,255,215,3,79,0,131,255,215,3,79,0,132,255,215,3,79,0,133,255,215,3,79,0,134,255,215,3,79,0,135,255,215,3,79,0,159,255,236,3,79,0,194,255,215,3,79,0,196,255,215,3,79,0,198,255,215,3,79,1,36,255,195,3,79,1,38,255,195,3,79,1,54,255,236,3,79,1,56,255,236,3,79,1,58,255,236,3,79,1,59,255,236,3,79,1,61,255,236,3,79,1,63,255,236,3,79,1,67,255,215,3,79,1,160,255,236,3,79,1,250,255,236,3,79,1,252,255,236,3,79,1,254,255,236,3,79,2,0,255,236,3,79,2,8,255,174,3,79,2,12,255,174,3,79,2,88,255,215,3,79,3,29,255,215,3,79,3,31,255,215,3,79,3,33,255,215,3,79,3,35,255,215,3,79,3,37,255,215,3,79,3,39,255,215,3,79,3,41,255,215,3,79,3,43,255,215,3,79,3,45,255,215,3,79,3,47,255,215,3,79,3,49,255,215,3,79,3,51,255,215,3,79,3,111,255,236,3,79,3,113,255,236,3,79,3,115,255,236,3,79,3,143,255,195,3,81,0,15,255,174,3,81,0,17,255,174,3,81,0,36,255,215,3,81,0,55,255,195,3,81,0,57,255,236,3,81,0,58,255,236,3,81,0,59,255,215,3,81,0,60,255,236,3,81,0,61,255,236,3,81,0,130,255,215,3,81,0,131,255,215,3,81,0,132,255,215,3,81,0,133,255,215,3,81,0,134,255,215,3,81,0,135,255,215,3,81,0,159,255,236,3,81,0,194,255,215,3,81,0,196,255,215,3,81,0,198,255,215,3,81,1,36,255,195,3,81,1,38,255,195,3,81,1,54,255,236,3,81,1,56,255,236,3,81,1,58,255,236,3,81,1,59,255,236,3,81,1,61,255,236,3,81,1,63,255,236,3,81,1,67,255,215,3,81,1,160,255,236,3,81,1,250,255,236,3,81,1,252,255,236,3,81,1,254,255,236,3,81,2,0,255,236,3,81,2,8,255,174,3,81,2,12,255,174,3,81,2,88,255,215,3,81,3,29,255,215,3,81,3,31,255,215,3,81,3,33,255,215,3,81,3,35,255,215,3,81,3,37,255,215,3,81,3,39,255,215,3,81,3,41,255,215,3,81,3,43,255,215,3,81,3,45,255,215,3,81,3,47,255,215,3,81,3,49,255,215,3,81,3,51,255,215,3,81,3,111,255,236,3,81,3,113,255,236,3,81,3,115,255,236,3,81,3,143,255,195,3,83,0,15,255,174,3,83,0,17,255,174,3,83,0,36,255,215,3,83,0,55,255,195,3,83,0,57,255,236,3,83,0,58,255,236,3,83,0,59,255,215,3,83,0,60,255,236,3,83,0,61,255,236,3,83,0,130,255,215,3,83,0,131,255,215,3,83,0,132,255,215,3,83,0,133,255,215,3,83,0,134,255,215,3,83,0,135,255,215,3,83,0,159,255,236,3,83,0,194,255,215,3,83,0,196,255,215,3,83,0,198,255,215,3,83,1,36,255,195,3,83,1,38,255,195,3,83,1,54,255,236,3,83,1,56,255,236,3,83,1,58,255,236,3,83,1,59,255,236,3,83,1,61,255,236,3,83,1,63,255,236,3,83,1,67,255,215,3,83,1,160,255,236,3,83,1,250,255,236,3,83,1,252,255,236,3,83,1,254,255,236,3,83,2,0,255,236,3,83,2,8,255,174,3,83,2,12,255,174,3,83,2,88,255,215,3,83,3,29,255,215,3,83,3,31,255,215,3,83,3,33,255,215,3,83,3,35,255,215,3,83,3,37,255,215,3,83,3,39,255,215,3,83,3,41,255,215,3,83,3,43,255,215,3,83,3,45,255,215,3,83,3,47,255,215,3,83,3,49,255,215,3,83,3,51,255,215,3,83,3,111,255,236,3,83,3,113,255,236,3,83,3,115,255,236,3,83,3,143,255,195,3,85,0,15,255,174,3,85,0,17,255,174,3,85,0,36,255,215,3,85,0,55,255,195,3,85,0,57,255,236,3,85,0,58,255,236,3,85,0,59,255,215,3,85,0,60,255,236,3,85,0,61,255,236,3,85,0,130,255,215,3,85,0,131,255,215,3,85,0,132,255,215,3,85,0,133,255,215,3,85,0,134,255,215,3,85,0,135,255,215,3,85,0,159,255,236,3,85,0,194,255,215,3,85,0,196,255,215,3,85,0,198,255,215,3,85,1,36,255,195,3,85,1,38,255,195,3,85,1,54,255,236,3,85,1,56,255,236,3,85,1,58,255,236,3,85,1,59,255,236,3,85,1,61,255,236,3,85,1,63,255,236,3,85,1,67,255,215,3,85,1,160,255,236,3,85,1,250,255,236,3,85,1,252,255,236,3,85,1,254,255,236,3,85,2,0,255,236,3,85,2,8,255,174,3,85,2,12,255,174,3,85,2,88,255,215,3,85,3,29,255,215,3,85,3,31,255,215,3,85,3,33,255,215,3,85,3,35,255,215,3,85,3,37,255,215,3,85,3,39,255,215,3,85,3,41,255,215,3,85,3,43,255,215,3,85,3,45,255,215,3,85,3,47,255,215,3,85,3,49,255,215,3,85,3,51,255,215,3,85,3,111,255,236,3,85,3,113,255,236,3,85,3,115,255,236,3,85,3,143,255,195,3,88,0,73,0,82,3,88,0,87,0,82,3,88,0,89,0,102,3,88,0,90,0,102,3,88,0,91,0,102,3,88,0,92,0,102,3,88,0,191,0,102,3,88,1,37,0,82,3,88,1,39,0,82,3,88,1,55,0,102,3,88,1,251,0,102,3,88,1,253,0,102,3,88,2,52,0,82,3,88,2,53,0,82,3,88,2,93,0,82,3,88,2,94,0,82,3,88,3,112,0,102,3,88,3,141,0,82,3,88,3,144,0,82,3,90,0,73,0,82,3,90,0,87,0,82,3,90,0,89,0,102,3,90,0,90,0,102,3,90,0,91,0,102,3,90,0,92,0,102,3,90,0,191,0,102,3,90,1,37,0,82,3,90,1,39,0,82,3,90,1,55,0,102,3,90,1,251,0,102,3,90,1,253,0,102,3,90,2,52,0,82,3,90,2,53,0,82,3,90,2,93,0,82,3,90,2,94,0,82,3,90,3,112,0,102,3,90,3,141,0,82,3,90,3,144,0,82,3,92,0,73,0,82,3,92,0,87,0,82,3,92,0,89,0,102,3,92,0,90,0,102,3,92,0,91,0,102,3,92,0,92,0,102,3,92,0,191,0,102,3,92,1,37,0,82,3,92,1,39,0,82,3,92,1,55,0,102,3,92,1,251,0,102,3,92,1,253,0,102,3,92,2,52,0,82,3,92,2,53,0,82,3,92,2,93,0,82,3,92,2,94,0,82,3,92,3,112,0,102,3,92,3,141,0,82,3,92,3,144,0,82,3,94,0,73,0,82,3,94,0,87,0,82,3,94,0,89,0,102,3,94,0,90,0,102,3,94,0,91,0,102,3,94,0,92,0,102,3,94,0,191,0,102,3,94,1,37,0,82,3,94,1,39,0,82,3,94,1,55,0,102,3,94,1,251,0,102,3,94,1,253,0,102,3,94,2,52,0,82,3,94,2,53,0,82,3,94,2,93,0,82,3,94,2,94,0,82,3,94,3,112,0,102,3,94,3,141,0,82,3,94,3,144,0,82,3,96,0,73,0,82,3,96,0,87,0,82,3,96,0,89,0,102,3,96,0,90,0,102,3,96,0,91,0,102,3,96,0,92,0,102,3,96,0,191,0,102,3,96,1,37,0,82,3,96,1,39,0,82,3,96,1,55,0,102,3,96,1,251,0,102,3,96,1,253,0,102,3,96,2,52,0,82,3,96,2,53,0,82,3,96,2,93,0,82,3,96,2,94,0,82,3,96,3,112,0,102,3,96,3,141,0,82,3,96,3,144,0,82,3,97,0,15,255,215,3,97,0,17,255,215,3,97,0,36,255,236,3,97,0,130,255,236,3,97,0,131,255,236,3,97,0,132,255,236,3,97,0,133,255,236,3,97,0,134,255,236,3,97,0,135,255,236,3,97,0,194,255,236,3,97,0,196,255,236,3,97,0,198,255,236,3,97,1,67,255,236,3,97,2,8,255,215,3,97,2,12,255,215,3,97,2,88,255,236,3,97,3,29,255,236,3,97,3,31,255,236,3,97,3,33,255,236,3,97,3,35,255,236,3,97,3,37,255,236,3,97,3,39,255,236,3,97,3,41,255,236,3,97,3,43,255,236,3,97,3,45,255,236,3,97,3,47,255,236,3,97,3,49,255,236,3,97,3,51,255,236,3,102,0,73,0,102,3,102,0,87,0,102,3,102,0,89,0,102,3,102,0,90,0,102,3,102,0,91,0,102,3,102,0,92,0,102,3,102,0,191,0,102,3,102,1,37,0,102,3,102,1,39,0,102,3,102,1,55,0,102,3,102,1,251,0,102,3,102,1,253,0,102,3,102,2,52,0,102,3,102,2,53,0,102,3,102,2,93,0,102,3,102,2,94,0,102,3,102,3,112,0,102,3,102,3,141,0,102,3,102,3,144,0,102,3,104,0,73,0,102,3,104,0,87,0,102,3,104,0,89,0,102,3,104,0,90,0,102,3,104,0,91,0,102,3,104,0,92,0,102,3,104,0,191,0,102,3,104,1,37,0,102,3,104,1,39,0,102,3,104,1,55,0,102,3,104,1,251,0,102,3,104,1,253,0,102,3,104,2,52,0,102,3,104,2,53,0,102,3,104,2,93,0,102,3,104,2,94,0,102,3,104,3,112,0,102,3,104,3,141,0,102,3,104,3,144,0,102,3,106,0,73,0,102,3,106,0,87,0,102,3,106,0,89,0,102,3,106,0,90,0,102,3,106,0,91,0,102,3,106,0,92,0,102,3,106,0,191,0,102,3,106,1,37,0,102,3,106,1,39,0,102,3,106,1,55,0,102,3,106,1,251,0,102,3,106,1,253,0,102,3,106,2,52,0,102,3,106,2,53,0,102,3,106,2,93,0,102,3,106,2,94,0,102,3,106,3,112,0,102,3,106,3,141,0,102,3,106,3,144,0,102,3,108,0,73,0,102,3,108,0,87,0,102,3,108,0,89,0,102,3,108,0,90,0,102,3,108,0,91,0,102,3,108,0,92,0,102,3,108,0,191,0,102,3,108,1,37,0,102,3,108,1,39,0,102,3,108,1,55,0,102,3,108,1,251,0,102,3,108,1,253,0,102,3,108,2,52,0,102,3,108,2,53,0,102,3,108,2,93,0,102,3,108,2,94,0,102,3,108,3,112,0,102,3,108,3,141,0,102,3,108,3,144,0,102,3,110,0,73,0,102,3,110,0,87,0,102,3,110,0,89,0,102,3,110,0,90,0,102,3,110,0,91,0,102,3,110,0,92,0,102,3,110,0,191,0,102,3,110,1,37,0,102,3,110,1,39,0,102,3,110,1,55,0,102,3,110,1,251,0,102,3,110,1,253,0,102,3,110,2,52,0,102,3,110,2,53,0,102,3,110,2,93,0,102,3,110,2,94,0,102,3,110,3,112,0,102,3,110,3,141,0,102,3,110,3,144,0,102,3,111,0,15,255,133,3,111,0,17,255,133,3,111,0,34,0,41,3,111,0,36,255,133,3,111,0,38,255,215,3,111,0,42,255,215,3,111,0,50,255,215,3,111,0,52,255,215,3,111,0,68,255,154,3,111,0,70,255,154,3,111,0,71,255,154,3,111,0,72,255,154,3,111,0,74,255,215,3,111,0,80,255,195,3,111,0,81,255,195,3,111,0,82,255,154,3,111,0,83,255,195,3,111,0,84,255,154,3,111,0,85,255,195,3,111,0,86,255,174,3,111,0,88,255,195,3,111,0,93,255,215,3,111,0,130,255,133,3,111,0,131,255,133,3,111,0,132,255,133,3,111,0,133,255,133,3,111,0,134,255,133,3,111,0,135,255,133,3,111,0,137,255,215,3,111,0,148,255,215,3,111,0,149,255,215,3,111,0,150,255,215,3,111,0,151,255,215,3,111,0,152,255,215,3,111,0,154,255,215,3,111,0,162,255,154,3,111,0,163,255,154,3,111,0,164,255,154,3,111,0,165,255,154,3,111,0,166,255,154,3,111,0,167,255,154,3,111,0,168,255,154,3,111,0,169,255,154,3,111,0,170,255,154,3,111,0,171,255,154,3,111,0,172,255,154,3,111,0,173,255,154,3,111,0,180,255,154,3,111,0,181,255,154,3,111,0,182,255,154,3,111,0,183,255,154,3,111,0,184,255,154,3,111,0,186,255,154,3,111,0,187,255,195,3,111,0,188,255,195,3,111,0,189,255,195,3,111,0,190,255,195,3,111,0,194,255,133,3,111,0,195,255,154,3,111,0,196,255,133,3,111,0,197,255,154,3,111,0,198,255,133,3,111,0,199,255,154,3,111,0,200,255,215,3,111,0,201,255,154,3,111,0,202,255,215,3,111,0,203,255,154,3,111,0,204,255,215,3,111,0,205,255,154,3,111,0,206,255,215,3,111,0,207,255,154,3,111,0,209,255,154,3,111,0,211,255,154,3,111,0,213,255,154,3,111,0,215,255,154,3,111,0,217,255,154,3,111,0,219,255,154,3,111,0,221,255,154,3,111,0,222,255,215,3,111,0,223,255,215,3,111,0,224,255,215,3,111,0,225,255,215,3,111,0,226,255,215,3,111,0,227,255,215,3,111,0,228,255,215,3,111,0,229,255,215,3,111,0,250,255,195,3,111,1,6,255,195,3,111,1,8,255,195,3,111,1,13,255,195,3,111,1,14,255,215,3,111,1,15,255,154,3,111,1,16,255,215,3,111,1,17,255,154,3,111,1,18,255,215,3,111,1,19,255,154,3,111,1,20,255,215,3,111,1,21,255,154,3,111,1,23,255,195,3,111,1,25,255,195,3,111,1,29,255,174,3,111,1,33,255,174,3,111,1,43,255,195,3,111,1,45,255,195,3,111,1,47,255,195,3,111,1,49,255,195,3,111,1,51,255,195,3,111,1,53,255,195,3,111,1,60,255,215,3,111,1,62,255,215,3,111,1,64,255,215,3,111,1,67,255,133,3,111,1,68,255,154,3,111,1,70,255,154,3,111,1,71,255,215,3,111,1,72,255,154,3,111,1,74,255,174,3,111,2,8,255,133,3,111,2,12,255,133,3,111,2,87,255,195,3,111,2,88,255,133,3,111,2,89,255,154,3,111,2,95,255,215,3,111,2,96,255,154,3,111,2,98,255,195,3,111,3,29,255,133,3,111,3,30,255,154,3,111,3,31,255,133,3,111,3,32,255,154,3,111,3,33,255,133,3,111,3,34,255,154,3,111,3,35,255,133,3,111,3,37,255,133,3,111,3,38,255,154,3,111,3,39,255,133,3,111,3,40,255,154,3,111,3,41,255,133,3,111,3,42,255,154,3,111,3,43,255,133,3,111,3,44,255,154,3,111,3,45,255,133,3,111,3,46,255,154,3,111,3,47,255,133,3,111,3,48,255,154,3,111,3,49,255,133,3,111,3,50,255,154,3,111,3,51,255,133,3,111,3,52,255,154,3,111,3,54,255,154,3,111,3,56,255,154,3,111,3,58,255,154,3,111,3,60,255,154,3,111,3,64,255,154,3,111,3,66,255,154,3,111,3,68,255,154,3,111,3,73,255,215,3,111,3,74,255,154,3,111,3,75,255,215,3,111,3,76,255,154,3,111,3,77,255,215,3,111,3,78,255,154,3,111,3,79,255,215,3,111,3,81,255,215,3,111,3,82,255,154,3,111,3,83,255,215,3,111,3,84,255,154,3,111,3,85,255,215,3,111,3,86,255,154,3,111,3,87,255,215,3,111,3,88,255,154,3,111,3,89,255,215,3,111,3,90,255,154,3,111,3,91,255,215,3,111,3,92,255,154,3,111,3,93,255,215,3,111,3,94,255,154,3,111,3,95,255,215,3,111,3,96,255,154,3,111,3,98,255,195,3,111,3,100,255,195,3,111,3,102,255,195,3,111,3,104,255,195,3,111,3,106,255,195,3,111,3,108,255,195,3,111,3,110,255,195,3,112,0,5,0,82,3,112,0,10,0,82,3,112,0,15,255,174,3,112,0,17,255,174,3,112,0,34,0,41,3,112,2,7,0,82,3,112,2,8,255,174,3,112,2,11,0,82,3,112,2,12,255,174,3,113,0,15,255,133,3,113,0,17,255,133,3,113,0,34,0,41,3,113,0,36,255,133,3,113,0,38,255,215,3,113,0,42,255,215,3,113,0,50,255,215,3,113,0,52,255,215,3,113,0,68,255,154,3,113,0,70,255,154,3,113,0,71,255,154,3,113,0,72,255,154,3,113,0,74,255,215,3,113,0,80,255,195,3,113,0,81,255,195,3,113,0,82,255,154,3,113,0,83,255,195,3,113,0,84,255,154,3,113,0,85,255,195,3,113,0,86,255,174,3,113,0,88,255,195,3,113,0,93,255,215,3,113,0,130,255,133,3,113,0,131,255,133,3,113,0,132,255,133,3,113,0,133,255,133,3,113,0,134,255,133,3,113,0,135,255,133,3,113,0,137,255,215,3,113,0,148,255,215,3,113,0,149,255,215,3,113,0,150,255,215,3,113,0,151,255,215,3,113,0,152,255,215,3,113,0,154,255,215,3,113,0,162,255,154,3,113,0,163,255,154,3,113,0,164,255,154,3,113,0,165,255,154,3,113,0,166,255,154,3,113,0,167,255,154,3,113,0,168,255,154,3,113,0,169,255,154,3,113,0,170,255,154,3,113,0,171,255,154,3,113,0,172,255,154,3,113,0,173,255,154,3,113,0,180,255,154,3,113,0,181,255,154,3,113,0,182,255,154,3,113,0,183,255,154,3,113,0,184,255,154,3,113,0,186,255,154,3,113,0,187,255,195,3,113,0,188,255,195,3,113,0,189,255,195,3,113,0,190,255,195,3,113,0,194,255,133,3,113,0,195,255,154,3,113,0,196,255,133,3,113,0,197,255,154,3,113,0,198,255,133,3,113,0,199,255,154,3,113,0,200,255,215,3,113,0,201,255,154,3,113,0,202,255,215,3,113,0,203,255,154,3,113,0,204,255,215,3,113,0,205,255,154,3,113,0,206,255,215,3,113,0,207,255,154,3,113,0,209,255,154,3,113,0,211,255,154,3,113,0,213,255,154,3,113,0,215,255,154,3,113,0,217,255,154,3,113,0,219,255,154,3,113,0,221,255,154,3,113,0,222,255,215,3,113,0,223,255,215,3,113,0,224,255,215,3,113,0,225,255,215,3,113,0,226,255,215,3,113,0,227,255,215,3,113,0,228,255,215,3,113,0,229,255,215,3,113,0,250,255,195,3,113,1,6,255,195,3,113,1,8,255,195,3,113,1,13,255,195,3,113,1,14,255,215,3,113,1,15,255,154,3,113,1,16,255,215,3,113,1,17,255,154,3,113,1,18,255,215,3,113,1,19,255,154,3,113,1,20,255,215,3,113,1,21,255,154,3,113,1,23,255,195,3,113,1,25,255,195,3,113,1,29,255,174,3,113,1,33,255,174,3,113,1,43,255,195,3,113,1,45,255,195,3,113,1,47,255,195,3,113,1,49,255,195,3,113,1,51,255,195,3,113,1,53,255,195,3,113,1,60,255,215,3,113,1,62,255,215,3,113,1,64,255,215,3,113,1,67,255,133,3,113,1,68,255,154,3,113,1,70,255,154,3,113,1,71,255,215,3,113,1,72,255,154,3,113,1,74,255,174,3,113,2,8,255,133,3,113,2,12,255,133,3,113,2,87,255,195,3,113,2,88,255,133,3,113,2,89,255,154,3,113,2,95,255,215,3,113,2,96,255,154,3,113,2,98,255,195,3,113,3,29,255,133,3,113,3,30,255,154,3,113,3,31,255,133,3,113,3,32,255,154,3,113,3,33,255,133,3,113,3,34,255,154,3,113,3,35,255,133,3,113,3,37,255,133,3,113,3,38,255,154,3,113,3,39,255,133,3,113,3,40,255,154,3,113,3,41,255,133,3,113,3,42,255,154,3,113,3,43,255,133,3,113,3,44,255,154,3,113,3,45,255,133,3,113,3,46,255,154,3,113,3,47,255,133,3,113,3,48,255,154,3,113,3,49,255,133,3,113,3,50,255,154,3,113,3,51,255,133,3,113,3,52,255,154,3,113,3,54,255,154,3,113,3,56,255,154,3,113,3,58,255,154,3,113,3,60,255,154,3,113,3,64,255,154,3,113,3,66,255,154,3,113,3,68,255,154,3,113,3,73,255,215,3,113,3,74,255,154,3,113,3,75,255,215,3,113,3,76,255,154,3,113,3,77,255,215,3,113,3,78,255,154,3,113,3,79,255,215,3,113,3,81,255,215,3,113,3,82,255,154,3,113,3,83,255,215,3,113,3,84,255,154,3,113,3,85,255,215,3,113,3,86,255,154,3,113,3,87,255,215,3,113,3,88,255,154,3,113,3,89,255,215,3,113,3,90,255,154,3,113,3,91,255,215,3,113,3,92,255,154,3,113,3,93,255,215,3,113,3,94,255,154,3,113,3,95,255,215,3,113,3,96,255,154,3,113,3,98,255,195,3,113,3,100,255,195,3,113,3,102,255,195,3,113,3,104,255,195,3,113,3,106,255,195,3,113,3,108,255,195,3,113,3,110,255,195,3,114,0,5,0,82,3,114,0,10,0,82,3,114,0,15,255,174,3,114,0,17,255,174,3,114,0,34,0,41,3,114,2,7,0,82,3,114,2,8,255,174,3,114,2,11,0,82,3,114,2,12,255,174,3,115,0,15,255,133,3,115,0,17,255,133,3,115,0,34,0,41,3,115,0,36,255,133,3,115,0,38,255,215,3,115,0,42,255,215,3,115,0,50,255,215,3,115,0,52,255,215,3,115,0,68,255,154,3,115,0,70,255,154,3,115,0,71,255,154,3,115,0,72,255,154,3,115,0,74,255,215,3,115,0,80,255,195,3,115,0,81,255,195,3,115,0,82,255,154,3,115,0,83,255,195,3,115,0,84,255,154,3,115,0,85,255,195,3,115,0,86,255,174,3,115,0,88,255,195,3,115,0,93,255,215,3,115,0,130,255,133,3,115,0,131,255,133,3,115,0,132,255,133,3,115,0,133,255,133,3,115,0,134,255,133,3,115,0,135,255,133,3,115,0,137,255,215,3,115,0,148,255,215,3,115,0,149,255,215,3,115,0,150,255,215,3,115,0,151,255,215,3,115,0,152,255,215,3,115,0,154,255,215,3,115,0,162,255,154,3,115,0,163,255,154,3,115,0,164,255,154,3,115,0,165,255,154,3,115,0,166,255,154,3,115,0,167,255,154,3,115,0,168,255,154,3,115,0,169,255,154,3,115,0,170,255,154,3,115,0,171,255,154,3,115,0,172,255,154,3,115,0,173,255,154,3,115,0,180,255,154,3,115,0,181,255,154,3,115,0,182,255,154,3,115,0,183,255,154,3,115,0,184,255,154,3,115,0,186,255,154,3,115,0,187,255,195,3,115,0,188,255,195,3,115,0,189,255,195,3,115,0,190,255,195,3,115,0,194,255,133,3,115,0,195,255,154,3,115,0,196,255,133,3,115,0,197,255,154,3,115,0,198,255,133,3,115,0,199,255,154,3,115,0,200,255,215,3,115,0,201,255,154,3,115,0,202,255,215,3,115,0,203,255,154,3,115,0,204,255,215,3,115,0,205,255,154,3,115,0,206,255,215,3,115,0,207,255,154,3,115,0,209,255,154,3,115,0,211,255,154,3,115,0,213,255,154,3,115,0,215,255,154,3,115,0,217,255,154,3,115,0,219,255,154,3,115,0,221,255,154,3,115,0,222,255,215,3,115,0,223,255,215,3,115,0,224,255,215,3,115,0,225,255,215,3,115,0,226,255,215,3,115,0,227,255,215,3,115,0,228,255,215,3,115,0,229,255,215,3,115,0,250,255,195,3,115,1,6,255,195,3,115,1,8,255,195,3,115,1,13,255,195,3,115,1,14,255,215,3,115,1,15,255,154,3,115,1,16,255,215,3,115,1,17,255,154,3,115,1,18,255,215,3,115,1,19,255,154,3,115,1,20,255,215,3,115,1,21,255,154,3,115,1,23,255,195,3,115,1,25,255,195,3,115,1,29,255,174,3,115,1,33,255,174,3,115,1,43,255,195,3,115,1,45,255,195,3,115,1,47,255,195,3,115,1,49,255,195,3,115,1,51,255,195,3,115,1,53,255,195,3,115,1,60,255,215,3,115,1,62,255,215,3,115,1,64,255,215,3,115,1,67,255,133,3,115,1,68,255,154,3,115,1,70,255,154,3,115,1,71,255,215,3,115,1,72,255,154,3,115,1,74,255,174,3,115,2,8,255,133,3,115,2,12,255,133,3,115,2,87,255,195,3,115,2,88,255,133,3,115,2,89,255,154,3,115,2,95,255,215,3,115,2,96,255,154,3,115,2,98,255,195,3,115,3,29,255,133,3,115,3,30,255,154,3,115,3,31,255,133,3,115,3,32,255,154,3,115,3,33,255,133,3,115,3,34,255,154,3,115,3,35,255,133,3,115,3,37,255,133,3,115,3,38,255,154,3,115,3,39,255,133,3,115,3,40,255,154,3,115,3,41,255,133,3,115,3,42,255,154,3,115,3,43,255,133,3,115,3,44,255,154,3,115,3,45,255,133,3,115,3,46,255,154,3,115,3,47,255,133,3,115,3,48,255,154,3,115,3,49,255,133,3,115,3,50,255,154,3,115,3,51,255,133,3,115,3,52,255,154,3,115,3,54,255,154,3,115,3,56,255,154,3,115,3,58,255,154,3,115,3,60,255,154,3,115,3,64,255,154,3,115,3,66,255,154,3,115,3,68,255,154,3,115,3,73,255,215,3,115,3,74,255,154,3,115,3,75,255,215,3,115,3,76,255,154,3,115,3,77,255,215,3,115,3,78,255,154,3,115,3,79,255,215,3,115,3,81,255,215,3,115,3,82,255,154,3,115,3,83,255,215,3,115,3,84,255,154,3,115,3,85,255,215,3,115,3,86,255,154,3,115,3,87,255,215,3,115,3,88,255,154,3,115,3,89,255,215,3,115,3,90,255,154,3,115,3,91,255,215,3,115,3,92,255,154,3,115,3,93,255,215,3,115,3,94,255,154,3,115,3,95,255,215,3,115,3,96,255,154,3,115,3,98,255,195,3,115,3,100,255,195,3,115,3,102,255,195,3,115,3,104,255,195,3,115,3,106,255,195,3,115,3,108,255,195,3,115,3,110,255,195,3,116,0,5,0,82,3,116,0,10,0,82,3,116,0,15,255,174,3,116,0,17,255,174,3,116,0,34,0,41,3,116,2,7,0,82,3,116,2,8,255,174,3,116,2,11,0,82,3,116,2,12,255,174,3,141,0,5,0,123,3,141,0,10,0,123,3,141,2,7,0,123,3,141,2,11,0,123,3,143,0,15,255,133,3,143,0,16,255,174,3,143,0,17,255,133,3,143,0,34,0,41,3,143,0,36,255,113,3,143,0,38,255,215,3,143,0,42,255,215,3,143,0,50,255,215,3,143,0,52,255,215,3,143,0,55,0,41,3,143,0,68,255,92,3,143,0,70,255,113,3,143,0,71,255,113,3,143,0,72,255,113,3,143,0,74,255,113,3,143,0,80,255,154,3,143,0,81,255,154,3,143,0,82,255,113,3,143,0,83,255,154,3,143,0,84,255,113,3,143,0,85,255,154,3,143,0,86,255,133,3,143,0,88,255,154,3,143,0,89,255,215,3,143,0,90,255,215,3,143,0,91,255,215,3,143,0,92,255,215,3,143,0,93,255,174,3,143,0,130,255,113,3,143,0,131,255,113,3,143,0,132,255,113,3,143,0,133,255,113,3,143,0,134,255,113,3,143,0,135,255,113,3,143,0,137,255,215,3,143,0,148,255,215,3,143,0,149,255,215,3,143,0,150,255,215,3,143,0,151,255,215,3,143,0,152,255,215,3,143,0,154,255,215,3,143,0,162,255,113,3,143,0,163,255,92,3,143,0,164,255,92,3,143,0,165,255,92,3,143,0,166,255,92,3,143,0,167,255,92,3,143,0,168,255,92,3,143,0,169,255,113,3,143,0,170,255,113,3,143,0,171,255,113,3,143,0,172,255,113,3,143,0,173,255,113,3,143,0,180,255,113,3,143,0,181,255,113,3,143,0,182,255,113,3,143,0,183,255,113,3,143,0,184,255,113,3,143,0,186,255,113,3,143,0,187,255,154,3,143,0,188,255,154,3,143,0,189,255,154,3,143,0,190,255,154,3,143,0,191,255,215,3,143,0,194,255,113,3,143,0,195,255,92,3,143,0,196,255,113,3,143,0,197,255,92,3,143,0,198,255,113,3,143,0,199,255,92,3,143,0,200,255,215,3,143,0,201,255,113,3,143,0,202,255,215,3,143,0,203,255,113,3,143,0,204,255,215,3,143,0,205,255,113,3,143,0,206,255,215,3,143,0,207,255,113,3,143,0,209,255,113,3,143,0,211,255,113,3,143,0,213,255,113,3,143,0,215,255,113,3,143,0,217,255,113,3,143,0,219,255,113,3,143,0,221,255,113,3,143,0,222,255,215,3,143,0,223,255,113,3,143,0,224,255,215,3,143,0,225,255,113,3,143,0,226,255,215,3,143,0,227,255,113,3,143,0,228,255,215,3,143,0,229,255,113,3,143,0,250,255,154,3,143,1,6,255,154,3,143,1,8,255,154,3,143,1,13,255,154,3,143,1,14,255,215,3,143,1,15,255,113,3,143,1,16,255,215,3,143,1,17,255,113,3,143,1,18,255,215,3,143,1,19,255,113,3,143,1,20,255,215,3,143,1,21,255,113,3,143,1,23,255,154,3,143,1,25,255,154,3,143,1,29,255,133,3,143,1,33,255,133,3,143,1,36,0,41,3,143,1,38,0,41,3,143,1,43,255,154,3,143,1,45,255,154,3,143,1,47,255,154,3,143,1,49,255,154,3,143,1,51,255,154,3,143,1,53,255,154,3,143,1,55,255,215,3,143,1,60,255,174,3,143,1,62,255,174,3,143,1,64,255,174,3,143,1,67,255,113,3,143,1,68,255,92,3,143,1,70,255,92,3,143,1,71,255,215,3,143,1,72,255,113,3,143,1,74,255,133,3,143,1,251,255,215,3,143,1,253,255,215,3,143,2,2,255,174,3,143,2,3,255,174,3,143,2,4,255,174,3,143,2,8,255,133,3,143,2,12,255,133,3,143,2,87,255,154,3,143,2,88,255,113,3,143,2,89,255,92,3,143,2,95,255,215,3,143,2,96,255,113,3,143,2,98,255,154,3,143,3,29,255,113,3,143,3,30,255,92,3,143,3,31,255,113,3,143,3,32,255,92,3,143,3,33,255,113,3,143,3,34,255,92,3,143,3,35,255,113,3,143,3,37,255,113,3,143,3,38,255,92,3,143,3,39,255,113,3,143,3,40,255,92,3,143,3,41,255,113,3,143,3,42,255,92,3,143,3,43,255,113,3,143,3,44,255,92,3,143,3,45,255,113,3,143,3,46,255,92,3,143,3,47,255,113,3,143,3,48,255,92,3,143,3,49,255,113,3,143,3,50,255,92,3,143,3,51,255,113,3,143,3,52,255,92,3,143,3,54,255,113,3,143,3,56,255,113,3,143,3,58,255,113,3,143,3,60,255,113,3,143,3,64,255,113,3,143,3,66,255,113,3,143,3,68,255,113,3,143,3,73,255,215,3,143,3,74,255,113,3,143,3,75,255,215,3,143,3,76,255,113,3,143,3,77,255,215,3,143,3,78,255,113,3,143,3,79,255,215,3,143,3,81,255,215,3,143,3,82,255,113,3,143,3,83,255,215,3,143,3,84,255,113,3,143,3,85,255,215,3,143,3,86,255,113,3,143,3,87,255,215,3,143,3,88,255,113,3,143,3,89,255,215,3,143,3,90,255,113,3,143,3,91,255,215,3,143,3,92,255,113,3,143,3,93,255,215,3,143,3,94,255,113,3,143,3,95,255,215,3,143,3,96,255,113,3,143,3,98,255,154,3,143,3,100,255,154,3,143,3,102,255,154,3,143,3,104,255,154,3,143,3,106,255,154,3,143,3,108,255,154,3,143,3,110,255,154,3,143,3,112,255,215,3,143,3,143,0,41,3,144,0,5,0,41,3,144,0,10,0,41,3,144,2,7,0,41,3,144,2,11,0,41,0,0,0,0,0,26,1,62,0,1,0,0,0,0,0,0,0,57,0,0,0,1,0,0,0,0,0,1,0,9,0,57,0,1,0,0,0,0,0,2,0,7,0,66,0,1,0,0,0,0,0,3,0,30,0,73,0,1,0,0,0,0,0,4,0,9,0,57,0,1,0,0,0,0,0,5,0,12,0,103,0,1,0,0,0,0,0,6,0,8,0,115,0,1,0,0,0,0,0,7,0,82,0,123,0,1,0,0,0,0,0,8,0,20,0,205,0,1,0,0,0,0,0,11,0,28,0,225,0,1,0,0,0,0,0,12,0,46,0,253,0,1,0,0,0,0,0,13,0,46,1,43,0,1,0,0,0,0,0,14,0,42,1,89,0,3,0,1,4,9,0,0,0,114,1,131,0,3,0,1,4,9,0,1,0,18,1,245,0,3,0,1,4,9,0,2,0,14,2,7,0,3,0,1,4,9,0,3,0,60,2,21,0,3,0,1,4,9,0,4,0,18,1,245,0,3,0,1,4,9,0,5,0,24,2,81,0,3,0,1,4,9,0,6,0,16,2,105,0,3,0,1,4,9,0,7,0,164,2,121,0,3,0,1,4,9,0,8,0,40,3,29,0,3,0,1,4,9,0,11,0,56,3,69,0,3,0,1,4,9,0,12,0,92,3,125,0,3,0,1,4,9,0,13,0,92,3,217,0,3,0,1,4,9,0,14,0,84,4,53,68,105,103,105,116,105,122,101,100,32,100,97,116,97,32,99,111,112,121,114,105,103,104,116,32,169,32,50,48,49,48,45,50,48,49,49,44,32,71,111,111,103,108,101,32,67,111,114,112,111,114,97,116,105,111,110,46,79,112,101,110,32,83,97,110,115,82,101,103,117,108,97,114,65,115,99,101,110,100,101,114,32,45,32,79,112,101,110,32,83,97,110,115,32,66,117,105,108,100,32,49,48,48,86,101,114,115,105,111,110,32,49,46,49,48,79,112,101,110,83,97,110,115,79,112,101,110,32,83,97,110,115,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,102,32,71,111,111,103,108,101,32,97,110,100,32,109,97,121,32,98,101,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,99,101,114,116,97,105,110,32,106,117,114,105,115,100,105,99,116,105,111,110,115,46,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,100,101,114,99,111,114,112,46,99,111,109,47,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115,105,103,110,101,114,115,46,104,116,109,108,76,105,99,101,110,115,101,100,32,117,110,100,101,114,32,116,104,101,32,65,112,97,99,104,101,32,76,105,99,101,110,115,101,44,32,86,101,114,115,105,111,110,32,50,46,48,104,116,116,112,58,47,47,119,119,119,46,97,112,97,99,104,101,46,111,114,103,47,108,105,99,101,110,115,101,115,47,76,73,67,69,78,83,69,45,50,46,48,0,68,0,105,0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32,0,99,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,169,0,32,0,50,0,48,0,49,0,48,0,45,0,50,0,48,0,49,0,49,0,44,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,79,0,112,0,101,0,110,0,32,0,83,0,97,0,110,0,115,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,65,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,79,0,112,0,101,0,110,0,32,0,83,0,97,0,110,0,115,0,32,0,66,0,117,0,105,0,108,0,100,0,32,0,49,0,48,0,48,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,49,0,48,0,79,0,112,0,101,0,110,0,83,0,97,0,110,0,115,0,79,0,112,0,101,0,110,0,32,0,83,0,97,0,110,0,115,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,32,0,97,0,110,0,100,0,32,0,109,0,97,0,121,0,32,0,98,0,101,0,32,0,114,0,101,0,103,0,105,0,115,0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110,0,32,0,106,0,117,0,114,0,105,0,115,0,100,0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,65,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0,112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104,0,116,0,109,0,108,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,100,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,65,0,112,0,97,0,99,0,104,0,101,0,32,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,44,0,32,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,50,0,46,0,48,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,112,0,97,0,99,0,104,0,101,0,46,0,111,0,114,0,103,0,47,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,115,0,47,0,76,0,73,0,67,0,69,0,78,0,83,0,69,0,45,0,50,0,46,0,48,0,0,2,0,0,0,0,0,0,255,102,0,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,170,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,1,119,1,120,1,121,1,122,1,123,1,124,1,125,1,126,1,127,1,128,1,129,1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176,1,177,1,178,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2,40,2,41,2,42,2,43,2,44,2,45,2,46,2,47,2,48,2,49,2,50,2,51,2,52,2,53,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,64,2,65,2,66,2,67,2,68,2,69,2,70,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2,121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,2,132,2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2,145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157,2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,2,168,2,169,2,170,2,171,2,172,2,173,2,174,2,175,2,176,2,177,2,178,2,179,2,180,2,181,2,182,2,183,2,184,2,185,2,186,2,187,2,188,2,189,2,190,2,191,2,192,2,193,2,194,2,195,2,196,2,197,2,198,2,199,2,200,2,201,2,202,2,203,2,204,2,205,2,206,2,207,2,208,2,209,2,210,2,211,2,212,2,213,2,214,2,215,2,216,2,217,2,218,2,219,2,220,2,221,2,222,2,223,2,224,2,225,2,226,2,227,2,228,2,229,2,230,2,231,2,232,2,233,2,234,2,235,2,236,2,237,2,238,2,239,2,240,2,241,2,242,2,243,2,244,2,245,2,246,2,247,2,248,2,249,2,250,2,251,2,252,2,253,2,254,2,255,3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3,16,3,17,3,18,3,19,3,20,3,21,3,22,3,23,3,24,3,25,3,26,3,27,3,28,3,29,3,30,3,31,3,32,3,33,3,34,3,35,3,36,3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3,46,3,47,3,48,3,49,3,50,3,51,3,52,3,53,3,54,3,55,3,56,3,57,3,58,3,59,3,60,3,61,3,62,3,63,3,64,3,65,3,66,3,67,3,68,3,69,3,70,3,71,3,72,3,73,3,74,3,75,3,76,3,77,3,78,3,79,3,80,3,81,3,82,3,83,3,84,3,85,3,86,3,87,3,88,3,89,3,90,3,91,3,92,3,93,3,94,3,95,3,96,3,97,3,98,3,99,3,100,3,101,3,102,3,103,3,104,3,105,3,106,3,107,3,108,3,109,3,110,3,111,3,112,3,113,3,114,3,115,3,116,3,117,3,118,3,119,3,120,3,121,3,122,3,123,3,124,3,125,3,126,3,127,3,128,3,129,3,130,3,131,3,132,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,3,141,3,142,3,143,3,144,3,145,3,146,3,147,3,148,3,149,3,150,3,151,3,152,3,153,3,154,3,155,3,156,3,157,3,158,3,159,3,160,3,161,3,162,3,163,3,164,3,165,3,166,3,167,3,168,3,169,3,170,3,171,3,172,3,173,3,174,3,175,3,176,3,177,3,178,3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186,3,187,3,188,3,189,3,190,3,191,3,192,3,193,3,194,3,195,3,196,3,197,3,198,3,199,3,200,3,201,3,202,3,203,3,204,3,205,3,206,3,207,3,208,3,209,3,210,3,211,3,212,3,213,3,214,3,215,3,216,3,217,3,218,3,219,3,220,3,221,3,222,3,223,3,224,3,225,3,226,3,227,3,228,3,229,3,230,3,231,3,232,3,233,3,234,3,235,3,236,3,237,3,238,3,239,3,240,3,241,3,242,3,243,3,244,3,245,3,246,3,247,3,248,3,249,3,250,3,251,3,252,3,253,3,254,3,255,4,0,4,1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4,9,4,10,4,11,4,12,4,13,4,14,4,15,4,16,4,17,4,18,4,19,4,20,4,21,4,22,4,23,4,24,4,25,4,26,4,27,4,28,4,29,4,30,4,31,4,32,4,33,4,34,4,35,4,36,4,37,4,38,4,39,4,40,4,41,4,42,4,43,4,44,4,45,4,46,4,47,4,48,4,49,4,50,4,51,4,52,4,53,4,54,4,55,4,56,4,57,4,58,4,59,4,60,4,61,4,62,4,63,4,64,4,65,4,66,4,67,4,68,4,69,4,70,4,71,4,72,4,73,4,74,4,75,4,76,4,77,4,78,4,79,4,80,4,81,4,82,4,83,4,84,4,85,4,86,4,87,4,88,4,89,4,90,4,91,4,92,4,93,4,94,4,95,4,96,4,97,4,98,4,99,4,100,4,101,4,102,4,103,4,104,4,105,4,106,4,107,4,108,4,109,4,110,4,111,4,112,4,113,4,114,4,115,4,116,4,117,4,118,4,119,4,120,4,121,4,122,4,123,4,124,4,125,4,126,4,127,4,128,4,129,4,130,4,131,4,132,4,133,4,134,4,135,4,136,4,137,4,138,4,139,4,140,4,141,4,142,4,143,4,144,4,145,4,146,4,147,4,148,4,149,4,150,4,151,4,152,4,153,4,154,4,155,4,156,4,157,4,158,4,159,4,160,4,161,4,162,4,163,4,164,4,165,4,166,4,167,4,168,4,169,4,170,4,171,7,46,110,111,116,100,101,102,4,110,117,108,108,16,110,111,110,109,97,114,107,105,110,103,114,101,116,117,114,110,5,115,112,97,99,101,6,101,120,99,108,97,109,8,113,117,111,116,101,100,98,108,10,110,117,109,98,101,114,115,105,103,110,6,100,111,108,108,97,114,7,112,101,114,99,101,110,116,9,97,109,112,101,114,115,97,110,100,11,113,117,111,116,101,115,105,110,103,108,101,9,112,97,114,101,110,108,101,102,116,10,112,97,114,101,110,114,105,103,104,116,8,97,115,116,101,114,105,115,107,4,112,108,117,115,5,99,111,109,109,97,6,104,121,112,104,101,110,6,112,101,114,105,111,100,5,115,108,97,115,104,4,122,101,114,111,3,111,110,101,3,116,119,111,5,116,104,114,101,101,4,102,111,117,114,4,102,105,118,101,3,115,105,120,5,115,101,118,101,110,5,101,105,103,104,116,4,110,105,110,101,5,99,111,108,111,110,9,115,101,109,105,99,111,108,111,110,4,108,101,115,115,5,101,113,117,97,108,7,103,114,101,97,116,101,114,8,113,117,101,115,116,105,111,110,2,97,116,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,5,73,46,97,108,116,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,11,98,114,97,99,107,101,116,108,101,102,116,9,98,97,99,107,115,108,97,115,104,12,98,114,97,99,107,101,116,114,105,103,104,116,11,97,115,99,105,105,99,105,114,99,117,109,10,117,110,100,101,114,115,99,111,114,101,5,103,114,97,118,101,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,1,119,1,120,1,121,1,122,9,98,114,97,99,101,108,101,102,116,3,98,97,114,10,98,114,97,99,101,114,105,103,104,116,10,97,115,99,105,105,116,105,108,100,101,16,110,111,110,98,114,101,97,107,105,110,103,115,112,97,99,101,10,101,120,99,108,97,109,100,111,119,110,4,99,101,110,116,8,115,116,101,114,108,105,110,103,8,99,117,114,114,101,110,99,121,3,121,101,110,9,98,114,111,107,101,110,98,97,114,7,115,101,99,116,105,111,110,8,100,105,101,114,101,115,105,115,9,99,111,112,121,114,105,103,104,116,11,111,114,100,102,101,109,105,110,105,110,101,13,103,117,105,108,108,101,109,111,116,108,101,102,116,10,108,111,103,105,99,97,108,110,111,116,7,117,110,105,48,48,65,68,10,114,101,103,105,115,116,101,114,101,100,9,111,118,101,114,115,99,111,114,101,6,100,101,103,114,101,101,9,112,108,117,115,109,105,110,117,115,11,116,119,111,115,117,112,101,114,105,111,114,13,116,104,114,101,101,115,117,112,101,114,105,111,114,5,97,99,117,116,101,2,109,117,9,112,97,114,97,103,114,97,112,104,14,112,101,114,105,111,100,99,101,110,116,101,114,101,100,7,99,101,100,105,108,108,97,11,111,110,101,115,117,112,101,114,105,111,114,12,111,114,100,109,97,115,99,117,108,105,110,101,14,103,117,105,108,108,101,109,111,116,114,105,103,104,116,10,111,110,101,113,117,97,114,116,101,114,7,111,110,101,104,97,108,102,13,116,104,114,101,101,113,117,97,114,116,101,114,115,12,113,117,101,115,116,105,111,110,100,111,119,110,6,65,103,114,97,118,101,6,65,97,99,117,116,101,11,65,99,105,114,99,117,109,102,108,101,120,6,65,116,105,108,100,101,9,65,100,105,101,114,101,115,105,115,5,65,114,105,110,103,2,65,69,8,67,99,101,100,105,108,108,97,6,69,103,114,97,118,101,6,69,97,99,117,116,101,11,69,99,105,114,99,117,109,102,108,101,120,9,69,100,105,101,114,101,115,105,115,10,73,103,114,97,118,101,46,97,108,116,10,73,97,99,117,116,101,46,97,108,116,15,73,99,105,114,99,117,109,102,108,101,120,46,97,108,116,13,73,100,105,101,114,101,115,105,115,46,97,108,116,3,69,116,104,6,78,116,105,108,100,101,6,79,103,114,97,118,101,6,79,97,99,117,116,101,11,79,99,105,114,99,117,109,102,108,101,120,6,79,116,105,108,100,101,9,79,100,105,101,114,101,115,105,115,8,109,117,108,116,105,112,108,121,6,79,115,108,97,115,104,6,85,103,114,97,118,101,6,85,97,99,117,116,101,11,85,99,105,114,99,117,109,102,108,101,120,9,85,100,105,101,114,101,115,105,115,6,89,97,99,117,116,101,5,84,104,111,114,110,10,103,101,114,109,97,110,100,98,108,115,6,97,103,114,97,118,101,6,97,97,99,117,116,101,11,97,99,105,114,99,117,109,102,108,101,120,6,97,116,105,108,100,101,9,97,100,105,101,114,101,115,105,115,5,97,114,105,110,103,2,97,101,8,99,99,101,100,105,108,108,97,6,101,103,114,97,118,101,6,101,97,99,117,116,101,11,101,99,105,114,99,117,109,102,108,101,120,9,101,100,105,101,114,101,115,105,115,6,105,103,114,97,118,101,6,105,97,99,117,116,101,11,105,99,105,114,99,117,109,102,108,101,120,9,105,100,105,101,114,101,115,105,115,3,101,116,104,6,110,116,105,108,100,101,6,111,103,114,97,118,101,6,111,97,99,117,116,101,11,111,99,105,114,99,117,109,102,108,101,120,6,111,116,105,108,100,101,9,111,100,105,101,114,101,115,105,115,6,100,105,118,105,100,101,6,111,115,108,97,115,104,6,117,103,114,97,118,101,6,117,97,99,117,116,101,11,117,99,105,114,99,117,109,102,108,101,120,9,117,100,105,101,114,101,115,105,115,6,121,97,99,117,116,101,5,116,104,111,114,110,9,121,100,105,101,114,101,115,105,115,7,65,109,97,99,114,111,110,7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,6,67,97,99,117,116,101,6,99,97,99,117,116,101,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,4,67,100,111,116,4,99,100,111,116,6,67,99,97,114,111,110,6,99,99,97,114,111,110,6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,6,100,99,114,111,97,116,7,69,109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111,110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114,99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,6,71,98,114,101,118,101,6,103,98,114,101,118,101,4,71,100,111,116,4,103,100,111,116,12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,10,73,116,105,108,100,101,46,97,108,116,6,105,116,105,108,100,101,11,73,109,97,99,114,111,110,46,97,108,116,7,105,109,97,99,114,111,110,10,73,98,114,101,118,101,46,97,108,116,6,105,98,114,101,118,101,11,73,111,103,111,110,101,107,46,97,108,116,7,105,111,103,111,110,101,107,14,73,100,111,116,97,99,99,101,110,116,46,97,108,116,8,100,111,116,108,101,115,115,105,6,73,74,46,97,108,116,2,105,106,11,74,99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,76,115,108,97,115,104,6,108,115,108,97,115,104,6,78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,108,97,117,116,2,79,69,2,111,101,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101,6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115,99,105,114,99,117,109,102,108,101,120,8,83,99,101,100,105,108,108,97,8,115,99,101,100,105,108,108,97,6,83,99,97,114,111,110,6,115,99,97,114,111,110,12,84,99,111,109,109,97,97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111,110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114,105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108,97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,120,9,89,100,105,101,114,101,115,105,115,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99,99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,6,90,99,97,114,111,110,6,122,99,97,114,111,110,5,108,111,110,103,115,6,102,108,111,114,105,110,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108,97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,12,83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111,109,109,97,97,99,99,101,110,116,10,99,105,114,99,117,109,102,108,101,120,5,99,97,114,111,110,6,109,97,99,114,111,110,5,98,114,101,118,101,9,100,111,116,97,99,99,101,110,116,4,114,105,110,103,6,111,103,111,110,101,107,5,116,105,108,100,101,12,104,117,110,103,97,114,117,109,108,97,117,116,5,116,111,110,111,115,13,100,105,101,114,101,115,105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,111,115,8,69,116,97,116,111,110,111,115,13,73,111,116,97,116,111,110,111,115,46,97,108,116,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,97,4,66,101,116,97,5,71,97,109,109,97,7,117,110,105,48,51,57,52,7,69,112,115,105,108,111,110,4,90,101,116,97,3,69,116,97,5,84,104,101,116,97,8,73,111,116,97,46,97,108,116,5,75,97,112,112,97,6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,7,117,110,105,48,51,65,57,16,73,111,116,97,100,105,101,114,101,115,105,115,46,97,108,116,15,85,112,115,105,108,111,110,100,105,101,114,101,115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,97,6,108,97,109,98,100,97,7,117,110,105,48,51,66,67,2,110,117,2,120,105,7,111,109,105,99,114,111,110,2,112,105,3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50,51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102,105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,13,97,102,105,105,49,48,48,53,53,46,97,108,116,13,97,102,105,105,49,48,48,53,54,46,97,108,116,9,97,102,105,105,49,48,48,53,55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102,105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49,48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49,55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102,105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49,48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48,52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102,105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49,48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57,51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103,114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99,117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101,115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,6,101,110,100,97,115,104,6,101,109,100,97,115,104,9,97,102,105,105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,9,113,117,111,116,101,108,101,102,116,10,113,117,111,116,101,114,105,103,104,116,14,113,117,111,116,101,115,105,110,103,108,98,97,115,101,13,113,117,111,116,101,114,101,118,101,114,115,101,100,12,113,117,111,116,101,100,98,108,108,101,102,116,13,113,117,111,116,101,100,98,108,114,105,103,104,116,12,113,117,111,116,101,100,98,108,98,97,115,101,6,100,97,103,103,101,114,9,100,97,103,103,101,114,100,98,108,6,98,117,108,108,101,116,8,101,108,108,105,112,115,105,115,11,112,101,114,116,104,111,117,115,97,110,100,6,109,105,110,117,116,101,6,115,101,99,111,110,100,13,103,117,105,108,115,105,110,103,108,108,101,102,116,14,103,117,105,108,115,105,110,103,108,114,105,103,104,116,9,101,120,99,108,97,109,100,98,108,8,102,114,97,99,116,105,111,110,9,110,115,117,112,101,114,105,111,114,5,102,114,97,110,99,9,97,102,105,105,48,56,57,52,49,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54,49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53,50,9,116,114,97,100,101,109,97,114,107,5,79,109,101,103,97,9,101,115,116,105,109,97,116,101,100,9,111,110,101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104,115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110,101,105,103,104,116,104,115,11,112,97,114,116,105,97,108,100,105,102,102,5,68,101,108,116,97,7,112,114,111,100,117,99,116,9,115,117,109,109,97,116,105,111,110,5,109,105,110,117,115,7,114,97,100,105,99,97,108,8,105,110,102,105,110,105,116,121,8,105,110,116,101,103,114,97,108,11,97,112,112,114,111,120,101,113,117,97,108,8,110,111,116,101,113,117,97,108,9,108,101,115,115,101,113,117,97,108,12,103,114,101,97,116,101,114,101,113,117,97,108,7,108,111,122,101,110,103,101,7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,13,99,121,114,105,108,108,105,99,98,114,101,118,101,8,100,111,116,108,101,115,115,106,16,99,97,114,111,110,99,111,109,109,97,97,99,99,101,110,116,11,99,111,109,109,97,97,99,99,101,110,116,17,99,111,109,109,97,97,99,99,101,110,116,114,111,116,97,116,101,12,122,101,114,111,115,117,112,101,114,105,111,114,12,102,111,117,114,115,117,112,101,114,105,111,114,12,102,105,118,101,115,117,112,101,114,105,111,114,11,115,105,120,115,117,112,101,114,105,111,114,13,115,101,118,101,110,115,117,112,101,114,105,111,114,13,101,105,103,104,116,115,117,112,101,114,105,111,114,12,110,105,110,101,115,117,112,101,114,105,111,114,7,117,110,105,50,48,48,48,7,117,110,105,50,48,48,49,7,117,110,105,50,48,48,50,7,117,110,105,50,48,48,51,7,117,110,105,50,48,48,52,7,117,110,105,50,48,48,53,7,117,110,105,50,48,48,54,7,117,110,105,50,48,48,55,7,117,110,105,50,48,48,56,7,117,110,105,50,48,48,57,7,117,110,105,50,48,48,65,7,117,110,105,50,48,48,66,7,117,110,105,70,69,70,70,7,117,110,105,70,70,70,67,7,117,110,105,70,70,70,68,7,117,110,105,48,49,70,48,7,117,110,105,48,50,66,67,7,117,110,105,48,51,68,49,7,117,110,105,48,51,68,50,7,117,110,105,48,51,68,54,7,117,110,105,49,69,51,69,7,117,110,105,49,69,51,70,7,117,110,105,49,69,48,48,7,117,110,105,49,69,48,49,7,117,110,105,49,70,52,68,7,117,110,105,48,50,70,51,9,100,97,115,105,97,111,120,105,97,7,117,110,105,70,66,48,51,7,117,110,105,70,66,48,52,5,79,104,111,114,110,5,111,104,111,114,110,5,85,104,111,114,110,5,117,104,111,114,110,7,117,110,105,48,51,48,48,7,117,110,105,48,51,48,49,7,117,110,105,48,51,48,51,4,104,111,111,107,8,100,111,116,98,101,108,111,119,7,117,110,105,48,52,48,48,7,117,110,105,48,52,48,68,7,117,110,105,48,52,53,48,7,117,110,105,48,52,53,68,7,117,110,105,48,52,54,48,7,117,110,105,48,52,54,49,7,117,110,105,48,52,54,50,7,117,110,105,48,52,54,51,7,117,110,105,48,52,54,52,7,117,110,105,48,52,54,53,7,117,110,105,48,52,54,54,7,117,110,105,48,52,54,55,7,117,110,105,48,52,54,56,7,117,110,105,48,52,54,57,7,117,110,105,48,52,54,65,7,117,110,105,48,52,54,66,7,117,110,105,48,52,54,67,7,117,110,105,48,52,54,68,7,117,110,105,48,52,54,69,7,117,110,105,48,52,54,70,7,117,110,105,48,52,55,48,7,117,110,105,48,52,55,49,7,117,110,105,48,52,55,50,7,117,110,105,48,52,55,51,7,117,110,105,48,52,55,52,7,117,110,105,48,52,55,53,7,117,110,105,48,52,55,54,7,117,110,105,48,52,55,55,7,117,110,105,48,52,55,56,7,117,110,105,48,52,55,57,7,117,110,105,48,52,55,65,7,117,110,105,48,52,55,66,7,117,110,105,48,52,55,67,7,117,110,105,48,52,55,68,7,117,110,105,48,52,55,69,7,117,110,105,48,52,55,70,7,117,110,105,48,52,56,48,7,117,110,105,48,52,56,49,7,117,110,105,48,52,56,50,7,117,110,105,48,52,56,51,7,117,110,105,48,52,56,52,7,117,110,105,48,52,56,53,7,117,110,105,48,52,56,54,7,117,110,105,48,52,56,56,7,117,110,105,48,52,56,57,7,117,110,105,48,52,56,65,7,117,110,105,48,52,56,66,7,117,110,105,48,52,56,67,7,117,110,105,48,52,56,68,7,117,110,105,48,52,56,69,7,117,110,105,48,52,56,70,7,117,110,105,48,52,57,50,7,117,110,105,48,52,57,51,7,117,110,105,48,52,57,52,7,117,110,105,48,52,57,53,7,117,110,105,48,52,57,54,7,117,110,105,48,52,57,55,7,117,110,105,48,52,57,56,7,117,110,105,48,52,57,57,7,117,110,105,48,52,57,65,7,117,110,105,48,52,57,66,7,117,110,105,48,52,57,67,7,117,110,105,48,52,57,68,7,117,110,105,48,52,57,69,7,117,110,105,48,52,57,70,7,117,110,105,48,52,65,48,7,117,110,105,48,52,65,49,7,117,110,105,48,52,65,50,7,117,110,105,48,52,65,51,7,117,110,105,48,52,65,52,7,117,110,105,48,52,65,53,7,117,110,105,48,52,65,54,7,117,110,105,48,52,65,55,7,117,110,105,48,52,65,56,7,117,110,105,48,52,65,57,7,117,110,105,48,52,65,65,7,117,110,105,48,52,65,66,7,117,110,105,48,52,65,67,7,117,110,105,48,52,65,68,7,117,110,105,48,52,65,69,7,117,110,105,48,52,65,70,7,117,110,105,48,52,66,48,7,117,110,105,48,52,66,49,7,117,110,105,48,52,66,50,7,117,110,105,48,52,66,51,7,117,110,105,48,52,66,52,7,117,110,105,48,52,66,53,7,117,110,105,48,52,66,54,7,117,110,105,48,52,66,55,7,117,110,105,48,52,66,56,7,117,110,105,48,52,66,57,7,117,110,105,48,52,66,65,7,117,110,105,48,52,66,66,7,117,110,105,48,52,66,67,7,117,110,105,48,52,66,68,7,117,110,105,48,52,66,69,7,117,110,105,48,52,66,70,11,117,110,105,48,52,67,48,46,97,108,116,7,117,110,105,48,52,67,49,7,117,110,105,48,52,67,50,7,117,110,105,48,52,67,51,7,117,110,105,48,52,67,52,7,117,110,105,48,52,67,53,7,117,110,105,48,52,67,54,7,117,110,105,48,52,67,55,7,117,110,105,48,52,67,56,7,117,110,105,48,52,67,57,7,117,110,105,48,52,67,65,7,117,110,105,48,52,67,66,7,117,110,105,48,52,67,67,7,117,110,105,48,52,67,68,7,117,110,105,48,52,67,69,11,117,110,105,48,52,67,70,46,97,108,116,7,117,110,105,48,52,68,48,7,117,110,105,48,52,68,49,7,117,110,105,48,52,68,50,7,117,110,105,48,52,68,51,7,117,110,105,48,52,68,52,7,117,110,105,48,52,68,53,7,117,110,105,48,52,68,54,7,117,110,105,48,52,68,55,7,117,110,105,48,52,68,56,7,117,110,105,48,52,68,57,7,117,110,105,48,52,68,65,7,117,110,105,48,52,68,66,7,117,110,105,48,52,68,67,7,117,110,105,48,52,68,68,7,117,110,105,48,52,68,69,7,117,110,105,48,52,68,70,7,117,110,105,48,52,69,48,7,117,110,105,48,52,69,49,7,117,110,105,48,52,69,50,7,117,110,105,48,52,69,51,7,117,110,105,48,52,69,52,7,117,110,105,48,52,69,53,7,117,110,105,48,52,69,54,7,117,110,105,48,52,69,55,7,117,110,105,48,52,69,56,7,117,110,105,48,52,69,57,7,117,110,105,48,52,69,65,7,117,110,105,48,52,69,66,7,117,110,105,48,52,69,67,7,117,110,105,48,52,69,68,7,117,110,105,48,52,69,69,7,117,110,105,48,52,69,70,7,117,110,105,48,52,70,48,7,117,110,105,48,52,70,49,7,117,110,105,48,52,70,50,7,117,110,105,48,52,70,51,7,117,110,105,48,52,70,52,7,117,110,105,48,52,70,53,7,117,110,105,48,52,70,54,7,117,110,105,48,52,70,55,7,117,110,105,48,52,70,56,7,117,110,105,48,52,70,57,7,117,110,105,48,52,70,65,7,117,110,105,48,52,70,66,7,117,110,105,48,52,70,67,7,117,110,105,48,52,70,68,7,117,110,105,48,52,70,69,7,117,110,105,48,52,70,70,7,117,110,105,48,53,48,48,7,117,110,105,48,53,48,49,7,117,110,105,48,53,48,50,7,117,110,105,48,53,48,51,7,117,110,105,48,53,48,52,7,117,110,105,48,53,48,53,7,117,110,105,48,53,48,54,7,117,110,105,48,53,48,55,7,117,110,105,48,53,48,56,7,117,110,105,48,53,48,57,7,117,110,105,48,53,48,65,7,117,110,105,48,53,48,66,7,117,110,105,48,53,48,67,7,117,110,105,48,53,48,68,7,117,110,105,48,53,48,69,7,117,110,105,48,53,48,70,7,117,110,105,48,53,49,48,7,117,110,105,48,53,49,49,7,117,110,105,48,53,49,50,7,117,110,105,48,53,49,51,7,117,110,105,49,69,65,48,7,117,110,105,49,69,65,49,7,117,110,105,49,69,65,50,7,117,110,105,49,69,65,51,7,117,110,105,49,69,65,52,7,117,110,105,49,69,65,53,7,117,110,105,49,69,65,54,7,117,110,105,49,69,65,55,7,117,110,105,49,69,65,56,7,117,110,105,49,69,65,57,7,117,110,105,49,69,65,65,7,117,110,105,49,69,65,66,7,117,110,105,49,69,65,67,7,117,110,105,49,69,65,68,7,117,110,105,49,69,65,69,7,117,110,105,49,69,65,70,7,117,110,105,49,69,66,48,7,117,110,105,49,69,66,49,7,117,110,105,49,69,66,50,7,117,110,105,49,69,66,51,7,117,110,105,49,69,66,52,7,117,110,105,49,69,66,53,7,117,110,105,49,69,66,54,7,117,110,105,49,69,66,55,7,117,110,105,49,69,66,56,7,117,110,105,49,69,66,57,7,117,110,105,49,69,66,65,7,117,110,105,49,69,66,66,7,117,110,105,49,69,66,67,7,117,110,105,49,69,66,68,7,117,110,105,49,69,66,69,7,117,110,105,49,69,66,70,7,117,110,105,49,69,67,48,7,117,110,105,49,69,67,49,7,117,110,105,49,69,67,50,7,117,110,105,49,69,67,51,7,117,110,105,49,69,67,52,7,117,110,105,49,69,67,53,7,117,110,105,49,69,67,54,7,117,110,105,49,69,67,55,11,117,110,105,49,69,67,56,46,97,108,116,7,117,110,105,49,69,67,57,11,117,110,105,49,69,67,65,46,97,108,116,7,117,110,105,49,69,67,66,7,117,110,105,49,69,67,67,7,117,110,105,49,69,67,68,7,117,110,105,49,69,67,69,7,117,110,105,49,69,67,70,7,117,110,105,49,69,68,48,7,117,110,105,49,69,68,49,7,117,110,105,49,69,68,50,7,117,110,105,49,69,68,51,7,117,110,105,49,69,68,52,7,117,110,105,49,69,68,53,7,117,110,105,49,69,68,54,7,117,110,105,49,69,68,55,7,117,110,105,49,69,68,56,7,117,110,105,49,69,68,57,7,117,110,105,49,69,68,65,7,117,110,105,49,69,68,66,7,117,110,105,49,69,68,67,7,117,110,105,49,69,68,68,7,117,110,105,49,69,68,69,7,117,110,105,49,69,68,70,7,117,110,105,49,69,69,48,7,117,110,105,49,69,69,49,7,117,110,105,49,69,69,50,7,117,110,105,49,69,69,51,7,117,110,105,49,69,69,52,7,117,110,105,49,69,69,53,7,117,110,105,49,69,69,54,7,117,110,105,49,69,69,55,7,117,110,105,49,69,69,56,7,117,110,105,49,69,69,57,7,117,110,105,49,69,69,65,7,117,110,105,49,69,69,66,7,117,110,105,49,69,69,67,7,117,110,105,49,69,69,68,7,117,110,105,49,69,69,69,7,117,110,105,49,69,69,70,7,117,110,105,49,69,70,48,7,117,110,105,49,69,70,49,7,117,110,105,49,69,70,52,7,117,110,105,49,69,70,53,7,117,110,105,49,69,70,54,7,117,110,105,49,69,70,55,7,117,110,105,49,69,70,56,7,117,110,105,49,69,70,57,7,117,110,105,50,48,65,66,7,117,110,105,48,51,48,70,19,99,105,114,99,117,109,102,108,101,120,97,99,117,116,101,99,111,109,98,19,99,105,114,99,117,109,102,108,101,120,103,114,97,118,101,99,111,109,98,18,99,105,114,99,117,109,102,108,101,120,104,111,111,107,99,111,109,98,19,99,105,114,99,117,109,102,108,101,120,116,105,108,100,101,99,111,109,98,14,98,114,101,118,101,97,99,117,116,101,99,111,109,98,14,98,114,101,118,101,103,114,97,118,101,99,111,109,98,13,98,114,101,118,101,104,111,111,107,99,111,109,98,14,98,114,101,118,101,116,105,108,100,101,99,111,109,98,16,99,121,114,105,108,108,105,99,104,111,111,107,108,101,102,116,17,99,121,114,105,108,108,105,99,98,105,103,104,111,111,107,85,67,17,99,121,114,105,108,108,105,99,98,105,103,104,111,111,107,76,67,8,111,110,101,46,112,110,117,109,7,122,101,114,111,46,111,115,6,111,110,101,46,111,115,6,116,119,111,46,111,115,8,116,104,114,101,101,46,111,115,7,102,111,117,114,46,111,115,7,102,105,118,101,46,111,115,6,115,105,120,46,111,115,8,115,101,118,101,110,46,111,115,8,101,105,103,104,116,46,111,115,7,110,105,110,101,46,111,115,2,102,102,7,117,110,105,50,49,50,48,8,84,99,101,100,105,108,108,97,8,116,99,101,100,105,108,108,97,5,103,46,97,108,116,15,103,99,105,114,99,117,109,102,108,101,120,46,97,108,116,10,103,98,114,101,118,101,46,97,108,116,8,103,100,111,116,46,97,108,116,16,103,99,111,109,109,97,97,99,99,101,110,116,46,97,108,116,1,73,6,73,103,114,97,118,101,6,73,97,99,117,116,101,11,73,99,105,114,99,117,109,102,108,101,120,9,73,100,105,101,114,101,115,105,115,6,73,116,105,108,100,101,7,73,109,97,99,114,111,110,6,73,98,114,101,118,101,7,73,111,103,111,110,101,107,10,73,100,111,116,97,99,99,101,110,116,2,73,74,9,73,111,116,97,116,111,110,111,115,4,73,111,116,97,12,73,111,116,97,100,105,101,114,101,115,105,115,9,97,102,105,105,49,48,48,53,53,9,97,102,105,105,49,48,48,53,54,7,117,110,105,48,52,67,48,7,117,110,105,48,52,67,70,7,117,110,105,49,69,67,56,7,117,110,105,49,69,67,65,0,0,1,0,3,0,8,0,10,0,13,0,7,255,255,0,15,0,1,0,0,0,12,0,0,0,22,0,0,0,2,0,1,0,0,3,169,0,1,0,4,0,0,0,1,0,0,0,0,0,1,0,0,0,10,0,52,0,54,0,1,108,97,116,110,0,8,0,16,0,2,77,79,76,32,0,22,82,79,77,32,0,28,0,0,255,255,0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,1,0,0,0,10,0,110,1,228,0,1,108,97,116,110,0,8,0,16,0,2,77,79,76,32,0,40,82,79,77,32,0,66,0,0,255,255,0,9,0,3,0,8,0,11,0,0,0,14,0,17,0,20,0,23,0,26,0,0,255,255,0,10,0,4,0,6,0,9,0,12,0,1,0,15,0,18,0,21,0,24,0,27,0,0,255,255,0,10,0,5,0,7,0,10,0,13,0,2,0,16,0,19,0,22,0,25,0,28,0,29,108,105,103,97,0,176,108,105,103,97,0,182,108,105,103,97,0,188,108,110,117,109,0,194,108,110,117,109,0,200,108,110,117,109,0,206,108,111,99,108,0,212,108,111,99,108,0,218,111,110,117,109,0,224,111,110,117,109,0,232,111,110,117,109,0,240,112,110,117,109,0,248,112,110,117,109,0,254,112,110,117,109,1,4,115,97,108,116,1,10,115,97,108,116,1,18,115,97,108,116,1,26,115,115,48,49,1,34,115,115,48,49,1,42,115,115,48,49,1,50,115,115,48,50,1,58,115,115,48,50,1,64,115,115,48,50,1,70,115,115,48,51,1,76,115,115,48,51,1,82,115,115,48,51,1,88,116,110,117,109,1,94,116,110,117,109,1,102,116,110,117,109,1,110,0,0,0,1,0,9,0,0,0,1,0,9,0,0,0,1,0,9,0,0,0,1,0,7,0,0,0,1,0,7,0,0,0,1,0,7,0,0,0,1,0,8,0,0,0,1,0,8,0,0,0,2,0,2,0,3,0,0,0,2,0,2,0,3,0,0,0,2,0,2,0,3,0,0,0,1,0,4,0,0,0,1,0,4,0,0,0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,2,0,5,0,6,0,0,0,2,0,5,0,6,0,0,0,2,0,5,0,6,0,10,0,22,0,30,0,38,0,46,0,54,0,62,0,70,0,78,0,86,0,94,0,1,0,0,0,1,0,80,0,1,0,0,0,1,0,122,0,1,0,0,0,1,0,170,0,1,0,0,0,1,0,198,0,1,0,0,0,1,0,238,0,1,0,0,0,1,0,244,0,1,0,0,0,1,1,16,0,1,0,0,0,1,1,22,0,1,0,0,0,1,1,50,0,4,0,0,0,1,1,72,0,2,0,16,0,5,3,145,3,146,3,147,3,148,3,149,0,2,0,5,0,74,0,74,0,0,0,223,0,223,0,1,0,225,0,225,0,2,0,227,0,227,0,3,0,229,0,229,0,4,0,2,0,46,0,20,0,44,0,142,0,143,0,144,0,145,0,234,0,236,0,238,0,240,0,242,0,244,1,90,1,103,1,119,1,161,1,162,2,201,2,216,3,69,3,71,0,2,0,1,3,150,3,169,0,0,0,2,0,26,0,10,3,131,3,132,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,0,2,0,1,0,19,0,28,0,0,0,2,0,26,0,10,3,131,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,3,132,0,2,0,3,0,19,0,19,0,0,0,21,0,28,0,1,3,130,3,130,0,9,0,2,0,8,0,1,3,130,0,1,0,1,0,20,0,2,0,26,0,10,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,2,0,1,3,131,3,140,0,0,0,2,0,8,0,1,0,20,0,1,0,1,3,130,0,2,0,26,0,10,0,19,3,130,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,2,0,1,3,131,3,140,0,0,0,2,0,14,0,4,3,143,3,144,1,32,1,33,0,2,0,2,1,36,1,37,0,0,1,73,1,74,0,2,0,1,0,54,0,1,0,8,0,5,0,12,0,20,0,28,0,34,0,40,2,94,0,3,0,73,0,79,2,93,0,3,0,73,0,76,3,141,0,2,0,73,2,53,0,2,0,79,2,52,0,2,0,76,0,1,0,1,0,73,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,21,94,0,0,0,20,0,0,0,0,0,0,21,86,48,130,21,82,6,9,42,134,72,134,247,13,1,7,2,160,130,21,67,48,130,21,63,2,1,1,49,11,48,9,6,5,43,14,3,2,26,5,0,48,97,6,10,43,6,1,4,1,130,55,2,1,4,160,83,48,81,48,44,6,10,43,6,1,4,1,130,55,2,1,28,162,30,128,28,0,60,0,60,0,60,0,79,0,98,0,115,0,111,0,108,0,101,0,116,0,101,0,62,0,62,0,62,48,33,48,9,6,5,43,14,3,2,26,5,0,4,20,130,184,185,128,143,217,245,64,166,109,110,179,21,84,65,54,153,222,211,125,160,130,17,93,48,130,3,122,48,130,2,98,160,3,2,1,2,2,16,56,37,215,250,248,97,175,158,244,144,231,38,181,214,90,213,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,83,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,43,48,41,6,3,85,4,3,19,34,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,67,65,48,30,23,13,48,55,48,54,49,53,48,48,48,48,48,48,90,23,13,49,50,48,54,49,52,50,51,53,57,53,57,90,48,92,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,52,48,50,6,3,85,4,3,19,43,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,83,105,103,110,101,114,32,45,32,71,50,48,129,159,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,129,141,0,48,129,137,2,129,129,0,196,181,242,82,21,188,136,134,96,41,22,74,91,47,75,145,107,135,145,243,53,84,88,53,234,209,54,94,98,77,82,81,52,113,194,123,102,29,137,200,221,42,196,106,10,246,55,217,152,116,145,246,146,174,176,181,118,150,241,169,74,99,69,71,46,107,11,146,78,75,43,140,238,88,74,139,212,7,228,26,44,248,130,170,88,217,205,66,243,45,192,117,222,141,171,199,142,29,154,108,76,8,149,30,222,219,239,103,225,114,194,73,194,158,96,60,225,226,190,22,163,99,120,105,20,123,173,45,2,3,1,0,1,163,129,196,48,129,193,48,52,6,8,43,6,1,5,5,7,1,1,4,40,48,38,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,12,6,3,85,29,19,1,1,255,4,2,48,0,48,51,6,3,85,29,31,4,44,48,42,48,40,160,38,160,36,134,34,104,116,116,112,58,47,47,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,116,115,115,45,99,97,46,99,114,108,48,22,6,3,85,29,37,1,1,255,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,14,6,3,85,29,15,1,1,255,4,4,3,2,6,192,48,30,6,3,85,29,17,4,23,48,21,164,19,48,17,49,15,48,13,6,3,85,4,3,19,6,84,83,65,49,45,50,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,130,1,1,0,80,197,75,200,36,128,223,228,13,36,194,222,26,177,161,2,161,166,130,45,12,131,21,129,55,10,130,14,44,176,90,23,97,181,216,5,254,136,219,241,145,145,179,86,26,64,166,235,146,190,56,57,176,117,54,116,58,152,79,228,55,186,153,137,202,149,66,29,176,185,199,160,141,87,224,250,213,100,4,66,53,78,1,209,51,162,23,200,77,170,39,199,242,225,134,76,2,56,77,131,120,198,252,83,224,235,224,6,135,221,164,150,158,94,12,152,226,165,190,191,130,133,195,96,225,223,173,40,216,199,165,75,100,218,199,27,91,189,172,57,8,213,56,34,161,51,139,47,138,154,235,188,7,33,63,68,65,9,7,181,101,28,36,188,72,211,68,128,235,161,207,201,2,180,20,207,84,199,22,163,128,92,249,121,62,93,114,125,136,23,158,44,67,162,202,83,206,125,61,246,42,58,184,79,148,0,165,109,10,131,93,249,94,83,244,24,179,87,15,112,195,251,245,173,149,160,14,23,222,196,22,128,96,201,15,43,110,134,4,241,235,244,120,39,209,5,197,238,52,91,94,185,73,50,242,51,48,130,3,196,48,130,3,45,160,3,2,1,2,2,16,71,191,25,149,223,141,82,70,67,247,219,109,72,13,49,164,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,129,139,49,11,48,9,6,3,85,4,6,19,2,90,65,49,21,48,19,6,3,85,4,8,19,12,87,101,115,116,101,114,110,32,67,97,112,101,49,20,48,18,6,3,85,4,7,19,11,68,117,114,98,97,110,118,105,108,108,101,49,15,48,13,6,3,85,4,10,19,6,84,104,97,119,116,101,49,29,48,27,6,3,85,4,11,19,20,84,104,97,119,116,101,32,67,101,114,116,105,102,105,99,97,116,105,111,110,49,31,48,29,6,3,85,4,3,19,22,84,104,97,119,116,101,32,84,105,109,101,115,116,97,109,112,105,110,103,32,67,65,48,30,23,13,48,51,49,50,48,52,48,48,48,48,48,48,90,23,13,49,51,49,50,48,51,50,51,53,57,53,57,90,48,83,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,43,48,41,6,3,85,4,3,19,34,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,67,65,48,130,1,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,169,202,178,164,204,205,32,175,10,125,137,172,135,117,240,180,78,241,223,193,15,191,103,97,189,163,100,28,218,187,249,202,51,171,132,48,137,88,126,140,219,107,221,54,158,15,191,209,236,120,242,119,166,126,111,60,191,147,175,13,186,104,244,108,148,202,189,82,45,171,72,61,245,182,213,93,95,27,2,159,250,47,107,30,164,247,163,154,166,26,200,2,225,127,76,82,227,14,96,236,64,28,126,185,13,222,63,199,180,223,135,189,95,122,106,49,46,3,153,129,19,168,71,32,206,49,115,13,87,45,205,120,52,51,149,18,153,18,185,222,104,47,170,230,227,194,138,140,42,195,139,33,135,102,189,131,88,87,111,117,191,60,170,38,135,93,202,16,21,60,159,132,234,84,193,10,110,196,254,197,74,221,185,7,17,151,34,124,219,62,39,209,30,120,236,159,49,201,241,230,34,25,219,196,179,71,67,154,26,95,160,30,144,228,94,245,238,124,241,125,171,98,1,143,245,77,11,222,208,34,86,168,149,205,174,136,118,174,238,186,13,243,228,77,217,160,251,104,160,174,20,59,179,135,193,187,2,3,1,0,1,163,129,219,48,129,216,48,52,6,8,43,6,1,5,5,7,1,1,4,40,48,38,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,18,6,3,85,29,19,1,1,255,4,8,48,6,1,1,255,2,1,0,48,65,6,3,85,29,31,4,58,48,56,48,54,160,52,160,50,134,48,104,116,116,112,58,47,47,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,84,104,97,119,116,101,84,105,109,101,115,116,97,109,112,105,110,103,67,65,46,99,114,108,48,19,6,3,85,29,37,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,14,6,3,85,29,15,1,1,255,4,4,3,2,1,6,48,36,6,3,85,29,17,4,29,48,27,164,25,48,23,49,21,48,19,6,3,85,4,3,19,12,84,83,65,50,48,52,56,45,49,45,53,51,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,129,129,0,74,107,249,234,88,194,68,28,49,137,121,153,43,150,191,130,172,1,214,28,76,205,176,138,88,110,223,8,41,163,94,200,202,147,19,231,4,82,13,239,71,39,47,0,56,176,228,201,147,78,154,212,34,98,21,247,63,55,33,79,112,49,128,241,139,56,135,179,232,232,151,0,254,207,85,150,78,36,210,169,39,78,122,174,183,97,65,243,42,206,231,201,217,94,221,187,43,133,62,181,157,181,217,225,87,255,190,180,197,126,245,207,12,158,240,151,254,43,211,59,82,27,27,56,39,247,63,74,48,130,4,252,48,130,4,101,160,3,2,1,2,2,16,101,82,38,225,178,46,24,225,89,15,41,133,172,34,231,92,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,95,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,55,48,53,6,3,85,4,11,19,46,67,108,97,115,115,32,51,32,80,117,98,108,105,99,32,80,114,105,109,97,114,121,32,67,101,114,116,105,102,105,99,97,116,105,111,110,32,65,117,116,104,111,114,105,116,121,48,30,23,13,48,57,48,53,50,49,48,48,48,48,48,48,90,23,13,49,57,48,53,50,48,50,51,53,57,53,57,90,48,129,182,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,31,48,29,6,3,85,4,11,19,22,86,101,114,105,83,105,103,110,32,84,114,117,115,116,32,78,101,116,119,111,114,107,49,59,48,57,6,3,85,4,11,19,50,84,101,114,109,115,32,111,102,32,117,115,101,32,97,116,32,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,32,40,99,41,48,57,49,48,48,46,6,3,85,4,3,19,39,86,101,114,105,83,105,103,110,32,67,108,97,115,115,32,51,32,67,111,100,101,32,83,105,103,110,105,110,103,32,50,48,48,57,45,50,32,67,65,48,130,1,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,190,103,29,180,96,170,16,73,111,86,23,124,102,201,94,134,13,213,241,172,167,113,131,142,139,137,248,136,4,137,21,6,186,45,132,33,149,228,209,156,80,76,251,210,34,189,218,242,178,53,59,30,143,195,9,251,252,19,46,90,191,137,124,61,59,37,30,246,243,88,123,156,244,1,181,198,10,184,128,206,190,39,116,97,103,39,77,106,229,236,129,97,88,121,163,224,23,16,18,21,39,176,225,77,52,127,43,71,32,68,185,222,102,36,102,138,205,79,186,31,197,56,200,84,144,225,114,246,25,102,117,106,185,73,104,207,56,121,13,170,48,168,219,44,96,72,158,215,170,20,1,169,131,215,56,145,48,57,19,150,3,58,124,64,84,182,173,224,47,27,131,220,168,17,82,62,2,179,215,43,253,33,182,167,92,163,15,11,169,166,16,80,14,52,46,77,167,206,201,94,37,212,140,188,243,110,124,41,188,1,93,252,49,135,90,213,140,133,103,88,136,25,160,191,53,240,234,43,163,33,231,144,246,131,229,168,237,96,120,94,123,96,131,253,87,11,93,65,13,99,84,96,214,67,33,239,2,3,1,0,1,163,130,1,219,48,130,1,215,48,18,6,3,85,29,19,1,1,255,4,8,48,6,1,1,255,2,1,0,48,112,6,3,85,29,32,4,105,48,103,48,101,6,11,96,134,72,1,134,248,69,1,7,23,3,48,86,48,40,6,8,43,6,1,5,5,7,2,1,22,28,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,99,112,115,48,42,6,8,43,6,1,5,5,7,2,2,48,30,26,28,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,48,14,6,3,85,29,15,1,1,255,4,4,3,2,1,6,48,109,6,8,43,6,1,5,5,7,1,12,4,97,48,95,161,93,160,91,48,89,48,87,48,85,22,9,105,109,97,103,101,47,103,105,102,48,33,48,31,48,7,6,5,43,14,3,2,26,4,20,143,229,211,26,134,172,141,142,107,195,207,128,106,212,72,24,44,123,25,46,48,37,22,35,104,116,116,112,58,47,47,108,111,103,111,46,118,101,114,105,115,105,103,110,46,99,111,109,47,118,115,108,111,103,111,46,103,105,102,48,29,6,3,85,29,37,4,22,48,20,6,8,43,6,1,5,5,7,3,2,6,8,43,6,1,5,5,7,3,3,48,52,6,8,43,6,1,5,5,7,1,1,4,40,48,38,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,49,6,3,85,29,31,4,42,48,40,48,38,160,36,160,34,134,32,104,116,116,112,58,47,47,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,112,99,97,51,46,99,114,108,48,41,6,3,85,29,17,4,34,48,32,164,30,48,28,49,26,48,24,6,3,85,4,3,19,17,67,108,97,115,115,51,67,65,50,48,52,56,45,49,45,53,53,48,29,6,3,85,29,14,4,22,4,20,151,208,107,168,38,112,200,161,63,148,31,8,45,196,53,155,164,161,30,242,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,129,129,0,139,3,192,221,148,216,65,162,97,105,176,21,168,120,199,48,198,144,60,126,66,247,36,182,228,131,115,23,4,127,4,16,156,161,226,250,129,47,235,192,202,68,231,114,224,80,182,85,16,32,131,110,150,146,228,154,81,106,180,55,49,220,165,45,235,140,0,199,29,79,231,77,50,186,133,248,78,190,250,103,85,101,240,106,190,122,202,100,56,26,16,16,120,69,118,49,243,134,122,3,15,96,194,179,93,157,246,139,102,118,130,27,89,225,131,229,189,73,165,56,86,229,222,65,119,14,88,15,48,130,5,19,48,130,3,251,160,3,2,1,2,2,16,102,227,240,103,121,202,21,22,109,80,83,111,136,25,26,131,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,129,182,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,31,48,29,6,3,85,4,11,19,22,86,101,114,105,83,105,103,110,32,84,114,117,115,116,32,78,101,116,119,111,114,107,49,59,48,57,6,3,85,4,11,19,50,84,101,114,109,115,32,111,102,32,117,115,101,32,97,116,32,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,32,40,99,41,48,57,49,48,48,46,6,3,85,4,3,19,39,86,101,114,105,83,105,103,110,32,67,108,97,115,115,32,51,32,67,111,100,101,32,83,105,103,110,105,110,103,32,50,48,48,57,45,50,32,67,65,48,30,23,13,49,48,48,55,50,57,48,48,48,48,48,48,90,23,13,49,50,48,56,48,56,50,51,53,57,53,57,90,48,129,208,49,11,48,9,6,3,85,4,6,19,2,85,83,49,22,48,20,6,3,85,4,8,19,13,77,97,115,115,97,99,104,117,115,101,116,116,115,49,15,48,13,6,3,85,4,7,19,6,87,111,98,117,114,110,49,30,48,28,6,3,85,4,10,20,21,77,111,110,111,116,121,112,101,32,73,109,97,103,105,110,103,32,73,110,99,46,49,62,48,60,6,3,85,4,11,19,53,68,105,103,105,116,97,108,32,73,68,32,67,108,97,115,115,32,51,32,45,32,77,105,99,114,111,115,111,102,116,32,83,111,102,116,119,97,114,101,32,86,97,108,105,100,97,116,105,111,110,32,118,50,49,24,48,22,6,3,85,4,11,20,15,84,121,112,101,32,79,112,101,114,97,116,105,111,110,115,49,30,48,28,6,3,85,4,3,20,21,77,111,110,111,116,121,112,101,32,73,109,97,103,105,110,103,32,73,110,99,46,48,129,159,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,129,141,0,48,129,137,2,129,129,0,148,68,160,149,105,124,85,13,208,219,22,141,50,53,138,76,51,171,94,32,161,76,215,42,135,56,215,152,165,64,240,25,73,11,34,30,83,79,194,67,166,202,139,169,86,239,110,72,6,168,5,21,57,30,99,59,36,18,144,185,152,207,202,8,53,125,114,227,71,87,253,121,203,138,74,231,64,112,45,53,99,127,174,128,207,196,175,216,251,247,201,252,137,216,215,164,160,219,9,242,162,242,123,239,205,117,193,247,101,80,100,34,157,189,125,188,173,184,75,204,88,69,14,77,209,89,76,77,2,3,1,0,1,163,130,1,131,48,130,1,127,48,9,6,3,85,29,19,4,2,48,0,48,14,6,3,85,29,15,1,1,255,4,4,3,2,7,128,48,68,6,3,85,29,31,4,61,48,59,48,57,160,55,160,53,134,51,104,116,116,112,58,47,47,99,115,99,51,45,50,48,48,57,45,50,45,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,67,83,67,51,45,50,48,48,57,45,50,46,99,114,108,48,68,6,3,85,29,32,4,61,48,59,48,57,6,11,96,134,72,1,134,248,69,1,7,23,3,48,42,48,40,6,8,43,6,1,5,5,7,2,1,22,28,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,48,19,6,3,85,29,37,4,12,48,10,6,8,43,6,1,5,5,7,3,3,48,117,6,8,43,6,1,5,5,7,1,1,4,105,48,103,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,63,6,8,43,6,1,5,5,7,48,2,134,51,104,116,116,112,58,47,47,99,115,99,51,45,50,48,48,57,45,50,45,97,105,97,46,118,101,114,105,115,105,103,110,46,99,111,109,47,67,83,67,51,45,50,48,48,57,45,50,46,99,101,114,48,31,6,3,85,29,35,4,24,48,22,128,20,151,208,107,168,38,112,200,161,63,148,31,8,45,196,53,155,164,161,30,242,48,17,6,9,96,134,72,1,134,248,66,1,1,4,4,3,2,4,16,48,22,6,10,43,6,1,4,1,130,55,2,1,27,4,8,48,6,1,1,0,1,1,255,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,130,1,1,0,78,230,34,135,223,103,65,21,23,226,210,238,126,14,206,194,153,214,99,189,240,181,147,229,106,114,98,225,245,210,60,56,238,168,61,8,95,186,71,129,130,95,91,75,73,244,29,32,250,15,147,9,208,29,25,86,68,23,162,136,243,251,141,157,174,247,13,53,222,60,12,172,68,148,96,69,42,155,254,155,111,76,59,177,52,103,112,16,134,255,90,57,92,90,227,108,130,171,53,124,101,75,253,152,109,181,21,148,73,156,136,112,16,190,61,177,98,149,180,219,180,212,218,232,157,65,144,126,254,125,185,164,146,235,110,242,34,138,198,119,54,77,138,90,11,83,5,49,211,43,40,175,82,225,141,122,107,181,119,68,189,12,173,244,93,37,44,227,205,138,48,62,75,3,156,121,202,166,78,174,11,194,204,36,7,11,193,148,130,246,16,241,186,144,182,155,154,216,92,60,19,241,234,2,6,24,39,77,60,137,111,51,138,211,134,222,233,88,51,117,61,235,147,105,226,68,111,78,0,108,207,213,133,218,86,166,154,166,63,203,76,33,104,144,242,96,186,225,232,6,93,57,33,19,50,237,49,130,3,103,48,130,3,99,2,1,1,48,129,203,48,129,182,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,31,48,29,6,3,85,4,11,19,22,86,101,114,105,83,105,103,110,32,84,114,117,115,116,32,78,101,116,119,111,114,107,49,59,48,57,6,3,85,4,11,19,50,84,101,114,109,115,32,111,102,32,117,115,101,32,97,116,32,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,32,40,99,41,48,57,49,48,48,46,6,3,85,4,3,19,39,86,101,114,105,83,105,103,110,32,67,108,97,115,115,32,51,32,67,111,100,101,32,83,105,103,110,105,110,103,32,50,48,48,57,45,50,32,67,65,2,16,102,227,240,103,121,202,21,22,109,80,83,111,136,25,26,131,48,9,6,5,43,14,3,2,26,5,0,160,112,48,16,6,10,43,6,1,4,1,130,55,2,1,12,49,2,48,0,48,25,6,9,42,134,72,134,247,13,1,9,3,49,12,6,10,43,6,1,4,1,130,55,2,1,4,48,28,6,10,43,6,1,4,1,130,55,2,1,11,49,14,48,12,6,10,43,6,1,4,1,130,55,2,1,21,48,35,6,9,42,134,72,134,247,13,1,9,4,49,22,4,20,72,227,234,219,23,99,143,198,177,21,87,39,32,183,101,244,25,83,149,24,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,4,129,128,69,59,188,212,186,239,218,27,191,98,59,222,18,236,74,6,132,69,113,65,201,2,254,46,14,149,243,137,177,82,244,65,235,109,50,44,72,191,41,145,188,178,47,93,100,36,52,46,186,150,180,182,74,115,151,224,246,159,65,247,247,104,182,245,128,6,120,65,190,83,144,192,126,120,82,91,28,170,14,33,66,220,190,9,156,51,211,70,80,144,59,5,153,16,43,89,105,236,133,216,99,209,45,195,6,150,52,237,20,163,156,242,241,84,64,213,71,23,160,11,0,31,140,102,239,222,62,27,161,130,1,127,48,130,1,123,6,9,42,134,72,134,247,13,1,9,6,49,130,1,108,48,130,1,104,2,1,1,48,103,48,83,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,43,48,41,6,3,85,4,3,19,34,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,67,65,2,16,56,37,215,250,248,97,175,158,244,144,231,38,181,214,90,213,48,9,6,5,43,14,3,2,26,5,0,160,93,48,24,6,9,42,134,72,134,247,13,1,9,3,49,11,6,9,42,134,72,134,247,13,1,7,1,48,28,6,9,42,134,72,134,247,13,1,9,5,49,15,23,13,49,49,48,53,48,53,49,54,53,53,49,48,90,48,35,6,9,42,134,72,134,247,13,1,9,4,49,22,4,20,84,23,8,43,11,189,238,26,39,14,31,141,252,83,147,244,56,86,16,15,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,4,129,128,29,193,119,137,174,155,111,34,227,107,229,69,218,78,145,64,240,159,239,59,31,39,74,86,172,58,253,168,148,106,124,247,156,193,127,123,147,96,78,27,196,43,87,149,148,203,22,225,154,103,51,209,43,41,19,200,236,190,188,89,177,3,164,41,153,236,29,136,153,36,135,119,15,155,202,20,251,212,212,73,76,116,14,200,61,46,111,32,201,3,205,232,229,15,208,33,57,179,86,25,213,251,172,189,172,169,56,189,176,213,12,163,217,99,173,176,149,180,104,88,195,226,215,41,255,145,164,199,0,0, \ No newline at end of file diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp new file mode 100644 index 000000000..87e64c326 --- /dev/null +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -0,0 +1,582 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + RichTextDrawer::RichTextDrawer() : + m_defaultColor(Color::White), + m_defaultOutlineColor(Color::Black), + m_defaultStyle(TextStyle_Regular), + m_glyphUpdated(false), + m_maxLineWidth(std::numeric_limits::infinity()), + m_defaultCharacterSpacingOffset(0.f), + m_defaultLineSpacingOffset(0.f), + m_defaultOutlineThickness(0.f), + m_defaultCharacterSize(24) + { + SetDefaultFont(Font::GetDefault()); + } + + RichTextDrawer::RichTextDrawer(const RichTextDrawer& drawer) : + m_defaultColor(drawer.m_defaultColor), + m_defaultStyle(drawer.m_defaultStyle), + m_fontIndexes(drawer.m_fontIndexes), + m_blocks(drawer.m_blocks), + m_glyphUpdated(false), + m_defaultOutlineColor(drawer.m_defaultOutlineColor), + m_maxLineWidth(drawer.m_maxLineWidth), + m_defaultCharacterSpacingOffset(drawer.m_defaultCharacterSpacingOffset), + m_defaultLineSpacingOffset(drawer.m_defaultLineSpacingOffset), + m_defaultOutlineThickness(drawer.m_defaultOutlineThickness), + m_defaultCharacterSize(drawer.m_defaultCharacterSize) + { + m_fonts.resize(drawer.m_fonts.size()); + for (std::size_t i = 0; i < m_fonts.size(); ++i) + { + m_fonts[i].font = drawer.m_fonts[i].font; + m_fonts[i].useCount = drawer.m_fonts[i].useCount; + } + + SetDefaultFont(drawer.m_defaultFont); + + ConnectFontSlots(); + } + + RichTextDrawer::RichTextDrawer(RichTextDrawer&& drawer) + { + operator=(std::move(drawer)); + } + + RichTextDrawer::~RichTextDrawer() = default; + + auto RichTextDrawer::AppendText(const String& str, bool forceNewBlock) -> BlockRef + { + NazaraAssert(!str.IsEmpty(), "String cannot be empty"); + + std::size_t defaultFontIndex = HandleFontAddition(m_defaultFont); + + auto HasDefaultProperties = [&](const Block& block) + { + return block.characterSize == m_defaultCharacterSize && + block.color == m_defaultColor && + block.fontIndex == defaultFontIndex && + block.characterSpacingOffset == m_defaultCharacterSpacingOffset && + block.lineSpacingOffset == m_defaultLineSpacingOffset && + block.outlineColor == m_defaultOutlineColor && + block.outlineThickness == m_defaultOutlineThickness && + block.style == m_defaultStyle; + }; + + // Check if last block has the same property as default, else create a new block + if (forceNewBlock || m_blocks.empty() || !HasDefaultProperties(m_blocks.back())) + { + std::size_t glyphIndex; + if (!m_blocks.empty()) + { + Block& lastBlock = m_blocks.back(); + glyphIndex = lastBlock.glyphIndex + lastBlock.text.GetLength(); + } + else + glyphIndex = 0; + + m_blocks.emplace_back(); + Block& newBlock = m_blocks.back(); + newBlock.characterSize = m_defaultCharacterSize; + newBlock.characterSpacingOffset = m_defaultCharacterSpacingOffset; + newBlock.color = m_defaultColor; + newBlock.fontIndex = defaultFontIndex; + newBlock.glyphIndex = glyphIndex; + newBlock.lineSpacingOffset = m_defaultLineSpacingOffset; + newBlock.outlineColor = m_defaultOutlineColor; + newBlock.outlineThickness = m_defaultOutlineThickness; + newBlock.style = m_defaultStyle; + newBlock.text = str; + + assert(newBlock.fontIndex < m_fonts.size()); + m_fonts[newBlock.fontIndex].useCount++; + } + else + m_blocks.back().text += str; + + InvalidateGlyphs(); + + return BlockRef(*this, m_blocks.size() - 1); + } + + void RichTextDrawer::Clear() + { + m_fontIndexes.clear(); + m_blocks.clear(); + m_fonts.clear(); + m_glyphs.clear(); + ClearGlyphs(); + } + + const Rectf& RichTextDrawer::GetBounds() const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_bounds; + } + + Font* RichTextDrawer::GetFont(std::size_t index) const + { + NazaraAssert(index < m_fonts.size(), "Font index out of range"); + + return m_fonts[index].font; + } + + std::size_t RichTextDrawer::GetFontCount() const + { + return m_fonts.size(); + } + + const AbstractTextDrawer::Glyph& RichTextDrawer::GetGlyph(std::size_t index) const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_glyphs[index]; + } + + std::size_t RichTextDrawer::GetGlyphCount() const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_glyphs.size(); + } + + const AbstractTextDrawer::Line& RichTextDrawer::GetLine(std::size_t index) const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + NazaraAssert(index < m_lines.size(), "Line index out of range"); + return m_lines[index]; + } + + std::size_t RichTextDrawer::GetLineCount() const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_lines.size(); + } + + float RichTextDrawer::GetMaxLineWidth() const + { + return m_maxLineWidth; + } + + void RichTextDrawer::MergeBlocks() + { + auto TestBlockProperties = [](const Block& lhs, const Block& rhs) + { + return lhs.characterSize == rhs.characterSize && + lhs.color == rhs.color && + lhs.fontIndex == rhs.fontIndex && + lhs.characterSpacingOffset == rhs.characterSpacingOffset && + lhs.lineSpacingOffset == rhs.lineSpacingOffset && + lhs.outlineColor == rhs.outlineColor && + lhs.outlineThickness == rhs.outlineThickness && + lhs.style == rhs.style; + }; + + std::size_t previousBlockIndex = 0; + for (std::size_t i = 1; i < m_blocks.size(); ++i) + { + if (TestBlockProperties(m_blocks[previousBlockIndex], m_blocks[i])) + { + m_blocks[previousBlockIndex].text += m_blocks[i].text; + + RemoveBlock(i); + --i; + } + else + previousBlockIndex = i; + } + } + + void RichTextDrawer::RemoveBlock(std::size_t index) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + + std::size_t textLength = m_blocks[index].text.GetLength(); + + ReleaseFont(m_blocks[index].fontIndex); + m_blocks.erase(m_blocks.begin() + index); + + for (std::size_t i = index; i < m_blocks.size(); ++i) + { + assert(m_blocks[i].glyphIndex > textLength); + m_blocks[i].glyphIndex -= textLength; + } + + InvalidateGlyphs(); + } + + void RichTextDrawer::SetMaxLineWidth(float lineWidth) + { + m_maxLineWidth = lineWidth; + + InvalidateGlyphs(); + } + + RichTextDrawer& RichTextDrawer::operator=(const RichTextDrawer& drawer) + { + DisconnectFontSlots(); + + m_blocks = drawer.m_blocks; + m_defaultCharacterSize = drawer.m_defaultCharacterSize; + m_defaultCharacterSpacingOffset = drawer.m_defaultCharacterSpacingOffset; + m_defaultColor = drawer.m_defaultColor; + m_defaultFont = drawer.m_defaultFont; + m_defaultLineSpacingOffset = drawer.m_defaultLineSpacingOffset; + m_defaultOutlineColor = drawer.m_defaultOutlineColor; + m_defaultOutlineThickness = drawer.m_defaultOutlineThickness; + m_defaultStyle = drawer.m_defaultStyle; + m_fontIndexes = drawer.m_fontIndexes; + + m_fonts.resize(drawer.m_fonts.size()); + for (std::size_t i = 0; i < m_fonts.size(); ++i) + { + m_fonts[i].font = drawer.m_fonts[i].font; + m_fonts[i].useCount = drawer.m_fonts[i].useCount; + } + + ConnectFontSlots(); + InvalidateGlyphs(); + + return *this; + } + + RichTextDrawer& RichTextDrawer::operator=(RichTextDrawer&& drawer) + { + DisconnectFontSlots(); + + m_blocks = std::move(drawer.m_blocks); + m_bounds = std::move(m_bounds); + m_defaultCharacterSize = std::move(drawer.m_defaultCharacterSize); + m_defaultCharacterSpacingOffset = std::move(drawer.m_defaultCharacterSpacingOffset); + m_defaultColor = std::move(drawer.m_defaultColor); + m_defaultFont = std::move(drawer.m_defaultFont); + m_defaultLineSpacingOffset = std::move(drawer.m_defaultLineSpacingOffset); + m_defaultOutlineColor = std::move(drawer.m_defaultOutlineColor); + m_defaultOutlineThickness = std::move(drawer.m_defaultOutlineThickness); + m_defaultStyle = std::move(drawer.m_defaultStyle); + m_drawPos = std::move(m_drawPos); + m_fontIndexes = std::move(drawer.m_fontIndexes); + m_fonts = std::move(drawer.m_fonts); + m_glyphs = std::move(m_glyphs); + m_lines = std::move(m_lines); + m_glyphUpdated = std::move(m_glyphUpdated); + + drawer.DisconnectFontSlots(); + ConnectFontSlots(); + + return *this; + } + + void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset, std::size_t glyphIndex, float glyphPosition) const + { + // Ensure we're appending from last line + Line& lastLine = m_lines.back(); + + const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); + + float previousDrawPos = m_drawPos.x; + + float lineHeight = GetLineHeight(lineSpacingOffset, sizeInfo); + + // Reset cursor + m_drawPos.x = 0; + m_drawPos.y += lineHeight; + m_lastSeparatorGlyph = InvalidGlyph; + + m_bounds.ExtendTo(lastLine.bounds); + m_lines.emplace_back(Line{ Rectf(0.f, lineHeight * m_lines.size(), 0.f, lineHeight), m_glyphs.size() + 1 }); + + if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) + { + Line& newLine = m_lines.back(); + newLine.glyphIndex = glyphIndex; + + for (std::size_t i = glyphIndex; i < m_glyphs.size(); ++i) + { + Glyph& glyph = m_glyphs[i]; + glyph.bounds.x -= glyphPosition; + glyph.bounds.y += lineHeight; + + for (auto& corner : glyph.corners) + { + corner.x -= glyphPosition; + corner.y += lineHeight; + } + + newLine.bounds.ExtendTo(glyph.bounds); + } + + assert(previousDrawPos >= glyphPosition); + m_drawPos.x += previousDrawPos - glyphPosition; + + lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - glyphPosition; + + // Regenerate bounds + m_bounds.MakeZero(); + for (auto& line : m_lines) + m_bounds.ExtendTo(line.bounds); + } + } + + bool RichTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, float lineSpacingOffset, unsigned int characterSize, int renderOrder, int* advance) const + { + const Font::Glyph& fontGlyph = font->GetGlyph(characterSize, style, outlineThickness, character); + if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) + { + glyph.atlas = font->GetAtlas()->GetLayer(fontGlyph.layerIndex); + glyph.atlasRect = fontGlyph.atlasRect; + glyph.color = color; + glyph.flipped = fontGlyph.flipped; + glyph.renderOrder = renderOrder; + + glyph.bounds.Set(fontGlyph.aabb); + + if (lineWrap && ShouldLineWrap(glyph.bounds.width)) + AppendNewLine(font, characterSize, lineSpacingOffset, m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.bounds.x += m_drawPos.x; + glyph.bounds.y += m_drawPos.y; + + // Faux bold and faux outline thickness are not supported + + // We "lean" the glyph to simulate italics style + float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; + float italicTop = italic * glyph.bounds.y; + float italicBottom = italic * glyph.bounds.GetMaximum().y; + + glyph.corners[0].Set(glyph.bounds.x - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[2].Set(glyph.bounds.x - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + + if (advance) + *advance = fontGlyph.advance; + + return true; + } + else + return false; + }; + + void RichTextDrawer::GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float characterSpacingOffset, float lineSpacingOffset, float outlineThickness, const String& text) const + { + if (text.IsEmpty()) + return; + + ///TODO: Allow iteration on Unicode characters without allocating any buffer + std::u32string characters = text.GetUtf32String(); + if (characters.empty()) + { + NazaraError("Invalid character set"); + return; + } + + char32_t previousCharacter = 0; + + const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); + float lineHeight = GetLineHeight(lineSpacingOffset, sizeInfo); + + float heightDifference = lineHeight - m_lines.back().bounds.height; + if (heightDifference > 0.f) + { + for (std::size_t glyphIndex = m_lines.back().glyphIndex; glyphIndex < m_glyphs.size(); ++glyphIndex) + { + Glyph& glyph = m_glyphs[glyphIndex]; + glyph.bounds.y += heightDifference; + + for (auto& corner : glyph.corners) + corner.y += heightDifference; + } + + m_drawPos.y += heightDifference; + m_lines.back().bounds.height += heightDifference; + } + + m_glyphs.reserve(m_glyphs.size() + characters.size() * ((outlineThickness > 0.f) ? 2 : 1)); + for (char32_t character : characters) + { + if (previousCharacter != 0) + m_drawPos.x += font->GetKerning(characterSize, previousCharacter, character); + + previousCharacter = character; + + bool whitespace = true; + float advance = characterSpacingOffset; + switch (character) + { + case ' ': + case '\n': + advance += float(sizeInfo.spaceAdvance); + break; + + case '\t': + advance += float(sizeInfo.spaceAdvance) * 4.f; + break; + + default: + whitespace = false; + break; + } + + Glyph glyph; + if (!whitespace) + { + int iAdvance; + if (!GenerateGlyph(glyph, character, 0.f, true, font, color, style, lineSpacingOffset, characterSize, 0, &iAdvance)) + continue; // Glyph failed to load, just skip it (can't do much) + + advance += float(iAdvance); + + if (outlineThickness > 0.f) + { + Glyph outlineGlyph; + if (GenerateGlyph(outlineGlyph, character, outlineThickness, false, font, outlineColor, style, lineSpacingOffset, characterSize, -1, nullptr)) + m_glyphs.push_back(outlineGlyph); + } + } + else + { + if (ShouldLineWrap(advance)) + AppendNewLine(font, characterSize, lineSpacingOffset, m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.atlas = nullptr; + glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, lineHeight); + + glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); + glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); + glyph.corners[2].Set(glyph.bounds.GetCorner(RectCorner_LeftBottom)); + glyph.corners[3].Set(glyph.bounds.GetCorner(RectCorner_RightBottom)); + } + + m_lines.back().bounds.ExtendTo(glyph.bounds); + + switch (character) + { + case '\n': + { + AppendNewLine(font, characterSize, lineSpacingOffset); + break; + } + + default: + m_drawPos.x += advance; + break; + } + + if (whitespace) + { + m_lastSeparatorGlyph = m_glyphs.size(); + m_lastSeparatorPosition = m_drawPos.x; + } + + m_glyphs.push_back(glyph); + } + + m_bounds.ExtendTo(m_lines.back().bounds); + + m_glyphUpdated = true; + } + + void RichTextDrawer::OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer) + { + NazaraUnused(font); + +#ifdef NAZARA_DEBUG + auto it = std::find_if(m_fonts.begin(), m_fonts.end(), [font](const auto& fontData) { return fontData.font == font; }); + if (it == m_fonts.end()) + { + NazaraInternalError("Not listening to " + String::Pointer(font)); + return; + } +#endif + + // Update atlas layer pointer + // Note: This can happen while updating + for (Glyph& glyph : m_glyphs) + { + if (glyph.atlas == oldLayer) + glyph.atlas = newLayer; + } + } + + void RichTextDrawer::OnFontInvalidated(const Font* font) + { + NazaraUnused(font); + +#ifdef NAZARA_DEBUG + auto it = std::find_if(m_fonts.begin(), m_fonts.end(), [font](const auto& fontData) { return fontData.font == font; }); + if (it == m_fonts.end()) + { + NazaraInternalError("Not listening to " + String::Pointer(font)); + return; + } +#endif + + m_glyphUpdated = false; + } + + void RichTextDrawer::OnFontRelease(const Font* font) + { + NazaraUnused(font); + NazaraUnused(font); + +#ifdef NAZARA_DEBUG + auto it = std::find_if(m_fonts.begin(), m_fonts.end(), [font](const auto& fontData) { return fontData.font == font; }); + if (it == m_fonts.end()) + { + NazaraInternalError("Not listening to " + String::Pointer(font)); + return; + } +#endif + + //SetFont(nullptr); + } + + void RichTextDrawer::UpdateGlyphs() const + { + ClearGlyphs(); + + if (!m_blocks.empty()) + { + const Block& firstBlock = m_blocks.front(); + + assert(firstBlock.fontIndex < m_fonts.size()); + const auto& firstFont = m_fonts[firstBlock.fontIndex]; + + if (firstFont.font) + m_lines.emplace_back(Line{ Rectf(0.f, 0.f, 0.f, GetLineHeight(firstBlock)), 0 }); + else + m_lines.emplace_back(Line{ Rectf::Zero(), 0 }); + + m_drawPos.Set(0, float(firstBlock.characterSize)); + + for (const Block& block : m_blocks) + { + assert(block.fontIndex < m_fonts.size()); + const auto& fontData = m_fonts[block.fontIndex]; + + GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.outlineColor, block.outlineThickness, block.characterSpacingOffset, block.lineSpacingOffset, block.text); + } + } + else + m_lines.emplace_back(Line{ Rectf::Zero(), 0 }); //< Ensure there's always a line + } +} diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 89accf012..ebaf28b3a 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -3,53 +3,19 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include namespace Nz { - SimpleTextDrawer::SimpleTextDrawer() : - m_color(Color::White), - m_style(TextStyle_Regular), - m_colorUpdated(true), - m_glyphUpdated(true), - m_characterSize(24) - { - SetFont(Font::GetDefault()); - } - - SimpleTextDrawer::SimpleTextDrawer(const SimpleTextDrawer& drawer) : - m_color(drawer.m_color), - m_text(drawer.m_text), - m_style(drawer.m_style), - m_colorUpdated(false), - m_glyphUpdated(false), - m_characterSize(drawer.m_characterSize) - { - SetFont(drawer.m_font); - } - - SimpleTextDrawer::SimpleTextDrawer(SimpleTextDrawer&& drawer) - { - operator=(std::move(drawer)); - } - - SimpleTextDrawer::~SimpleTextDrawer() = default; - - void SimpleTextDrawer::AppendText(const String& str) - { - m_text.Append(str); - if (m_glyphUpdated) - GenerateGlyphs(str); - } - void SimpleTextDrawer::Clear() { m_text.Clear(true); ClearGlyphs(); } - const Recti& SimpleTextDrawer::GetBounds() const + const Rectf& SimpleTextDrawer::GetBounds() const { if (!m_glyphUpdated) UpdateGlyphs(); @@ -57,27 +23,12 @@ namespace Nz return m_bounds; } - unsigned int SimpleTextDrawer::GetCharacterSize() const - { - return m_characterSize; - } - - const Color& SimpleTextDrawer::GetColor() const - { - return m_color; - } - - Font* SimpleTextDrawer::GetFont() const - { - return m_font; - } - Font* SimpleTextDrawer::GetFont(std::size_t index) const { NazaraAssert(index == 0, "Font index out of range"); NazaraUnused(index); - return m_font; + return GetFont(); } std::size_t SimpleTextDrawer::GetFontCount() const @@ -120,148 +71,116 @@ namespace Nz return m_lines.size(); } - UInt32 SimpleTextDrawer::GetStyle() const + float SimpleTextDrawer::GetMaxLineWidth() const { - return m_style; + return m_maxLineWidth; } - const String& SimpleTextDrawer::GetText() const + void SimpleTextDrawer::AppendNewLine(std::size_t glyphIndex, float glyphPosition) const { - return m_text; - } + // Ensure we're appending from last line + Line& lastLine = m_lines.back(); - void SimpleTextDrawer::SetCharacterSize(unsigned int characterSize) - { - m_characterSize = characterSize; + float previousDrawPos = m_drawPos.x; - m_glyphUpdated = false; - } + float lineHeight = GetLineHeight(); - void SimpleTextDrawer::SetColor(const Color& color) - { - m_color = color; + // Reset cursor + m_drawPos.x = 0.f; + m_drawPos.y += lineHeight; + m_lastSeparatorGlyph = InvalidGlyph; - m_colorUpdated = false; - } + m_bounds.ExtendTo(lastLine.bounds); + m_lines.emplace_back(Line{ Rectf(0.f, lineHeight * m_lines.size(), 0.f, lineHeight), m_glyphs.size() + 1 }); - void SimpleTextDrawer::SetFont(Font* font) - { - if (m_font != font) + if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) { - m_font = font; + Line& newLine = m_lines.back(); + newLine.glyphIndex = glyphIndex; - if (m_font) - ConnectFontSlots(); - else - DisconnectFontSlots(); + for (std::size_t i = glyphIndex; i < m_glyphs.size(); ++i) + { + Glyph& glyph = m_glyphs[i]; + glyph.bounds.x -= glyphPosition; + glyph.bounds.y += lineHeight; - m_glyphUpdated = false; + for (auto& corner : glyph.corners) + { + corner.x -= glyphPosition; + corner.y += lineHeight; + } + + newLine.bounds.ExtendTo(glyph.bounds); + } + + assert(previousDrawPos >= glyphPosition); + m_drawPos.x += previousDrawPos - glyphPosition; + + lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - glyphPosition; + + // Regenerate bounds + m_bounds.MakeZero(); + for (auto& line : m_lines) + m_bounds.ExtendTo(line.bounds); } } - void SimpleTextDrawer::SetStyle(UInt32 style) - { - m_style = style; - - m_glyphUpdated = false; - } - - void SimpleTextDrawer::SetText(const String& str) - { - m_text = str; - - m_glyphUpdated = false; - } - - SimpleTextDrawer& SimpleTextDrawer::operator=(const SimpleTextDrawer& drawer) - { - m_characterSize = drawer.m_characterSize; - m_color = drawer.m_color; - m_style = drawer.m_style; - m_text = drawer.m_text; - - m_colorUpdated = false; - m_glyphUpdated = false; - SetFont(drawer.m_font); - - return *this; - } - - SimpleTextDrawer& SimpleTextDrawer::operator=(SimpleTextDrawer&& drawer) - { - DisconnectFontSlots(); - - m_bounds = std::move(drawer.m_bounds); - m_colorUpdated = std::move(drawer.m_colorUpdated); - m_characterSize = std::move(drawer.m_characterSize); - m_color = std::move(drawer.m_color); - m_glyphs = std::move(drawer.m_glyphs); - m_glyphUpdated = std::move(drawer.m_glyphUpdated); - m_font = std::move(drawer.m_font); - m_style = std::move(drawer.m_style); - m_text = std::move(drawer.m_text); - - // Update slot pointers (TODO: Improve the way of doing this) - ConnectFontSlots(); - - return *this; - } - - SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, UInt32 style, const Color& color) - { - SimpleTextDrawer drawer; - drawer.SetCharacterSize(characterSize); - drawer.SetColor(color); - drawer.SetStyle(style); - drawer.SetText(str); - - return drawer; - } - - SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, UInt32 style, const Color& color) - { - SimpleTextDrawer drawer; - drawer.SetCharacterSize(characterSize); - drawer.SetColor(color); - drawer.SetFont(font); - drawer.SetStyle(style); - drawer.SetText(str); - - return drawer; - } - void SimpleTextDrawer::ClearGlyphs() const { m_bounds.MakeZero(); m_colorUpdated = true; - m_drawPos.Set(0, m_characterSize); //< Our draw "cursor" + m_drawPos.Set(0, float(m_characterSize)); //< Our draw "cursor" + m_lastSeparatorGlyph = InvalidGlyph; m_lines.clear(); m_glyphs.clear(); m_glyphUpdated = true; m_previousCharacter = 0; - m_workingBounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly) if (m_font) - m_lines.emplace_back(Line{Rectf(0.f, 0.f, 0.f, float(m_font->GetSizeInfo(m_characterSize).lineHeight)), 0}); + m_lines.emplace_back(Line{Rectf(0.f, 0.f, 0.f, GetLineHeight()), 0}); else m_lines.emplace_back(Line{Rectf::Zero(), 0}); } - void SimpleTextDrawer::ConnectFontSlots() + bool SimpleTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const { - m_atlasChangedSlot.Connect(m_font->OnFontAtlasChanged, this, &SimpleTextDrawer::OnFontInvalidated); - m_atlasLayerChangedSlot.Connect(m_font->OnFontAtlasLayerChanged, this, &SimpleTextDrawer::OnFontAtlasLayerChanged); - m_fontReleaseSlot.Connect(m_font->OnFontRelease, this, &SimpleTextDrawer::OnFontRelease); - m_glyphCacheClearedSlot.Connect(m_font->OnFontGlyphCacheCleared, this, &SimpleTextDrawer::OnFontInvalidated); - } + const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, outlineThickness, character); + if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) + { + glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); + glyph.atlasRect = fontGlyph.atlasRect; + glyph.color = color; + glyph.flipped = fontGlyph.flipped; + glyph.renderOrder = renderOrder; - void SimpleTextDrawer::DisconnectFontSlots() - { - m_atlasChangedSlot.Disconnect(); - m_atlasLayerChangedSlot.Disconnect(); - m_fontReleaseSlot.Disconnect(); - m_glyphCacheClearedSlot.Disconnect(); - } + glyph.bounds.Set(fontGlyph.aabb); + + if (lineWrap && ShouldLineWrap(glyph.bounds.width)) + AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.bounds.x += m_drawPos.x; + glyph.bounds.y += m_drawPos.y; + + // Faux bold and faux outline thickness are not supported + + // We "lean" the glyph to simulate italics style + float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; + float italicTop = italic * glyph.bounds.y; + float italicBottom = italic * glyph.bounds.GetMaximum().y; + + glyph.corners[0].Set(glyph.bounds.x - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[2].Set(glyph.bounds.x - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + + if (advance) + *advance = fontGlyph.advance; + + return true; + } + else + return false; + }; void SimpleTextDrawer::GenerateGlyphs(const String& text) const { @@ -278,7 +197,7 @@ namespace Nz const Font::SizeInfo& sizeInfo = m_font->GetSizeInfo(m_characterSize); - m_glyphs.reserve(m_glyphs.size() + characters.size()); + m_glyphs.reserve(m_glyphs.size() + characters.size() * ((m_outlineThickness > 0.f) ? 2 : 1)); for (char32_t character : characters) { if (m_previousCharacter != 0) @@ -287,16 +206,16 @@ namespace Nz m_previousCharacter = character; bool whitespace = true; - int advance = 0; + float advance = m_characterSpacingOffset; switch (character) { case ' ': case '\n': - advance = sizeInfo.spaceAdvance; + advance += float(sizeInfo.spaceAdvance); break; case '\t': - advance = sizeInfo.spaceAdvance * 4; + advance += float(sizeInfo.spaceAdvance) * 4.f; break; default: @@ -307,54 +226,26 @@ namespace Nz Glyph glyph; if (!whitespace) { - const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, character); - if (!fontGlyph.valid) + int iAdvance; + if (!GenerateGlyph(glyph, character, 0.f, true, m_color, 0, &iAdvance)) continue; // Glyph failed to load, just skip it (can't do much) - advance = fontGlyph.advance; + advance += float(iAdvance); - glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); - glyph.atlasRect = fontGlyph.atlasRect; - glyph.color = m_color; - glyph.flipped = fontGlyph.flipped; - - glyph.bounds.Set(fontGlyph.aabb); - glyph.bounds.x += m_drawPos.x; - glyph.bounds.y += m_drawPos.y; - - if (fontGlyph.requireFauxBold) + if (m_outlineThickness > 0.f) { - // Let's simulate bold by enlarging the glyph (not a neat idea, but should work) - Vector2f center = glyph.bounds.GetCenter(); - - // Enlarge by 10% - glyph.bounds.width *= 1.1f; - glyph.bounds.height *= 1.1f; - - // Replace it at the correct height - Vector2f offset(glyph.bounds.GetCenter() - center); - glyph.bounds.x -= offset.x; - glyph.bounds.y -= offset.y; - - // Adjust advance (+10%) - advance += advance / 10; + Glyph outlineGlyph; + if (GenerateGlyph(outlineGlyph, character, m_outlineThickness, false, m_outlineColor, -1, nullptr)) + m_glyphs.push_back(outlineGlyph); } - - // We "lean" the glyph to simulate italics style - float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; - float italicTop = italic * glyph.bounds.y; - float italicBottom = italic * glyph.bounds.GetMaximum().y; - - glyph.corners[0].Set(glyph.bounds.x - italicTop, glyph.bounds.y); - glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop, glyph.bounds.y); - glyph.corners[2].Set(glyph.bounds.x - italicBottom, glyph.bounds.y + glyph.bounds.height); - glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom, glyph.bounds.y + glyph.bounds.height); } else { - glyph.atlas = nullptr; + if (ShouldLineWrap(advance)) + AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); - glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, float(advance), float(sizeInfo.lineHeight)); + glyph.atlas = nullptr; + glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, GetLineHeight(sizeInfo)); glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); @@ -363,18 +254,12 @@ namespace Nz } m_lines.back().bounds.ExtendTo(glyph.bounds); - + switch (character) { case '\n': { - // Reset cursor - advance = 0; - m_drawPos.x = 0; - m_drawPos.y += sizeInfo.lineHeight; - - m_workingBounds.ExtendTo(m_lines.back().bounds); - m_lines.emplace_back(Line{Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1}); + AppendNewLine(); break; } @@ -383,12 +268,16 @@ namespace Nz break; } + if (whitespace) + { + m_lastSeparatorGlyph = m_glyphs.size(); + m_lastSeparatorPosition = m_drawPos.x; + } + m_glyphs.push_back(glyph); } - m_workingBounds.ExtendTo(m_lines.back().bounds); - - m_bounds.Set(Rectf(std::floor(m_workingBounds.x), std::floor(m_workingBounds.y), std::ceil(m_workingBounds.width), std::ceil(m_workingBounds.height))); + m_bounds.ExtendTo(m_lines.back().bounds); m_colorUpdated = true; m_glyphUpdated = true; @@ -407,7 +296,7 @@ namespace Nz #endif // Update atlas layer pointer - // Note: This can happen while updating + // Note: This can happen while updating glyphs for (Glyph& glyph : m_glyphs) { if (glyph.atlas == oldLayer) @@ -427,7 +316,7 @@ namespace Nz } #endif - m_glyphUpdated = false; + InvalidateGlyphs(); } void SimpleTextDrawer::OnFontRelease(const Font* font) @@ -445,20 +334,4 @@ namespace Nz SetFont(nullptr); } - - void SimpleTextDrawer::UpdateGlyphColor() const - { - for (Glyph& glyph : m_glyphs) - glyph.color = m_color; - - m_colorUpdated = true; - } - - void SimpleTextDrawer::UpdateGlyphs() const - { - NazaraAssert(m_font && m_font->IsValid(), "Invalid font"); - - ClearGlyphs(); - GenerateGlyphs(m_text); - } } diff --git a/tests/Engine/Core/StackVector.cpp b/tests/Engine/Core/StackVector.cpp index ceb36da89..62e67404b 100644 --- a/tests/Engine/Core/StackVector.cpp +++ b/tests/Engine/Core/StackVector.cpp @@ -1,175 +1,347 @@ +#include #include #include #include #include +// This is a quick way to check that checks are valid +#define USE_STD_VECTOR 0 + +class DestructionCounter +{ + public: + DestructionCounter() : + m_counter(nullptr), + m_value(0) + { + } + + DestructionCounter(std::size_t* counter, int value) : + m_counter(counter), + m_value(value) + { + if (m_counter) + (*m_counter)++; + } + + DestructionCounter(const DestructionCounter& counter) : + m_counter(counter.m_counter), + m_value(counter.m_value) + { + if (m_counter) + (*m_counter)++; + } + + DestructionCounter(DestructionCounter&& counter) : + m_counter(counter.m_counter), + m_value(counter.m_value) + { + if (m_counter) + (*m_counter)++; + } + + ~DestructionCounter() + { + if (m_counter) + { + assert(*m_counter > 0); + (*m_counter)--; + } + } + + operator int() const + { + return m_value; + } + + DestructionCounter& operator=(const DestructionCounter& counter) + { + if (m_counter) + { + assert(*m_counter > 0); + (*m_counter)--; + } + + m_counter = counter.m_counter; + m_value = counter.m_value; + + if (m_counter) + (*m_counter)++; + + return *this; + } + + DestructionCounter& operator=(DestructionCounter&& counter) + { + if (this == &counter) + return *this; + + if (m_counter) + { + assert(*m_counter > 0); + (*m_counter)--; + } + + m_counter = counter.m_counter; + m_value = counter.m_value; + + if (m_counter) + (*m_counter)++; + + return *this; + } + + private: + std::size_t* m_counter; + int m_value; +}; + SCENARIO("StackVector", "[CORE][STACKVECTOR]") { GIVEN("A StackVector to contain multiple int") { - volatile std::size_t capacity = 50; - Nz::StackVector vector = NazaraStackVector(int, capacity); - - WHEN("At construction, the vector is empty but has capacity") + std::size_t counter = 0; { - CHECK(vector.capacity() == capacity); - CHECK(vector.empty()); - CHECK(vector.size() == 0); - } + volatile std::size_t capacity = 50; +#if USE_STD_VECTOR + std::vector vector; + vector.reserve(capacity); +#else + Nz::StackVector vector = NazaraStackVector(DestructionCounter, capacity); +#endif - WHEN("Emplacing five elements, vector size increase accordingly") - { - for (std::size_t i = 0; i < 5; ++i) + WHEN("At construction, the vector is empty but has capacity") { - int val = int(i); - CHECK(vector.emplace_back(val) == val); + CHECK(vector.capacity() == capacity); + CHECK(vector.empty()); + CHECK(vector.size() == 0); +#if !USE_STD_VECTOR + CHECK(vector.max_size() == capacity); +#endif } - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("Pushing three elements, vector size increase accordingly") - { - for (std::size_t i = 0; i < 3; ++i) + WHEN("Resizing it changes its size and create/destroy elements") { - int val = int(i); - CHECK(vector.push_back(val) == val); + vector.resize(vector.capacity()); + CHECK(vector.size() == vector.capacity()); + CHECK(counter == 0); + vector.resize(0); + CHECK(vector.empty()); + CHECK(vector.size() == 0); + CHECK(counter == 0); } - CHECK(!vector.empty()); - CHECK(vector.size() == 3); - - std::array expectedValues = { 0, 1, 2 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - - THEN("We resize to five") + WHEN("Resizing it allocates elements") { - vector.resize(5); + vector.resize(vector.capacity(), DestructionCounter(&counter, 0)); + CHECK(vector.size() == vector.capacity()); + CHECK(counter == capacity); + vector.resize(0); + CHECK(vector.empty()); + CHECK(vector.size() == 0); + CHECK(counter == 0); + } + + WHEN("Emplacing five elements, vector size increase accordingly") + { + for (std::size_t i = 0; i < 5; ++i) + { +#if USE_STD_VECTOR + vector.emplace_back(&counter, int(i)); +#else + CHECK(vector.emplace_back(&counter, int(i)) == int(i)); +#endif + } CHECK(!vector.empty()); CHECK(vector.size() == 5); - std::array expectedValues = { 0, 1, 2, 0, 0 }; + std::array expectedValues = { 0, 1, 2, 3, 4 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + + WHEN("Pushing three elements, vector size increase accordingly") + { + for (std::size_t i = 0; i < 3; ++i) + { + DestructionCounter val(&counter, int(i)); +#if USE_STD_VECTOR + vector.push_back(val); +#else + CHECK(vector.push_back(val) == val); +#endif + } + + CHECK(!vector.empty()); + CHECK(vector.size() == 3); + + std::array expectedValues = { 0, 1, 2 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - AND_THEN("We resize it back to zero") + THEN("We resize to five") { - vector.resize(0); + vector.resize(5); - CHECK(vector.empty()); - CHECK(vector.size() == 0); - } - AND_THEN("We clear it") - { - vector.clear(); + CHECK(!vector.empty()); + CHECK(vector.size() == 5); - CHECK(vector.empty()); - CHECK(vector.size() == 0); + std::array expectedValues = { 0, 1, 2, 0, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + + AND_THEN("We resize it back to zero") + { + vector.resize(0); + + CHECK(vector.empty()); + CHECK(vector.size() == 0); + } + AND_THEN("We clear it") + { + vector.clear(); + + CHECK(vector.empty()); + CHECK(vector.size() == 0); + CHECK(counter == 0); + } } } - } - WHEN("We generate its content will iota") - { - vector.resize(10); - std::iota(vector.begin(), vector.end(), -5); - - std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using emplace") - { - for (std::size_t i = 0; i < 5; ++i) + WHEN("We generate its content will iota") { - int val = int(i); - CHECK(*vector.emplace(vector.end(), val) == val); + vector.resize(10); + for (std::size_t i = 0; i < vector.size(); ++i) + vector[i] = DestructionCounter(&counter, -5 + int(i)); + + std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + + AND_WHEN("We pop back some elements") + { + for (std::size_t i = 0; i < 5; ++i) + vector.pop_back(); + + std::array expectedValues = { -5, -4, -3, -2, -1 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements at the beginning") + { + vector.erase(vector.begin()); + vector.erase(vector.begin()); + + std::array expectedValues = { -3, -2, -1, 0, 1, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements in the middle") + { + vector.erase(vector.begin() + 2); + vector.erase(vector.begin() + 2); + vector.erase(vector.begin() + 6); + + std::array expectedValues = { -5, -4, -1, 0, 1, 2, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements at the end") + { + vector.erase(vector.end() - 1); + vector.erase(vector.end() - 1); + + std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase a range") + { + vector.erase(vector.begin() + 2, vector.end() - 3); + + std::array expectedValues = { -5, -4, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase everything") + { + vector.erase(vector.begin(), vector.end()); + + CHECK(vector.empty()); + } } - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using emplace, in reverse order") - { - for (std::size_t i = 0; i < 5; ++i) + WHEN("We generate its content using emplace") { - int val = int(i); - CHECK(*vector.emplace(vector.begin(), val) == val); + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.emplace(vector.end(), &counter, int(i)) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 0, 1, 2, 3, 4 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 4, 3, 2, 1, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using emplace, at the middle") - { - for (std::size_t i = 0; i < 10; ++i) + WHEN("We generate its content using emplace, in reverse order") { - int val = int(i); - CHECK(*vector.emplace(vector.begin() + i / 2, val) == val); + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.emplace(vector.begin(), &counter, int(i)) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 4, 3, 2, 1, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - CHECK(!vector.empty()); - CHECK(vector.size() == 10); - - std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using insert") - { - for (std::size_t i = 0; i < 5; ++i) + WHEN("We generate its content using emplace, at the middle") { - int val = int(i); - CHECK(*vector.insert(vector.end(), val) == val); + for (std::size_t i = 0; i < 10; ++i) + CHECK(*vector.emplace(vector.begin() + i / 2, &counter, int(i)) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 10); + + std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using insert, in reverse order") - { - for (std::size_t i = 0; i < 5; ++i) + WHEN("We generate its content using insert") { - int val = int(i); - CHECK(*vector.insert(vector.begin(), val) == val); + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.insert(vector.end(), DestructionCounter(&counter, int(i))) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 0, 1, 2, 3, 4 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 4, 3, 2, 1, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using insert, at the middle") - { - for (std::size_t i = 0; i < 10; ++i) + WHEN("We generate its content using insert, in reverse order") { - int val = int(i); - CHECK(*vector.insert(vector.begin() + i / 2, val) == val); + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.insert(vector.begin(), DestructionCounter(&counter, int(i))) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 4, 3, 2, 1, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - CHECK(!vector.empty()); - CHECK(vector.size() == 10); + WHEN("We generate its content using insert, at the middle") + { + for (std::size_t i = 0; i < 10; ++i) + CHECK(*vector.insert(vector.begin() + i / 2, DestructionCounter(&counter, int(i))) == int(i)); - std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + CHECK(!vector.empty()); + CHECK(vector.size() == 10); + + std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } } + + CHECK(counter == 0); } } diff --git a/tests/Engine/Network/IpAddress.cpp b/tests/Engine/Network/IpAddress.cpp index abcb65909..571e7ec75 100644 --- a/tests/Engine/Network/IpAddress.cpp +++ b/tests/Engine/Network/IpAddress.cpp @@ -40,7 +40,9 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") Nz::IpAddress google(8, 8, 8, 8); THEN("Google (DNS) is 8.8.8.8") { - CHECK(Nz::IpAddress::ResolveAddress(google) == "google-public-dns-a.google.com"); + Nz::String dnsAddress = Nz::IpAddress::ResolveAddress(google); + bool dnsCheck = dnsAddress == "google-public-dns-a.google.com" || dnsAddress == "dns.google"; + CHECK(dnsCheck); } } } diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index 7eae99908..e554746d8 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include Nz::RigidBody2D CreateBody(Nz::PhysWorld2D& world); @@ -93,6 +94,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") std::vector tmp; tmp.push_back(CreateBody(world)); tmp.push_back(CreateBody(world)); + world.Step(1.f); THEN("They should be valid") @@ -112,11 +114,14 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::Rectf aabb(positionAABB.x, positionAABB.y, 1.f, 2.f); Nz::Collider2DRef box = Nz::BoxCollider2D::New(aabb); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, box); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(box, true, false); + bool userData = false; body.SetUserdata(&userData); Nz::Vector2f position = Nz::Vector2f::Zero(); + body.SetPosition(position); world.Step(1.f); @@ -126,7 +131,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") { CHECK(body.GetAABB() == aabb); CHECK(body.GetAngularVelocity() == 0.f); - CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); + CHECK(body.GetMassCenter(Nz::CoordSys_Global) == position); CHECK(body.GetGeom() == box); CHECK(body.GetMass() == Approx(mass)); CHECK(body.GetPosition() == position); @@ -150,7 +155,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") { aabb.Translate(velocity); CHECK(body.GetAABB() == aabb); - CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); + CHECK(body.GetMassCenter(Nz::CoordSys_Global) == position); CHECK(body.GetPosition() == position); CHECK(body.GetVelocity() == velocity); } @@ -211,7 +216,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") float radius = 5.f; Nz::Collider2DRef circle = Nz::CircleCollider2D::New(radius, position); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, circle); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(circle, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the circle") @@ -240,7 +247,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::CompoundCollider2DRef compound = Nz::CompoundCollider2D::New(colliders); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, compound); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(compound, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the compound") @@ -267,7 +276,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::SparsePtr sparsePtr(vertices.data()); Nz::ConvexCollider2DRef convex = Nz::ConvexCollider2D::New(sparsePtr, vertices.size()); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, convex); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(convex, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the convex") @@ -289,7 +300,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::Vector2f positionB(1.f, -4.f); Nz::Collider2DRef segment = Nz::SegmentCollider2D::New(positionA, positionB, 0.f); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, segment); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(segment, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the segment") @@ -309,7 +322,11 @@ Nz::RigidBody2D CreateBody(Nz::PhysWorld2D& world) Nz::Rectf aabb(positionAABB.x, positionAABB.y, 1.f, 2.f); Nz::Collider2DRef box = Nz::BoxCollider2D::New(aabb); float mass = 1.f; - return Nz::RigidBody2D(&world, mass, box); + + Nz::RigidBody2D body(&world, mass, box); + body.SetPosition(Nz::Vector2f::Zero()); + + return body; } void EQUALITY(const Nz::RigidBody2D& left, const Nz::RigidBody2D& right) diff --git a/tests/SDK/NDK/EntityOwner.cpp b/tests/SDK/NDK/EntityOwner.cpp index 2d240a6d0..b7ce87e15 100644 --- a/tests/SDK/NDK/EntityOwner.cpp +++ b/tests/SDK/NDK/EntityOwner.cpp @@ -105,4 +105,25 @@ SCENARIO("EntityOwner", "[NDK][ENTITYOWNER]") } } } + + GIVEN("A vector of EntityOwner") + { + Ndk::World world(false); + + std::vector entityOwners; + for (std::size_t i = 1; i <= 10; ++i) + { + for (const Ndk::EntityHandle& entity : world.CreateEntities(10 * i)) + entityOwners.emplace_back(entity); + + entityOwners.clear(); + world.Refresh(); + + std::size_t aliveEntities = 0; + for (const Ndk::EntityHandle& entity : world.GetEntities()) + aliveEntities++; + + CHECK(aliveEntities == 0); + } + } } diff --git a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp index d94797065..770f1e190 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp @@ -6,7 +6,7 @@ #include #include -Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf AABB); +Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf& AABB); SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") { @@ -80,6 +80,8 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") Ndk::EntityHandle movingEntity = CreateBaseEntity(world, position, movingAABB); Ndk::NodeComponent& nodeComponent = movingEntity->GetComponent(); Ndk::PhysicsComponent2D& physicsComponent2D = movingEntity->AddComponent(); + physicsComponent2D.SetMassCenter(Nz::Vector2f::Zero()); + physicsComponent2D.SetPosition(position); world.GetSystem().SetFixedUpdateRate(30.f); @@ -124,6 +126,8 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") Ndk::EntityHandle movingEntity = CreateBaseEntity(world, position, movingAABB); Ndk::NodeComponent& nodeComponent = movingEntity->GetComponent(); Ndk::PhysicsComponent2D& physicsComponent2D = movingEntity->AddComponent(); + physicsComponent2D.SetMassCenter(Nz::Vector2f::Zero()); + physicsComponent2D.SetPosition(position); world.GetSystem().SetFixedUpdateRate(30.f); @@ -145,7 +149,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") } } -Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf AABB) +Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf& AABB) { Ndk::EntityHandle entity = world.CreateEntity(); Ndk::NodeComponent& nodeComponent = entity->AddComponent(); diff --git a/tests/SDK/NDK/Systems/RenderSystem.cpp b/tests/SDK/NDK/Systems/RenderSystem.cpp index 329818f74..e30fa3a03 100644 --- a/tests/SDK/NDK/Systems/RenderSystem.cpp +++ b/tests/SDK/NDK/Systems/RenderSystem.cpp @@ -90,17 +90,17 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") { CHECK(physicsComponent2D.GetAngularVelocity() == angularSpeed); CHECK(physicsComponent2D.GetRotation() == angularSpeed); - CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(1.f, 4.f, 2.f, 1.f)); + CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.5f, 4.5f, 2.f, 1.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == 2.f * angularSpeed); - CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.f, 2.f, 1.f, 2.f)); + CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(3.f, 4.0f, 1.f, 2.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == 3.f * angularSpeed); - CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(3.f, 3.f, 2.f, 1.f)); + CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.5f, 4.5f, 2.f, 1.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); diff --git a/tests/SDK/NDK/World.cpp b/tests/SDK/NDK/World.cpp index 185717609..f98a7e2e1 100644 --- a/tests/SDK/NDK/World.cpp +++ b/tests/SDK/NDK/World.cpp @@ -126,4 +126,37 @@ SCENARIO("World", "[NDK][WORLD]") } } } + + GIVEN("An empty world") + { + Ndk::World world(false); + + WHEN("We create two entities") + { + Ndk::EntityHandle a = world.CreateEntity(); + REQUIRE(a->GetId() == 0); + Ndk::EntityHandle b = world.CreateEntity(); + REQUIRE(b->GetId() == 1); + + b->OnEntityDestruction.Connect([a](Ndk::Entity*) + { + REQUIRE(a.IsValid()); + a->Kill(); + }); + + THEN("We kill the second entity which will kill the first one") + { + b->Kill(); + world.Refresh(); + + AND_THEN("Both entities should be dead next refresh") + { + world.Refresh(); + + REQUIRE_FALSE(a.IsValid()); + REQUIRE_FALSE(b.IsValid()); + } + } + } + } } diff --git a/thirdparty/src/chipmunk/chipmunk.c b/thirdparty/src/chipmunk/chipmunk.c index 503265cf6..a6cc9d6d4 100644 --- a/thirdparty/src/chipmunk/chipmunk.c +++ b/thirdparty/src/chipmunk/chipmunk.c @@ -89,7 +89,7 @@ cpAreaForSegment(cpVect a, cpVect b, cpFloat r) } cpFloat -cpMomentForPoly(cpFloat m, const int count, const cpVect *verts, cpVect offset, cpFloat r) +cpMomentForPoly(cpFloat m, int count, const cpVect *verts, cpVect offset, cpFloat r) { // TODO account for radius. if(count == 2) return cpMomentForSegment(m, verts[0], verts[1], 0.0f);